From 31320b4ab7008ad920e45617d80f9caa9c75bbc0 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 13 Oct 2020 05:53:50 -0400 Subject: [PATCH] Mythic mobs support --- pom.xml | 11 ++++ src/main/java/com/volmit/iris/Iris.java | 3 + .../iris/gen/PostBlockTerrainProvider.java | 5 ++ .../iris/gen/post/PostMasterPatcher.java | 10 +++ .../com/volmit/iris/link/MythicMobsLink.java | 64 +++++++++++++++++++ .../volmit/iris/manager/SchemaBuilder.java | 43 +++++++++++++ .../com/volmit/iris/object/IrisEntity.java | 28 ++++++-- .../iris/util/RegistryListMythical.java | 14 ++++ 8 files changed, 174 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/volmit/iris/link/MythicMobsLink.java create mode 100644 src/main/java/com/volmit/iris/util/RegistryListMythical.java diff --git a/pom.xml b/pom.xml index 588d13be6..b931ef344 100644 --- a/pom.xml +++ b/pom.xml @@ -152,6 +152,11 @@ CodeMC https://repo.codemc.org/repository/maven-public + + nexus + Lumine Releases + https://mvn.lumine.io/repository/maven-public/ + WorldEdit https://maven.enginehub.org/repo/ @@ -197,6 +202,12 @@ 7.2.0-SNAPSHOT provided + + io.lumine.xikage + MythicMobs + 4.9.1 + provided + com.github.ben-manes.caffeine diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index df9121e96..60a39e9dd 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -23,6 +23,7 @@ import com.volmit.iris.gen.provisions.ProvisionBukkit; import com.volmit.iris.gen.scaffold.IrisGenConfiguration; import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.link.MultiverseCoreLink; +import com.volmit.iris.link.MythicMobsLink; import com.volmit.iris.manager.EditManager; import com.volmit.iris.manager.IrisBoardManager; import com.volmit.iris.manager.IrisDataManager; @@ -59,6 +60,7 @@ public class Iris extends MortarPlugin public static IrisBoardManager board; public static String nmsTag = findNMSTag(); public static MultiverseCoreLink linkMultiverseCore; + public static MythicMobsLink linkMythicMobs; private static IrisLock lock = new IrisLock("Iris"); private static final Queue syncJobs = new ShurikenQueue<>(); public static boolean customModels = doesSupportCustomModels(); @@ -156,6 +158,7 @@ public class Iris extends MortarPlugin struct = new StructureManager(); board = new IrisBoardManager(); linkMultiverseCore = new MultiverseCoreLink(); + linkMythicMobs = new MythicMobsLink(); edit = new EditManager(); J.a(() -> IO.delete(getTemp())); J.a(this::bstats); diff --git a/src/main/java/com/volmit/iris/gen/PostBlockTerrainProvider.java b/src/main/java/com/volmit/iris/gen/PostBlockTerrainProvider.java index 0569fa0df..0a96799be 100644 --- a/src/main/java/com/volmit/iris/gen/PostBlockTerrainProvider.java +++ b/src/main/java/com/volmit/iris/gen/PostBlockTerrainProvider.java @@ -85,6 +85,11 @@ public abstract class PostBlockTerrainProvider extends ParallaxTerrainProvider i @Override public BlockData getPostBlock(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { + if(y > 255 || y < 0) + { + return null; + } + if(x >> 4 == currentPostX && z >> 4 == currentPostZ) { getPostLock().lock(); diff --git a/src/main/java/com/volmit/iris/gen/post/PostMasterPatcher.java b/src/main/java/com/volmit/iris/gen/post/PostMasterPatcher.java index 21eea8d6a..be8f338e6 100644 --- a/src/main/java/com/volmit/iris/gen/post/PostMasterPatcher.java +++ b/src/main/java/com/volmit/iris/gen/post/PostMasterPatcher.java @@ -402,6 +402,11 @@ public class PostMasterPatcher extends IrisPostBlockFilter private int nearestCaveFloor(int floor, int x, int z, int currentPostX, int currentPostZ, ChunkData currentData) { + if(floor > 255) + { + return 255; + } + if(B.isAir(getPostBlock(x, floor, z, currentPostX, currentPostZ, currentData))) { if(B.isAir(getPostBlock(x, floor - 1, z, currentPostX, currentPostZ, currentData))) @@ -430,6 +435,11 @@ public class PostMasterPatcher extends IrisPostBlockFilter private int nearestCaveCeiling(int ceiling, int x, int z, int currentPostX, int currentPostZ, ChunkData currentData) { + if(ceiling > 255) + { + return 255; + } + if(B.isAir(getPostBlock(x, ceiling, z, currentPostX, currentPostZ, currentData))) { if(B.isAir(getPostBlock(x, ceiling + 1, z, currentPostX, currentPostZ, currentData))) diff --git a/src/main/java/com/volmit/iris/link/MythicMobsLink.java b/src/main/java/com/volmit/iris/link/MythicMobsLink.java new file mode 100644 index 000000000..0f26ec1fa --- /dev/null +++ b/src/main/java/com/volmit/iris/link/MythicMobsLink.java @@ -0,0 +1,64 @@ +package com.volmit.iris.link; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.plugin.Plugin; + +import com.volmit.iris.util.KList; + +import io.lumine.xikage.mythicmobs.MythicMobs; +import io.lumine.xikage.mythicmobs.mobs.MythicMob; + +public class MythicMobsLink +{ + public MythicMobsLink() + { + + } + + public boolean supported() + { + return getMythicMobs() != null; + } + + public Entity spawn(String name, Location a) + { + if(!supported()) + { + return null; + } + + MythicMobs m = (MythicMobs) getMythicMobs(); + return m.getMobManager().spawnMob(name, a).getEntity().getBukkitEntity(); + } + + public String[] getMythicMobTypes() + { + KList v = new KList<>(); + + if(supported()) + { + MythicMobs m = (MythicMobs) getMythicMobs(); + + for(MythicMob i : m.getMobManager().getMobTypes()) + { + v.add(i.getInternalName()); + } + } + + return v.toArray(new String[v.size()]); + } + + public Plugin getMythicMobs() + { + Plugin p = Bukkit.getPluginManager().getPlugin("MythicMobs"); + + if(p == null) + { + return null; + } + + return p; + } +} diff --git a/src/main/java/com/volmit/iris/manager/SchemaBuilder.java b/src/main/java/com/volmit/iris/manager/SchemaBuilder.java index c08fdcb05..941281883 100644 --- a/src/main/java/com/volmit/iris/manager/SchemaBuilder.java +++ b/src/main/java/com/volmit/iris/manager/SchemaBuilder.java @@ -26,6 +26,7 @@ import com.volmit.iris.util.RegistryListFont; import com.volmit.iris.util.RegistryListGenerator; import com.volmit.iris.util.RegistryListItemType; import com.volmit.iris.util.RegistryListLoot; +import com.volmit.iris.util.RegistryListMythical; import com.volmit.iris.util.RegistryListObject; import com.volmit.iris.util.RegistryListRegion; import com.volmit.iris.util.RegistryListStructure; @@ -207,6 +208,22 @@ public class SchemaBuilder } + else if(k.isAnnotationPresent(RegistryListMythical.class)) + { + String key = "enum-reg-mythical"; + + if(!definitions.containsKey(key)) + { + JSONObject j = new JSONObject(); + j.put("enum", new JSONArray(Iris.linkMythicMobs.getMythicMobTypes())); + definitions.put(key, j); + } + + fancyType = "Mythic Mob Type"; + prop.put("$ref", "#/definitions/" + key); + description.add(SYMBOL_TYPE__N + " Must be a valid Mythic Mob Type (use ctrl+space for auto complete!) Define mythic mobs with the mythic mobs plugin configuration files."); + } + else if(k.isAnnotationPresent(RegistryListBlockType.class)) { String key = "enum-block-type"; @@ -553,6 +570,31 @@ public class SchemaBuilder description.add(SYMBOL_TYPE__N + " Must be a valid Biome (use ctrl+space for auto complete!)"); } + else if(k.isAnnotationPresent(RegistryListMythical.class)) + { + fancyType = "List of Mythic Mob Types"; + String key = "enum-reg-mythical"; + + if(!definitions.containsKey(key)) + { + JSONObject j = new JSONObject(); + JSONArray ja = new JSONArray(); + + for(String i : Iris.linkMythicMobs.getMythicMobTypes()) + { + ja.put(i); + } + + j.put("enum", ja); + definitions.put(key, j); + } + + JSONObject items = new JSONObject(); + items.put("$ref", "#/definitions/" + key); + prop.put("items", items); + description.add(SYMBOL_TYPE__N + " Must be a valid Mythic Mob Type (use ctrl+space for auto complete!) Configure mob types in the mythic mobs plugin configuration files."); + } + else if(k.isAnnotationPresent(RegistryListBlockType.class)) { fancyType = "List of Block Types"; @@ -839,6 +881,7 @@ public class SchemaBuilder { warnings.add("Unexpected Schema Type: " + type + " for field " + k.getName() + " (" + k.getType().getSimpleName() + ") in class " + cl.getSimpleName()); } + KList d = new KList<>(); d.add(k.getName()); d.add(getFieldDescription(k)); diff --git a/src/main/java/com/volmit/iris/object/IrisEntity.java b/src/main/java/com/volmit/iris/object/IrisEntity.java index 15893a288..df83c95e2 100644 --- a/src/main/java/com/volmit/iris/object/IrisEntity.java +++ b/src/main/java/com/volmit/iris/object/IrisEntity.java @@ -24,6 +24,7 @@ import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.KList; import com.volmit.iris.util.RNG; +import com.volmit.iris.util.RegistryListMythical; import com.volmit.iris.util.Required; import lombok.AllArgsConstructor; @@ -41,11 +42,15 @@ import lombok.experimental.Accessors; @EqualsAndHashCode(callSuper = false) public class IrisEntity extends IrisRegistrant { - @Required @DontObfuscate - @Desc("The type of entity to spawn") - private EntityType type = EntityType.PIG; + @Desc("The type of entity to spawn. To spawn a mythic mob, set this type to unknown and define mythic type.") + private EntityType type = EntityType.UNKNOWN; + + @RegistryListMythical + @Desc("The type of mythic mob (if mythic mobs is installed). If this is set, make sure to set 'type' to UNKNOWN") + @DontObfuscate + private String mythicalType = ""; @DontObfuscate @Desc("The custom name of this entity") @@ -136,7 +141,7 @@ public class IrisEntity extends IrisRegistrant public Entity spawn(ParallaxTerrainProvider gen, Location at, RNG rng) { - Entity e = at.getWorld().spawnEntity(at, getType()); + Entity e = doSpawn(at); e.setCustomName(getCustomName() != null ? C.translateAlternateColorCodes('&', getCustomName()) : null); e.setCustomNameVisible(isCustomNameVisible()); e.setGlowing(isGlowing()); @@ -259,4 +264,19 @@ public class IrisEntity extends IrisRegistrant return e; } + + private Entity doSpawn(Location at) + { + if(isMythical()) + { + return Iris.linkMythicMobs.spawn(getMythicalType(), at); + } + + return at.getWorld().spawnEntity(at, getType()); + } + + public boolean isMythical() + { + return Iris.linkMythicMobs.supported() && !getMythicalType().trim().isEmpty(); + } } diff --git a/src/main/java/com/volmit/iris/util/RegistryListMythical.java b/src/main/java/com/volmit/iris/util/RegistryListMythical.java new file mode 100644 index 000000000..f2b6283e6 --- /dev/null +++ b/src/main/java/com/volmit/iris/util/RegistryListMythical.java @@ -0,0 +1,14 @@ +package com.volmit.iris.util; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.*; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +@Retention(RUNTIME) +@Target({PARAMETER, TYPE, FIELD}) +public @interface RegistryListMythical +{ + +}