mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-12-20 07:29:32 +00:00
Compare commits
109 Commits
old/iris3
...
2.2.18-1.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
141ca76647 | ||
|
|
94557830f5 | ||
|
|
49acb7faba | ||
|
|
1904f67662 | ||
|
|
5b2bf38344 | ||
|
|
494c38a153 | ||
|
|
dd4b85cbfe | ||
|
|
8f7b54a5a4 | ||
|
|
cec502340e | ||
|
|
64e27c7fb0 | ||
|
|
b2bbd31548 | ||
|
|
17df92a07c | ||
|
|
2b749b5ab7 | ||
|
|
28e3402d88 | ||
|
|
d96bb061e0 | ||
|
|
e6def804f8 | ||
|
|
a5be48c07c | ||
|
|
fe3909f594 | ||
|
|
f37d91a530 | ||
|
|
614ef78771 | ||
|
|
fb294fc03c | ||
|
|
8c7e7c3d48 | ||
|
|
98b6280652 | ||
|
|
7c4c2d6382 | ||
|
|
1a29ea302e | ||
|
|
be39fce741 | ||
|
|
4fed2e6e5f | ||
|
|
14ae5809b0 | ||
|
|
0f66aa47c9 | ||
|
|
cf85d300f4 | ||
|
|
91d60e56df | ||
|
|
1d3681beb4 | ||
|
|
0b403cf329 | ||
|
|
8ba75899e3 | ||
|
|
4d4ed72159 | ||
|
|
b72bf072b3 | ||
|
|
4edcb54b31 | ||
|
|
eae7fc0e53 | ||
|
|
fddacd4410 | ||
|
|
de6c4b9a30 | ||
|
|
6990e34138 | ||
|
|
d9883697ef | ||
|
|
05a26ff8b2 | ||
|
|
84bb082d44 | ||
|
|
a0db94d84f | ||
|
|
0367b4ecd7 | ||
|
|
dbc425dce6 | ||
|
|
116c017c6d | ||
|
|
9c387475f0 | ||
|
|
0765c21cef | ||
|
|
2871038584 | ||
|
|
340885f939 | ||
|
|
1e32e47f54 | ||
|
|
3c759f3b01 | ||
|
|
6615f34d20 | ||
|
|
3a4aac1ee4 | ||
|
|
4d6c092615 | ||
|
|
93421a1dc9 | ||
|
|
209458a856 | ||
|
|
82bd94620e | ||
|
|
af9f017871 | ||
|
|
2f8922ea87 | ||
|
|
0ea936f3fe | ||
|
|
d1870ee0a8 | ||
|
|
d2151690ad | ||
|
|
dff373e7d5 | ||
|
|
0aec2a664f | ||
|
|
723b696393 | ||
|
|
f5f89eb4e4 | ||
|
|
df15332c7f | ||
|
|
61d9e5a869 | ||
|
|
9628b66a97 | ||
|
|
5e041366d4 | ||
|
|
3ecae8d72c | ||
|
|
5709ce9d82 | ||
|
|
ce3c334ac5 | ||
|
|
2ed5aa8730 | ||
|
|
8480a63dda | ||
|
|
132a1695f3 | ||
|
|
21775630c3 | ||
|
|
eac2ef7c6d | ||
|
|
386997f646 | ||
|
|
637b90ad62 | ||
|
|
95d755c2ec | ||
|
|
781aeebef6 | ||
|
|
5e133fd51a | ||
|
|
85f62a3b9d | ||
|
|
a32de58c8b | ||
|
|
1cb2ea6c17 | ||
|
|
6a37ab7af2 | ||
|
|
e0f0aaf767 | ||
|
|
3d7c5b050a | ||
|
|
6bc57c255f | ||
|
|
b82edfe688 | ||
|
|
6b32eb3441 | ||
|
|
23a07fa8a5 | ||
|
|
b019faedd2 | ||
|
|
4430433a10 | ||
|
|
f52cd29e7b | ||
|
|
6a44e593a6 | ||
|
|
f7065fe034 | ||
|
|
0a247956f7 | ||
|
|
03836acded | ||
|
|
b5fb277982 | ||
|
|
e523d3c166 | ||
|
|
41477e4aa6 | ||
|
|
fbaf42a8c4 | ||
|
|
1c3668047b | ||
|
|
7d78c69b6e |
1
.github/ISSUE_TEMPLATE/bug.yml
vendored
1
.github/ISSUE_TEMPLATE/bug.yml
vendored
@@ -39,6 +39,7 @@ body:
|
|||||||
- 1.17
|
- 1.17
|
||||||
- 1.17.1
|
- 1.17.1
|
||||||
- 1.18
|
- 1.18
|
||||||
|
- 1.19
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: input
|
- type: input
|
||||||
|
|||||||
26
build.gradle
26
build.gradle
@@ -24,10 +24,11 @@ plugins {
|
|||||||
id "de.undercouch.download" version "5.0.1"
|
id "de.undercouch.download" version "5.0.1"
|
||||||
}
|
}
|
||||||
|
|
||||||
version '2.2.1-1.19' // Needs to be version specific
|
version '2.2.18-1.19.2' // Needs to be version specific
|
||||||
def nmsVersion = "1.19"
|
def nmsVersion = "1.19.2" //[NMS]
|
||||||
def apiVersion = '1.19'
|
def apiVersion = '1.19'
|
||||||
def spigotJarVersion = '1.19-R0.1-SNAPSHOT'
|
def specialSourceVersion = '1.11.0' //[NMS]
|
||||||
|
def spigotJarVersion = '1.19.2-R0.1-SNAPSHOT' //[NMS]
|
||||||
def name = getRootProject().getName() // Defined in settings.gradle
|
def name = getRootProject().getName() // Defined in settings.gradle
|
||||||
def main = 'com.volmit.iris.Iris'
|
def main = 'com.volmit.iris.Iris'
|
||||||
|
|
||||||
@@ -38,7 +39,7 @@ registerCustomOutputTask('Psycho', 'D://Dan/MinecraftDevelopment/server/plugins'
|
|||||||
registerCustomOutputTask('ArcaneArts', 'C://Users/arcane/Documents/development/server/plugins')
|
registerCustomOutputTask('ArcaneArts', 'C://Users/arcane/Documents/development/server/plugins')
|
||||||
registerCustomOutputTask('Coco', 'D://Documents/MC/plugins')
|
registerCustomOutputTask('Coco', 'D://Documents/MC/plugins')
|
||||||
registerCustomOutputTask('Strange', 'D://Servers/1.17 Test Server/plugins')
|
registerCustomOutputTask('Strange', 'D://Servers/1.17 Test Server/plugins')
|
||||||
registerCustomOutputTask('Vatuu', 'D://Minecraft/Servers/1.19/plugins')
|
registerCustomOutputTask('Vatuu', 'D://Minecraft/Servers/1.19.2/plugins')
|
||||||
// ========================== UNIX ==============================
|
// ========================== UNIX ==============================
|
||||||
registerCustomOutputTaskUnix('CyberpwnLT', '/Users/danielmills/development/server/plugins')
|
registerCustomOutputTaskUnix('CyberpwnLT', '/Users/danielmills/development/server/plugins')
|
||||||
registerCustomOutputTaskUnix('PsychoLT', '/Users/brianfopiano/Desktop/REMOTES/RemoteMinecraft/plugins')
|
registerCustomOutputTaskUnix('PsychoLT', '/Users/brianfopiano/Desktop/REMOTES/RemoteMinecraft/plugins')
|
||||||
@@ -73,11 +74,8 @@ repositories {
|
|||||||
includeGroup("org.spigotmc")
|
includeGroup("org.spigotmc")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
maven { url "https://dl.cloudsmith.io/public/arcane/archive/maven/" }
|
maven { url "https://arcanearts.jfrog.io/artifactory/archives" }
|
||||||
maven { url "https://maven.enginehub.org/repo/" }
|
|
||||||
mavenCentral()
|
|
||||||
mavenLocal()
|
|
||||||
maven { url "https://jitpack.io"}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -124,10 +122,10 @@ dependencies {
|
|||||||
// Provided or Classpath
|
// Provided or Classpath
|
||||||
compileOnly 'org.projectlombok:lombok:1.18.24'
|
compileOnly 'org.projectlombok:lombok:1.18.24'
|
||||||
annotationProcessor 'org.projectlombok:lombok:1.18.24'
|
annotationProcessor 'org.projectlombok:lombok:1.18.24'
|
||||||
implementation 'org.spigotmc:spigot-api:1.19-R0.1-SNAPSHOT'
|
implementation 'org.spigotmc:spigot-api:1.19.2-R0.1-SNAPSHOT'
|
||||||
implementation 'me.clip:placeholderapi:2.11.1'
|
implementation 'me.clip:placeholderapi:2.11.1'
|
||||||
implementation 'io.th0rgal:oraxen:1.94.0'
|
implementation 'io.th0rgal:oraxen:1.94.0'
|
||||||
implementation 'org.bukkit:craftbukkit:1.19-R0.1-SNAPSHOT:remapped-mojang'
|
implementation 'org.bukkit:craftbukkit:1.19.2-R0.1-SNAPSHOT:remapped-mojang' //[NMS]
|
||||||
implementation 'com.github.LoneDev6:api-itemsadder:3.1.0b'
|
implementation 'com.github.LoneDev6:api-itemsadder:3.1.0b'
|
||||||
|
|
||||||
// Shaded
|
// Shaded
|
||||||
@@ -194,7 +192,7 @@ task downloadBuildtools(type: Download) {
|
|||||||
|
|
||||||
task downloadSpecialSource(type: Download) {
|
task downloadSpecialSource(type: Download) {
|
||||||
group "remapping"
|
group "remapping"
|
||||||
src 'https://repo.maven.apache.org/maven2/net/md-5/SpecialSource/1.10.0/SpecialSource-1.10.0-shaded.jar'
|
src 'https://repo.maven.apache.org/maven2/net/md-5/SpecialSource/' + specialSourceVersion + '/SpecialSource-'+specialSourceVersion+'-shaded.jar'
|
||||||
dest specialSourceJar
|
dest specialSourceJar
|
||||||
onlyIf {
|
onlyIf {
|
||||||
!specialSourceJar.exists()
|
!specialSourceJar.exists()
|
||||||
@@ -300,7 +298,7 @@ def registerCustomOutputTask(name, path) {
|
|||||||
from(new File(buildDir, "Iris-" + version + ".jar"))
|
from(new File(buildDir, "Iris-" + version + ".jar"))
|
||||||
into(file(path))
|
into(file(path))
|
||||||
rename { String fileName ->
|
rename { String fileName ->
|
||||||
fileName.replace("Iris-" + version + ".jar", "Iris.jar")
|
fileName.replace("Iris-" + version + ".jar", "Iris- "+ version +".jar")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -317,7 +315,7 @@ def registerCustomOutputTaskUnix(name, path) {
|
|||||||
from(new File(buildDir, "Iris-" + version + ".jar"))
|
from(new File(buildDir, "Iris-" + version + ".jar"))
|
||||||
into(file(path))
|
into(file(path))
|
||||||
rename { String fileName ->
|
rename { String fileName ->
|
||||||
fileName.replace("Iris-" + version + ".jar", "Iris.jar")
|
fileName.replace("Iris-" + version + ".jar", "Iris- "+ version +".jar")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import com.volmit.iris.core.ServerConfigurator;
|
|||||||
import com.volmit.iris.core.link.*;
|
import com.volmit.iris.core.link.*;
|
||||||
import com.volmit.iris.core.loader.IrisData;
|
import com.volmit.iris.core.loader.IrisData;
|
||||||
import com.volmit.iris.core.nms.INMS;
|
import com.volmit.iris.core.nms.INMS;
|
||||||
|
import com.volmit.iris.core.pregenerator.LazyPregenerator;
|
||||||
import com.volmit.iris.core.service.StudioSVC;
|
import com.volmit.iris.core.service.StudioSVC;
|
||||||
import com.volmit.iris.core.tools.IrisToolbelt;
|
import com.volmit.iris.core.tools.IrisToolbelt;
|
||||||
import com.volmit.iris.engine.EnginePanic;
|
import com.volmit.iris.engine.EnginePanic;
|
||||||
@@ -85,7 +86,11 @@ import java.util.Objects;
|
|||||||
|
|
||||||
@SuppressWarnings("CanBeFinal")
|
@SuppressWarnings("CanBeFinal")
|
||||||
public class Iris extends VolmitPlugin implements Listener {
|
public class Iris extends VolmitPlugin implements Listener {
|
||||||
|
|
||||||
|
public static final String OVERWORLD_TAG = "2086";
|
||||||
|
|
||||||
private static final Queue<Runnable> syncJobs = new ShurikenQueue<>();
|
private static final Queue<Runnable> syncJobs = new ShurikenQueue<>();
|
||||||
|
|
||||||
public static Iris instance;
|
public static Iris instance;
|
||||||
public static BukkitAudiences audiences;
|
public static BukkitAudiences audiences;
|
||||||
public static MultiverseCoreLink linkMultiverseCore;
|
public static MultiverseCoreLink linkMultiverseCore;
|
||||||
@@ -400,6 +405,7 @@ public class Iris extends VolmitPlugin implements Listener {
|
|||||||
J.s(() -> {
|
J.s(() -> {
|
||||||
J.a(() -> PaperLib.suggestPaper(this));
|
J.a(() -> PaperLib.suggestPaper(this));
|
||||||
J.a(() -> IO.delete(getTemp()));
|
J.a(() -> IO.delete(getTemp()));
|
||||||
|
J.a(LazyPregenerator::loadLazyGenerators, 100);
|
||||||
J.a(this::bstats);
|
J.a(this::bstats);
|
||||||
J.ar(this::checkConfigHotload, 60);
|
J.ar(this::checkConfigHotload, 60);
|
||||||
J.sr(this::tickQueue, 0);
|
J.sr(this::tickQueue, 0);
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import com.volmit.iris.util.format.C;
|
|||||||
import com.volmit.iris.util.io.IO;
|
import com.volmit.iris.util.io.IO;
|
||||||
import com.volmit.iris.util.plugin.VolmitSender;
|
import com.volmit.iris.util.plugin.VolmitSender;
|
||||||
import com.volmit.iris.util.scheduling.J;
|
import com.volmit.iris.util.scheduling.J;
|
||||||
|
import com.volmit.iris.util.scheduling.Queue;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.configuration.InvalidConfigurationException;
|
import org.bukkit.configuration.InvalidConfigurationException;
|
||||||
import org.bukkit.configuration.file.FileConfiguration;
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
@@ -38,6 +39,7 @@ import org.bukkit.entity.Player;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public class ServerConfigurator {
|
public class ServerConfigurator {
|
||||||
@@ -82,41 +84,19 @@ public class ServerConfigurator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static File getDatapacksFolder() {
|
private static List<File> getDatapacksFolder() {
|
||||||
if(!IrisSettings.get().getGeneral().forceMainWorld.isEmpty()) {
|
if(!IrisSettings.get().getGeneral().forceMainWorld.isEmpty()) {
|
||||||
return new File(IrisSettings.get().getGeneral().forceMainWorld + "/datapacks");
|
return new KList<File>().qadd(new File(IrisSettings.get().getGeneral().forceMainWorld + "/datapacks"));
|
||||||
|
}
|
||||||
|
KList<File> worlds = new KList<>();
|
||||||
|
Bukkit.getServer().getWorlds().forEach(w -> worlds.add(new File(w.getWorldFolder(), "datapacks")));
|
||||||
|
return worlds;
|
||||||
}
|
}
|
||||||
|
|
||||||
File props = new File("server.properties");
|
|
||||||
|
|
||||||
if(props.exists()) {
|
|
||||||
try {
|
|
||||||
KList<String> m = new KList<>(IO.readAll(props).split("\\Q\n\\E"));
|
|
||||||
|
|
||||||
for(String i : m) {
|
|
||||||
if(i.trim().startsWith("level-name=")) {
|
|
||||||
return new File(i.trim().split("\\Q=\\E")[1] + "/datapacks");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch(IOException e) {
|
|
||||||
Iris.reportError(e);
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void installDataPacks(boolean fullInstall) {
|
public static void installDataPacks(boolean fullInstall) {
|
||||||
Iris.info("Checking Data Packs...");
|
Iris.info("Checking Data Packs...");
|
||||||
boolean reboot = false;
|
|
||||||
File packs = new File("plugins/Iris/packs");
|
File packs = new File("plugins/Iris/packs");
|
||||||
File dpacks = getDatapacksFolder();
|
|
||||||
|
|
||||||
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()) {
|
if(packs.exists()) {
|
||||||
for(File i : packs.listFiles()) {
|
for(File i : packs.listFiles()) {
|
||||||
@@ -135,8 +115,8 @@ public class ServerConfigurator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Iris.verbose(" Checking Dimension " + dim.getLoadFile().getPath());
|
Iris.verbose(" Checking Dimension " + dim.getLoadFile().getPath());
|
||||||
if(dim.installDataPack(() -> data, dpacks)) {
|
for(File dpack : getDatapacksFolder()) {
|
||||||
reboot = true;
|
dim.installDataPack(() -> data, dpack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -147,19 +127,12 @@ public class ServerConfigurator {
|
|||||||
|
|
||||||
Iris.info("Data Packs Setup!");
|
Iris.info("Data Packs Setup!");
|
||||||
|
|
||||||
if(fullInstall) {
|
if(fullInstall)
|
||||||
verifyDataPacksPost(IrisSettings.get().getAutoConfiguration().isAutoRestartOnCustomBiomeInstall());
|
verifyDataPacksPost(IrisSettings.get().getAutoConfiguration().isAutoRestartOnCustomBiomeInstall());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private static void verifyDataPacksPost(boolean allowRestarting) {
|
private static void verifyDataPacksPost(boolean allowRestarting) {
|
||||||
File packs = new File("plugins/Iris/packs");
|
File packs = new File("plugins/Iris/packs");
|
||||||
File dpacks = getDatapacksFolder();
|
|
||||||
|
|
||||||
if(dpacks == null) {
|
|
||||||
Iris.error("Cannot find the datapacks folder! Please try generating a default world first maybe? Is this a new server?");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean bad = false;
|
boolean bad = false;
|
||||||
if(packs.exists()) {
|
if(packs.exists()) {
|
||||||
|
|||||||
@@ -38,10 +38,13 @@ import com.volmit.iris.util.parallel.MultiBurst;
|
|||||||
import com.volmit.iris.util.plugin.VolmitSender;
|
import com.volmit.iris.util.plugin.VolmitSender;
|
||||||
import com.volmit.iris.util.scheduling.J;
|
import com.volmit.iris.util.scheduling.J;
|
||||||
import com.volmit.iris.util.scheduling.jobs.QueueJob;
|
import com.volmit.iris.util.scheduling.jobs.QueueJob;
|
||||||
|
import com.volmit.iris.util.stream.utility.ProfiledStream;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Chunk;
|
import org.bukkit.Chunk;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
|
|
||||||
@@ -76,8 +79,6 @@ public class CommandIris implements DecreeExecutor {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sender().sendMessage(C.RED + "You should not be using this command to create new worlds. Instead, use the tutorial: https://docs.volmit.com/iris/getting-started");
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
IrisToolbelt.createWorld()
|
IrisToolbelt.createWorld()
|
||||||
.dimension(type.getLoadKey())
|
.dimension(type.getLoadKey())
|
||||||
@@ -96,6 +97,37 @@ public class CommandIris implements DecreeExecutor {
|
|||||||
sender().sendMessage(C.GREEN + "Successfully created your world!");
|
sender().sendMessage(C.GREEN + "Successfully created your world!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Decree(description = "Remove an Iris world", aliases = {"del", "rm"}, sync = true)
|
||||||
|
public void remove(
|
||||||
|
@Param(description = "The world to remove")
|
||||||
|
World world,
|
||||||
|
@Param(description = "Whether to also remove the folder (if set to false, just does not load the world)", defaultValue = "true")
|
||||||
|
boolean delete
|
||||||
|
) {
|
||||||
|
if (!IrisToolbelt.isIrisWorld(world)) {
|
||||||
|
sender().sendMessage(C.RED + "This is not an Iris world. Iris worlds: " + String.join(", ", Bukkit.getServer().getWorlds().stream().filter(IrisToolbelt::isIrisWorld).map(World::getName).toList()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sender().sendMessage(C.GREEN + "Removing world: " + world.getName());
|
||||||
|
try {
|
||||||
|
if (IrisToolbelt.removeWorld(world)) {
|
||||||
|
sender().sendMessage(C.GREEN + "Successfully removed " + world.getName() + " from bukkit.yml");
|
||||||
|
} else {
|
||||||
|
sender().sendMessage(C.YELLOW + "Looks like the world was already removed from bukkit.yml");
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
sender().sendMessage(C.RED + "Failed to save bukkit.yml because of " + e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
IrisToolbelt.evacuate(world, "Deleting world");
|
||||||
|
Bukkit.unloadWorld(world, false);
|
||||||
|
if (delete && world.getWorldFolder().delete()) {
|
||||||
|
sender().sendMessage(C.GREEN + "Successfully removed world folder");
|
||||||
|
} else {
|
||||||
|
sender().sendMessage(C.RED + "Failed to remove world folder");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Decree(description = "Print version information")
|
@Decree(description = "Print version information")
|
||||||
public void version() {
|
public void version() {
|
||||||
sender().sendMessage(C.GREEN + "Iris v" + Iris.instance.getDescription().getVersion() + " by Volmit Software");
|
sender().sendMessage(C.GREEN + "Iris v" + Iris.instance.getDescription().getVersion() + " by Volmit Software");
|
||||||
@@ -107,6 +139,12 @@ public class CommandIris implements DecreeExecutor {
|
|||||||
sender().sendMessage(C.GREEN + "Total Height: " + (sender().player().getWorld().getMaxHeight() - sender().player().getWorld().getMinHeight()));
|
sender().sendMessage(C.GREEN + "Total Height: " + (sender().player().getWorld().getMaxHeight() - sender().player().getWorld().getMinHeight()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Decree(description = "QOL command to open a overworld studio world.", sync = true)
|
||||||
|
public void so() {
|
||||||
|
sender().sendMessage(C.GREEN + "Opening studio for the \"Overworld\" pack (seed: 1337)");
|
||||||
|
Iris.service(StudioSVC.class).open(sender(), 1337, "overworld");
|
||||||
|
}
|
||||||
|
|
||||||
@Decree(description = "Set aura spins")
|
@Decree(description = "Set aura spins")
|
||||||
public void aura(
|
public void aura(
|
||||||
@Param(description = "The h color value", defaultValue = "-20")
|
@Param(description = "The h color value", defaultValue = "-20")
|
||||||
@@ -170,10 +208,14 @@ public class CommandIris implements DecreeExecutor {
|
|||||||
@Param(name = "overwrite", description = "Whether or not to overwrite the pack with the downloaded one", aliases = "force", defaultValue = "false")
|
@Param(name = "overwrite", description = "Whether or not to overwrite the pack with the downloaded one", aliases = "force", defaultValue = "false")
|
||||||
boolean overwrite
|
boolean overwrite
|
||||||
) {
|
) {
|
||||||
branch = pack.equals("overworld") ? "stable" : branch;
|
|
||||||
sender().sendMessage(C.GREEN + "Downloading pack: " + pack + "/" + branch + (trim ? " trimmed" : "") + (overwrite ? " overwriting" : ""));
|
sender().sendMessage(C.GREEN + "Downloading pack: " + pack + "/" + branch + (trim ? " trimmed" : "") + (overwrite ? " overwriting" : ""));
|
||||||
|
if(pack.equals("overworld")) {
|
||||||
|
String url = "https://github.com/IrisDimensions/overworld/releases/download/" + Iris.OVERWORLD_TAG + "/overworld.zip";
|
||||||
|
Iris.service(StudioSVC.class).downloadRelease(sender(), url, trim, overwrite);
|
||||||
|
} else {
|
||||||
Iris.service(StudioSVC.class).downloadSearch(sender(), "IrisDimensions/" + pack + "/" + branch, trim, overwrite);
|
Iris.service(StudioSVC.class).downloadSearch(sender(), "IrisDimensions/" + pack + "/" + branch, trim, overwrite);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Decree(description = "Get metrics for your world", aliases = "measure", origin = DecreeOrigin.PLAYER)
|
@Decree(description = "Get metrics for your world", aliases = "measure", origin = DecreeOrigin.PLAYER)
|
||||||
public void metrics() {
|
public void metrics() {
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public class CommandWhat implements DecreeExecutor {
|
|||||||
@Decree(description = "What biome am i in?", origin = DecreeOrigin.PLAYER)
|
@Decree(description = "What biome am i in?", origin = DecreeOrigin.PLAYER)
|
||||||
public void biome() {
|
public void biome() {
|
||||||
try {
|
try {
|
||||||
IrisBiome b = engine().getBiome(player().getLocation().getBlockX(), player().getLocation().getBlockY(), player().getLocation().getBlockZ());
|
IrisBiome b = engine().getBiome(player().getLocation().getBlockX(), player().getLocation().getBlockY() - player().getWorld().getMinHeight(), player().getLocation().getBlockZ());
|
||||||
sender().sendMessage("IBiome: " + b.getLoadKey() + " (" + b.getDerivative().name() + ")");
|
sender().sendMessage("IBiome: " + b.getLoadKey() + " (" + b.getDerivative().name() + ")");
|
||||||
|
|
||||||
} catch(Throwable e) {
|
} catch(Throwable e) {
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ public class NoiseExplorerGUI extends JPanel implements MouseWheelListener, List
|
|||||||
JFrame frame = new JFrame("Noise Explorer");
|
JFrame frame = new JFrame("Noise Explorer");
|
||||||
NoiseExplorerGUI nv = new NoiseExplorerGUI();
|
NoiseExplorerGUI nv = new NoiseExplorerGUI();
|
||||||
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
|
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
|
||||||
KList<String> li = new KList<>(NoiseStyle.values()).toStringList();
|
KList<String> li = new KList<>(NoiseStyle.values()).toStringList().sort();
|
||||||
combo = new JComboBox<>(li.toArray(new String[0]));
|
combo = new JComboBox<>(li.toArray(new String[0]));
|
||||||
combo.setSelectedItem("STATIC");
|
combo.setSelectedItem("STATIC");
|
||||||
combo.setFocusable(false);
|
combo.setFocusable(false);
|
||||||
|
|||||||
@@ -83,7 +83,6 @@ public class PregeneratorJob implements PregenListener {
|
|||||||
this.pregenerator = new IrisPregenerator(task, method, this);
|
this.pregenerator = new IrisPregenerator(task, method, this);
|
||||||
max = new Position2(0, 0);
|
max = new Position2(0, 0);
|
||||||
min = new Position2(0, 0);
|
min = new Position2(0, 0);
|
||||||
KList<Runnable> draw = new KList<>();
|
|
||||||
task.iterateRegions((xx, zz) -> {
|
task.iterateRegions((xx, zz) -> {
|
||||||
min.setX(Math.min(xx << 5, min.getX()));
|
min.setX(Math.min(xx << 5, min.getX()));
|
||||||
min.setZ(Math.min(zz << 5, min.getZ()));
|
min.setZ(Math.min(zz << 5, min.getZ()));
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ package com.volmit.iris.core.link;
|
|||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.core.tools.IrisToolbelt;
|
import com.volmit.iris.core.tools.IrisToolbelt;
|
||||||
|
import com.volmit.iris.engine.object.IrisBiome;
|
||||||
import com.volmit.iris.engine.platform.PlatformChunkGenerator;
|
import com.volmit.iris.engine.platform.PlatformChunkGenerator;
|
||||||
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
|
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
@@ -59,15 +60,15 @@ public class IrisPapiExpansion extends PlaceholderExpansion {
|
|||||||
|
|
||||||
if(p.equalsIgnoreCase("biome_name")) {
|
if(p.equalsIgnoreCase("biome_name")) {
|
||||||
if(a != null) {
|
if(a != null) {
|
||||||
return a.getEngine().getBiome(l).getName();
|
return getBiome(a, l).getName();
|
||||||
}
|
}
|
||||||
} else if(p.equalsIgnoreCase("biome_id")) {
|
} else if(p.equalsIgnoreCase("biome_id")) {
|
||||||
if(a != null) {
|
if(a != null) {
|
||||||
return a.getEngine().getBiome(l).getLoadKey();
|
return getBiome(a, l).getLoadKey();
|
||||||
}
|
}
|
||||||
} else if(p.equalsIgnoreCase("biome_file")) {
|
} else if(p.equalsIgnoreCase("biome_file")) {
|
||||||
if(a != null) {
|
if(a != null) {
|
||||||
return a.getEngine().getBiome(l).getLoadFile().getPath();
|
return getBiome(a, l).getLoadFile().getPath();
|
||||||
}
|
}
|
||||||
} else if(p.equalsIgnoreCase("region_name")) {
|
} else if(p.equalsIgnoreCase("region_name")) {
|
||||||
if(a != null) {
|
if(a != null) {
|
||||||
@@ -107,4 +108,8 @@ public class IrisPapiExpansion extends PlaceholderExpansion {
|
|||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private IrisBiome getBiome(PlatformChunkGenerator a, Location l) {
|
||||||
|
return a.getEngine().getBiome(l.getBlockX(), l.getBlockY() - l.getWorld().getMinHeight(), l.getBlockZ());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,33 +68,26 @@ public class ObjectResourceLoader extends ResourceLoader<IrisObject> {
|
|||||||
if(possibleKeys != null) {
|
if(possibleKeys != null) {
|
||||||
return possibleKeys;
|
return possibleKeys;
|
||||||
}
|
}
|
||||||
|
|
||||||
Iris.debug("Building " + resourceTypeName + " Possibility Lists");
|
Iris.debug("Building " + resourceTypeName + " Possibility Lists");
|
||||||
KSet<String> m = new KSet<>();
|
KSet<String> m = new KSet<>();
|
||||||
|
|
||||||
for(File i : getFolders()) {
|
for(File i : getFolders()) {
|
||||||
for(File j : i.listFiles()) {
|
m.addAll(getFiles(i, ".iob", true));
|
||||||
if(j.isFile() && j.getName().endsWith(".iob")) {
|
|
||||||
m.add(j.getName().replaceAll("\\Q.iob\\E", ""));
|
|
||||||
} else if(j.isDirectory()) {
|
|
||||||
for(File k : j.listFiles()) {
|
|
||||||
if(k.isFile() && k.getName().endsWith(".iob")) {
|
|
||||||
m.add(j.getName() + "/" + k.getName().replaceAll("\\Q.iob\\E", ""));
|
|
||||||
} else if(k.isDirectory()) {
|
|
||||||
for(File l : k.listFiles()) {
|
|
||||||
if(l.isFile() && l.getName().endsWith(".iob")) {
|
|
||||||
m.add(j.getName() + "/" + k.getName() + "/" + l.getName().replaceAll("\\Q.iob\\E", ""));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
possibleKeys = m.toArray(new String[0]);
|
||||||
|
return possibleKeys;
|
||||||
}
|
}
|
||||||
|
|
||||||
KList<String> v = new KList<>(m);
|
private KList<String> getFiles(File dir, String ext, boolean skipDirName) {
|
||||||
possibleKeys = v.toArray(new String[0]);
|
KList<String> paths = new KList<>();
|
||||||
return possibleKeys;
|
String name = skipDirName ? "" : dir.getName() + "/";
|
||||||
|
for(File f : dir.listFiles()) {
|
||||||
|
if(f.isFile() && f.getName().endsWith(ext)) {
|
||||||
|
paths.add(name + f.getName().replaceAll("\\Q" + ext + "\\E", ""));
|
||||||
|
} else if(f.isDirectory()) {
|
||||||
|
getFiles(f, ext, false).forEach(e -> paths.add(name + e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
public File findFile(String name) {
|
public File findFile(String name) {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ package com.volmit.iris.core.nms;
|
|||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.core.IrisSettings;
|
import com.volmit.iris.core.IrisSettings;
|
||||||
import com.volmit.iris.core.nms.v19_1.NMSBinding19_1;
|
import com.volmit.iris.core.nms.v19_2.NMSBinding19_2;
|
||||||
import com.volmit.iris.core.nms.v1X.NMSBinding1X;
|
import com.volmit.iris.core.nms.v1X.NMSBinding1X;
|
||||||
import com.volmit.iris.util.collection.KMap;
|
import com.volmit.iris.util.collection.KMap;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
@@ -28,7 +28,7 @@ import org.bukkit.Bukkit;
|
|||||||
public class INMS {
|
public class INMS {
|
||||||
//@builder
|
//@builder
|
||||||
private static final KMap<String, Class<? extends INMSBinding>> bindings = new KMap<String, Class<? extends INMSBinding>>()
|
private static final KMap<String, Class<? extends INMSBinding>> bindings = new KMap<String, Class<? extends INMSBinding>>()
|
||||||
.qput("v1_19_R1", NMSBinding19_1.class);
|
.qput("v1_19_R1", NMSBinding19_2.class);
|
||||||
//@done
|
//@done
|
||||||
private static final INMSBinding binding = bind();
|
private static final INMSBinding binding = bind();
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.volmit.iris.core.nms.v19_1;
|
package com.volmit.iris.core.nms.v19_2;
|
||||||
|
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
@@ -39,15 +39,10 @@ import it.unimi.dsi.fastutil.objects.Object2IntMap;
|
|||||||
import net.minecraft.core.*;
|
import net.minecraft.core.*;
|
||||||
import net.minecraft.nbt.NbtIo;
|
import net.minecraft.nbt.NbtIo;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.util.BitStorage;
|
|
||||||
import net.minecraft.util.Mth;
|
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.chunk.ChunkAccess;
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
||||||
import net.minecraft.world.level.chunk.LevelChunkSection;
|
|
||||||
import net.minecraft.world.level.chunk.Palette;
|
|
||||||
import net.minecraft.world.level.chunk.PalettedContainer;
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
@@ -74,7 +69,7 @@ import java.util.Iterator;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
public class NMSBinding19_1 implements INMSBinding {
|
public class NMSBinding19_2 implements INMSBinding {
|
||||||
|
|
||||||
private final KMap<Biome, Object> baseBiomeCache = new KMap<>();
|
private final KMap<Biome, Object> baseBiomeCache = new KMap<>();
|
||||||
private final BlockData AIR = Material.AIR.createBlockData();
|
private final BlockData AIR = Material.AIR.createBlockData();
|
||||||
@@ -344,44 +339,12 @@ public class NMSBinding19_1 implements INMSBinding {
|
|||||||
ChunkAccess s = (ChunkAccess) getFieldForBiomeStorage(chunk).get(chunk);
|
ChunkAccess s = (ChunkAccess) getFieldForBiomeStorage(chunk).get(chunk);
|
||||||
Holder<net.minecraft.world.level.biome.Biome> biome = (Holder<net.minecraft.world.level.biome.Biome>) somethingVeryDirty;
|
Holder<net.minecraft.world.level.biome.Biome> biome = (Holder<net.minecraft.world.level.biome.Biome>) somethingVeryDirty;
|
||||||
s.setBiome(x, y, z, biome);
|
s.setBiome(x, y, z, biome);
|
||||||
/*int l = QuartPos.fromBlock(s.getMinBuildHeight());
|
|
||||||
int i1 = l + QuartPos.fromBlock(s.getHeight()) - 1;
|
|
||||||
PalettedContainer<Holder<net.minecraft.world.level.biome.Biome>> palette = getPalette(s, s.getSectionIndex(QuartPos.toBlock(Mth.clamp(y, l, i1))));
|
|
||||||
int index = getPaletteIndex(x, y, z, s, palette);
|
|
||||||
int data = getPaletteDataId(palette, biome);
|
|
||||||
setPaletteData(palette, index, data);*/
|
|
||||||
} catch(IllegalAccessException e) {
|
} catch(IllegalAccessException e) {
|
||||||
Iris.reportError(e);
|
Iris.reportError(e);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private PalettedContainer<Holder<net.minecraft.world.level.biome.Biome>> getPalette(ChunkAccess ca, int index) {
|
|
||||||
LevelChunkSection[] sections = fieldForClass(LevelChunkSection[].class, ChunkAccess.class, ca);
|
|
||||||
return fieldForClass(PalettedContainer.class, LevelChunkSection.class, sections[index]);
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getPaletteIndex(int x, int y, int z, ChunkAccess s, PalettedContainer<?> palette) {
|
|
||||||
int l = QuartPos.fromBlock(s.getMinBuildHeight());
|
|
||||||
int i1 = l + QuartPos.fromBlock(s.getHeight()) - 1;
|
|
||||||
int j1 = Mth.clamp(y, l, i1);
|
|
||||||
return fieldForClass(PalettedContainer.Strategy.class, PalettedContainer.class, palette).getIndex(x & 3, j1 & 3, z & 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
private <T extends Holder<?>> int getPaletteDataId(PalettedContainer<T> palette, T data) throws ClassNotFoundException {
|
|
||||||
Class<?> dataType = getClassType(PalettedContainer.class, 1);
|
|
||||||
Object paletteData = fieldFor(dataType, palette);
|
|
||||||
Palette<T> fuckinFinally = fieldForClass(Palette.class,dataType, paletteData);
|
|
||||||
return fuckinFinally.idFor(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setPaletteData(PalettedContainer<?> palette, int index, int data) throws ClassNotFoundException {
|
|
||||||
Class<?> dataType = getClassType(PalettedContainer.class, 1);
|
|
||||||
Object paletteData = fieldFor(dataType, palette);
|
|
||||||
BitStorage storage = fieldForClass(BitStorage.class, dataType, paletteData);
|
|
||||||
storage.set(index, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Field getFieldForBiomeStorage(Object storage) {
|
private Field getFieldForBiomeStorage(Object storage) {
|
||||||
Field f = biomeStorageCache;
|
Field f = biomeStorageCache;
|
||||||
|
|
||||||
@@ -29,6 +29,7 @@ import com.volmit.iris.util.scheduling.ChronoLatch;
|
|||||||
import com.volmit.iris.util.scheduling.J;
|
import com.volmit.iris.util.scheduling.J;
|
||||||
import com.volmit.iris.util.scheduling.Looper;
|
import com.volmit.iris.util.scheduling.Looper;
|
||||||
|
|
||||||
|
import java.util.concurrent.Semaphore;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.concurrent.atomic.AtomicLong;
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
@@ -55,10 +56,12 @@ public class IrisPregenerator {
|
|||||||
private final KSet<Position2> retry;
|
private final KSet<Position2> retry;
|
||||||
private final KSet<Position2> net;
|
private final KSet<Position2> net;
|
||||||
private final ChronoLatch cl;
|
private final ChronoLatch cl;
|
||||||
|
private final Semaphore limiter;
|
||||||
|
|
||||||
public IrisPregenerator(PregenTask task, PregeneratorMethod generator, PregenListener listener) {
|
public IrisPregenerator(PregenTask task, PregeneratorMethod generator, PregenListener listener) {
|
||||||
this.listener = listenify(listener);
|
this.listener = listenify(listener);
|
||||||
cl = new ChronoLatch(5000);
|
cl = new ChronoLatch(5000);
|
||||||
|
limiter = new Semaphore(Runtime.getRuntime().availableProcessors());
|
||||||
generatedRegions = new KSet<>();
|
generatedRegions = new KSet<>();
|
||||||
this.shutdown = new AtomicBoolean(false);
|
this.shutdown = new AtomicBoolean(false);
|
||||||
this.paused = new AtomicBoolean(false);
|
this.paused = new AtomicBoolean(false);
|
||||||
@@ -140,6 +143,7 @@ public class IrisPregenerator {
|
|||||||
generator.close();
|
generator.close();
|
||||||
ticker.interrupt();
|
ticker.interrupt();
|
||||||
listener.onClose();
|
listener.onClose();
|
||||||
|
getMantle().trim(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void visitRegion(int x, int z, boolean regions) {
|
private void visitRegion(int x, int z, boolean regions) {
|
||||||
@@ -162,12 +166,26 @@ public class IrisPregenerator {
|
|||||||
boolean hit = false;
|
boolean hit = false;
|
||||||
if(generator.supportsRegions(x, z, listener) && regions) {
|
if(generator.supportsRegions(x, z, listener) && regions) {
|
||||||
hit = true;
|
hit = true;
|
||||||
|
try {
|
||||||
|
limiter.acquire();
|
||||||
listener.onRegionGenerating(x, z);
|
listener.onRegionGenerating(x, z);
|
||||||
generator.generateRegion(x, z, listener);
|
generator.generateRegion(x, z, listener);
|
||||||
|
limiter.release();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
} else if(!regions) {
|
} else if(!regions) {
|
||||||
hit = true;
|
hit = true;
|
||||||
listener.onRegionGenerating(x, z);
|
listener.onRegionGenerating(x, z);
|
||||||
PregenTask.iterateRegion(x, z, (xx, zz) -> generator.generateChunk(xx, zz, listener));
|
PregenTask.iterateRegion(x, z, (xx, zz) -> {
|
||||||
|
try {
|
||||||
|
limiter.acquire();
|
||||||
|
generator.generateChunk(xx, zz, listener);
|
||||||
|
limiter.release();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(hit) {
|
if(hit) {
|
||||||
|
|||||||
@@ -0,0 +1,178 @@
|
|||||||
|
package com.volmit.iris.core.pregenerator;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.volmit.iris.Iris;
|
||||||
|
import com.volmit.iris.util.format.Form;
|
||||||
|
import com.volmit.iris.util.io.IO;
|
||||||
|
import com.volmit.iris.util.math.Position2;
|
||||||
|
import com.volmit.iris.util.math.Spiraler;
|
||||||
|
import com.volmit.iris.util.scheduling.ChronoLatch;
|
||||||
|
import com.volmit.iris.util.scheduling.J;
|
||||||
|
import io.papermc.lib.PaperLib;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.world.WorldUnloadEvent;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
public class LazyPregenerator extends Thread implements Listener
|
||||||
|
{
|
||||||
|
private final LazyPregenJob job;
|
||||||
|
private final File destination;
|
||||||
|
private final int maxPosition;
|
||||||
|
private final World world;
|
||||||
|
private final long rate;
|
||||||
|
private final ChronoLatch latch;
|
||||||
|
|
||||||
|
public LazyPregenerator(LazyPregenJob job, File destination)
|
||||||
|
{
|
||||||
|
this.job = job;
|
||||||
|
this.destination = destination;
|
||||||
|
this.maxPosition = new Spiraler(job.getRadiusBlocks() * 2, job.getRadiusBlocks() * 2, (x, z) -> {}).count();
|
||||||
|
this.world = Bukkit.getWorld(job.getWorld());
|
||||||
|
this.rate = Math.round((1D / (job.chunksPerMinute / 60D)) * 1000D);
|
||||||
|
this.latch = new ChronoLatch(60000);
|
||||||
|
}
|
||||||
|
|
||||||
|
public LazyPregenerator(File file) throws IOException {
|
||||||
|
this(new Gson().fromJson(IO.readAll(file), LazyPregenJob.class), file);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void on(WorldUnloadEvent e)
|
||||||
|
{
|
||||||
|
if(e.getWorld().equals(world)) {
|
||||||
|
interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
while(!interrupted()) {
|
||||||
|
J.sleep(rate);
|
||||||
|
tick();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
saveNow();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void tick() {
|
||||||
|
if(latch.flip())
|
||||||
|
{
|
||||||
|
save();
|
||||||
|
Iris.info("LazyGen: " + world.getName() + " RTT: " + Form.duration((Math.pow((job.radiusBlocks / 16D), 2) / job.chunksPerMinute) * 60 * 1000, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(job.getPosition() >= maxPosition)
|
||||||
|
{
|
||||||
|
if(job.isHealing())
|
||||||
|
{
|
||||||
|
int pos = (job.getHealingPosition() + 1) % maxPosition;
|
||||||
|
job.setHealingPosition(pos);
|
||||||
|
tickRegenerate(getChunk(pos));
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Iris.verbose("Completed Lazy Gen!");
|
||||||
|
interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int pos = job.getPosition() + 1;
|
||||||
|
job.setPosition(pos);
|
||||||
|
tickGenerate(getChunk(pos));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void tickGenerate(Position2 chunk) {
|
||||||
|
if(PaperLib.isPaper()) {
|
||||||
|
PaperLib.getChunkAtAsync(world, chunk.getX(), chunk.getZ(), true).thenAccept((i) -> Iris.verbose("Generated Async " + chunk));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
J.s(() -> world.getChunkAt(chunk.getX(), chunk.getZ()));
|
||||||
|
Iris.verbose("Generated " + chunk);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void tickRegenerate(Position2 chunk) {
|
||||||
|
J.s(() -> world.regenerateChunk(chunk.getX(), chunk.getZ()));
|
||||||
|
Iris.verbose("Regenerated " + chunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Position2 getChunk(int position)
|
||||||
|
{
|
||||||
|
int p = -1;
|
||||||
|
AtomicInteger xx = new AtomicInteger();
|
||||||
|
AtomicInteger zz = new AtomicInteger();
|
||||||
|
Spiraler s = new Spiraler(job.getRadiusBlocks() * 2, job.getRadiusBlocks() * 2, (x, z) -> {
|
||||||
|
xx.set(x);
|
||||||
|
zz.set(z);
|
||||||
|
});
|
||||||
|
|
||||||
|
while(s.hasNext() && p++ < position) {
|
||||||
|
s.next();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Position2(xx.get(), zz.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void save()
|
||||||
|
{
|
||||||
|
J.a(() -> {
|
||||||
|
try {
|
||||||
|
saveNow();
|
||||||
|
}
|
||||||
|
|
||||||
|
catch (Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveNow() throws IOException {
|
||||||
|
IO.writeAll(this.destination, new Gson().toJson(job));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void loadLazyGenerators()
|
||||||
|
{
|
||||||
|
for(World i : Bukkit.getWorlds())
|
||||||
|
{
|
||||||
|
File lazygen = new File(i.getWorldFolder(), "lazygen.json");
|
||||||
|
|
||||||
|
if(lazygen.exists()) {
|
||||||
|
try {
|
||||||
|
LazyPregenerator p = new LazyPregenerator(lazygen);
|
||||||
|
p.start();
|
||||||
|
Iris.info("Started Lazy Pregenerator: " + p.job);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
public static class LazyPregenJob
|
||||||
|
{
|
||||||
|
private String world;
|
||||||
|
@Builder.Default private int healingPosition = 0;
|
||||||
|
@Builder.Default private boolean healing = false;
|
||||||
|
@Builder.Default private int chunksPerMinute = 32; // 48 hours is roughly 5000 radius
|
||||||
|
@Builder.Default private int radiusBlocks = 5000;
|
||||||
|
@Builder.Default private int position = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -22,17 +22,7 @@ import com.volmit.iris.Iris;
|
|||||||
import com.volmit.iris.core.loader.IrisData;
|
import com.volmit.iris.core.loader.IrisData;
|
||||||
import com.volmit.iris.core.loader.IrisRegistrant;
|
import com.volmit.iris.core.loader.IrisRegistrant;
|
||||||
import com.volmit.iris.core.loader.ResourceLoader;
|
import com.volmit.iris.core.loader.ResourceLoader;
|
||||||
import com.volmit.iris.engine.object.annotations.ArrayType;
|
import com.volmit.iris.engine.object.annotations.*;
|
||||||
import com.volmit.iris.engine.object.annotations.Desc;
|
|
||||||
import com.volmit.iris.engine.object.annotations.MaxNumber;
|
|
||||||
import com.volmit.iris.engine.object.annotations.MinNumber;
|
|
||||||
import com.volmit.iris.engine.object.annotations.RegistryListBlockType;
|
|
||||||
import com.volmit.iris.engine.object.annotations.RegistryListFont;
|
|
||||||
import com.volmit.iris.engine.object.annotations.RegistryListItemType;
|
|
||||||
import com.volmit.iris.engine.object.annotations.RegistryListResource;
|
|
||||||
import com.volmit.iris.engine.object.annotations.RegistryListSpecialEntity;
|
|
||||||
import com.volmit.iris.engine.object.annotations.Required;
|
|
||||||
import com.volmit.iris.engine.object.annotations.Snippet;
|
|
||||||
import com.volmit.iris.util.collection.KList;
|
import com.volmit.iris.util.collection.KList;
|
||||||
import com.volmit.iris.util.collection.KMap;
|
import com.volmit.iris.util.collection.KMap;
|
||||||
import com.volmit.iris.util.data.B;
|
import com.volmit.iris.util.data.B;
|
||||||
@@ -52,7 +42,7 @@ public class SchemaBuilder {
|
|||||||
private static final String SYMBOL_LIMIT__N = "*";
|
private static final String SYMBOL_LIMIT__N = "*";
|
||||||
private static final String SYMBOL_TYPE__N = "";
|
private static final String SYMBOL_TYPE__N = "";
|
||||||
private static final JSONArray POTION_TYPES = getPotionTypes();
|
private static final JSONArray POTION_TYPES = getPotionTypes();
|
||||||
private static final JSONArray ENCHANT_TYPES = getEnchantmentTypes();
|
private static final JSONArray ENCHANT_TYPES = getEnchantTypes();
|
||||||
private static final JSONArray ITEM_TYPES = new JSONArray(B.getItemTypes());
|
private static final JSONArray ITEM_TYPES = new JSONArray(B.getItemTypes());
|
||||||
private static final JSONArray FONT_TYPES = new JSONArray(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames());
|
private static final JSONArray FONT_TYPES = new JSONArray(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames());
|
||||||
private final KMap<String, JSONObject> definitions;
|
private final KMap<String, JSONObject> definitions;
|
||||||
@@ -67,16 +57,6 @@ public class SchemaBuilder {
|
|||||||
this.root = root;
|
this.root = root;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static JSONArray getEnchantmentTypes() {
|
|
||||||
JSONArray a = new JSONArray();
|
|
||||||
|
|
||||||
for(Field gg : Enchantment.class.getDeclaredFields()) {
|
|
||||||
a.put(gg.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static JSONArray getPotionTypes() {
|
private static JSONArray getPotionTypes() {
|
||||||
JSONArray a = new JSONArray();
|
JSONArray a = new JSONArray();
|
||||||
|
|
||||||
@@ -87,6 +67,14 @@ public class SchemaBuilder {
|
|||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static JSONArray getEnchantTypes() {
|
||||||
|
JSONArray array = new JSONArray();
|
||||||
|
for(Enchantment e : Enchantment.values()) {
|
||||||
|
array.put(e.getKey().getKey());
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
public JSONObject construct() {
|
public JSONObject construct() {
|
||||||
JSONObject schema = new JSONObject();
|
JSONObject schema = new JSONObject();
|
||||||
schema.put("$schema", "http://json-schema.org/draft-07/schema#");
|
schema.put("$schema", "http://json-schema.org/draft-07/schema#");
|
||||||
@@ -309,7 +297,7 @@ public class SchemaBuilder {
|
|||||||
prop.put("$ref", "#/definitions/" + key);
|
prop.put("$ref", "#/definitions/" + key);
|
||||||
description.add(SYMBOL_TYPE__N + " Must be a valid Font Family (use ctrl+space for auto complete!)");
|
description.add(SYMBOL_TYPE__N + " Must be a valid Font Family (use ctrl+space for auto complete!)");
|
||||||
|
|
||||||
} else if(k.getType().equals(Enchantment.class)) {
|
} else if(k.isAnnotationPresent(RegistryListEnchantment.class)) {
|
||||||
String key = "enum-enchantment";
|
String key = "enum-enchantment";
|
||||||
|
|
||||||
if(!definitions.containsKey(key)) {
|
if(!definitions.containsKey(key)) {
|
||||||
@@ -483,7 +471,7 @@ public class SchemaBuilder {
|
|||||||
items.put("$ref", "#/definitions/" + key);
|
items.put("$ref", "#/definitions/" + key);
|
||||||
prop.put("items", items);
|
prop.put("items", items);
|
||||||
description.add(SYMBOL_TYPE__N + " Must be a valid Font Family (use ctrl+space for auto complete!)");
|
description.add(SYMBOL_TYPE__N + " Must be a valid Font Family (use ctrl+space for auto complete!)");
|
||||||
} else if(t.type().equals(Enchantment.class)) {
|
} else if(k.isAnnotationPresent(RegistryListEnchantment.class)) {
|
||||||
fancyType = "List of Enchantment Types";
|
fancyType = "List of Enchantment Types";
|
||||||
String key = "enum-enchantment";
|
String key = "enum-enchantment";
|
||||||
|
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ public class StudioSVC implements IrisService {
|
|||||||
String[] nodes = url.split("\\Q/\\E");
|
String[] nodes = url.split("\\Q/\\E");
|
||||||
String repo = nodes.length == 1 ? "IrisDimensions/" + nodes[0] : nodes[0] + "/" + nodes[1];
|
String repo = nodes.length == 1 ? "IrisDimensions/" + nodes[0] : nodes[0] + "/" + nodes[1];
|
||||||
branch = nodes.length > 2 ? nodes[2] : branch;
|
branch = nodes.length > 2 ? nodes[2] : branch;
|
||||||
download(sender, repo, branch, trim, forceOverwrite);
|
download(sender, repo, branch, trim, forceOverwrite, false);
|
||||||
} catch(Throwable e) {
|
} catch(Throwable e) {
|
||||||
Iris.reportError(e);
|
Iris.reportError(e);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -179,12 +179,22 @@ public class StudioSVC implements IrisService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void download(VolmitSender sender, String repo, String branch, boolean trim) throws JsonSyntaxException, IOException {
|
public void downloadRelease(VolmitSender sender, String url, boolean trim, boolean forceOverwrite) {
|
||||||
download(sender, repo, branch, trim, false);
|
try {
|
||||||
|
download(sender, "IrisDimensions", url, trim, forceOverwrite, true);
|
||||||
|
} catch(Throwable e) {
|
||||||
|
Iris.reportError(e);
|
||||||
|
e.printStackTrace();
|
||||||
|
sender.sendMessage("Failed to download 'IrisDimensions/overworld' from " + url + ".");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void download(VolmitSender sender, String repo, String branch, boolean trim, boolean forceOverwrite) throws JsonSyntaxException, IOException {
|
public void download(VolmitSender sender, String repo, String branch, boolean trim) throws JsonSyntaxException, IOException {
|
||||||
String url = "https://codeload.github.com/" + repo + "/zip/refs/heads/" + branch;
|
download(sender, repo, branch, trim, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void download(VolmitSender sender, String repo, String branch, boolean trim, boolean forceOverwrite, boolean directUrl) throws JsonSyntaxException, IOException {
|
||||||
|
String url = directUrl ? branch : "https://codeload.github.com/" + repo + "/zip/refs/heads/" + branch;
|
||||||
sender.sendMessage("Downloading " + url + " "); //The extra space stops a bug in adventure API from repeating the last letter of the URL
|
sender.sendMessage("Downloading " + url + " "); //The extra space stops a bug in adventure API from repeating the last letter of the URL
|
||||||
File zip = Iris.getNonCachedFile("pack-" + trim + "-" + repo, url);
|
File zip = Iris.getNonCachedFile("pack-" + trim + "-" + repo, url);
|
||||||
File temp = Iris.getTemp();
|
File temp = Iris.getTemp();
|
||||||
|
|||||||
@@ -38,8 +38,11 @@ import org.bukkit.GameRule;
|
|||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.WorldCreator;
|
import org.bukkit.WorldCreator;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
@@ -102,6 +105,9 @@ public class IrisCreator {
|
|||||||
throw new IrisException("Dimension cannot be found null for id " + dimension());
|
throw new IrisException("Dimension cannot be found null for id " + dimension());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(sender == null)
|
||||||
|
sender = Iris.getSender();
|
||||||
|
|
||||||
if(!studio()) {
|
if(!studio()) {
|
||||||
Iris.service(StudioSVC.class).installIntoWorld(sender, d.getLoadKey(), new File(name()));
|
Iris.service(StudioSVC.class).installIntoWorld(sender, d.getLoadKey(), new File(name()));
|
||||||
}
|
}
|
||||||
@@ -174,7 +180,8 @@ public class IrisCreator {
|
|||||||
world.get().setTime(6000);
|
world.get().setTime(6000);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
} else
|
||||||
|
addToBukkitYml();
|
||||||
|
|
||||||
if(pregen != null) {
|
if(pregen != null) {
|
||||||
CompletableFuture<Boolean> ff = new CompletableFuture<>();
|
CompletableFuture<Boolean> ff = new CompletableFuture<>();
|
||||||
@@ -204,7 +211,38 @@ public class IrisCreator {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return world.get();
|
return world.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final File BUKKIT_YML = new File(Bukkit.getServer().getWorldContainer(), "bukkit.yml");
|
||||||
|
|
||||||
|
private void addToBukkitYml() {
|
||||||
|
YamlConfiguration yml = YamlConfiguration.loadConfiguration(BUKKIT_YML);
|
||||||
|
String gen = "Iris:" + dimension;
|
||||||
|
ConfigurationSection section = yml.contains("worlds") ? yml.getConfigurationSection("worlds") : yml.createSection("worlds");
|
||||||
|
if(!section.contains(name)) {
|
||||||
|
section.createSection(name).set("generator", gen);
|
||||||
|
try {
|
||||||
|
yml.save(BUKKIT_YML);
|
||||||
|
Iris.info("Registered \"" + name + "\" in bukkit.yml");
|
||||||
|
} catch(IOException e) {
|
||||||
|
Iris.error("Failed to update bukkit.yml!");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean removeFromBukkitYml(String name) throws IOException {
|
||||||
|
YamlConfiguration yml = YamlConfiguration.loadConfiguration(BUKKIT_YML);
|
||||||
|
ConfigurationSection section = yml.getConfigurationSection("worlds");
|
||||||
|
if (section == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
section.set(name, null);
|
||||||
|
if (section.getValues(false).keySet().stream().noneMatch(k -> section.get(k) != null)) {
|
||||||
|
yml.set("worlds", null);
|
||||||
|
}
|
||||||
|
yml.save(BUKKIT_YML);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import org.bukkit.block.data.BlockData;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -221,7 +222,6 @@ public class IrisToolbelt {
|
|||||||
new VolmitSender(j, Iris.instance.getTag()).sendMessage("You have been evacuated from this world. " + m);
|
new VolmitSender(j, Iris.instance.getTag()).sendMessage("You have been evacuated from this world. " + m);
|
||||||
j.teleport(i.getSpawnLocation());
|
j.teleport(i.getSpawnLocation());
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -248,4 +248,8 @@ public class IrisToolbelt {
|
|||||||
if(e == null) {return;}
|
if(e == null) {return;}
|
||||||
e.getEngine().getMantle().getMantle().remove(x, y - world.getMinHeight(), z, of);
|
e.getEngine().getMantle().getMantle().remove(x, y - world.getMinHeight(), z, of);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean removeWorld(World world) throws IOException {
|
||||||
|
return IrisCreator.removeFromBukkitYml(world.getName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,11 +39,14 @@ import com.volmit.iris.util.math.RNG;
|
|||||||
import com.volmit.iris.util.noise.CNG;
|
import com.volmit.iris.util.noise.CNG;
|
||||||
import com.volmit.iris.util.stream.ProceduralStream;
|
import com.volmit.iris.util.stream.ProceduralStream;
|
||||||
import com.volmit.iris.util.stream.interpolation.Interpolated;
|
import com.volmit.iris.util.stream.interpolation.Interpolated;
|
||||||
|
import com.volmit.iris.util.stream.utility.WasteDetector;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@@ -112,96 +115,97 @@ public class IrisComplex implements DataProvider {
|
|||||||
.getAllBiomes(this).forEach((b) -> b
|
.getAllBiomes(this).forEach((b) -> b
|
||||||
.getGenerators()
|
.getGenerators()
|
||||||
.forEach((c) -> registerGenerator(c.getCachedGenerator(this)))));
|
.forEach((c) -> registerGenerator(c.getCachedGenerator(this)))));
|
||||||
overlayStream = ProceduralStream.ofDouble((x, z) -> 0.0D);
|
overlayStream = ProceduralStream.ofDouble((x, z) -> 0.0D).waste("Overlay Stream");
|
||||||
engine.getDimension().getOverlayNoise().forEach(i -> overlayStream = overlayStream.add((x, z) -> i.get(rng, getData(), x, z)));
|
engine.getDimension().getOverlayNoise().forEach(i -> overlayStream = overlayStream.add((x, z) -> i.get(rng, getData(), x, z)));
|
||||||
rockStream = engine.getDimension().getRockPalette().getLayerGenerator(rng.nextParallelRNG(45), data).stream()
|
rockStream = engine.getDimension().getRockPalette().getLayerGenerator(rng.nextParallelRNG(45), data).stream()
|
||||||
.select(engine.getDimension().getRockPalette().getBlockData(data));
|
.select(engine.getDimension().getRockPalette().getBlockData(data)).waste("Rock Stream");
|
||||||
fluidStream = engine.getDimension().getFluidPalette().getLayerGenerator(rng.nextParallelRNG(78), data).stream()
|
fluidStream = engine.getDimension().getFluidPalette().getLayerGenerator(rng.nextParallelRNG(78), data).stream()
|
||||||
.select(engine.getDimension().getFluidPalette().getBlockData(data));
|
.select(engine.getDimension().getFluidPalette().getBlockData(data)).waste("Fluid Stream");
|
||||||
regionStyleStream = engine.getDimension().getRegionStyle().create(rng.nextParallelRNG(883), getData()).stream()
|
regionStyleStream = engine.getDimension().getRegionStyle().create(rng.nextParallelRNG(883), getData()).stream()
|
||||||
.zoom(engine.getDimension().getRegionZoom());
|
.zoom(engine.getDimension().getRegionZoom()).waste("Region Style");
|
||||||
regionIdentityStream = regionStyleStream.fit(Integer.MIN_VALUE, Integer.MAX_VALUE);
|
regionIdentityStream = regionStyleStream.fit(Integer.MIN_VALUE, Integer.MAX_VALUE).waste("Region Identity Stream");
|
||||||
regionStream = focusRegion != null ?
|
regionStream = focusRegion != null ?
|
||||||
ProceduralStream.of((x, z) -> focusRegion,
|
ProceduralStream.of((x, z) -> focusRegion,
|
||||||
Interpolated.of(a -> 0D, a -> focusRegion))
|
Interpolated.of(a -> 0D, a -> focusRegion))
|
||||||
: regionStyleStream
|
: regionStyleStream
|
||||||
.selectRarity(data.getRegionLoader().loadAll(engine.getDimension().getRegions()))
|
.selectRarity(data.getRegionLoader().loadAll(engine.getDimension().getRegions()))
|
||||||
.cache2D("regionStream", engine, cacheSize);
|
.cache2D("regionStream", engine, cacheSize).waste("Region Stream");
|
||||||
regionIDStream = regionIdentityStream.convertCached((i) -> new UUID(Double.doubleToLongBits(i), String.valueOf(i * 38445).hashCode() * 3245556666L));
|
regionIDStream = regionIdentityStream.convertCached((i) -> new UUID(Double.doubleToLongBits(i),
|
||||||
|
String.valueOf(i * 38445).hashCode() * 3245556666L)).waste("Region ID Stream");
|
||||||
caveBiomeStream = regionStream.convert((r)
|
caveBiomeStream = regionStream.convert((r)
|
||||||
-> engine.getDimension().getCaveBiomeStyle().create(rng.nextParallelRNG(InferredType.CAVE.ordinal()), getData()).stream()
|
-> engine.getDimension().getCaveBiomeStyle().create(rng.nextParallelRNG(InferredType.CAVE.ordinal()), getData()).stream()
|
||||||
.zoom(r.getCaveBiomeZoom())
|
.zoom(r.getCaveBiomeZoom())
|
||||||
.selectRarity(data.getBiomeLoader().loadAll(r.getCaveBiomes()))
|
.selectRarity(data.getBiomeLoader().loadAll(r.getCaveBiomes()))
|
||||||
.onNull(emptyBiome)
|
.onNull(emptyBiome)
|
||||||
).convertAware2D(ProceduralStream::get).cache2D("caveBiomeStream", engine, cacheSize);
|
).convertAware2D(ProceduralStream::get).cache2D("caveBiomeStream", engine, cacheSize).waste("Cave Biome Stream");
|
||||||
inferredStreams.put(InferredType.CAVE, caveBiomeStream);
|
inferredStreams.put(InferredType.CAVE, caveBiomeStream);
|
||||||
landBiomeStream = regionStream.convert((r)
|
landBiomeStream = regionStream.convert((r)
|
||||||
-> engine.getDimension().getLandBiomeStyle().create(rng.nextParallelRNG(InferredType.LAND.ordinal()), getData()).stream()
|
-> engine.getDimension().getLandBiomeStyle().create(rng.nextParallelRNG(InferredType.LAND.ordinal()), getData()).stream()
|
||||||
.zoom(r.getLandBiomeZoom())
|
.zoom(r.getLandBiomeZoom())
|
||||||
.selectRarity(data.getBiomeLoader().loadAll(r.getLandBiomes(), (t) -> t.setInferredType(InferredType.LAND)))
|
.selectRarity(data.getBiomeLoader().loadAll(r.getLandBiomes(), (t) -> t.setInferredType(InferredType.LAND)))
|
||||||
).convertAware2D(ProceduralStream::get)
|
).convertAware2D(ProceduralStream::get)
|
||||||
.cache2D("landBiomeStream", engine, cacheSize);
|
.cache2D("landBiomeStream", engine, cacheSize).waste("Land Biome Stream");
|
||||||
inferredStreams.put(InferredType.LAND, landBiomeStream);
|
inferredStreams.put(InferredType.LAND, landBiomeStream);
|
||||||
seaBiomeStream = regionStream.convert((r)
|
seaBiomeStream = regionStream.convert((r)
|
||||||
-> engine.getDimension().getSeaBiomeStyle().create(rng.nextParallelRNG(InferredType.SEA.ordinal()), getData()).stream()
|
-> engine.getDimension().getSeaBiomeStyle().create(rng.nextParallelRNG(InferredType.SEA.ordinal()), getData()).stream()
|
||||||
.zoom(r.getSeaBiomeZoom())
|
.zoom(r.getSeaBiomeZoom())
|
||||||
.selectRarity(data.getBiomeLoader().loadAll(r.getSeaBiomes(), (t) -> t.setInferredType(InferredType.SEA)))
|
.selectRarity(data.getBiomeLoader().loadAll(r.getSeaBiomes(), (t) -> t.setInferredType(InferredType.SEA)))
|
||||||
).convertAware2D(ProceduralStream::get)
|
).convertAware2D(ProceduralStream::get)
|
||||||
.cache2D("seaBiomeStream", engine, cacheSize);
|
.cache2D("seaBiomeStream", engine, cacheSize).waste("Sea Biome Stream");
|
||||||
inferredStreams.put(InferredType.SEA, seaBiomeStream);
|
inferredStreams.put(InferredType.SEA, seaBiomeStream);
|
||||||
shoreBiomeStream = regionStream.convert((r)
|
shoreBiomeStream = regionStream.convert((r)
|
||||||
-> engine.getDimension().getShoreBiomeStyle().create(rng.nextParallelRNG(InferredType.SHORE.ordinal()), getData()).stream()
|
-> engine.getDimension().getShoreBiomeStyle().create(rng.nextParallelRNG(InferredType.SHORE.ordinal()), getData()).stream()
|
||||||
.zoom(r.getShoreBiomeZoom())
|
.zoom(r.getShoreBiomeZoom())
|
||||||
.selectRarity(data.getBiomeLoader().loadAll(r.getShoreBiomes(), (t) -> t.setInferredType(InferredType.SHORE)))
|
.selectRarity(data.getBiomeLoader().loadAll(r.getShoreBiomes(), (t) -> t.setInferredType(InferredType.SHORE)))
|
||||||
).convertAware2D(ProceduralStream::get).cache2D("shoreBiomeStream", engine, cacheSize);
|
).convertAware2D(ProceduralStream::get).cache2D("shoreBiomeStream", engine, cacheSize).waste("Shore Biome Stream");
|
||||||
inferredStreams.put(InferredType.SHORE, shoreBiomeStream);
|
inferredStreams.put(InferredType.SHORE, shoreBiomeStream);
|
||||||
bridgeStream = focusBiome != null ? ProceduralStream.of((x, z) -> focusBiome.getInferredType(),
|
bridgeStream = focusBiome != null ? ProceduralStream.of((x, z) -> focusBiome.getInferredType(),
|
||||||
Interpolated.of(a -> 0D, a -> focusBiome.getInferredType())) :
|
Interpolated.of(a -> 0D, a -> focusBiome.getInferredType())) :
|
||||||
engine.getDimension().getContinentalStyle().create(rng.nextParallelRNG(234234565), getData())
|
engine.getDimension().getContinentalStyle().create(rng.nextParallelRNG(234234565), getData())
|
||||||
.bake().scale(1D / engine.getDimension().getContinentZoom()).bake().stream()
|
.bake().scale(1D / engine.getDimension().getContinentZoom()).bake().stream()
|
||||||
.convert((v) -> v >= engine.getDimension().getLandChance() ? InferredType.SEA : InferredType.LAND)
|
.convert((v) -> v >= engine.getDimension().getLandChance() ? InferredType.SEA : InferredType.LAND)
|
||||||
.cache2D("bridgeStream", engine, cacheSize);
|
.cache2D("bridgeStream", engine, cacheSize).waste("Bridge Stream");
|
||||||
baseBiomeStream = focusBiome != null ? ProceduralStream.of((x, z) -> focusBiome,
|
baseBiomeStream = focusBiome != null ? ProceduralStream.of((x, z) -> focusBiome,
|
||||||
Interpolated.of(a -> 0D, a -> focusBiome)) :
|
Interpolated.of(a -> 0D, a -> focusBiome)) :
|
||||||
bridgeStream.convertAware2D((t, x, z) -> inferredStreams.get(t).get(x, z))
|
bridgeStream.convertAware2D((t, x, z) -> inferredStreams.get(t).get(x, z))
|
||||||
.convertAware2D(this::implode)
|
.convertAware2D(this::implode)
|
||||||
.cache2D("baseBiomeStream", engine, cacheSize);
|
.cache2D("baseBiomeStream", engine, cacheSize).waste("Base Biome Stream");
|
||||||
heightStream = ProceduralStream.of((x, z) -> {
|
heightStream = ProceduralStream.of((x, z) -> {
|
||||||
IrisBiome b = focusBiome != null ? focusBiome : baseBiomeStream.get(x, z);
|
IrisBiome b = focusBiome != null ? focusBiome : baseBiomeStream.get(x, z);
|
||||||
return getHeight(engine, b, x, z, engine.getSeedManager().getHeight());
|
return getHeight(engine, b, x, z, engine.getSeedManager().getHeight());
|
||||||
}, Interpolated.DOUBLE).clamp(0, engine.getHeight()).cache2D("heightStream", engine, cacheSize);
|
}, Interpolated.DOUBLE).clamp(0, engine.getHeight()).cache2D("heightStream", engine, cacheSize).waste("Height Stream");
|
||||||
roundedHeighteightStream = heightStream.round();
|
roundedHeighteightStream = heightStream.round().waste("Rounded Height Stream");
|
||||||
slopeStream = heightStream.slope(3).cache2D("slopeStream", engine, cacheSize);
|
slopeStream = heightStream.slope(3).cache2D("slopeStream", engine, cacheSize).waste("Slope Stream");
|
||||||
trueBiomeStream = focusBiome != null ? ProceduralStream.of((x, y) -> focusBiome, Interpolated.of(a -> 0D,
|
trueBiomeStream = focusBiome != null ? ProceduralStream.of((x, y) -> focusBiome, Interpolated.of(a -> 0D,
|
||||||
b -> focusBiome))
|
b -> focusBiome))
|
||||||
.cache2D("trueBiomeStream-focus", engine, cacheSize) : heightStream
|
.cache2D("trueBiomeStream-focus", engine, cacheSize) : heightStream
|
||||||
.convertAware2D((h, x, z) ->
|
.convertAware2D((h, x, z) ->
|
||||||
fixBiomeType(h, baseBiomeStream.get(x, z),
|
fixBiomeType(h, baseBiomeStream.get(x, z),
|
||||||
regionStream.get(x, z), x, z, fluidHeight))
|
regionStream.get(x, z), x, z, fluidHeight))
|
||||||
.cache2D("trueBiomeStream", engine, cacheSize);
|
.cache2D("trueBiomeStream", engine, cacheSize).waste("True Biome Stream");
|
||||||
trueBiomeDerivativeStream = trueBiomeStream.convert(IrisBiome::getDerivative).cache2D("trueBiomeDerivativeStream", engine, cacheSize);
|
trueBiomeDerivativeStream = trueBiomeStream.convert(IrisBiome::getDerivative).cache2D("trueBiomeDerivativeStream", engine, cacheSize).waste("True Biome Derivative Stream");
|
||||||
heightFluidStream = heightStream.max(fluidHeight).cache2D("heightFluidStream", engine, cacheSize);
|
heightFluidStream = heightStream.max(fluidHeight).cache2D("heightFluidStream", engine, cacheSize).waste("Height Fluid Stream");
|
||||||
maxHeightStream = ProceduralStream.ofDouble((x, z) -> height);
|
maxHeightStream = ProceduralStream.ofDouble((x, z) -> height).waste("Max Height Stream");
|
||||||
terrainSurfaceDecoration = trueBiomeStream
|
terrainSurfaceDecoration = trueBiomeStream
|
||||||
.convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.NONE)).cache2D("terrainSurfaceDecoration", engine, cacheSize);
|
.convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.NONE)).cache2D("terrainSurfaceDecoration", engine, cacheSize).waste("Surface Decoration Stream");
|
||||||
terrainCeilingDecoration = trueBiomeStream
|
terrainCeilingDecoration = trueBiomeStream
|
||||||
.convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.CEILING)).cache2D("terrainCeilingDecoration", engine, cacheSize);
|
.convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.CEILING)).cache2D("terrainCeilingDecoration", engine, cacheSize).waste("Ceiling Decoration Stream");
|
||||||
terrainCaveSurfaceDecoration = caveBiomeStream
|
terrainCaveSurfaceDecoration = caveBiomeStream
|
||||||
.convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.NONE)).cache2D("terrainCaveSurfaceDecoration", engine, cacheSize);
|
.convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.NONE)).cache2D("terrainCaveSurfaceDecoration", engine, cacheSize).waste("Cave Surface Stream");
|
||||||
terrainCaveCeilingDecoration = caveBiomeStream
|
terrainCaveCeilingDecoration = caveBiomeStream
|
||||||
.convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.CEILING)).cache2D("terrainCaveCeilingDecoration", engine, cacheSize);
|
.convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.CEILING)).cache2D("terrainCaveCeilingDecoration", engine, cacheSize).waste("Cave Ceiling Stream");
|
||||||
shoreSurfaceDecoration = trueBiomeStream
|
shoreSurfaceDecoration = trueBiomeStream
|
||||||
.convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.SHORE_LINE)).cache2D("shoreSurfaceDecoration", engine, cacheSize);
|
.convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.SHORE_LINE)).cache2D("shoreSurfaceDecoration", engine, cacheSize).waste("Shore Surface Stream");
|
||||||
seaSurfaceDecoration = trueBiomeStream
|
seaSurfaceDecoration = trueBiomeStream
|
||||||
.convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.SEA_SURFACE)).cache2D("seaSurfaceDecoration", engine, cacheSize);
|
.convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.SEA_SURFACE)).cache2D("seaSurfaceDecoration", engine, cacheSize).waste("Sea Surface Stream");
|
||||||
seaFloorDecoration = trueBiomeStream
|
seaFloorDecoration = trueBiomeStream
|
||||||
.convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.SEA_FLOOR)).cache2D("seaFloorDecoration", engine, cacheSize);
|
.convertAware2D((b, xx, zz) -> decorateFor(b, xx, zz, IrisDecorationPart.SEA_FLOOR)).cache2D("seaFloorDecoration", engine, cacheSize).waste("Sea Floor Stream");
|
||||||
baseBiomeIDStream = trueBiomeStream.convertAware2D((b, x, z) -> {
|
baseBiomeIDStream = trueBiomeStream.convertAware2D((b, x, z) -> {
|
||||||
UUID d = regionIDStream.get(x, z);
|
UUID d = regionIDStream.get(x, z);
|
||||||
return new UUID(b.getLoadKey().hashCode() * 818223L,
|
return new UUID(b.getLoadKey().hashCode() * 818223L,
|
||||||
d.hashCode());
|
d.hashCode());
|
||||||
})
|
})
|
||||||
.cache2D("", engine, cacheSize);
|
.cache2D("", engine, cacheSize).waste("Biome ID Stream");
|
||||||
//@done
|
//@done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import com.volmit.iris.engine.object.IrisRegion;
|
|||||||
import com.volmit.iris.engine.scripting.EngineExecutionEnvironment;
|
import com.volmit.iris.engine.scripting.EngineExecutionEnvironment;
|
||||||
import com.volmit.iris.util.atomics.AtomicRollingSequence;
|
import com.volmit.iris.util.atomics.AtomicRollingSequence;
|
||||||
import com.volmit.iris.util.collection.KMap;
|
import com.volmit.iris.util.collection.KMap;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.context.IrisContext;
|
import com.volmit.iris.util.context.IrisContext;
|
||||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
import com.volmit.iris.util.format.C;
|
import com.volmit.iris.util.format.C;
|
||||||
@@ -192,8 +193,8 @@ public class IrisEngine implements Engine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void generateMatter(int x, int z, boolean multicore) {
|
public void generateMatter(int x, int z, boolean multicore, ChunkContext context) {
|
||||||
getMantle().generateMatter(x, z, multicore);
|
getMantle().generateMatter(x, z, multicore, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -20,20 +20,10 @@ package com.volmit.iris.engine;
|
|||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.core.IrisSettings;
|
import com.volmit.iris.core.IrisSettings;
|
||||||
import com.volmit.iris.engine.data.cache.Cache;
|
import com.volmit.iris.core.loader.IrisData;
|
||||||
import com.volmit.iris.engine.framework.Engine;
|
import com.volmit.iris.engine.framework.Engine;
|
||||||
import com.volmit.iris.engine.framework.EngineAssignedWorldManager;
|
import com.volmit.iris.engine.framework.EngineAssignedWorldManager;
|
||||||
import com.volmit.iris.engine.object.IRare;
|
import com.volmit.iris.engine.object.*;
|
||||||
import com.volmit.iris.engine.object.IrisBiome;
|
|
||||||
import com.volmit.iris.engine.object.IrisBlockDrops;
|
|
||||||
import com.volmit.iris.engine.object.IrisEngineChunkData;
|
|
||||||
import com.volmit.iris.engine.object.IrisEngineData;
|
|
||||||
import com.volmit.iris.engine.object.IrisEngineSpawnerCooldown;
|
|
||||||
import com.volmit.iris.engine.object.IrisEntitySpawn;
|
|
||||||
import com.volmit.iris.engine.object.IrisMarker;
|
|
||||||
import com.volmit.iris.engine.object.IrisPosition;
|
|
||||||
import com.volmit.iris.engine.object.IrisRegion;
|
|
||||||
import com.volmit.iris.engine.object.IrisSpawner;
|
|
||||||
import com.volmit.iris.util.collection.KList;
|
import com.volmit.iris.util.collection.KList;
|
||||||
import com.volmit.iris.util.collection.KMap;
|
import com.volmit.iris.util.collection.KMap;
|
||||||
import com.volmit.iris.util.collection.KSet;
|
import com.volmit.iris.util.collection.KSet;
|
||||||
@@ -55,6 +45,7 @@ import lombok.Data;
|
|||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import org.bukkit.Chunk;
|
import org.bukkit.Chunk;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.World;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.LivingEntity;
|
import org.bukkit.entity.LivingEntity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
@@ -69,7 +60,6 @@ import java.util.Set;
|
|||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
@@ -617,7 +607,6 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
|
|||||||
@Override
|
@Override
|
||||||
public void onBlockBreak(BlockBreakEvent e) {
|
public void onBlockBreak(BlockBreakEvent e) {
|
||||||
if(e.getBlock().getWorld().equals(getTarget().getWorld().realWorld())) {
|
if(e.getBlock().getWorld().equals(getTarget().getWorld().realWorld())) {
|
||||||
|
|
||||||
J.a(() -> {
|
J.a(() -> {
|
||||||
MatterMarker marker = getMantle().get(e.getBlock().getX(), e.getBlock().getY(), e.getBlock().getZ(), MatterMarker.class);
|
MatterMarker marker = getMantle().get(e.getBlock().getX(), e.getBlock().getY(), e.getBlock().getZ(), MatterMarker.class);
|
||||||
|
|
||||||
@@ -634,53 +623,31 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
KList<ItemStack> d = new KList<>();
|
/*KList<ItemStack> d = new KList<>();
|
||||||
Runnable drop = () -> J.s(() -> d.forEach((i) -> e.getBlock().getWorld().dropItemNaturally(e.getBlock().getLocation().clone().add(0.5, 0.5, 0.5), i)));
|
IrisBiome b = getEngine().getBiome(e.getBlock().getLocation().clone().subtract(0, getEngine().getWorld().minHeight(), 0));
|
||||||
IrisBiome b = getEngine().getBiome(e.getBlock().getLocation());
|
List<IrisBlockDrops> dropProviders = filterDrops(b.getBlockDrops(), e, getData());
|
||||||
|
|
||||||
if(dropItems(e, d, drop, b.getBlockDrops(), b)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if(dropProviders.stream().noneMatch(IrisBlockDrops::isSkipParents)) {
|
||||||
IrisRegion r = getEngine().getRegion(e.getBlock().getLocation());
|
IrisRegion r = getEngine().getRegion(e.getBlock().getLocation());
|
||||||
|
dropProviders.addAll(filterDrops(r.getBlockDrops(), e, getData()));
|
||||||
if(dropItems(e, d, drop, r.getBlockDrops(), b)) {
|
dropProviders.addAll(filterDrops(getEngine().getDimension().getBlockDrops(), e, getData()));
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(IrisBlockDrops i : getEngine().getDimension().getBlockDrops()) {
|
dropProviders.forEach(provider -> provider.fillDrops(false, d));
|
||||||
if(i.shouldDropFor(e.getBlock().getBlockData(), getData())) {
|
|
||||||
if(i.isReplaceVanillaDrops()) {
|
if(dropProviders.stream().anyMatch(IrisBlockDrops::isReplaceVanillaDrops)) {
|
||||||
e.setDropItems(false);
|
e.setDropItems(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
i.fillDrops(false, d);
|
if(d.isNotEmpty()) {
|
||||||
|
World w = e.getBlock().getWorld();
|
||||||
if(i.isSkipParents()) {
|
J.s(() -> d.forEach(item -> w.dropItemNaturally(e.getBlock().getLocation().clone().add(.5, .5, .5), item)));
|
||||||
drop.run();
|
}*/
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean dropItems(BlockBreakEvent e, KList<ItemStack> d, Runnable drop, KList<IrisBlockDrops> blockDrops, IrisBiome b) {
|
private List<IrisBlockDrops> filterDrops(KList<IrisBlockDrops> drops, BlockBreakEvent e, IrisData data) {
|
||||||
for(IrisBlockDrops i : blockDrops) {
|
return new KList<>(drops.stream().filter(d -> d.shouldDropFor(e.getBlock().getBlockData(), data)).toList());
|
||||||
if(i.shouldDropFor(e.getBlock().getBlockData(), getData())) {
|
|
||||||
if(i.isReplaceVanillaDrops()) {
|
|
||||||
e.setDropItems(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
i.fillDrops(false, d);
|
|
||||||
|
|
||||||
if(i.isSkipParents()) {
|
|
||||||
drop.run();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -25,8 +25,10 @@ import com.volmit.iris.engine.framework.Engine;
|
|||||||
import com.volmit.iris.engine.framework.EngineAssignedActuator;
|
import com.volmit.iris.engine.framework.EngineAssignedActuator;
|
||||||
import com.volmit.iris.engine.object.IrisBiome;
|
import com.volmit.iris.engine.object.IrisBiome;
|
||||||
import com.volmit.iris.engine.object.IrisBiomeCustom;
|
import com.volmit.iris.engine.object.IrisBiomeCustom;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
import com.volmit.iris.util.hunk.Hunk;
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
|
import com.volmit.iris.util.hunk.view.BiomeGridHunkHolder;
|
||||||
import com.volmit.iris.util.hunk.view.BiomeGridHunkView;
|
import com.volmit.iris.util.hunk.view.BiomeGridHunkView;
|
||||||
import com.volmit.iris.util.math.RNG;
|
import com.volmit.iris.util.math.RNG;
|
||||||
import com.volmit.iris.util.parallel.BurstExecutor;
|
import com.volmit.iris.util.parallel.BurstExecutor;
|
||||||
@@ -56,6 +58,14 @@ public class IrisBiomeActuator extends EngineAssignedActuator<Biome> {
|
|||||||
hh.forceBiomeBaseInto(x, y, z, bb);
|
hh.forceBiomeBaseInto(x, y, z, bb);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
} else if(h instanceof BiomeGridHunkHolder hh) {
|
||||||
|
ChunkGenerator.BiomeGrid g = hh.getChunk();
|
||||||
|
if(g instanceof TerrainChunk) {
|
||||||
|
((TerrainChunk) g).getBiomeBaseInjector().setBiome(x, y, z, bb);
|
||||||
|
} else {
|
||||||
|
hh.forceBiomeBaseInto(x, y, z, bb);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
} catch(Throwable e) {
|
} catch(Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -66,7 +76,7 @@ public class IrisBiomeActuator extends EngineAssignedActuator<Biome> {
|
|||||||
|
|
||||||
@BlockCoordinates
|
@BlockCoordinates
|
||||||
@Override
|
@Override
|
||||||
public void onActuate(int x, int z, Hunk<Biome> h, boolean multicore) {
|
public void onActuate(int x, int z, Hunk<Biome> h, boolean multicore, ChunkContext context) {
|
||||||
PrecisionStopwatch p = PrecisionStopwatch.start();
|
PrecisionStopwatch p = PrecisionStopwatch.start();
|
||||||
BurstExecutor burst = burst().burst(PaperLib.isPaper() && multicore);
|
BurstExecutor burst = burst().burst(PaperLib.isPaper() && multicore);
|
||||||
|
|
||||||
@@ -75,7 +85,7 @@ public class IrisBiomeActuator extends EngineAssignedActuator<Biome> {
|
|||||||
burst.queue(() -> {
|
burst.queue(() -> {
|
||||||
IrisBiome ib;
|
IrisBiome ib;
|
||||||
for(int zf = 0; zf < h.getDepth(); zf++) {
|
for(int zf = 0; zf < h.getDepth(); zf++) {
|
||||||
ib = getComplex().getTrueBiomeStream().get(finalXf + x, zf + z);
|
ib = context.getBiome().get(finalXf, zf);
|
||||||
int maxHeight = (int) (getComplex().getFluidHeight() + ib.getMaxWithObjectHeight(getData()));
|
int maxHeight = (int) (getComplex().getFluidHeight() + ib.getMaxWithObjectHeight(getData()));
|
||||||
if(ib.isCustom()) {
|
if(ib.isCustom()) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import com.volmit.iris.engine.framework.Engine;
|
|||||||
import com.volmit.iris.engine.framework.EngineAssignedActuator;
|
import com.volmit.iris.engine.framework.EngineAssignedActuator;
|
||||||
import com.volmit.iris.engine.framework.EngineDecorator;
|
import com.volmit.iris.engine.framework.EngineDecorator;
|
||||||
import com.volmit.iris.engine.object.IrisBiome;
|
import com.volmit.iris.engine.object.IrisBiome;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
import com.volmit.iris.util.hunk.Hunk;
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
import com.volmit.iris.util.math.RNG;
|
import com.volmit.iris.util.math.RNG;
|
||||||
@@ -66,7 +67,7 @@ public class IrisDecorantActuator extends EngineAssignedActuator<BlockData> {
|
|||||||
|
|
||||||
@BlockCoordinates
|
@BlockCoordinates
|
||||||
@Override
|
@Override
|
||||||
public void onActuate(int x, int z, Hunk<BlockData> output, boolean multicore) {
|
public void onActuate(int x, int z, Hunk<BlockData> output, boolean multicore, ChunkContext context) {
|
||||||
if(!getEngine().getDimension().isDecorate()) {
|
if(!getEngine().getDimension().isDecorate()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -86,9 +87,9 @@ public class IrisDecorantActuator extends EngineAssignedActuator<BlockData> {
|
|||||||
int emptyFor = 0;
|
int emptyFor = 0;
|
||||||
int lastSolid = 0;
|
int lastSolid = 0;
|
||||||
realZ = Math.round(z + j);
|
realZ = Math.round(z + j);
|
||||||
height = (int) Math.round(getComplex().getHeightStream().get(realX, realZ));
|
height = (int) Math.round(context.getHeight().get(finalI, j));
|
||||||
biome = getComplex().getTrueBiomeStream().get(realX, realZ);
|
biome = context.getBiome().get(finalI, j);
|
||||||
cave = shouldRay ? getComplex().getCaveBiomeStream().get(realX, realZ) : null;
|
cave = shouldRay ? context.getCave().get(finalI, j) : null;
|
||||||
|
|
||||||
if(biome.getDecorators().isEmpty() && (cave == null || cave.getDecorators().isEmpty())) {
|
if(biome.getDecorators().isEmpty() && (cave == null || cave.getDecorators().isEmpty())) {
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import com.volmit.iris.engine.framework.EngineAssignedActuator;
|
|||||||
import com.volmit.iris.engine.object.IrisBiome;
|
import com.volmit.iris.engine.object.IrisBiome;
|
||||||
import com.volmit.iris.engine.object.IrisRegion;
|
import com.volmit.iris.engine.object.IrisRegion;
|
||||||
import com.volmit.iris.util.collection.KList;
|
import com.volmit.iris.util.collection.KList;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
import com.volmit.iris.util.hunk.Hunk;
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
import com.volmit.iris.util.math.RNG;
|
import com.volmit.iris.util.math.RNG;
|
||||||
@@ -50,13 +51,13 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator<BlockData>
|
|||||||
|
|
||||||
@BlockCoordinates
|
@BlockCoordinates
|
||||||
@Override
|
@Override
|
||||||
public void onActuate(int x, int z, Hunk<BlockData> h, boolean multicore) {
|
public void onActuate(int x, int z, Hunk<BlockData> h, boolean multicore, ChunkContext context) {
|
||||||
PrecisionStopwatch p = PrecisionStopwatch.start();
|
PrecisionStopwatch p = PrecisionStopwatch.start();
|
||||||
|
|
||||||
BurstExecutor e = burst().burst(multicore);
|
BurstExecutor e = burst().burst(multicore);
|
||||||
for(int xf = 0; xf < h.getWidth(); xf++) {
|
for(int xf = 0; xf < h.getWidth(); xf++) {
|
||||||
int finalXf = xf;
|
int finalXf = xf;
|
||||||
e.queue(() -> terrainSliver(x, z, finalXf, h));
|
e.queue(() -> terrainSliver(x, z, finalXf, h, context));
|
||||||
}
|
}
|
||||||
|
|
||||||
e.complete();
|
e.complete();
|
||||||
@@ -81,7 +82,7 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator<BlockData>
|
|||||||
* the blockdata
|
* the blockdata
|
||||||
*/
|
*/
|
||||||
@BlockCoordinates
|
@BlockCoordinates
|
||||||
public void terrainSliver(int x, int z, int xf, Hunk<BlockData> h) {
|
public void terrainSliver(int x, int z, int xf, Hunk<BlockData> h, ChunkContext context) {
|
||||||
int zf, realX, realZ, hf, he;
|
int zf, realX, realZ, hf, he;
|
||||||
IrisBiome biome;
|
IrisBiome biome;
|
||||||
IrisRegion region;
|
IrisRegion region;
|
||||||
@@ -89,9 +90,9 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator<BlockData>
|
|||||||
for(zf = 0; zf < h.getDepth(); zf++) {
|
for(zf = 0; zf < h.getDepth(); zf++) {
|
||||||
realX = xf + x;
|
realX = xf + x;
|
||||||
realZ = zf + z;
|
realZ = zf + z;
|
||||||
biome = getComplex().getTrueBiomeStream().get(realX, realZ);
|
biome = context.getBiome().get(xf, zf);
|
||||||
region = getComplex().getRegionStream().get(realX, realZ);
|
region = context.getRegion().get(xf, zf);
|
||||||
he = (int) Math.round(Math.min(h.getHeight(), getComplex().getHeightStream().get(realX, realZ)));
|
he = (int) Math.round(Math.min(h.getHeight(), context.getHeight().get(xf, zf)));
|
||||||
hf = Math.round(Math.max(Math.min(h.getHeight(), getDimension().getFluidHeight()), he));
|
hf = Math.round(Math.max(Math.min(h.getHeight(), getDimension().getFluidHeight()), he));
|
||||||
|
|
||||||
if(hf < 0) {
|
if(hf < 0) {
|
||||||
@@ -126,7 +127,7 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator<BlockData>
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
h.set(xf, i, zf, getComplex().getFluidStream().get(realX, +realZ));
|
h.set(xf, i, zf, context.getFluid().get(xf,zf));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,7 +154,7 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator<BlockData>
|
|||||||
if(ore != null) {
|
if(ore != null) {
|
||||||
h.set(xf, i, zf, ore);
|
h.set(xf, i, zf, ore);
|
||||||
} else {
|
} else {
|
||||||
h.set(xf, i, zf, getComplex().getRockStream().get(realX, realZ));
|
h.set(xf, i, zf, context.getRock().get(xf, zf));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,11 +23,13 @@ import com.volmit.iris.engine.framework.Engine;
|
|||||||
import com.volmit.iris.engine.object.IrisBiome;
|
import com.volmit.iris.engine.object.IrisBiome;
|
||||||
import com.volmit.iris.engine.object.IrisDecorationPart;
|
import com.volmit.iris.engine.object.IrisDecorationPart;
|
||||||
import com.volmit.iris.engine.object.IrisDecorator;
|
import com.volmit.iris.engine.object.IrisDecorator;
|
||||||
|
import com.volmit.iris.util.data.B;
|
||||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
import com.volmit.iris.util.hunk.Hunk;
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.BlockFace;
|
import org.bukkit.block.BlockFace;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.bukkit.block.data.MultipleFacing;
|
||||||
import org.bukkit.block.data.type.PointedDripstone;
|
import org.bukkit.block.data.type.PointedDripstone;
|
||||||
|
|
||||||
public class IrisCeilingDecorator extends IrisEngineDecorator {
|
public class IrisCeilingDecorator extends IrisEngineDecorator {
|
||||||
@@ -39,11 +41,10 @@ public class IrisCeilingDecorator extends IrisEngineDecorator {
|
|||||||
@Override
|
@Override
|
||||||
public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk<BlockData> data, IrisBiome biome, int height, int max) {
|
public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk<BlockData> data, IrisBiome biome, int height, int max) {
|
||||||
IrisDecorator decorator = getDecorator(biome, realX, realZ);
|
IrisDecorator decorator = getDecorator(biome, realX, realZ);
|
||||||
|
|
||||||
if(decorator != null) {
|
if(decorator != null) {
|
||||||
if(!decorator.isStacking()) {
|
if(!decorator.isStacking()) {
|
||||||
if(height >= 0 || height < getEngine().getHeight()) {
|
if(height >= 0 || height < getEngine().getHeight()) {
|
||||||
data.set(x, height, z, decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData()));
|
data.set(x, height, z, fixFaces(decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData()), realX, height, realZ));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData());
|
int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData());
|
||||||
@@ -98,4 +99,24 @@ public class IrisCeilingDecorator extends IrisEngineDecorator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private BlockData fixFaces(BlockData b, int x, int y, int z) {
|
||||||
|
if(B.isVineBlock(b)) {
|
||||||
|
MultipleFacing data = (MultipleFacing)b.clone();
|
||||||
|
boolean found = false;
|
||||||
|
for(BlockFace f : BlockFace.values()) {
|
||||||
|
if(!f.isCartesian())
|
||||||
|
continue;
|
||||||
|
Material m = getEngine().getMantle().get(x + f.getModX(), y + f.getModY(), z + f.getModZ()).getMaterial();
|
||||||
|
if(m.isSolid()) {
|
||||||
|
found = true;
|
||||||
|
data.setFace(f, m.isSolid());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found)
|
||||||
|
data.setFace(BlockFace.UP, true);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
return b;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,12 +25,14 @@ import com.volmit.iris.engine.object.InferredType;
|
|||||||
import com.volmit.iris.engine.object.IrisBiome;
|
import com.volmit.iris.engine.object.IrisBiome;
|
||||||
import com.volmit.iris.engine.object.IrisDecorationPart;
|
import com.volmit.iris.engine.object.IrisDecorationPart;
|
||||||
import com.volmit.iris.engine.object.IrisDecorator;
|
import com.volmit.iris.engine.object.IrisDecorator;
|
||||||
|
import com.volmit.iris.util.data.B;
|
||||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
import com.volmit.iris.util.hunk.Hunk;
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.BlockFace;
|
import org.bukkit.block.BlockFace;
|
||||||
import org.bukkit.block.data.Bisected;
|
import org.bukkit.block.data.Bisected;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.bukkit.block.data.MultipleFacing;
|
||||||
import org.bukkit.block.data.type.PointedDripstone;
|
import org.bukkit.block.data.type.PointedDripstone;
|
||||||
|
|
||||||
public class IrisSurfaceDecorator extends IrisEngineDecorator {
|
public class IrisSurfaceDecorator extends IrisEngineDecorator {
|
||||||
@@ -55,11 +57,14 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator {
|
|||||||
bd = decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData());
|
bd = decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData());
|
||||||
|
|
||||||
if(!underwater) {
|
if(!underwater) {
|
||||||
if(!canGoOn(bd, bdx)) {
|
if(!canGoOn(bd, bdx) && (!decorator.isForcePlace() && decorator.getForceBlock() == null) ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(decorator.getForceBlock() != null)
|
||||||
|
data.set(x, height, z, fixFaces(decorator.getForceBlock().getBlockData(getData()), x, height, z));
|
||||||
|
|
||||||
if(bd instanceof Bisected) {
|
if(bd instanceof Bisected) {
|
||||||
bd = bd.clone();
|
bd = bd.clone();
|
||||||
((Bisected) bd).setHalf(Bisected.Half.TOP);
|
((Bisected) bd).setHalf(Bisected.Half.TOP);
|
||||||
@@ -72,7 +77,7 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator {
|
|||||||
((Bisected) bd).setHalf(Bisected.Half.BOTTOM);
|
((Bisected) bd).setHalf(Bisected.Half.BOTTOM);
|
||||||
}
|
}
|
||||||
|
|
||||||
data.set(x, height + 1, z, bd);
|
data.set(x, height + 1, z, fixFaces(bd, x, height + 1, z));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if(height < getDimension().getFluidHeight()) {
|
if(height < getDimension().getFluidHeight()) {
|
||||||
@@ -139,4 +144,24 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private BlockData fixFaces(BlockData b, int x, int y, int z) {
|
||||||
|
if(B.isVineBlock(b)) {
|
||||||
|
MultipleFacing data = (MultipleFacing)b.clone();
|
||||||
|
boolean found = false;
|
||||||
|
for(BlockFace f : BlockFace.values()) {
|
||||||
|
if(!f.isCartesian())
|
||||||
|
continue;
|
||||||
|
Material m = getEngine().getMantle().get(x + f.getModX(), y + f.getModY(), z + f.getModZ()).getMaterial();
|
||||||
|
if(m.isSolid()) {
|
||||||
|
found = true;
|
||||||
|
data.setFace(f, m.isSolid());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found)
|
||||||
|
data.setFace(BlockFace.UP, true);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
return b;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ import com.volmit.iris.core.gui.components.RenderType;
|
|||||||
import com.volmit.iris.core.gui.components.Renderer;
|
import com.volmit.iris.core.gui.components.Renderer;
|
||||||
import com.volmit.iris.core.loader.IrisData;
|
import com.volmit.iris.core.loader.IrisData;
|
||||||
import com.volmit.iris.core.loader.IrisRegistrant;
|
import com.volmit.iris.core.loader.IrisRegistrant;
|
||||||
import com.volmit.iris.core.nms.INMS;
|
|
||||||
import com.volmit.iris.engine.IrisComplex;
|
import com.volmit.iris.engine.IrisComplex;
|
||||||
import com.volmit.iris.engine.data.cache.Cache;
|
import com.volmit.iris.engine.data.cache.Cache;
|
||||||
import com.volmit.iris.engine.data.chunk.TerrainChunk;
|
import com.volmit.iris.engine.data.chunk.TerrainChunk;
|
||||||
@@ -33,6 +32,7 @@ import com.volmit.iris.engine.object.*;
|
|||||||
import com.volmit.iris.engine.scripting.EngineExecutionEnvironment;
|
import com.volmit.iris.engine.scripting.EngineExecutionEnvironment;
|
||||||
import com.volmit.iris.util.collection.KList;
|
import com.volmit.iris.util.collection.KList;
|
||||||
import com.volmit.iris.util.collection.KMap;
|
import com.volmit.iris.util.collection.KMap;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.context.IrisContext;
|
import com.volmit.iris.util.context.IrisContext;
|
||||||
import com.volmit.iris.util.data.B;
|
import com.volmit.iris.util.data.B;
|
||||||
import com.volmit.iris.util.data.DataProvider;
|
import com.volmit.iris.util.data.DataProvider;
|
||||||
@@ -195,7 +195,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
|
|||||||
return getComplex().getRegionStream().get(x, z);
|
return getComplex().getRegionStream().get(x, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
void generateMatter(int x, int z, boolean multicore);
|
void generateMatter(int x, int z, boolean multicore, ChunkContext context);
|
||||||
|
|
||||||
@BlockCoordinates
|
@BlockCoordinates
|
||||||
default IrisBiome getCaveOrMantleBiome(int x, int y, int z) {
|
default IrisBiome getCaveOrMantleBiome(int x, int y, int z) {
|
||||||
@@ -422,21 +422,27 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat
|
|||||||
default KList<IrisLootTable> getLootTables(RNG rng, Block b) {
|
default KList<IrisLootTable> getLootTables(RNG rng, Block b) {
|
||||||
int rx = b.getX();
|
int rx = b.getX();
|
||||||
int rz = b.getZ();
|
int rz = b.getZ();
|
||||||
|
int ry = b.getY() - getWorld().minHeight();
|
||||||
double he = getComplex().getHeightStream().get(rx, rz);
|
double he = getComplex().getHeightStream().get(rx, rz);
|
||||||
PlacedObject po = getObjectPlacement(rx, b.getY(), rz);
|
KList<IrisLootTable> tables = new KList<>();
|
||||||
if(po != null && po.getPlacement() != null) {
|
|
||||||
|
|
||||||
|
PlacedObject po = getObjectPlacement(rx, ry, rz);
|
||||||
|
if(po != null && po.getPlacement() != null) {
|
||||||
if(B.isStorageChest(b.getBlockData())) {
|
if(B.isStorageChest(b.getBlockData())) {
|
||||||
IrisLootTable table = po.getPlacement().getTable(b.getBlockData(), getData());
|
IrisLootTable table = po.getPlacement().getTable(b.getBlockData(), getData());
|
||||||
if(table != null) {
|
if(table != null) {
|
||||||
|
tables.add(table);
|
||||||
|
if(po.getPlacement().isOverrideGlobalLoot()) {
|
||||||
return new KList<>(table);
|
return new KList<>(table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
IrisRegion region = getComplex().getRegionStream().get(rx, rz);
|
IrisRegion region = getComplex().getRegionStream().get(rx, rz);
|
||||||
IrisBiome biomeSurface = getComplex().getTrueBiomeStream().get(rx, rz);
|
IrisBiome biomeSurface = getComplex().getTrueBiomeStream().get(rx, rz);
|
||||||
IrisBiome biomeUnder = b.getY() < he ? getComplex().getCaveBiomeStream().get(rx, rz) : biomeSurface;
|
IrisBiome biomeUnder = ry < he ? getComplex().getCaveBiomeStream().get(rx, rz) : biomeSurface;
|
||||||
KList<IrisLootTable> tables = new KList<>();
|
|
||||||
double multiplier = 1D * getDimension().getLoot().getMultiplier() * region.getLoot().getMultiplier() * biomeSurface.getLoot().getMultiplier() * biomeUnder.getLoot().getMultiplier();
|
double multiplier = 1D * getDimension().getLoot().getMultiplier() * region.getLoot().getMultiplier() * biomeSurface.getLoot().getMultiplier() * biomeUnder.getLoot().getMultiplier();
|
||||||
injectTables(tables, getDimension().getLoot());
|
injectTables(tables, getDimension().getLoot());
|
||||||
injectTables(tables, region.getLoot());
|
injectTables(tables, region.getLoot());
|
||||||
|
|||||||
@@ -18,10 +18,11 @@
|
|||||||
|
|
||||||
package com.volmit.iris.engine.framework;
|
package com.volmit.iris.engine.framework;
|
||||||
|
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
import com.volmit.iris.util.hunk.Hunk;
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
|
|
||||||
public interface EngineActuator<O> extends EngineComponent {
|
public interface EngineActuator<O> extends EngineComponent {
|
||||||
@BlockCoordinates
|
@BlockCoordinates
|
||||||
void actuate(int x, int z, Hunk<O> output, boolean multicore);
|
void actuate(int x, int z, Hunk<O> output, boolean multicore, ChunkContext context);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
package com.volmit.iris.engine.framework;
|
package com.volmit.iris.engine.framework;
|
||||||
|
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
import com.volmit.iris.util.hunk.Hunk;
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
|
|
||||||
@@ -26,11 +27,11 @@ public abstract class EngineAssignedActuator<T> extends EngineAssignedComponent
|
|||||||
super(engine, name);
|
super(engine, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract void onActuate(int x, int z, Hunk<T> output, boolean multicore);
|
public abstract void onActuate(int x, int z, Hunk<T> output, boolean multicore, ChunkContext context);
|
||||||
|
|
||||||
@BlockCoordinates
|
@BlockCoordinates
|
||||||
@Override
|
@Override
|
||||||
public void actuate(int x, int z, Hunk<T> output, boolean multicore) {
|
public void actuate(int x, int z, Hunk<T> output, boolean multicore, ChunkContext context) {
|
||||||
onActuate(x, z, output, multicore);
|
onActuate(x, z, output, multicore, context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
package com.volmit.iris.engine.framework;
|
package com.volmit.iris.engine.framework;
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
import com.volmit.iris.util.hunk.Hunk;
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
|
|
||||||
@@ -28,13 +29,13 @@ public abstract class EngineAssignedModifier<T> extends EngineAssignedComponent
|
|||||||
}
|
}
|
||||||
|
|
||||||
@BlockCoordinates
|
@BlockCoordinates
|
||||||
public abstract void onModify(int x, int z, Hunk<T> output, boolean multicore);
|
public abstract void onModify(int x, int z, Hunk<T> output, boolean multicore, ChunkContext context);
|
||||||
|
|
||||||
@BlockCoordinates
|
@BlockCoordinates
|
||||||
@Override
|
@Override
|
||||||
public void modify(int x, int z, Hunk<T> output, boolean multicore) {
|
public void modify(int x, int z, Hunk<T> output, boolean multicore, ChunkContext context) {
|
||||||
try {
|
try {
|
||||||
onModify(x, z, output, multicore);
|
onModify(x, z, output, multicore, context);
|
||||||
} catch(Throwable e) {
|
} catch(Throwable e) {
|
||||||
Iris.error("Modifier Failure: " + getName());
|
Iris.error("Modifier Failure: " + getName());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import com.volmit.iris.util.collection.KList;
|
|||||||
import com.volmit.iris.util.format.C;
|
import com.volmit.iris.util.format.C;
|
||||||
import com.volmit.iris.util.math.Position2;
|
import com.volmit.iris.util.math.Position2;
|
||||||
import com.volmit.iris.util.plugin.VolmitSender;
|
import com.volmit.iris.util.plugin.VolmitSender;
|
||||||
|
import com.volmit.iris.util.stream.utility.WasteDetector;
|
||||||
import io.papermc.lib.PaperLib;
|
import io.papermc.lib.PaperLib;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
@@ -145,6 +146,9 @@ public abstract class EngineAssignedWorldManager extends EngineAssignedComponent
|
|||||||
@EventHandler
|
@EventHandler
|
||||||
public void on(BlockBreakEvent e) {
|
public void on(BlockBreakEvent e) {
|
||||||
if(e.getPlayer().getWorld().equals(getTarget().getWorld().realWorld())) {
|
if(e.getPlayer().getWorld().equals(getTarget().getWorld().realWorld())) {
|
||||||
|
|
||||||
|
WasteDetector.printAll();
|
||||||
|
|
||||||
onBlockBreak(e);
|
onBlockBreak(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,12 +18,19 @@
|
|||||||
|
|
||||||
package com.volmit.iris.engine.framework;
|
package com.volmit.iris.engine.framework;
|
||||||
|
|
||||||
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.engine.IrisComplex;
|
import com.volmit.iris.engine.IrisComplex;
|
||||||
import com.volmit.iris.engine.mantle.EngineMantle;
|
import com.volmit.iris.engine.mantle.EngineMantle;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
|
import com.volmit.iris.util.context.IrisContext;
|
||||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
|
import com.volmit.iris.util.format.C;
|
||||||
|
import com.volmit.iris.util.format.Form;
|
||||||
import com.volmit.iris.util.hunk.Hunk;
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
|
import com.volmit.iris.util.math.RollingSequence;
|
||||||
import com.volmit.iris.util.parallel.BurstExecutor;
|
import com.volmit.iris.util.parallel.BurstExecutor;
|
||||||
import com.volmit.iris.util.parallel.MultiBurst;
|
import com.volmit.iris.util.parallel.MultiBurst;
|
||||||
|
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
|
|
||||||
@@ -37,12 +44,12 @@ public interface EngineMode extends Staged {
|
|||||||
}
|
}
|
||||||
|
|
||||||
default EngineStage burst(EngineStage... stages) {
|
default EngineStage burst(EngineStage... stages) {
|
||||||
return (x, z, blocks, biomes, multicore) -> {
|
return (x, z, blocks, biomes, multicore, ctx) -> {
|
||||||
BurstExecutor e = burst().burst(stages.length);
|
BurstExecutor e = burst().burst(stages.length);
|
||||||
e.setMulticore(multicore);
|
e.setMulticore(multicore);
|
||||||
|
|
||||||
for(EngineStage i : stages) {
|
for(EngineStage i : stages) {
|
||||||
e.queue(() -> i.generate(x, z, blocks, biomes, multicore));
|
e.queue(() -> i.generate(x, z, blocks, biomes, multicore, ctx));
|
||||||
}
|
}
|
||||||
|
|
||||||
e.complete();
|
e.complete();
|
||||||
@@ -57,14 +64,25 @@ public interface EngineMode extends Staged {
|
|||||||
return getEngine().getMantle();
|
return getEngine().getMantle();
|
||||||
}
|
}
|
||||||
|
|
||||||
default void generateMatter(int x, int z, boolean multicore) {
|
default void generateMatter(int x, int z, boolean multicore, ChunkContext context) {
|
||||||
getMantle().generateMatter(x, z, multicore);
|
getMantle().generateMatter(x, z, multicore, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final RollingSequence r = new RollingSequence(64);
|
||||||
|
public static final RollingSequence r2 = new RollingSequence(256);
|
||||||
|
|
||||||
@BlockCoordinates
|
@BlockCoordinates
|
||||||
default void generate(int x, int z, Hunk<BlockData> blocks, Hunk<Biome> biomes, boolean multicore) {
|
default void generate(int x, int z, Hunk<BlockData> blocks, Hunk<Biome> biomes, boolean multicore) {
|
||||||
|
PrecisionStopwatch p = PrecisionStopwatch.start();
|
||||||
|
PrecisionStopwatch p2 = PrecisionStopwatch.start();
|
||||||
|
ChunkContext ctx = new ChunkContext(x, z, getComplex());
|
||||||
|
IrisContext.getOr(getEngine()).setChunkContext(ctx);
|
||||||
|
r.put(p.getMilliseconds());
|
||||||
|
|
||||||
for(EngineStage i : getStages()) {
|
for(EngineStage i : getStages()) {
|
||||||
i.generate(x, z, blocks, biomes, multicore);
|
i.generate(x, z, blocks, biomes, multicore, ctx);
|
||||||
}
|
}
|
||||||
|
r2.put(p2.getMilliseconds());
|
||||||
|
// Iris.warn(Form.duration(r.getAverage(), 2) + " Prep: TOTAL: " + C.RED + Form.duration(r2.getAverage(), 2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,10 +18,11 @@
|
|||||||
|
|
||||||
package com.volmit.iris.engine.framework;
|
package com.volmit.iris.engine.framework;
|
||||||
|
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
import com.volmit.iris.util.hunk.Hunk;
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
|
|
||||||
public interface EngineModifier<T> extends EngineComponent {
|
public interface EngineModifier<T> extends EngineComponent {
|
||||||
@BlockCoordinates
|
@BlockCoordinates
|
||||||
void modify(int x, int z, Hunk<T> t, boolean multicore);
|
void modify(int x, int z, Hunk<T> t, boolean multicore, ChunkContext context);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
package com.volmit.iris.engine.framework;
|
package com.volmit.iris.engine.framework;
|
||||||
|
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
import com.volmit.iris.util.hunk.Hunk;
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
@@ -25,7 +26,7 @@ import org.bukkit.block.data.BlockData;
|
|||||||
|
|
||||||
public interface EngineStage {
|
public interface EngineStage {
|
||||||
@BlockCoordinates
|
@BlockCoordinates
|
||||||
void generate(int x, int z, Hunk<BlockData> blocks, Hunk<Biome> biomes, boolean multicore);
|
void generate(int x, int z, Hunk<BlockData> blocks, Hunk<Biome> biomes, boolean multicore, ChunkContext context);
|
||||||
|
|
||||||
default void close() {
|
default void close() {
|
||||||
if(this instanceof EngineComponent c) {
|
if(this instanceof EngineComponent c) {
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import com.volmit.iris.engine.object.IrisBiome;
|
|||||||
import com.volmit.iris.engine.object.IrisJigsawStructure;
|
import com.volmit.iris.engine.object.IrisJigsawStructure;
|
||||||
import com.volmit.iris.engine.object.IrisObject;
|
import com.volmit.iris.engine.object.IrisObject;
|
||||||
import com.volmit.iris.engine.object.IrisRegion;
|
import com.volmit.iris.engine.object.IrisRegion;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.format.Form;
|
import com.volmit.iris.util.format.Form;
|
||||||
import com.volmit.iris.util.math.M;
|
import com.volmit.iris.util.math.M;
|
||||||
import com.volmit.iris.util.math.Position2;
|
import com.volmit.iris.util.math.Position2;
|
||||||
@@ -175,7 +176,7 @@ public interface Locator<T> {
|
|||||||
static Locator<IrisBiome> caveOrMantleBiome(String loadKey) {
|
static Locator<IrisBiome> caveOrMantleBiome(String loadKey) {
|
||||||
return (e, c) -> {
|
return (e, c) -> {
|
||||||
AtomicBoolean found = new AtomicBoolean(false);
|
AtomicBoolean found = new AtomicBoolean(false);
|
||||||
e.generateMatter(c.getX(), c.getZ(), true);
|
e.generateMatter(c.getX(), c.getZ(), true, new ChunkContext(c.getX() << 4, c.getZ() << 4, e.getComplex(), false));
|
||||||
e.getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), MatterCavern.class, (x, y, z, t) -> {
|
e.getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), MatterCavern.class, (x, y, z, t) -> {
|
||||||
if(found.get()) {
|
if(found.get()) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -126,8 +126,7 @@ public class PlannedStructure {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int id = rng.i(0, Integer.MAX_VALUE);
|
int id = rng.i(0, Integer.MAX_VALUE);
|
||||||
vo.place(xx, height, zz, placer, options, rng, e.shouldReduce(eng) ? null : (b)
|
vo.place(xx, height, zz, placer, options, rng, (b) -> e.set(b.getX(), b.getY(), b.getZ(), v.getLoadKey() + "@" + id), null, getData());
|
||||||
-> e.set(b.getX(), b.getY(), b.getZ(), v.getLoadKey() + "@" + id), null, getData());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void place(World world) {
|
public void place(World world) {
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import com.volmit.iris.engine.object.IrisDimension;
|
|||||||
import com.volmit.iris.engine.object.IrisPosition;
|
import com.volmit.iris.engine.object.IrisPosition;
|
||||||
import com.volmit.iris.engine.object.TileData;
|
import com.volmit.iris.engine.object.TileData;
|
||||||
import com.volmit.iris.util.collection.KList;
|
import com.volmit.iris.util.collection.KList;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.context.IrisContext;
|
import com.volmit.iris.util.context.IrisContext;
|
||||||
import com.volmit.iris.util.data.B;
|
import com.volmit.iris.util.data.B;
|
||||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
@@ -188,7 +189,7 @@ public interface EngineMantle extends IObjectPlacer {
|
|||||||
|
|
||||||
|
|
||||||
@ChunkCoordinates
|
@ChunkCoordinates
|
||||||
default void generateMatter(int x, int z, boolean multicore) {
|
default void generateMatter(int x, int z, boolean multicore, ChunkContext context) {
|
||||||
if(!getEngine().getDimension().isUseMantle()) {
|
if(!getEngine().getDimension().isUseMantle()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -206,7 +207,7 @@ public interface EngineMantle extends IObjectPlacer {
|
|||||||
MantleChunk mc = getMantle().getChunk(xx, zz);
|
MantleChunk mc = getMantle().getChunk(xx, zz);
|
||||||
|
|
||||||
for(MantleComponent k : getComponents()) {
|
for(MantleComponent k : getComponents()) {
|
||||||
generateMantleComponent(writer, xx, zz, k, mc);
|
generateMantleComponent(writer, xx, zz, k, mc, context);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -216,8 +217,8 @@ public interface EngineMantle extends IObjectPlacer {
|
|||||||
burst.complete();
|
burst.complete();
|
||||||
}
|
}
|
||||||
|
|
||||||
default void generateMantleComponent(MantleWriter writer, int x, int z, MantleComponent c, MantleChunk mc) {
|
default void generateMantleComponent(MantleWriter writer, int x, int z, MantleComponent c, MantleChunk mc, ChunkContext context) {
|
||||||
mc.raiseFlag(c.getFlag(), () -> c.generateLayer(writer, x, z));
|
mc.raiseFlag(c.getFlag(), () -> c.generateLayer(writer, x, z, context));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ChunkCoordinates
|
@ChunkCoordinates
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ package com.volmit.iris.engine.mantle;
|
|||||||
import com.volmit.iris.core.loader.IrisData;
|
import com.volmit.iris.core.loader.IrisData;
|
||||||
import com.volmit.iris.engine.IrisComplex;
|
import com.volmit.iris.engine.IrisComplex;
|
||||||
import com.volmit.iris.engine.object.IrisDimension;
|
import com.volmit.iris.engine.object.IrisDimension;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.documentation.ChunkCoordinates;
|
import com.volmit.iris.util.documentation.ChunkCoordinates;
|
||||||
import com.volmit.iris.util.mantle.Mantle;
|
import com.volmit.iris.util.mantle.Mantle;
|
||||||
import com.volmit.iris.util.mantle.MantleFlag;
|
import com.volmit.iris.util.mantle.MantleFlag;
|
||||||
@@ -60,5 +61,5 @@ public interface MantleComponent {
|
|||||||
MantleFlag getFlag();
|
MantleFlag getFlag();
|
||||||
|
|
||||||
@ChunkCoordinates
|
@ChunkCoordinates
|
||||||
void generateLayer(MantleWriter writer, int x, int z);
|
void generateLayer(MantleWriter writer, int x, int z, ChunkContext context);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import com.volmit.iris.engine.mantle.MantleWriter;
|
|||||||
import com.volmit.iris.engine.object.IrisBiome;
|
import com.volmit.iris.engine.object.IrisBiome;
|
||||||
import com.volmit.iris.engine.object.IrisCarving;
|
import com.volmit.iris.engine.object.IrisCarving;
|
||||||
import com.volmit.iris.engine.object.IrisRegion;
|
import com.volmit.iris.engine.object.IrisRegion;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.documentation.ChunkCoordinates;
|
import com.volmit.iris.util.documentation.ChunkCoordinates;
|
||||||
import com.volmit.iris.util.mantle.MantleFlag;
|
import com.volmit.iris.util.mantle.MantleFlag;
|
||||||
import com.volmit.iris.util.math.RNG;
|
import com.volmit.iris.util.math.RNG;
|
||||||
@@ -35,12 +36,10 @@ public class MantleCarvingComponent extends IrisMantleComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void generateLayer(MantleWriter writer, int x, int z) {
|
public void generateLayer(MantleWriter writer, int x, int z, ChunkContext context) {
|
||||||
RNG rng = new RNG(Cache.key(x, z) + seed());
|
RNG rng = new RNG(Cache.key(x, z) + seed());
|
||||||
int xxx = 8 + (x << 4);
|
IrisRegion region = context.getRegion().get(8, 8);
|
||||||
int zzz = 8 + (z << 4);
|
IrisBiome biome = context.getBiome().get(8, 8);
|
||||||
IrisRegion region = getComplex().getRegionStream().get(xxx, zzz);
|
|
||||||
IrisBiome biome = getComplex().getTrueBiomeStream().get(xxx, zzz);
|
|
||||||
carve(writer, rng, x, z, region, biome);
|
carve(writer, rng, x, z, region, biome);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import com.volmit.iris.engine.mantle.MantleWriter;
|
|||||||
import com.volmit.iris.engine.object.IrisBiome;
|
import com.volmit.iris.engine.object.IrisBiome;
|
||||||
import com.volmit.iris.engine.object.IrisFluidBodies;
|
import com.volmit.iris.engine.object.IrisFluidBodies;
|
||||||
import com.volmit.iris.engine.object.IrisRegion;
|
import com.volmit.iris.engine.object.IrisRegion;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.documentation.ChunkCoordinates;
|
import com.volmit.iris.util.documentation.ChunkCoordinates;
|
||||||
import com.volmit.iris.util.mantle.MantleFlag;
|
import com.volmit.iris.util.mantle.MantleFlag;
|
||||||
import com.volmit.iris.util.math.RNG;
|
import com.volmit.iris.util.math.RNG;
|
||||||
@@ -35,12 +36,10 @@ public class MantleFluidBodyComponent extends IrisMantleComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void generateLayer(MantleWriter writer, int x, int z) {
|
public void generateLayer(MantleWriter writer, int x, int z, ChunkContext context) {
|
||||||
RNG rng = new RNG(Cache.key(x, z) + seed() + 405666);
|
RNG rng = new RNG(Cache.key(x, z) + seed() + 405666);
|
||||||
int xxx = 8 + (x << 4);
|
IrisRegion region = context.getRegion().get(8, 8);
|
||||||
int zzz = 8 + (z << 4);
|
IrisBiome biome = context.getBiome().get(8, 8);
|
||||||
IrisRegion region = getComplex().getRegionStream().get(xxx, zzz);
|
|
||||||
IrisBiome biome = getComplex().getTrueBiomeStream().get(xxx, zzz);
|
|
||||||
generate(writer, rng, x, z, region, biome);
|
generate(writer, rng, x, z, region, biome);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import com.volmit.iris.engine.object.IrisJigsawStructurePlacement;
|
|||||||
import com.volmit.iris.engine.object.IrisPosition;
|
import com.volmit.iris.engine.object.IrisPosition;
|
||||||
import com.volmit.iris.engine.object.IrisRegion;
|
import com.volmit.iris.engine.object.IrisRegion;
|
||||||
import com.volmit.iris.engine.object.NoiseStyle;
|
import com.volmit.iris.engine.object.NoiseStyle;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
import com.volmit.iris.util.documentation.ChunkCoordinates;
|
import com.volmit.iris.util.documentation.ChunkCoordinates;
|
||||||
import com.volmit.iris.util.mantle.MantleFlag;
|
import com.volmit.iris.util.mantle.MantleFlag;
|
||||||
@@ -46,12 +47,10 @@ public class MantleJigsawComponent extends IrisMantleComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void generateLayer(MantleWriter writer, int x, int z) {
|
public void generateLayer(MantleWriter writer, int x, int z, ChunkContext context) {
|
||||||
RNG rng = new RNG(cng.fit(-Integer.MAX_VALUE, Integer.MAX_VALUE, x, z));
|
RNG rng = new RNG(cng.fit(-Integer.MAX_VALUE, Integer.MAX_VALUE, x, z));
|
||||||
int xxx = 8 + (x << 4);
|
IrisRegion region = context.getRegion().get(8, 8);
|
||||||
int zzz = 8 + (z << 4);
|
IrisBiome biome = context.getBiome().get(8, 8);
|
||||||
IrisRegion region = getComplex().getRegionStream().get(xxx, zzz);
|
|
||||||
IrisBiome biome = getComplex().getTrueBiomeStream().get(xxx, zzz);
|
|
||||||
generateJigsaw(writer, rng, x, z, biome, region);
|
generateJigsaw(writer, rng, x, z, biome, region);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import com.volmit.iris.engine.object.IrisObject;
|
|||||||
import com.volmit.iris.engine.object.IrisObjectPlacement;
|
import com.volmit.iris.engine.object.IrisObjectPlacement;
|
||||||
import com.volmit.iris.engine.object.IrisRegion;
|
import com.volmit.iris.engine.object.IrisRegion;
|
||||||
import com.volmit.iris.util.collection.KSet;
|
import com.volmit.iris.util.collection.KSet;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
import com.volmit.iris.util.documentation.ChunkCoordinates;
|
import com.volmit.iris.util.documentation.ChunkCoordinates;
|
||||||
import com.volmit.iris.util.mantle.MantleFlag;
|
import com.volmit.iris.util.mantle.MantleFlag;
|
||||||
@@ -41,12 +42,10 @@ public class MantleObjectComponent extends IrisMantleComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void generateLayer(MantleWriter writer, int x, int z) {
|
public void generateLayer(MantleWriter writer, int x, int z, ChunkContext context) {
|
||||||
RNG rng = new RNG(Cache.key(x, z) + seed());
|
RNG rng = new RNG(Cache.key(x, z) + seed());
|
||||||
int xxx = 8 + (x << 4);
|
IrisRegion region = context.getRegion().get(8, 8);
|
||||||
int zzz = 8 + (z << 4);
|
IrisBiome biome = context.getBiome().get(8, 8);
|
||||||
IrisRegion region = getComplex().getRegionStream().get(xxx, zzz);
|
|
||||||
IrisBiome biome = getComplex().getTrueBiomeStream().get(xxx, zzz);
|
|
||||||
placeObjects(writer, rng, x, z, biome, region);
|
placeObjects(writer, rng, x, z, biome, region);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,9 +94,7 @@ public class MantleObjectComponent extends IrisMantleComponent {
|
|||||||
int xx = rng.i(x, x + 15);
|
int xx = rng.i(x, x + 15);
|
||||||
int zz = rng.i(z, z + 15);
|
int zz = rng.i(z, z + 15);
|
||||||
int id = rng.i(0, Integer.MAX_VALUE);
|
int id = rng.i(0, Integer.MAX_VALUE);
|
||||||
v.place(xx, -1, zz, writer, objectPlacement, rng,
|
v.place(xx, -1, zz, writer, objectPlacement, rng, (b) -> writer.setData(b.getX(), b.getY(), b.getZ(), v.getLoadKey() + "@" + id), null, getData());
|
||||||
getMantle().shouldReduce(getEngineMantle().getEngine()) ? null : (b) -> writer.setData(b.getX(), b.getY(), b.getZ(),
|
|
||||||
v.getLoadKey() + "@" + id), null, getData());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,8 +31,8 @@ public class ModeEnclosure extends IrisEngineMode implements EngineMode {
|
|||||||
var biome = new IrisBiomeActuator(getEngine());
|
var biome = new IrisBiomeActuator(getEngine());
|
||||||
|
|
||||||
registerStage(burst(
|
registerStage(burst(
|
||||||
(x, z, k, p, m) -> terrain.actuate(x, z, k, m),
|
(x, z, k, p, m, c) -> terrain.actuate(x, z, k, m, c),
|
||||||
(x, z, k, p, m) -> biome.actuate(x, z, p, m)
|
(x, z, k, p, m, c) -> biome.actuate(x, z, p, m, c)
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,8 +31,8 @@ public class ModeIslands extends IrisEngineMode implements EngineMode {
|
|||||||
var biome = new IrisBiomeActuator(getEngine());
|
var biome = new IrisBiomeActuator(getEngine());
|
||||||
|
|
||||||
registerStage(burst(
|
registerStage(burst(
|
||||||
(x, z, k, p, m) -> terrain.actuate(x, z, k, m),
|
(x, z, k, p, m, c) -> terrain.actuate(x, z, k, m, c),
|
||||||
(x, z, k, p, m) -> biome.actuate(x, z, p, m)
|
(x, z, k, p, m, c) -> biome.actuate(x, z, p, m, c)
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ import com.volmit.iris.engine.modifier.IrisPerfectionModifier;
|
|||||||
import com.volmit.iris.engine.modifier.IrisPostModifier;
|
import com.volmit.iris.engine.modifier.IrisPostModifier;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
|
|
||||||
|
|
||||||
public class ModeOverworld extends IrisEngineMode implements EngineMode {
|
public class ModeOverworld extends IrisEngineMode implements EngineMode {
|
||||||
public ModeOverworld(Engine engine) {
|
public ModeOverworld(Engine engine) {
|
||||||
super(engine);
|
super(engine);
|
||||||
@@ -42,16 +41,16 @@ public class ModeOverworld extends IrisEngineMode implements EngineMode {
|
|||||||
var deposit = new IrisDepositModifier(getEngine());
|
var deposit = new IrisDepositModifier(getEngine());
|
||||||
var perfection = new IrisPerfectionModifier(getEngine());
|
var perfection = new IrisPerfectionModifier(getEngine());
|
||||||
|
|
||||||
|
registerStage((x, z, k, p, m, c) -> biome.actuate(x, z, p, m, c));
|
||||||
registerStage(burst(
|
registerStage(burst(
|
||||||
(x, z, k, p, m) -> generateMatter(x >> 4, z >> 4, m),
|
(x, z, k, p, m, c) -> generateMatter(x >> 4, z >> 4, m, c),
|
||||||
(x, z, k, p, m) -> terrain.actuate(x, z, k, m),
|
(x, z, k, p, m, c) -> terrain.actuate(x, z, k, m, c)
|
||||||
(x, z, k, p, m) -> biome.actuate(x, z, p, m)
|
|
||||||
));
|
));
|
||||||
registerStage((x, z, k, p, m) -> cave.modify(x >> 4, z >> 4, k, m));
|
registerStage((x, z, k, p, m, c) -> cave.modify(x >> 4, z >> 4, k, m, c));
|
||||||
registerStage((x, z, k, p, m) -> deposit.modify(x, z, k, m));
|
registerStage((x, z, k, p, m, c) -> deposit.modify(x, z, k, m,c));
|
||||||
registerStage((x, z, k, p, m) -> decorant.actuate(x, z, k, m));
|
registerStage((x, z, k, p, m, c) -> decorant.actuate(x, z, k, m, c));
|
||||||
registerStage((x, z, k, p, m) -> post.modify(x, z, k, m));
|
registerStage((x, z, k, p, m, c) -> post.modify(x, z, k, m, c));
|
||||||
registerStage((x, z, K, p, m) -> getMantle().insertMatter(x >> 4, z >> 4, BlockData.class, K, m));
|
registerStage((x, z, K, p, m, c) -> getMantle().insertMatter(x >> 4, z >> 4, BlockData.class, K, m));
|
||||||
registerStage((x, z, k, p, m) -> perfection.modify(x, z, k, m));
|
registerStage((x, z, k, p, m, c) -> perfection.modify(x, z, k, m, c));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,8 +31,8 @@ public class ModeSuperFlat extends IrisEngineMode implements EngineMode {
|
|||||||
var biome = new IrisBiomeActuator(getEngine());
|
var biome = new IrisBiomeActuator(getEngine());
|
||||||
|
|
||||||
registerStage(burst(
|
registerStage(burst(
|
||||||
(x, z, k, p, m) -> terrain.actuate(x, z, k, m),
|
(x, z, k, p, m, c) -> terrain.actuate(x, z, k, m, c),
|
||||||
(x, z, k, p, m) -> biome.actuate(x, z, p, m)
|
(x, z, k, p, m, c) -> biome.actuate(x, z, p, m, c)
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import com.volmit.iris.engine.object.IrisDecorator;
|
|||||||
import com.volmit.iris.engine.object.IrisPosition;
|
import com.volmit.iris.engine.object.IrisPosition;
|
||||||
import com.volmit.iris.util.collection.KList;
|
import com.volmit.iris.util.collection.KList;
|
||||||
import com.volmit.iris.util.collection.KMap;
|
import com.volmit.iris.util.collection.KMap;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.context.IrisContext;
|
import com.volmit.iris.util.context.IrisContext;
|
||||||
import com.volmit.iris.util.data.B;
|
import com.volmit.iris.util.data.B;
|
||||||
import com.volmit.iris.util.function.Consumer4;
|
import com.volmit.iris.util.function.Consumer4;
|
||||||
@@ -58,7 +59,7 @@ public class IrisCarveModifier extends EngineAssignedModifier<BlockData> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onModify(int x, int z, Hunk<BlockData> output, boolean multicore) {
|
public void onModify(int x, int z, Hunk<BlockData> output, boolean multicore, ChunkContext context) {
|
||||||
PrecisionStopwatch p = PrecisionStopwatch.start();
|
PrecisionStopwatch p = PrecisionStopwatch.start();
|
||||||
Mantle mantle = getEngine().getMantle().getMantle();
|
Mantle mantle = getEngine().getMantle().getMantle();
|
||||||
MantleChunk mc = getEngine().getMantle().getMantle().getChunk(x, z);
|
MantleChunk mc = getEngine().getMantle().getMantle().getChunk(x, z);
|
||||||
@@ -130,7 +131,7 @@ public class IrisCarveModifier extends EngineAssignedModifier<BlockData> {
|
|||||||
biome.setInferredType(InferredType.CAVE);
|
biome.setInferredType(InferredType.CAVE);
|
||||||
BlockData d = biome.getWall().get(rng, i.getX() + (x << 4), i.getY(), i.getZ() + (z << 4), getData());
|
BlockData d = biome.getWall().get(rng, i.getX() + (x << 4), i.getY(), i.getZ() + (z << 4), getData());
|
||||||
|
|
||||||
if(d != null && B.isSolid(output.get(i.getX(), i.getY(), i.getZ())) && i.getY() <= getComplex().getHeightStream().get(i.getX() + (x << 4), i.getZ() + (z << 4))) {
|
if(d != null && B.isSolid(output.get(i.getX(), i.getY(), i.getZ())) && i.getY() <= context.getHeight().get(i.getX(), i.getZ())) {
|
||||||
output.set(i.getX(), i.getY(), i.getZ(), d);
|
output.set(i.getX(), i.getY(), i.getZ(), d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import com.volmit.iris.engine.object.IrisBiome;
|
|||||||
import com.volmit.iris.engine.object.IrisDepositGenerator;
|
import com.volmit.iris.engine.object.IrisDepositGenerator;
|
||||||
import com.volmit.iris.engine.object.IrisObject;
|
import com.volmit.iris.engine.object.IrisObject;
|
||||||
import com.volmit.iris.engine.object.IrisRegion;
|
import com.volmit.iris.engine.object.IrisRegion;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.data.B;
|
import com.volmit.iris.util.data.B;
|
||||||
import com.volmit.iris.util.data.HeightMap;
|
import com.volmit.iris.util.data.HeightMap;
|
||||||
import com.volmit.iris.util.hunk.Hunk;
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
@@ -42,41 +43,41 @@ public class IrisDepositModifier extends EngineAssignedModifier<BlockData> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onModify(int x, int z, Hunk<BlockData> output, boolean multicore) {
|
public void onModify(int x, int z, Hunk<BlockData> output, boolean multicore, ChunkContext context) {
|
||||||
PrecisionStopwatch p = PrecisionStopwatch.start();
|
PrecisionStopwatch p = PrecisionStopwatch.start();
|
||||||
generateDeposits(rng, output, Math.floorDiv(x, 16), Math.floorDiv(z, 16), multicore);
|
generateDeposits(rng, output, Math.floorDiv(x, 16), Math.floorDiv(z, 16), multicore, context);
|
||||||
getEngine().getMetrics().getDeposit().put(p.getMilliseconds());
|
getEngine().getMetrics().getDeposit().put(p.getMilliseconds());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void generateDeposits(RNG rx, Hunk<BlockData> terrain, int x, int z, boolean multicore) {
|
public void generateDeposits(RNG rx, Hunk<BlockData> terrain, int x, int z, boolean multicore, ChunkContext context) {
|
||||||
RNG ro = rx.nextParallelRNG(x * x).nextParallelRNG(z * z);
|
RNG ro = rx.nextParallelRNG(x * x).nextParallelRNG(z * z);
|
||||||
IrisRegion region = getComplex().getRegionStream().get((x * 16) + 7, (z * 16) + 7);
|
IrisRegion region = context.getRegion().get(7,7);
|
||||||
IrisBiome biome = getComplex().getTrueBiomeStream().get((x * 16) + 7, (z * 16) + 7);
|
IrisBiome biome = context.getBiome().get(7,7);
|
||||||
BurstExecutor burst = burst().burst(multicore);
|
BurstExecutor burst = burst().burst(multicore);
|
||||||
|
|
||||||
for(IrisDepositGenerator k : getDimension().getDeposits()) {
|
for(IrisDepositGenerator k : getDimension().getDeposits()) {
|
||||||
burst.queue(() -> generate(k, terrain, ro, x, z, false));
|
burst.queue(() -> generate(k, terrain, ro, x, z, false, context));
|
||||||
}
|
}
|
||||||
|
|
||||||
for(IrisDepositGenerator k : region.getDeposits()) {
|
for(IrisDepositGenerator k : region.getDeposits()) {
|
||||||
for(int l = 0; l < ro.i(k.getMinPerChunk(), k.getMaxPerChunk()); l++) {
|
for(int l = 0; l < ro.i(k.getMinPerChunk(), k.getMaxPerChunk()); l++) {
|
||||||
burst.queue(() -> generate(k, terrain, ro, x, z, false));
|
burst.queue(() -> generate(k, terrain, ro, x, z, false, context));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(IrisDepositGenerator k : biome.getDeposits()) {
|
for(IrisDepositGenerator k : biome.getDeposits()) {
|
||||||
for(int l = 0; l < ro.i(k.getMinPerChunk(), k.getMaxPerChunk()); l++) {
|
for(int l = 0; l < ro.i(k.getMinPerChunk(), k.getMaxPerChunk()); l++) {
|
||||||
burst.queue(() -> generate(k, terrain, ro, x, z, false));
|
burst.queue(() -> generate(k, terrain, ro, x, z, false, context));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
burst.complete();
|
burst.complete();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void generate(IrisDepositGenerator k, Hunk<BlockData> data, RNG rng, int cx, int cz, boolean safe) {
|
public void generate(IrisDepositGenerator k, Hunk<BlockData> data, RNG rng, int cx, int cz, boolean safe, ChunkContext context) {
|
||||||
generate(k, data, rng, cx, cz, safe, null);
|
generate(k, data, rng, cx, cz, safe, null, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void generate(IrisDepositGenerator k, Hunk<BlockData> data, RNG rng, int cx, int cz, boolean safe, HeightMap he) {
|
public void generate(IrisDepositGenerator k, Hunk<BlockData> data, RNG rng, int cx, int cz, boolean safe, HeightMap he, ChunkContext context) {
|
||||||
for(int l = 0; l < rng.i(k.getMinPerChunk(), k.getMaxPerChunk()); l++) {
|
for(int l = 0; l < rng.i(k.getMinPerChunk(), k.getMaxPerChunk()); l++) {
|
||||||
IrisObject clump = k.getClump(rng, getData());
|
IrisObject clump = k.getClump(rng, getData());
|
||||||
|
|
||||||
@@ -92,7 +93,7 @@ public class IrisDepositModifier extends EngineAssignedModifier<BlockData> {
|
|||||||
int x = rng.i(af, bf);
|
int x = rng.i(af, bf);
|
||||||
int z = rng.i(af, bf);
|
int z = rng.i(af, bf);
|
||||||
int height = (he != null ? he.getHeight((cx << 4) + x, (cz << 4) + z) : (int) (Math.round(
|
int height = (he != null ? he.getHeight((cx << 4) + x, (cz << 4) + z) : (int) (Math.round(
|
||||||
getComplex().getHeightStream().get((cx << 4) + x, (cz << 4) + z)
|
context.getHeight().get( x, z)
|
||||||
))) - 7;
|
))) - 7;
|
||||||
|
|
||||||
if(height <= 0) {
|
if(height <= 0) {
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ package com.volmit.iris.engine.modifier;
|
|||||||
|
|
||||||
import com.volmit.iris.engine.framework.Engine;
|
import com.volmit.iris.engine.framework.Engine;
|
||||||
import com.volmit.iris.engine.framework.EngineAssignedModifier;
|
import com.volmit.iris.engine.framework.EngineAssignedModifier;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.data.B;
|
import com.volmit.iris.util.data.B;
|
||||||
import com.volmit.iris.util.hunk.Hunk;
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
import com.volmit.iris.util.parallel.BurstExecutor;
|
import com.volmit.iris.util.parallel.BurstExecutor;
|
||||||
@@ -41,7 +42,7 @@ public class IrisPerfectionModifier extends EngineAssignedModifier<BlockData> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onModify(int x, int z, Hunk<BlockData> output, boolean multicore) {
|
public void onModify(int x, int z, Hunk<BlockData> output, boolean multicore, ChunkContext context) {
|
||||||
PrecisionStopwatch p = PrecisionStopwatch.start();
|
PrecisionStopwatch p = PrecisionStopwatch.start();
|
||||||
AtomicBoolean changed = new AtomicBoolean(true);
|
AtomicBoolean changed = new AtomicBoolean(true);
|
||||||
int passes = 0;
|
int passes = 0;
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ package com.volmit.iris.engine.modifier;
|
|||||||
import com.volmit.iris.engine.framework.Engine;
|
import com.volmit.iris.engine.framework.Engine;
|
||||||
import com.volmit.iris.engine.framework.EngineAssignedModifier;
|
import com.volmit.iris.engine.framework.EngineAssignedModifier;
|
||||||
import com.volmit.iris.engine.object.IrisBiome;
|
import com.volmit.iris.engine.object.IrisBiome;
|
||||||
|
import com.volmit.iris.util.context.ChunkContext;
|
||||||
import com.volmit.iris.util.data.B;
|
import com.volmit.iris.util.data.B;
|
||||||
import com.volmit.iris.util.hunk.Hunk;
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
import com.volmit.iris.util.math.RNG;
|
import com.volmit.iris.util.math.RNG;
|
||||||
@@ -28,6 +29,7 @@ import com.volmit.iris.util.scheduling.PrecisionStopwatch;
|
|||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.block.data.Levelled;
|
import org.bukkit.block.data.Levelled;
|
||||||
|
import org.bukkit.block.data.MultipleFacing;
|
||||||
import org.bukkit.block.data.Waterlogged;
|
import org.bukkit.block.data.Waterlogged;
|
||||||
import org.bukkit.block.data.type.Slab;
|
import org.bukkit.block.data.type.Slab;
|
||||||
|
|
||||||
@@ -44,7 +46,7 @@ public class IrisPostModifier extends EngineAssignedModifier<BlockData> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onModify(int x, int z, Hunk<BlockData> output, boolean multicore) {
|
public void onModify(int x, int z, Hunk<BlockData> output, boolean multicore, ChunkContext context) {
|
||||||
PrecisionStopwatch p = PrecisionStopwatch.start();
|
PrecisionStopwatch p = PrecisionStopwatch.start();
|
||||||
AtomicInteger i = new AtomicInteger();
|
AtomicInteger i = new AtomicInteger();
|
||||||
AtomicInteger j = new AtomicInteger();
|
AtomicInteger j = new AtomicInteger();
|
||||||
@@ -53,14 +55,14 @@ public class IrisPostModifier extends EngineAssignedModifier<BlockData> {
|
|||||||
for(j.set(0); j.get() < output.getDepth(); j.getAndIncrement()) {
|
for(j.set(0); j.get() < output.getDepth(); j.getAndIncrement()) {
|
||||||
int ii = i.get();
|
int ii = i.get();
|
||||||
int jj = j.get();
|
int jj = j.get();
|
||||||
post(ii, jj, sync, ii + x, jj + z);
|
post(ii, jj, sync, ii + x, jj + z, context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getEngine().getMetrics().getPost().put(p.getMilliseconds());
|
getEngine().getMetrics().getPost().put(p.getMilliseconds());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void post(int currentPostX, int currentPostZ, Hunk<BlockData> currentData, int x, int z) {
|
private void post(int currentPostX, int currentPostZ, Hunk<BlockData> currentData, int x, int z, ChunkContext context) {
|
||||||
int h = getEngine().getMantle().trueHeight(x, z);
|
int h = getEngine().getMantle().trueHeight(x, z);
|
||||||
int ha = getEngine().getMantle().trueHeight(x + 1, z);
|
int ha = getEngine().getMantle().trueHeight(x + 1, z);
|
||||||
int hb = getEngine().getMantle().trueHeight(x, z + 1);
|
int hb = getEngine().getMantle().trueHeight(x, z + 1);
|
||||||
@@ -135,7 +137,7 @@ public class IrisPostModifier extends EngineAssignedModifier<BlockData> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Wall Patcher
|
// Wall Patcher
|
||||||
IrisBiome biome = getComplex().getTrueBiomeStream().get(x, z);
|
IrisBiome biome = context.getBiome().get(currentPostX, currentPostZ);
|
||||||
|
|
||||||
if(getDimension().isPostProcessingWalls()) {
|
if(getDimension().isPostProcessingWalls()) {
|
||||||
if(!biome.getWall().getPalette().isEmpty()) {
|
if(!biome.getWall().getPalette().isEmpty()) {
|
||||||
@@ -221,10 +223,20 @@ public class IrisPostModifier extends EngineAssignedModifier<BlockData> {
|
|||||||
// Foliage
|
// Foliage
|
||||||
b = getPostBlock(x, h + 1, z, currentPostX, currentPostZ, currentData);
|
b = getPostBlock(x, h + 1, z, currentPostX, currentPostZ, currentData);
|
||||||
|
|
||||||
|
if(B.isVineBlock(b) && b instanceof MultipleFacing f) {
|
||||||
|
int finalH = h + 1;
|
||||||
|
|
||||||
|
f.getAllowedFaces().forEach(face -> {
|
||||||
|
BlockData d = getPostBlock(x + face.getModX(), finalH + face.getModY(), z + face.getModZ(), currentPostX, currentPostZ, currentData);
|
||||||
|
f.setFace(face, !B.isAir(d) && !B.isVineBlock(d));
|
||||||
|
});
|
||||||
|
setPostBlock(x, h + 1, z, b, currentPostX, currentPostZ, currentData);
|
||||||
|
}
|
||||||
|
|
||||||
if(B.isFoliage(b) || b.getMaterial().equals(Material.DEAD_BUSH)) {
|
if(B.isFoliage(b) || b.getMaterial().equals(Material.DEAD_BUSH)) {
|
||||||
Material onto = getPostBlock(x, h, z, currentPostX, currentPostZ, currentData).getMaterial();
|
Material onto = getPostBlock(x, h, z, currentPostX, currentPostZ, currentData).getMaterial();
|
||||||
|
|
||||||
if(!B.canPlaceOnto(b.getMaterial(), onto)) {
|
if(!B.canPlaceOnto(b.getMaterial(), onto) && !B.isDecorant(b)) {
|
||||||
setPostBlock(x, h + 1, z, AIR, currentPostX, currentPostZ, currentData);
|
setPostBlock(x, h + 1, z, AIR, currentPostX, currentPostZ, currentData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -242,7 +254,7 @@ public class IrisPostModifier extends EngineAssignedModifier<BlockData> {
|
|||||||
|
|
||||||
public boolean isSolid(int x, int y, int z, int currentPostX, int currentPostZ, Hunk<BlockData> currentData) {
|
public boolean isSolid(int x, int y, int z, int currentPostX, int currentPostZ, Hunk<BlockData> currentData) {
|
||||||
BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData);
|
BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData);
|
||||||
return d.getMaterial().isSolid();
|
return d.getMaterial().isSolid() && !B.isVineBlock(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isSolidNonSlab(int x, int y, int z, int currentPostX, int currentPostZ, Hunk<BlockData> currentData) {
|
public boolean isSolidNonSlab(int x, int y, int z, int currentPostX, int currentPostZ, Hunk<BlockData> currentData) {
|
||||||
|
|||||||
@@ -56,8 +56,7 @@ public class IrisBlockDrops {
|
|||||||
private boolean replaceVanillaDrops = false;
|
private boolean replaceVanillaDrops = false;
|
||||||
|
|
||||||
public boolean shouldDropFor(BlockData data, IrisData rdata) {
|
public boolean shouldDropFor(BlockData data, IrisData rdata) {
|
||||||
KList<BlockData> list = this.data.aquire(() ->
|
KList<BlockData> list = this.data.aquire(() -> {
|
||||||
{
|
|
||||||
KList<BlockData> b = new KList<>();
|
KList<BlockData> b = new KList<>();
|
||||||
|
|
||||||
for(IrisBlockData i : getBlocks()) {
|
for(IrisBlockData i : getBlocks()) {
|
||||||
|
|||||||
@@ -53,6 +53,8 @@ public class IrisDecorator {
|
|||||||
private IrisGeneratorStyle variance = NoiseStyle.STATIC.style();
|
private IrisGeneratorStyle variance = NoiseStyle.STATIC.style();
|
||||||
@Desc("Forcefully place this decorant anywhere it is supposed to go even if it should not go on a specific surface block. For example, you could force tallgrass to place on top of stone by using this.")
|
@Desc("Forcefully place this decorant anywhere it is supposed to go even if it should not go on a specific surface block. For example, you could force tallgrass to place on top of stone by using this.")
|
||||||
private boolean forcePlace = false;
|
private boolean forcePlace = false;
|
||||||
|
@Desc("Forced the surface block of this decorant to be the specified block. Assumes forcePlace.")
|
||||||
|
private IrisBlockData forceBlock;
|
||||||
@DependsOn({"scaleStack", "stackMin", "stackMax"})
|
@DependsOn({"scaleStack", "stackMin", "stackMax"})
|
||||||
@Desc("If stackMax is set to true, use this to limit its max height for large caverns")
|
@Desc("If stackMax is set to true, use this to limit its max height for large caverns")
|
||||||
private int absoluteMaxStack = 30;
|
private int absoluteMaxStack = 30;
|
||||||
|
|||||||
@@ -19,21 +19,17 @@
|
|||||||
package com.volmit.iris.engine.object;
|
package com.volmit.iris.engine.object;
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.engine.object.annotations.Desc;
|
import com.volmit.iris.engine.object.annotations.*;
|
||||||
import com.volmit.iris.engine.object.annotations.MaxNumber;
|
|
||||||
import com.volmit.iris.engine.object.annotations.MinNumber;
|
|
||||||
import com.volmit.iris.engine.object.annotations.Required;
|
|
||||||
import com.volmit.iris.engine.object.annotations.Snippet;
|
|
||||||
import com.volmit.iris.util.math.RNG;
|
import com.volmit.iris.util.math.RNG;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
|
import org.bukkit.NamespacedKey;
|
||||||
import org.bukkit.enchantments.Enchantment;
|
import org.bukkit.enchantments.Enchantment;
|
||||||
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
|
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
|
|
||||||
@Snippet("enchantment")
|
@Snippet("enchantment")
|
||||||
@Accessors(chain = true)
|
@Accessors(chain = true)
|
||||||
@@ -43,8 +39,9 @@ import java.lang.reflect.Field;
|
|||||||
@Data
|
@Data
|
||||||
public class IrisEnchantment {
|
public class IrisEnchantment {
|
||||||
@Required
|
@Required
|
||||||
|
@RegistryListEnchantment
|
||||||
@Desc("The enchantment")
|
@Desc("The enchantment")
|
||||||
private String enchantment = "";
|
private String enchantment;
|
||||||
|
|
||||||
@MinNumber(1)
|
@MinNumber(1)
|
||||||
@Desc("Minimum amount of this loot")
|
@Desc("Minimum amount of this loot")
|
||||||
@@ -61,12 +58,17 @@ public class IrisEnchantment {
|
|||||||
|
|
||||||
public void apply(RNG rng, ItemMeta meta) {
|
public void apply(RNG rng, ItemMeta meta) {
|
||||||
try {
|
try {
|
||||||
if(rng.nextDouble() < chance) {
|
Enchantment enchant = Enchantment.getByKey(NamespacedKey.minecraft(getEnchantment()));
|
||||||
if(meta instanceof EnchantmentStorageMeta) {
|
if(enchant == null) {
|
||||||
((EnchantmentStorageMeta) meta).addStoredEnchant(getEnchant(), getLevel(rng), true);
|
Iris.warn("Unknown Enchantment: " + getEnchantment());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
meta.addEnchant(getEnchant(), getLevel(rng), true);
|
if(rng.nextDouble() < chance) {
|
||||||
|
if(meta instanceof EnchantmentStorageMeta) {
|
||||||
|
((EnchantmentStorageMeta) meta).addStoredEnchant(enchant, getLevel(rng), true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
meta.addEnchant(enchant, getLevel(rng), true);
|
||||||
}
|
}
|
||||||
} catch(Throwable e) {
|
} catch(Throwable e) {
|
||||||
Iris.reportError(e);
|
Iris.reportError(e);
|
||||||
@@ -74,21 +76,6 @@ public class IrisEnchantment {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Enchantment getEnchant() {
|
|
||||||
for(Field i : Enchantment.class.getDeclaredFields()) {
|
|
||||||
if(i.getType().equals(Enchantment.class) && i.getName().equals(getEnchantment())) {
|
|
||||||
try {
|
|
||||||
return (Enchantment) i.get(null);
|
|
||||||
} catch(IllegalArgumentException | IllegalAccessException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
Iris.reportError(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getLevel(RNG rng) {
|
public int getLevel(RNG rng) {
|
||||||
return rng.i(getMinLevel(), getMaxLevel());
|
return rng.i(getMinLevel(), getMaxLevel());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -213,24 +213,24 @@ public class IrisGenerator extends IrisRegistrant {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int hc = (int) ((cliffHeightMin * 10) + 10 + cliffHeightMax * seed + offsetX + offsetZ);
|
int hc = (int) ((cliffHeightMin * 10) + 10 + cliffHeightMax * getSeed() + offsetX + offsetZ);
|
||||||
double h = multiplicitive ? 1 : 0;
|
double h = multiplicitive ? 1 : 0;
|
||||||
double tp = 0;
|
double tp = 0;
|
||||||
|
|
||||||
if(composite.size() == 1) {
|
if(composite.size() == 1) {
|
||||||
if(multiplicitive) {
|
if(multiplicitive) {
|
||||||
h *= composite.get(0).getNoise(seed + superSeed + hc, (rx + offsetX) / zoom, (rz + offsetZ) / zoom, getLoader());
|
h *= composite.get(0).getNoise(getSeed() + superSeed + hc, (rx + offsetX) / zoom, (rz + offsetZ) / zoom, getLoader());
|
||||||
} else {
|
} else {
|
||||||
tp += composite.get(0).getOpacity();
|
tp += composite.get(0).getOpacity();
|
||||||
h += composite.get(0).getNoise(seed + superSeed + hc, (rx + offsetX) / zoom, (rz + offsetZ) / zoom, getLoader());
|
h += composite.get(0).getNoise(getSeed() + superSeed + hc, (rx + offsetX) / zoom, (rz + offsetZ) / zoom, getLoader());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for(IrisNoiseGenerator i : composite) {
|
for(IrisNoiseGenerator i : composite) {
|
||||||
if(multiplicitive) {
|
if(multiplicitive) {
|
||||||
h *= i.getNoise(seed + superSeed + hc, (rx + offsetX) / zoom, (rz + offsetZ) / zoom, getLoader());
|
h *= i.getNoise(getSeed() + superSeed + hc, (rx + offsetX) / zoom, (rz + offsetZ) / zoom, getLoader());
|
||||||
} else {
|
} else {
|
||||||
tp += i.getOpacity();
|
tp += i.getOpacity();
|
||||||
h += i.getNoise(seed + superSeed + hc, (rx + offsetX) / zoom, (rz + offsetZ) / zoom, getLoader());
|
h += i.getNoise(getSeed() + superSeed + hc, (rx + offsetX) / zoom, (rz + offsetZ) / zoom, getLoader());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -248,8 +248,8 @@ public class IrisGenerator extends IrisRegistrant {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public double cell(double rx, double rz, double v, double superSeed) {
|
public double cell(double rx, double rz, double v, double superSeed) {
|
||||||
getCellGenerator(seed + 46222).setShuffle(getCellFractureShuffle());
|
getCellGenerator(getSeed() + 46222).setShuffle(getCellFractureShuffle());
|
||||||
return getCellGenerator(seed + 46222).getDistance(rx / getCellFractureZoom(), rz / getCellFractureZoom()) > getCellPercentSize() ? (v * getCellFractureHeight()) : v;
|
return getCellGenerator(getSeed() + 46222).getDistance(rx / getCellFractureZoom(), rz / getCellFractureZoom()) > getCellPercentSize() ? (v * getCellFractureHeight()) : v;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean hasCellCracks() {
|
private boolean hasCellCracks() {
|
||||||
@@ -257,8 +257,8 @@ public class IrisGenerator extends IrisRegistrant {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public double getCliffHeight(double rx, double rz, double superSeed) {
|
public double getCliffHeight(double rx, double rz, double superSeed) {
|
||||||
int hc = (int) ((cliffHeightMin * 10) + 10 + cliffHeightMax * seed + offsetX + offsetZ);
|
int hc = (int) ((cliffHeightMin * 10) + 10 + cliffHeightMax * getSeed() + offsetX + offsetZ);
|
||||||
double h = cliffHeightGenerator.getNoise((long) (seed + superSeed + hc), (rx + offsetX) / zoom, (rz + offsetZ) / zoom, getLoader());
|
double h = cliffHeightGenerator.getNoise((long) (getSeed() + superSeed + hc), (rx + offsetX) / zoom, (rz + offsetZ) / zoom, getLoader());
|
||||||
return IrisInterpolation.lerp(cliffHeightMin, cliffHeightMax, h);
|
return IrisInterpolation.lerp(cliffHeightMin, cliffHeightMax, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ public class IrisLoot {
|
|||||||
private KList<String> lore = new KList<>();
|
private KList<String> lore = new KList<>();
|
||||||
@RegistryListItemType
|
@RegistryListItemType
|
||||||
@Required
|
@Required
|
||||||
@Desc("This is the item or block type. Does not accept minecraft:*. Only materials such as DIAMOND_SWORD or DIRT.")
|
@Desc("This is the item or block type. Does not accept minecraft:*, only materials such as DIAMOND_SWORD or DIRT. The exception are modded materials, as they require a namespace.")
|
||||||
private String type = "";
|
private String type = "";
|
||||||
@Desc("The dye color")
|
@Desc("The dye color")
|
||||||
private DyeColor dyeColor = null;
|
private DyeColor dyeColor = null;
|
||||||
@@ -120,90 +120,16 @@ public class IrisLoot {
|
|||||||
|
|
||||||
public ItemStack get(boolean debug, RNG rng) {
|
public ItemStack get(boolean debug, RNG rng) {
|
||||||
try {
|
try {
|
||||||
ItemStack is;
|
ItemStack is = getItemStack(rng);
|
||||||
if(!type.startsWith("minecraft:") && type.contains(":")) {
|
if(is == null)
|
||||||
Optional<ItemStack> opt = Iris.service(ExternalDataSVC.class).getItemStack(NamespacedKey.fromString(type));
|
return new ItemStack(Material.AIR);
|
||||||
if(opt.isEmpty()) {
|
is.setItemMeta(applyProperties(is, rng, debug, null));
|
||||||
//TODO Better third party provider
|
|
||||||
Iris.warn("Unknown Material: " + type);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
is = opt.get();
|
|
||||||
is.setAmount(Math.max(1, rng.i(getMinAmount(), getMaxAmount())));
|
|
||||||
} else {
|
|
||||||
is = new ItemStack(getType(), Math.max(1, rng.i(getMinAmount(), getMaxAmount())));
|
|
||||||
}
|
|
||||||
|
|
||||||
ItemMeta m = is.getItemMeta();
|
|
||||||
|
|
||||||
if(is.getType().getMaxDurability() > 0 && m instanceof Damageable d) {
|
|
||||||
int max = is.getType().getMaxDurability();
|
|
||||||
d.setDamage((int) Math.round(Math.max(0, Math.min(max, (1D - rng.d(getMinDurability(), getMaxDurability())) * max))));
|
|
||||||
}
|
|
||||||
|
|
||||||
for(IrisEnchantment i : getEnchantments()) {
|
|
||||||
i.apply(rng, m);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(IrisAttributeModifier i : getAttributes()) {
|
|
||||||
i.apply(rng, m);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
m.setCustomModelData(getCustomModel());
|
|
||||||
} catch(Throwable e) {
|
|
||||||
Iris.reportError(e);
|
|
||||||
}
|
|
||||||
m.setLocalizedName(C.translateAlternateColorCodes('&', displayName));
|
|
||||||
m.setDisplayName(C.translateAlternateColorCodes('&', displayName));
|
|
||||||
m.setUnbreakable(isUnbreakable());
|
|
||||||
|
|
||||||
for(ItemFlag i : getItemFlags()) {
|
|
||||||
m.addItemFlags(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
KList<String> lore = new KList<>();
|
|
||||||
|
|
||||||
getLore().forEach((i) ->
|
|
||||||
{
|
|
||||||
String mf = C.translateAlternateColorCodes('&', i);
|
|
||||||
|
|
||||||
if(mf.length() > 24) {
|
|
||||||
for(String g : Form.wrapWords(mf, 24).split("\\Q\n\\E")) {
|
|
||||||
lore.add(g.trim());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
lore.add(mf);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if(debug) {
|
|
||||||
if(lore.isNotEmpty()) {
|
|
||||||
lore.add(C.GRAY + "--------------------");
|
|
||||||
}
|
|
||||||
|
|
||||||
lore.add(C.GRAY + "1 in " + (getRarity()) + " Chance (" + Form.pc(1D / (getRarity()), 5) + ")");
|
|
||||||
}
|
|
||||||
|
|
||||||
m.setLore(lore);
|
|
||||||
|
|
||||||
if(getLeatherColor() != null && m instanceof LeatherArmorMeta) {
|
|
||||||
Color c = Color.decode(getLeatherColor());
|
|
||||||
((LeatherArmorMeta) m).setColor(org.bukkit.Color.fromRGB(c.getRed(), c.getGreen(), c.getBlue()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(getDyeColor() != null && m instanceof Colorable) {
|
|
||||||
((Colorable) m).setColor(getDyeColor());
|
|
||||||
}
|
|
||||||
|
|
||||||
is.setItemMeta(m);
|
|
||||||
return applyCustomNbt(is);
|
return applyCustomNbt(is);
|
||||||
} catch(Throwable e) {
|
} catch(Throwable e) {
|
||||||
Iris.reportError(e);
|
Iris.reportError(e);
|
||||||
}
|
|
||||||
|
|
||||||
return new ItemStack(Material.AIR);
|
return new ItemStack(Material.AIR);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public ItemStack get(boolean debug, boolean giveSomething, IrisLootTable table, RNG rng, int x, int y, int z) {
|
public ItemStack get(boolean debug, boolean giveSomething, IrisLootTable table, RNG rng, int x, int y, int z) {
|
||||||
if(debug) {
|
if(debug) {
|
||||||
@@ -212,25 +138,39 @@ public class IrisLoot {
|
|||||||
|
|
||||||
if(giveSomething || chance.aquire(() -> NoiseStyle.STATIC.create(rng)).fit(1, rarity * table.getRarity(), x, y, z) == 1) {
|
if(giveSomething || chance.aquire(() -> NoiseStyle.STATIC.create(rng)).fit(1, rarity * table.getRarity(), x, y, z) == 1) {
|
||||||
try {
|
try {
|
||||||
ItemStack is;
|
ItemStack is = getItemStack(rng);
|
||||||
|
if(is == null)
|
||||||
|
return null;
|
||||||
|
is.setItemMeta(applyProperties(is, rng, debug, table));
|
||||||
|
return applyCustomNbt(is);
|
||||||
|
} catch(Throwable e) {
|
||||||
|
//Iris.reportError(e);
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO Better Third Party Item Acquisition
|
||||||
|
private ItemStack getItemStack(RNG rng) {
|
||||||
if(!type.startsWith("minecraft:") && type.contains(":")) {
|
if(!type.startsWith("minecraft:") && type.contains(":")) {
|
||||||
Optional<ItemStack> opt = Iris.service(ExternalDataSVC.class).getItemStack(NamespacedKey.fromString(type));
|
Optional<ItemStack> opt = Iris.service(ExternalDataSVC.class).getItemStack(NamespacedKey.fromString(type));
|
||||||
if(opt.isEmpty()) {
|
if(opt.isEmpty()) {
|
||||||
Iris.warn("Unknown Material: " + type);
|
Iris.warn("Unknown Material: " + type);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
is = opt.get();
|
ItemStack is = opt.get();
|
||||||
is.setAmount(Math.max(1, rng.i(getMinAmount(), getMaxAmount())));
|
is.setAmount(Math.max(1, rng.i(getMinAmount(), getMaxAmount())));
|
||||||
return is;
|
return is;
|
||||||
} else {
|
}
|
||||||
is = new ItemStack(getType(), Math.max(1, rng.i(getMinAmount(), getMaxAmount())));
|
return new ItemStack(getType(), Math.max(1, rng.i(getMinAmount(), getMaxAmount())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ItemMeta applyProperties(ItemStack is, RNG rng, boolean debug, IrisLootTable table) {
|
||||||
ItemMeta m = is.getItemMeta();
|
ItemMeta m = is.getItemMeta();
|
||||||
|
if(m == null) {
|
||||||
if(is.getType().getMaxDurability() > 0 && m instanceof Damageable d) {
|
return null;
|
||||||
int max = is.getType().getMaxDurability();
|
|
||||||
d.setDamage((int) Math.round(Math.max(0, Math.min(max, (1D - rng.d(getMinDurability(), getMaxDurability())) * max))));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(IrisEnchantment i : getEnchantments()) {
|
for(IrisEnchantment i : getEnchantments()) {
|
||||||
@@ -241,19 +181,31 @@ public class IrisLoot {
|
|||||||
i.apply(rng, m);
|
i.apply(rng, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
m.setUnbreakable(isUnbreakable());
|
||||||
|
for(ItemFlag i : getItemFlags()) {
|
||||||
|
m.addItemFlags(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(getCustomModel() != null) {
|
||||||
m.setCustomModelData(getCustomModel());
|
m.setCustomModelData(getCustomModel());
|
||||||
} catch(Throwable e) {
|
}
|
||||||
Iris.reportError(e);
|
|
||||||
|
if(is.getType().getMaxDurability() > 0 && m instanceof Damageable d) {
|
||||||
|
int max = is.getType().getMaxDurability();
|
||||||
|
d.setDamage((int) Math.round(Math.max(0, Math.min(max, (1D - rng.d(getMinDurability(), getMaxDurability())) * max))));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(getLeatherColor() != null && m instanceof LeatherArmorMeta leather) {
|
||||||
|
Color c = Color.decode(getLeatherColor());
|
||||||
|
leather.setColor(org.bukkit.Color.fromRGB(c.getRed(), c.getGreen(), c.getBlue()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(getDyeColor() != null && m instanceof Colorable colorable) {
|
||||||
|
colorable.setColor(getDyeColor());
|
||||||
}
|
}
|
||||||
|
|
||||||
m.setLocalizedName(C.translateAlternateColorCodes('&', displayName));
|
m.setLocalizedName(C.translateAlternateColorCodes('&', displayName));
|
||||||
m.setDisplayName(C.translateAlternateColorCodes('&', displayName));
|
m.setDisplayName(C.translateAlternateColorCodes('&', displayName));
|
||||||
m.setUnbreakable(isUnbreakable());
|
|
||||||
|
|
||||||
for(ItemFlag i : getItemFlags()) {
|
|
||||||
m.addItemFlags(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
KList<String> lore = new KList<>();
|
KList<String> lore = new KList<>();
|
||||||
|
|
||||||
@@ -271,6 +223,12 @@ public class IrisLoot {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if(debug) {
|
if(debug) {
|
||||||
|
if(table == null) {
|
||||||
|
if(lore.isNotEmpty()) {
|
||||||
|
lore.add(C.GRAY + "--------------------");
|
||||||
|
}
|
||||||
|
lore.add(C.GRAY + "1 in " + (getRarity()) + " Chance (" + Form.pc(1D / (getRarity()), 5) + ")");
|
||||||
|
} else {
|
||||||
if(lore.isNotEmpty()) {
|
if(lore.isNotEmpty()) {
|
||||||
lore.add(C.GRAY + "--------------------");
|
lore.add(C.GRAY + "--------------------");
|
||||||
}
|
}
|
||||||
@@ -278,18 +236,13 @@ public class IrisLoot {
|
|||||||
lore.add(C.GRAY + "From: " + table.getName() + " (" + Form.pc(1D / table.getRarity(), 5) + ")");
|
lore.add(C.GRAY + "From: " + table.getName() + " (" + Form.pc(1D / table.getRarity(), 5) + ")");
|
||||||
lore.add(C.GRAY + "1 in " + (table.getRarity() * getRarity()) + " Chance (" + Form.pc(1D / (table.getRarity() * getRarity()), 5) + ")");
|
lore.add(C.GRAY + "1 in " + (table.getRarity() * getRarity()) + " Chance (" + Form.pc(1D / (table.getRarity() * getRarity()), 5) + ")");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m.setLore(lore);
|
m.setLore(lore);
|
||||||
is.setItemMeta(m);
|
|
||||||
return applyCustomNbt(is);
|
return m;
|
||||||
} catch(Throwable e) {
|
|
||||||
//Iris.reportError(e);
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private ItemStack applyCustomNbt(ItemStack stack) throws CommandSyntaxException {
|
private ItemStack applyCustomNbt(ItemStack stack) throws CommandSyntaxException {
|
||||||
if(customNbt == null || customNbt.isEmpty())
|
if(customNbt == null || customNbt.isEmpty())
|
||||||
|
|||||||
@@ -47,9 +47,11 @@ import lombok.experimental.Accessors;
|
|||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
import org.bukkit.block.BlockState;
|
import org.bukkit.block.BlockState;
|
||||||
import org.bukkit.block.TileState;
|
import org.bukkit.block.TileState;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.bukkit.block.data.MultipleFacing;
|
||||||
import org.bukkit.block.data.Waterlogged;
|
import org.bukkit.block.data.Waterlogged;
|
||||||
import org.bukkit.block.data.type.Leaves;
|
import org.bukkit.block.data.type.Leaves;
|
||||||
import org.bukkit.util.BlockVector;
|
import org.bukkit.util.BlockVector;
|
||||||
@@ -779,7 +781,7 @@ public class IrisObject extends IrisRegistrant {
|
|||||||
zz += config.warp(rng, i.getZ() + z, i.getY() + y, i.getX() + x, getLoader());
|
zz += config.warp(rng, i.getZ() + z, i.getY() + y, i.getX() + x, getLoader());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(yv < 0 && (config.getMode().equals(ObjectPlaceMode.PAINT))) {
|
if(yv < 0 && (config.getMode().equals(ObjectPlaceMode.PAINT)) && !B.isVineBlock(data)) {
|
||||||
yy = (int) Math.round(i.getY()) + Math.floorDiv(h, 2) + placer.getHighest(xx, zz, getLoader(), config.isUnderwater());
|
yy = (int) Math.round(i.getY()) + Math.floorDiv(h, 2) + placer.getHighest(xx, zz, getLoader(), config.isUnderwater());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -799,10 +801,20 @@ public class IrisObject extends IrisRegistrant {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(config.isWaterloggable() && yy <= placer.getFluidHeight() && data instanceof Waterlogged) {
|
if((config.isWaterloggable() || config.isUnderwater()) && yy <= placer.getFluidHeight() && data instanceof Waterlogged) {
|
||||||
((Waterlogged) data).setWaterlogged(true);
|
((Waterlogged) data).setWaterlogged(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(B.isVineBlock(data)) {
|
||||||
|
MultipleFacing f = (MultipleFacing)data;
|
||||||
|
for(BlockFace face : f.getAllowedFaces()) {
|
||||||
|
BlockData facingBlock = placer.get(xx + face.getModX(), yy + face.getModY(), zz + face.getModZ());
|
||||||
|
if(B.isSolid(facingBlock) && !B.isVineBlock(facingBlock)) {
|
||||||
|
f.setFace(face, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(listener != null) {
|
if(listener != null) {
|
||||||
listener.accept(new BlockPosition(xx, yy, zz));
|
listener.accept(new BlockPosition(xx, yy, zz));
|
||||||
}
|
}
|
||||||
@@ -811,7 +823,9 @@ public class IrisObject extends IrisRegistrant {
|
|||||||
placer.getEngine().getMantle().getMantle().set(xx, yy, zz, new MatterMarker(markers.get(g)));
|
placer.getEngine().getMantle().getMantle().set(xx, yy, zz, new MatterMarker(markers.get(g)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!data.getMaterial().equals(Material.AIR) && !data.getMaterial().equals(Material.CAVE_AIR)) {
|
boolean wouldReplace = B.isSolid(placer.get(xx, yy, zz)) && B.isVineBlock(data);
|
||||||
|
|
||||||
|
if(!data.getMaterial().equals(Material.AIR) && !data.getMaterial().equals(Material.CAVE_AIR) && !wouldReplace) {
|
||||||
placer.set(xx, yy, zz, data);
|
placer.set(xx, yy, zz, data);
|
||||||
if(tile != null) {
|
if(tile != null) {
|
||||||
placer.setTile(xx, yy, zz, tile);
|
placer.setTile(xx, yy, zz, tile);
|
||||||
@@ -849,6 +863,7 @@ public class IrisObject extends IrisRegistrant {
|
|||||||
BlockVector i = g.clone();
|
BlockVector i = g.clone();
|
||||||
i = config.getRotation().rotate(i.clone(), spinx, spiny, spinz).clone();
|
i = config.getRotation().rotate(i.clone(), spinx, spiny, spinz).clone();
|
||||||
i = config.getTranslate().translate(i.clone(), config.getRotation(), spinx, spiny, spinz).clone();
|
i = config.getTranslate().translate(i.clone(), config.getRotation(), spinx, spiny, spinz).clone();
|
||||||
|
d = config.getRotation().rotate(d, spinx, spiny, spinz);
|
||||||
|
|
||||||
if(i.getBlockY() != lowest)
|
if(i.getBlockY() != lowest)
|
||||||
continue;
|
continue;
|
||||||
@@ -882,7 +897,7 @@ public class IrisObject extends IrisRegistrant {
|
|||||||
|
|
||||||
int highest = placer.getHighest(xx, zz, getLoader(), true);
|
int highest = placer.getHighest(xx, zz, getLoader(), true);
|
||||||
|
|
||||||
if(config.isWaterloggable() && highest <= placer.getFluidHeight() && d instanceof Waterlogged)
|
if((config.isWaterloggable() || config.isUnderwater()) && highest <= placer.getFluidHeight() && d instanceof Waterlogged)
|
||||||
((Waterlogged) d).setWaterlogged(true);
|
((Waterlogged) d).setWaterlogged(true);
|
||||||
|
|
||||||
if(yv >= 0 && config.isBottom())
|
if(yv >= 0 && config.isBottom())
|
||||||
@@ -894,10 +909,21 @@ public class IrisObject extends IrisRegistrant {
|
|||||||
if(settings.getYMax() != 0)
|
if(settings.getYMax() != 0)
|
||||||
lowerBound -= Math.min(config.getStiltSettings().getYMax() - (lowest + y - highest), 0);
|
lowerBound -= Math.min(config.getStiltSettings().getYMax() - (lowest + y - highest), 0);
|
||||||
}
|
}
|
||||||
for(int j = lowest + y; j > lowerBound; j--)
|
for(int j = lowest + y; j > lowerBound; j--) {
|
||||||
|
if(B.isVineBlock(d)) {
|
||||||
|
MultipleFacing f = (MultipleFacing)d;
|
||||||
|
for(BlockFace face : f.getAllowedFaces()) {
|
||||||
|
BlockData facingBlock = placer.get(xx + face.getModX(), j + face.getModY(), zz + face.getModZ());
|
||||||
|
if(B.isSolid(facingBlock) && !B.isVineBlock(facingBlock)) {
|
||||||
|
f.setFace(face, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
placer.set(xx, j, zz, d);
|
placer.set(xx, j, zz, d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
readLock.unlock();
|
readLock.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -122,6 +122,8 @@ public class IrisObjectPlacement {
|
|||||||
@ArrayType(min = 1, type = IrisObjectLoot.class)
|
@ArrayType(min = 1, type = IrisObjectLoot.class)
|
||||||
@Desc("The loot tables to apply to these objects")
|
@Desc("The loot tables to apply to these objects")
|
||||||
private KList<IrisObjectLoot> loot = new KList<>();
|
private KList<IrisObjectLoot> loot = new KList<>();
|
||||||
|
@Desc("Whether the given loot tables override any and all other loot tables available in the dimension, region or biome.")
|
||||||
|
private boolean overrideGlobalLoot = false;
|
||||||
@Desc("This object / these objects override the following trees when they grow...")
|
@Desc("This object / these objects override the following trees when they grow...")
|
||||||
@ArrayType(min = 1, type = IrisTree.class)
|
@ArrayType(min = 1, type = IrisTree.class)
|
||||||
private KList<IrisTree> trees = new KList<>();
|
private KList<IrisTree> trees = new KList<>();
|
||||||
@@ -201,6 +203,8 @@ public class IrisObjectPlacement {
|
|||||||
TableCache tc = new TableCache();
|
TableCache tc = new TableCache();
|
||||||
|
|
||||||
for(IrisObjectLoot loot : getLoot()) {
|
for(IrisObjectLoot loot : getLoot()) {
|
||||||
|
if(loot == null)
|
||||||
|
continue;
|
||||||
IrisLootTable table = manager.getLootLoader().load(loot.getName());
|
IrisLootTable table = manager.getLootLoader().load(loot.getName());
|
||||||
if(table == null) {
|
if(table == null) {
|
||||||
Iris.warn("Couldn't find loot table " + loot.getName());
|
Iris.warn("Couldn't find loot table " + loot.getName());
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package com.volmit.iris.engine.object.annotations;
|
||||||
|
|
||||||
|
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 RegistryListEnchantment {
|
||||||
|
}
|
||||||
@@ -40,6 +40,7 @@ import com.volmit.iris.util.scheduling.ChronoLatch;
|
|||||||
import com.volmit.iris.util.scheduling.J;
|
import com.volmit.iris.util.scheduling.J;
|
||||||
import com.volmit.iris.util.scheduling.Looper;
|
import com.volmit.iris.util.scheduling.Looper;
|
||||||
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
|
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
|
||||||
|
import com.volmit.iris.util.stream.utility.ProfiledStream;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
@@ -81,12 +82,14 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun
|
|||||||
private Engine engine;
|
private Engine engine;
|
||||||
private Looper hotloader;
|
private Looper hotloader;
|
||||||
private StudioMode lastMode;
|
private StudioMode lastMode;
|
||||||
|
private DummyBiomeProvider dummyBiomeProvider;
|
||||||
@Setter
|
@Setter
|
||||||
private StudioGenerator studioGenerator;
|
private StudioGenerator studioGenerator;
|
||||||
|
|
||||||
public BukkitChunkGenerator(IrisWorld world, boolean studio, File dataLocation, String dimensionKey) {
|
public BukkitChunkGenerator(IrisWorld world, boolean studio, File dataLocation, String dimensionKey) {
|
||||||
setup = new AtomicBoolean(false);
|
setup = new AtomicBoolean(false);
|
||||||
studioGenerator = null;
|
studioGenerator = null;
|
||||||
|
dummyBiomeProvider = new DummyBiomeProvider();
|
||||||
populators = new KList<>();
|
populators = new KList<>();
|
||||||
loadLock = new Semaphore(LOAD_LOCKS);
|
loadLock = new Semaphore(LOAD_LOCKS);
|
||||||
this.world = world;
|
this.world = world;
|
||||||
@@ -274,7 +277,6 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun
|
|||||||
public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random ignored, int x, int z, @NotNull BiomeGrid biome) {
|
public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random ignored, int x, int z, @NotNull BiomeGrid biome) {
|
||||||
try {
|
try {
|
||||||
getEngine(world);
|
getEngine(world);
|
||||||
loadLock.acquire();
|
|
||||||
computeStudioGenerator();
|
computeStudioGenerator();
|
||||||
TerrainChunk tc = TerrainChunk.create(world, biome);
|
TerrainChunk tc = TerrainChunk.create(world, biome);
|
||||||
this.world.bind(world);
|
this.world.bind(world);
|
||||||
@@ -291,10 +293,9 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun
|
|||||||
|
|
||||||
ChunkData c = tc.getRaw();
|
ChunkData c = tc.getRaw();
|
||||||
Iris.debug("Generated " + x + " " + z);
|
Iris.debug("Generated " + x + " " + z);
|
||||||
loadLock.release();
|
|
||||||
return c;
|
return c;
|
||||||
} catch(Throwable e) {
|
} catch(Throwable e) {
|
||||||
loadLock.release();
|
|
||||||
Iris.error("======================================");
|
Iris.error("======================================");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Iris.reportErrorChunk(x, z, e, "CHUNK");
|
Iris.reportErrorChunk(x, z, e, "CHUNK");
|
||||||
@@ -368,6 +369,6 @@ public class BukkitChunkGenerator extends ChunkGenerator implements PlatformChun
|
|||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public BiomeProvider getDefaultBiomeProvider(@NotNull WorldInfo worldInfo) {
|
public BiomeProvider getDefaultBiomeProvider(@NotNull WorldInfo worldInfo) {
|
||||||
return null;
|
return dummyBiomeProvider;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.volmit.iris.engine.platform;
|
||||||
|
|
||||||
|
import com.volmit.iris.util.collection.KList;
|
||||||
|
import org.bukkit.block.Biome;
|
||||||
|
import org.bukkit.generator.BiomeProvider;
|
||||||
|
import org.bukkit.generator.WorldInfo;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class DummyBiomeProvider extends BiomeProvider {
|
||||||
|
private final List<Biome> ALL = new KList<>(Biome.values()).qdel(Biome.CUSTOM);
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Biome getBiome(@NotNull WorldInfo worldInfo, int x, int y, int z) {
|
||||||
|
return Biome.PLAINS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public List<Biome> getBiomes(@NotNull WorldInfo worldInfo) {
|
||||||
|
return ALL;
|
||||||
|
}
|
||||||
|
}
|
||||||
51
src/main/java/com/volmit/iris/util/context/ChunkContext.java
Normal file
51
src/main/java/com/volmit/iris/util/context/ChunkContext.java
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
package com.volmit.iris.util.context;
|
||||||
|
|
||||||
|
import com.volmit.iris.engine.IrisComplex;
|
||||||
|
import com.volmit.iris.engine.object.IrisBiome;
|
||||||
|
import com.volmit.iris.engine.object.IrisRegion;
|
||||||
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
|
import com.volmit.iris.util.parallel.BurstExecutor;
|
||||||
|
import com.volmit.iris.util.parallel.MultiBurst;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ChunkContext {
|
||||||
|
private final int x;
|
||||||
|
private final int z;
|
||||||
|
private ChunkedDataCache<Double> height;
|
||||||
|
private ChunkedDataCache<IrisBiome> biome;
|
||||||
|
private ChunkedDataCache<IrisBiome> cave;
|
||||||
|
private ChunkedDataCache<BlockData> rock;
|
||||||
|
private ChunkedDataCache<BlockData> fluid;
|
||||||
|
private ChunkedDataCache<IrisRegion> region;
|
||||||
|
|
||||||
|
@BlockCoordinates
|
||||||
|
public ChunkContext(int x, int z, IrisComplex c) {
|
||||||
|
this(x, z, c, true);
|
||||||
|
}
|
||||||
|
@BlockCoordinates
|
||||||
|
public ChunkContext(int x, int z, IrisComplex c, boolean cache) {
|
||||||
|
this.x = x;
|
||||||
|
this.z = z;
|
||||||
|
if(cache) {
|
||||||
|
BurstExecutor b = MultiBurst.burst.burst();
|
||||||
|
height = new ChunkedDataCache<>(b, c.getHeightStream(), x, z);
|
||||||
|
biome = new ChunkedDataCache<>(b, c.getTrueBiomeStream(), x, z);
|
||||||
|
cave = new ChunkedDataCache<>(b, c.getCaveBiomeStream(), x, z);
|
||||||
|
rock = new ChunkedDataCache<>(b, c.getRockStream(), x, z);
|
||||||
|
fluid = new ChunkedDataCache<>(b, c.getFluidStream(), x, z);
|
||||||
|
region = new ChunkedDataCache<>(b, c.getRegionStream(), x, z);
|
||||||
|
b.complete();
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
height = new ChunkedDataCache<>(null, c.getHeightStream(), x, z, false);
|
||||||
|
biome = new ChunkedDataCache<>(null, c.getTrueBiomeStream(), x, z, false);
|
||||||
|
cave = new ChunkedDataCache<>(null, c.getCaveBiomeStream(), x, z, false);
|
||||||
|
rock = new ChunkedDataCache<>(null, c.getRockStream(), x, z, false);
|
||||||
|
fluid = new ChunkedDataCache<>(null, c.getFluidStream(), x, z, false);
|
||||||
|
region = new ChunkedDataCache<>(null, c.getRegionStream(), x, z, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
package com.volmit.iris.util.context;
|
||||||
|
|
||||||
|
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||||
|
import com.volmit.iris.util.parallel.BurstExecutor;
|
||||||
|
import com.volmit.iris.util.stream.ProceduralStream;
|
||||||
|
|
||||||
|
public class ChunkedDataCache<T> {
|
||||||
|
private final int x;
|
||||||
|
private final int z;
|
||||||
|
private final Object[] data;
|
||||||
|
private final boolean cache;
|
||||||
|
private final ProceduralStream<T> stream;
|
||||||
|
|
||||||
|
@BlockCoordinates
|
||||||
|
public ChunkedDataCache(BurstExecutor burst, ProceduralStream<T> stream, int x, int z) {
|
||||||
|
this(burst, stream, x, z, true);
|
||||||
|
}
|
||||||
|
@BlockCoordinates
|
||||||
|
public ChunkedDataCache(BurstExecutor burst, ProceduralStream<T> stream, int x, int z, boolean cache) {
|
||||||
|
this.stream = stream;
|
||||||
|
this.cache = cache;
|
||||||
|
this.x = x;
|
||||||
|
this.z = z;
|
||||||
|
if(cache) {
|
||||||
|
data = new Object[256];
|
||||||
|
int i,j;
|
||||||
|
|
||||||
|
for(i = 0; i < 16; i++) {
|
||||||
|
int finalI = i;
|
||||||
|
for(j = 0; j < 16; j++) {
|
||||||
|
int finalJ = j;
|
||||||
|
burst.queue(() -> data[(finalJ * 16) + finalI] = stream.get(x+ finalI, z+ finalJ));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
data = new Object[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@BlockCoordinates
|
||||||
|
public T get(int x, int z) {
|
||||||
|
if(!cache) {
|
||||||
|
return stream.get(this.x + x, this.z + z);
|
||||||
|
}
|
||||||
|
|
||||||
|
T t = (T) data[(z * 16) + x];
|
||||||
|
return t == null ? stream.get(this.x + x, this.z + z) : t;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,11 +28,26 @@ import lombok.AllArgsConstructor;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@AllArgsConstructor
|
|
||||||
public class IrisContext {
|
public class IrisContext {
|
||||||
private static final KMap<Thread, IrisContext> context = new KMap<>();
|
private static final KMap<Thread, IrisContext> context = new KMap<>();
|
||||||
private static ChronoLatch cl = new ChronoLatch(60000);
|
private static ChronoLatch cl = new ChronoLatch(60000);
|
||||||
private final Engine engine;
|
private final Engine engine;
|
||||||
|
private ChunkContext chunkContext;
|
||||||
|
|
||||||
|
public IrisContext(Engine engine) {
|
||||||
|
this.engine = engine;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IrisContext getOr(Engine engine) {
|
||||||
|
IrisContext c = get();
|
||||||
|
|
||||||
|
if(c == null) {
|
||||||
|
c = new IrisContext(engine);
|
||||||
|
touch(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
public static IrisContext get() {
|
public static IrisContext get() {
|
||||||
return context.get(Thread.currentThread());
|
return context.get(Thread.currentThread());
|
||||||
|
|||||||
@@ -199,7 +199,10 @@ public class B {
|
|||||||
STONE_BUTTON,
|
STONE_BUTTON,
|
||||||
WARPED_BUTTON,
|
WARPED_BUTTON,
|
||||||
TORCH,
|
TORCH,
|
||||||
SOUL_TORCH
|
SOUL_TORCH,
|
||||||
|
GLOW_LICHEN,
|
||||||
|
VINE,
|
||||||
|
SCULK_VEIN
|
||||||
}).forEach((i) -> b.add(i.ordinal()));
|
}).forEach((i) -> b.add(i.ordinal()));
|
||||||
b.addAll(foliageCache);
|
b.addAll(foliageCache);
|
||||||
|
|
||||||
@@ -402,6 +405,8 @@ public class B {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isSolid(BlockData mat) {
|
public static boolean isSolid(BlockData mat) {
|
||||||
|
if(mat == null)
|
||||||
|
return false;
|
||||||
return mat.getMaterial().isSolid();
|
return mat.getMaterial().isSolid();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -672,4 +677,11 @@ public class B {
|
|||||||
public static void registerCustomBlockData(String namespace, String key, BlockData blockData) {
|
public static void registerCustomBlockData(String namespace, String key, BlockData blockData) {
|
||||||
custom.put(namespace + ":" + key, blockData);
|
custom.put(namespace + ":" + key, blockData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isVineBlock(BlockData data) {
|
||||||
|
return switch(data.getMaterial()) {
|
||||||
|
case VINE, SCULK_VEIN, GLOW_LICHEN -> true;
|
||||||
|
default -> false;
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,7 +62,6 @@ public class BiomeGridHunkView implements Hunk<Biome> {
|
|||||||
if(y > highest)
|
if(y > highest)
|
||||||
{
|
{
|
||||||
highest = y;
|
highest = y;
|
||||||
Iris.info("Highest = " + highest);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -579,8 +579,7 @@ public class Mantle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void deleteChunkSlice(int x, int z, Class<?> c) {
|
public void deleteChunkSlice(int x, int z, Class<?> c) {
|
||||||
if(!IrisToolbelt.toolbeltConfiguration.isEmpty() && IrisToolbelt.toolbeltConfiguration.getOrDefault("retain.mantle." + c.getCanonicalName(), false))
|
if(!IrisToolbelt.toolbeltConfiguration.isEmpty() && IrisToolbelt.toolbeltConfiguration.getOrDefault("retain.mantle." + c.getCanonicalName(), false)) {
|
||||||
{
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -75,4 +75,14 @@ public class Spiraler {
|
|||||||
z += dz;
|
z += dz;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int count() {
|
||||||
|
int c = 0;
|
||||||
|
while(hasNext()) {
|
||||||
|
next();
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ import com.volmit.iris.engine.object.IrisPosition;
|
|||||||
import com.volmit.iris.util.collection.KSet;
|
import com.volmit.iris.util.collection.KSet;
|
||||||
import com.volmit.iris.util.hunk.Hunk;
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
import com.volmit.iris.util.math.BlockPosition;
|
import com.volmit.iris.util.math.BlockPosition;
|
||||||
import com.volmit.iris.util.scheduling.J;
|
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ package com.volmit.iris.util.stream;
|
|||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.core.loader.IrisData;
|
import com.volmit.iris.core.loader.IrisData;
|
||||||
|
import com.volmit.iris.engine.data.cache.Cache;
|
||||||
import com.volmit.iris.engine.framework.Engine;
|
import com.volmit.iris.engine.framework.Engine;
|
||||||
import com.volmit.iris.engine.object.IRare;
|
import com.volmit.iris.engine.object.IRare;
|
||||||
import com.volmit.iris.engine.object.IrisStyledRange;
|
import com.volmit.iris.engine.object.IrisStyledRange;
|
||||||
@@ -29,6 +30,9 @@ import com.volmit.iris.util.function.Function3;
|
|||||||
import com.volmit.iris.util.function.Function4;
|
import com.volmit.iris.util.function.Function4;
|
||||||
import com.volmit.iris.util.hunk.Hunk;
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
import com.volmit.iris.util.math.RNG;
|
import com.volmit.iris.util.math.RNG;
|
||||||
|
import com.volmit.iris.util.parallel.BurstExecutor;
|
||||||
|
import com.volmit.iris.util.parallel.GridLock;
|
||||||
|
import com.volmit.iris.util.parallel.MultiBurst;
|
||||||
import com.volmit.iris.util.stream.arithmetic.AddingStream;
|
import com.volmit.iris.util.stream.arithmetic.AddingStream;
|
||||||
import com.volmit.iris.util.stream.arithmetic.ClampedStream;
|
import com.volmit.iris.util.stream.arithmetic.ClampedStream;
|
||||||
import com.volmit.iris.util.stream.arithmetic.CoordinateBitShiftLeftStream;
|
import com.volmit.iris.util.stream.arithmetic.CoordinateBitShiftLeftStream;
|
||||||
@@ -62,9 +66,11 @@ import com.volmit.iris.util.stream.utility.NullSafeStream;
|
|||||||
import com.volmit.iris.util.stream.utility.ProfiledStream;
|
import com.volmit.iris.util.stream.utility.ProfiledStream;
|
||||||
import com.volmit.iris.util.stream.utility.SemaphoreStream;
|
import com.volmit.iris.util.stream.utility.SemaphoreStream;
|
||||||
import com.volmit.iris.util.stream.utility.SynchronizedStream;
|
import com.volmit.iris.util.stream.utility.SynchronizedStream;
|
||||||
|
import com.volmit.iris.util.stream.utility.WasteDetector;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
@SuppressWarnings("ALL")
|
@SuppressWarnings("ALL")
|
||||||
@@ -110,7 +116,7 @@ public interface ProceduralStream<T> extends ProceduralLayer, Interpolated<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
default ProceduralStream<T> profile() {
|
default ProceduralStream<T> profile() {
|
||||||
return profile(10);
|
return profile(256);
|
||||||
}
|
}
|
||||||
|
|
||||||
default ProceduralStream<T> profile(int memory) {
|
default ProceduralStream<T> profile(int memory) {
|
||||||
@@ -133,6 +139,10 @@ public interface ProceduralStream<T> extends ProceduralLayer, Interpolated<T> {
|
|||||||
return add2D((x, z) -> a.get(x, z));
|
return add2D((x, z) -> a.get(x, z));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default ProceduralStream<T> waste(String name) {
|
||||||
|
return new WasteDetector<T>(this, name);
|
||||||
|
}
|
||||||
|
|
||||||
default ProceduralStream<T> subtract(ProceduralStream<Double> a) {
|
default ProceduralStream<T> subtract(ProceduralStream<Double> a) {
|
||||||
return subtract2D((x, z) -> a.get(x, z));
|
return subtract2D((x, z) -> a.get(x, z));
|
||||||
}
|
}
|
||||||
@@ -289,7 +299,7 @@ public interface ProceduralStream<T> extends ProceduralLayer, Interpolated<T> {
|
|||||||
return new To3DStream<T>(this);
|
return new To3DStream<T>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
default ProceduralStream<T> cache2D(String name, Engine engine, int size) {
|
default CachedStream2D<T> cache2D(String name, Engine engine, int size) {
|
||||||
return new CachedStream2D<T>(name, engine, this, size);
|
return new CachedStream2D<T>(name, engine, this, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -405,6 +415,48 @@ public interface ProceduralStream<T> extends ProceduralLayer, Interpolated<T> {
|
|||||||
}, Interpolated.DOUBLE);
|
}, Interpolated.DOUBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default Hunk<T> fastFill2DParallel(int x, int z) {
|
||||||
|
Hunk<T> hunk = Hunk.newAtomicHunk(16, 16, 1);
|
||||||
|
BurstExecutor e = MultiBurst.burst.burst(256);
|
||||||
|
int i,j;
|
||||||
|
|
||||||
|
for(i = 0; i < 16; i++) {
|
||||||
|
for(j = 0; j < 16; j++) {
|
||||||
|
int fi = i;
|
||||||
|
int fj = j;
|
||||||
|
e.queue(() -> hunk.setRaw(fi, fj, 0, get(x+ fi, z+ fj)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
e.complete();
|
||||||
|
return hunk;
|
||||||
|
}
|
||||||
|
|
||||||
|
default void fastFill2DParallel(Hunk<T> hunk, BurstExecutor e, int x, int z) {
|
||||||
|
int i,j;
|
||||||
|
|
||||||
|
for(i = 0; i < 16; i++) {
|
||||||
|
for(j = 0; j < 16; j++) {
|
||||||
|
int fi = i;
|
||||||
|
int fj = j;
|
||||||
|
e.queue(() -> hunk.setRaw(fi, fj, 0, get(x+ fi, z+ fj)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default Hunk<T> fastFill2D(int x, int z) {
|
||||||
|
Hunk<T> hunk = Hunk.newArrayHunk(16, 16, 1);
|
||||||
|
int i,j;
|
||||||
|
|
||||||
|
for(i = 0; i < 16; i++) {
|
||||||
|
for(j = 0; j < 16; j++) {
|
||||||
|
hunk.setRaw(i, j, 0, get(x+ i, z+ j));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return hunk;
|
||||||
|
}
|
||||||
|
|
||||||
default ProceduralStream<T> fit(double inMin, double inMax, double min, double max) {
|
default ProceduralStream<T> fit(double inMin, double inMax, double min, double max) {
|
||||||
return new FittedStream<T>(this, inMin, inMax, min, max);
|
return new FittedStream<T>(this, inMin, inMax, min, max);
|
||||||
}
|
}
|
||||||
@@ -531,6 +583,21 @@ public interface ProceduralStream<T> extends ProceduralLayer, Interpolated<T> {
|
|||||||
|
|
||||||
ProceduralStream<?> getSource();
|
ProceduralStream<?> getSource();
|
||||||
|
|
||||||
|
default void fillChunk(int x, int z, T[] c) {
|
||||||
|
if(c.length != 256) {
|
||||||
|
throw new RuntimeException("Not 256 Length for chunk get");
|
||||||
|
}
|
||||||
|
|
||||||
|
int xs = x << 4;
|
||||||
|
int zs = z << 4;
|
||||||
|
|
||||||
|
for(int i = 0; i < 16; i++) {
|
||||||
|
for(int j = 0; j < 16; j++) {
|
||||||
|
c[Cache.to1D(i+xs, j+zs, 0, 16, 16)] = get(i+xs, j+zs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
T get(double x, double z);
|
T get(double x, double z);
|
||||||
|
|
||||||
T get(double x, double y, double z);
|
T get(double x, double y, double z);
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ import com.volmit.iris.engine.data.cache.Cache;
|
|||||||
import com.volmit.iris.engine.framework.Engine;
|
import com.volmit.iris.engine.framework.Engine;
|
||||||
import com.volmit.iris.engine.framework.MeteredCache;
|
import com.volmit.iris.engine.framework.MeteredCache;
|
||||||
import com.volmit.iris.util.data.KCache;
|
import com.volmit.iris.util.data.KCache;
|
||||||
|
import com.volmit.iris.util.hunk.Hunk;
|
||||||
|
import com.volmit.iris.util.hunk.storage.ArrayHunk;
|
||||||
import com.volmit.iris.util.stream.BasicStream;
|
import com.volmit.iris.util.stream.BasicStream;
|
||||||
import com.volmit.iris.util.stream.ProceduralStream;
|
import com.volmit.iris.util.stream.ProceduralStream;
|
||||||
|
|
||||||
@@ -31,6 +33,7 @@ public class CachedStream2D<T> extends BasicStream<T> implements ProceduralStrea
|
|||||||
private final ProceduralStream<T> stream;
|
private final ProceduralStream<T> stream;
|
||||||
private final KCache<Long, T> cache;
|
private final KCache<Long, T> cache;
|
||||||
private final Engine engine;
|
private final Engine engine;
|
||||||
|
private boolean chunked = true;
|
||||||
|
|
||||||
public CachedStream2D(String name, Engine engine, ProceduralStream<T> stream, int size) {
|
public CachedStream2D(String name, Engine engine, ProceduralStream<T> stream, int size) {
|
||||||
super();
|
super();
|
||||||
@@ -52,6 +55,7 @@ public class CachedStream2D<T> extends BasicStream<T> implements ProceduralStrea
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public T get(double x, double z) {
|
public T get(double x, double z) {
|
||||||
|
//return stream.get(x, z);
|
||||||
return cache.get(Cache.key((int) x, (int) z));
|
return cache.get(Cache.key((int) x, (int) z));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,11 +34,13 @@ public class ProfiledStream<T> extends BasicStream<T> {
|
|||||||
public static final AtomicInteger ids = new AtomicInteger();
|
public static final AtomicInteger ids = new AtomicInteger();
|
||||||
private final int id;
|
private final int id;
|
||||||
private final RollingSequence metrics;
|
private final RollingSequence metrics;
|
||||||
|
public static final KList<ProfiledStream<?>> profiles = new KList<>();
|
||||||
|
|
||||||
public ProfiledStream(ProceduralStream<T> stream, int memory) {
|
public ProfiledStream(ProceduralStream<T> stream, int memory) {
|
||||||
super(stream);
|
super(stream);
|
||||||
this.metrics = new RollingSequence(memory);
|
this.metrics = new RollingSequence(memory);
|
||||||
this.id = ids.getAndAdd(1);
|
this.id = ids.getAndAdd(1);
|
||||||
|
profiles.add(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void print(Consumer<String> printer, ProceduralStream<?> stream) {
|
public static void print(Consumer<String> printer, ProceduralStream<?> stream) {
|
||||||
|
|||||||
@@ -0,0 +1,80 @@
|
|||||||
|
package com.volmit.iris.util.stream.utility;
|
||||||
|
|
||||||
|
import com.volmit.iris.Iris;
|
||||||
|
import com.volmit.iris.util.collection.KList;
|
||||||
|
import com.volmit.iris.util.collection.KMap;
|
||||||
|
import com.volmit.iris.util.format.C;
|
||||||
|
import com.volmit.iris.util.stream.BasicStream;
|
||||||
|
import com.volmit.iris.util.stream.ProceduralStream;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
public class WasteDetector<T> extends BasicStream<T> {
|
||||||
|
public static final boolean checking = false;
|
||||||
|
private static final KMap<String, Integer> allAccesses = new KMap<>();
|
||||||
|
private static final KMap<String, List<Throwable>> allThrows = new KMap<>();
|
||||||
|
private final AtomicInteger accesses;
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
public WasteDetector(ProceduralStream<T> stream, String name) {
|
||||||
|
super(stream);
|
||||||
|
this.name = name;
|
||||||
|
accesses = new AtomicInteger(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T get(double x, double z) {
|
||||||
|
if(checking)
|
||||||
|
{
|
||||||
|
if(x == 7 && z == 7) {
|
||||||
|
// AHHHAAA!
|
||||||
|
allAccesses.compute(name, (k, v) -> v == null ? 1 : v + 1);
|
||||||
|
try {
|
||||||
|
throw new RuntimeException();
|
||||||
|
}
|
||||||
|
|
||||||
|
catch(RuntimeException e) {
|
||||||
|
allThrows.computeIfAbsent(name, (k) -> new KList<>()).add(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return getTypedSource().get(x, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void printAll() {
|
||||||
|
if(checking)
|
||||||
|
{
|
||||||
|
Iris.warn("=========================================================");
|
||||||
|
for(String i : allAccesses.sortKNumber().reverse()) {
|
||||||
|
Iris.warn(i + ": " + allAccesses.get(i) + " Time(s)");
|
||||||
|
}
|
||||||
|
Iris.warn("=========================================================");
|
||||||
|
for(String i : allAccesses.sortKNumber().reverse()) {
|
||||||
|
Iris.warn("======== "+ i + " ========");
|
||||||
|
for(Throwable j : allThrows.get(i)) {
|
||||||
|
j.printStackTrace();
|
||||||
|
}
|
||||||
|
Iris.warn("---------------------------------------------------------");
|
||||||
|
}
|
||||||
|
Iris.warn("=========================================================");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T get(double x, double y, double z) {
|
||||||
|
return getTypedSource().get(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double toDouble(T t) {
|
||||||
|
return getTypedSource().toDouble(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T fromDouble(double d) {
|
||||||
|
return getTypedSource().fromDouble(d);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@ name: ${name}
|
|||||||
version: ${version}
|
version: ${version}
|
||||||
main: ${main}
|
main: ${main}
|
||||||
load: STARTUP
|
load: STARTUP
|
||||||
authors: [ cyberpwn, NextdoorPsycho ]
|
authors: [ cyberpwn, NextdoorPsycho, Vatuu ]
|
||||||
website: volmit.com
|
website: volmit.com
|
||||||
description: More than a Dimension!
|
description: More than a Dimension!
|
||||||
libraries:
|
libraries:
|
||||||
@@ -19,7 +19,6 @@ libraries:
|
|||||||
- bsf:bsf:2.4.0
|
- bsf:bsf:2.4.0
|
||||||
commands:
|
commands:
|
||||||
iris:
|
iris:
|
||||||
aliases: [ ir, irs ]
|
aliases: [ ir, irs]
|
||||||
api-version: ${apiversion}
|
api-version: ${apiversion}
|
||||||
hotload-dependencies: false
|
hotload-dependencies: false
|
||||||
softdepend: [ "Oraxen", "ItemsAdder", "IrisFeller", "WorldEdit"]
|
|
||||||
Reference in New Issue
Block a user