From 90a5398e984f44d669102c97b084791df8bef8a7 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 6 Sep 2020 04:01:20 -0400 Subject: [PATCH] Initial spawns --- .../java/com/volmit/iris/ProjectManager.java | 15 ++- .../volmit/iris/gen/IrisTerrainProvider.java | 54 +++++++++-- .../volmit/iris/gen/layer/GenLayerUpdate.java | 3 + .../com/volmit/iris/object/IrisBiome.java | 9 +- .../com/volmit/iris/object/IrisDimension.java | 9 +- .../com/volmit/iris/object/IrisEntity.java | 6 +- .../iris/object/IrisEntityInitialSpawn.java | 94 +++++++++++++++++++ ...pawn.java => IrisEntitySpawnOverride.java} | 4 +- .../com/volmit/iris/object/IrisRegion.java | 9 +- .../com/volmit/iris/object/IrisStructure.java | 9 +- .../volmit/iris/object/IrisStructureTile.java | 9 +- 11 files changed, 192 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/volmit/iris/object/IrisEntityInitialSpawn.java rename src/main/java/com/volmit/iris/object/{IrisEntitySpawn.java => IrisEntitySpawnOverride.java} (96%) diff --git a/src/main/java/com/volmit/iris/ProjectManager.java b/src/main/java/com/volmit/iris/ProjectManager.java index 2781e1e8b..e3dc5824e 100644 --- a/src/main/java/com/volmit/iris/ProjectManager.java +++ b/src/main/java/com/volmit/iris/ProjectManager.java @@ -444,11 +444,16 @@ public class ProjectManager biomes.forEach((r) -> r.getLoot().getTables().forEach((i) -> loot.add(Iris.globaldata.getLootLoader().load(i)))); structures.forEach((r) -> r.getLoot().getTables().forEach((i) -> loot.add(Iris.globaldata.getLootLoader().load(i)))); structures.forEach((b) -> b.getTiles().forEach((r) -> r.getLoot().getTables().forEach((i) -> loot.add(Iris.globaldata.getLootLoader().load(i))))); - structures.forEach((r) -> r.getEntitySpawns().forEach((sp) -> entities.add(Iris.globaldata.getEntityLoader().load(sp.getEntity())))); - structures.forEach((s) -> s.getTiles().forEach((r) -> r.getEntitySpawns().forEach((sp) -> entities.add(Iris.globaldata.getEntityLoader().load(sp.getEntity()))))); - biomes.forEach((r) -> r.getEntitySpawns().forEach((sp) -> entities.add(Iris.globaldata.getEntityLoader().load(sp.getEntity())))); - regions.forEach((r) -> r.getEntitySpawns().forEach((sp) -> entities.add(Iris.globaldata.getEntityLoader().load(sp.getEntity())))); - dimension.getEntitySpawns().forEach((sp) -> entities.add(Iris.globaldata.getEntityLoader().load(sp.getEntity()))); + structures.forEach((r) -> r.getEntitySpawnOverrides().forEach((sp) -> entities.add(Iris.globaldata.getEntityLoader().load(sp.getEntity())))); + structures.forEach((s) -> s.getTiles().forEach((r) -> r.getEntitySpawnOverrides().forEach((sp) -> entities.add(Iris.globaldata.getEntityLoader().load(sp.getEntity()))))); + biomes.forEach((r) -> r.getEntitySpawnOverrides().forEach((sp) -> entities.add(Iris.globaldata.getEntityLoader().load(sp.getEntity())))); + regions.forEach((r) -> r.getEntitySpawnOverrides().forEach((sp) -> entities.add(Iris.globaldata.getEntityLoader().load(sp.getEntity())))); + dimension.getEntitySpawnOverrides().forEach((sp) -> entities.add(Iris.globaldata.getEntityLoader().load(sp.getEntity()))); + structures.forEach((r) -> r.getEntityInitialSpawns().forEach((sp) -> entities.add(Iris.globaldata.getEntityLoader().load(sp.getEntity())))); + structures.forEach((s) -> s.getTiles().forEach((r) -> r.getEntityInitialSpawns().forEach((sp) -> entities.add(Iris.globaldata.getEntityLoader().load(sp.getEntity()))))); + biomes.forEach((r) -> r.getEntityInitialSpawns().forEach((sp) -> entities.add(Iris.globaldata.getEntityLoader().load(sp.getEntity())))); + regions.forEach((r) -> r.getEntityInitialSpawns().forEach((sp) -> entities.add(Iris.globaldata.getEntityLoader().load(sp.getEntity())))); + dimension.getEntityInitialSpawns().forEach((sp) -> entities.add(Iris.globaldata.getEntityLoader().load(sp.getEntity()))); KMap renameObjects = new KMap<>(); String a = ""; diff --git a/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java b/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java index 064b6d5e3..80d1d5706 100644 --- a/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java +++ b/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java @@ -26,7 +26,8 @@ import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisBlockDrops; import com.volmit.iris.object.IrisDimension; import com.volmit.iris.object.IrisEffect; -import com.volmit.iris.object.IrisEntitySpawn; +import com.volmit.iris.object.IrisEntityInitialSpawn; +import com.volmit.iris.object.IrisEntitySpawnOverride; import com.volmit.iris.object.IrisRegion; import com.volmit.iris.util.Form; import com.volmit.iris.util.IrisStructureResult; @@ -409,6 +410,33 @@ public class IrisTerrainProvider extends PostBlockTerrainProvider implements Iri } } + public void spawnInitials(Chunk c, RNG rng) + { + int x = (c.getX() * 16) + rng.nextInt(15); + int z = (c.getZ() * 16) + rng.nextInt(15); + int y = getCarvedHeight(x, z); + IrisDimension dim = getDimension(); + IrisRegion region = sampleRegion(x, z); + IrisBiome above = sampleTrueBiome(x, z); + + IrisStructureResult res = getStructure(x, y, z); + + if(res != null && res.getTile() != null) + { + trySpawn(res.getTile().getEntityInitialSpawns(), c, rng); + } + + if(res != null && res.getStructure() != null) + { + trySpawn(res.getStructure().getEntityInitialSpawns(), c, rng); + + } + + trySpawn(above.getEntityInitialSpawns(), c, rng); + trySpawn(region.getEntityInitialSpawns(), c, rng); + trySpawn(dim.getEntityInitialSpawns(), c, rng); + } + @Override protected void onSpawn(EntitySpawnEvent e) { @@ -431,7 +459,7 @@ public class IrisTerrainProvider extends PostBlockTerrainProvider implements Iri if(res != null && res.getTile() != null) { - if(trySpawn(res.getTile().getEntitySpawns(), e)) + if(trySpawn(res.getTile().getEntitySpawnOverrides(), e)) { return; } @@ -439,7 +467,7 @@ public class IrisTerrainProvider extends PostBlockTerrainProvider implements Iri if(res != null && res.getStructure() != null) { - if(trySpawn(res.getStructure().getEntitySpawns(), e)) + if(trySpawn(res.getStructure().getEntitySpawnOverrides(), e)) { return; } @@ -447,32 +475,32 @@ public class IrisTerrainProvider extends PostBlockTerrainProvider implements Iri if(below != null) { - if(trySpawn(below.getEntitySpawns(), e)) + if(trySpawn(below.getEntitySpawnOverrides(), e)) { return; } } - if(trySpawn(above.getEntitySpawns(), e)) + if(trySpawn(above.getEntitySpawnOverrides(), e)) { return; } - if(trySpawn(region.getEntitySpawns(), e)) + if(trySpawn(region.getEntitySpawnOverrides(), e)) { return; } - if(trySpawn(dim.getEntitySpawns(), e)) + if(trySpawn(dim.getEntitySpawnOverrides(), e)) { return; } } } - private boolean trySpawn(KList s, EntitySpawnEvent e) + private boolean trySpawn(KList s, EntitySpawnEvent e) { - for(IrisEntitySpawn i : s) + for(IrisEntitySpawnOverride i : s) { setSpawnable(false); @@ -492,6 +520,14 @@ public class IrisTerrainProvider extends PostBlockTerrainProvider implements Iri return false; } + private void trySpawn(KList s, Chunk c, RNG rng) + { + for(IrisEntityInitialSpawn i : s) + { + i.spawn(this, c, rng); + } + } + @Override public boolean canSpawn(int x, int z) { diff --git a/src/main/java/com/volmit/iris/gen/layer/GenLayerUpdate.java b/src/main/java/com/volmit/iris/gen/layer/GenLayerUpdate.java index bd0198efc..c424ae80f 100644 --- a/src/main/java/com/volmit/iris/gen/layer/GenLayerUpdate.java +++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerUpdate.java @@ -13,6 +13,7 @@ import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import com.volmit.iris.Iris; +import com.volmit.iris.gen.IrisTerrainProvider; import com.volmit.iris.gen.ParallaxTerrainProvider; import com.volmit.iris.gen.atomics.AtomicSliverMap; import com.volmit.iris.object.InventorySlotType; @@ -61,6 +62,8 @@ public class GenLayerUpdate extends BlockPopulator } } + ((IrisTerrainProvider) gen).spawnInitials(c, rx); + p.end(); gen.getMetrics().getUpdate().put(p.getMilliseconds()); } diff --git a/src/main/java/com/volmit/iris/object/IrisBiome.java b/src/main/java/com/volmit/iris/object/IrisBiome.java index e31ae47ff..4094297be 100644 --- a/src/main/java/com/volmit/iris/object/IrisBiome.java +++ b/src/main/java/com/volmit/iris/object/IrisBiome.java @@ -48,8 +48,13 @@ public class IrisBiome extends IrisRegistrant implements IRare @DontObfuscate @Desc("Entity spawns to override or add to this biome") - @ArrayType(min = 1, type = IrisEntitySpawn.class) - private KList entitySpawns = new KList<>(); + @ArrayType(min = 1, type = IrisEntitySpawnOverride.class) + private KList entitySpawnOverrides = new KList<>(); + + @DontObfuscate + @Desc("Entity spawns during generation") + @ArrayType(min = 1, type = IrisEntityInitialSpawn.class) + private KList entityInitialSpawns = new KList<>(); @ArrayType(min = 1, type = IrisEffect.class) @DontObfuscate diff --git a/src/main/java/com/volmit/iris/object/IrisDimension.java b/src/main/java/com/volmit/iris/object/IrisDimension.java index 9c3a5ac4c..ca08be642 100644 --- a/src/main/java/com/volmit/iris/object/IrisDimension.java +++ b/src/main/java/com/volmit/iris/object/IrisDimension.java @@ -53,8 +53,13 @@ public class IrisDimension extends IrisRegistrant @DontObfuscate @Desc("Entity spawns to override or add to this dimension") - @ArrayType(min = 1, type = IrisEntitySpawn.class) - private KList entitySpawns = new KList<>(); + @ArrayType(min = 1, type = IrisEntitySpawnOverride.class) + private KList entitySpawnOverrides = new KList<>(); + + @DontObfuscate + @Desc("Entity spawns during generation") + @ArrayType(min = 1, type = IrisEntityInitialSpawn.class) + private KList entityInitialSpawns = new KList<>(); @DontObfuscate @Desc("Reference loot tables in this area") diff --git a/src/main/java/com/volmit/iris/object/IrisEntity.java b/src/main/java/com/volmit/iris/object/IrisEntity.java index b5790ab51..cfd3f2a26 100644 --- a/src/main/java/com/volmit/iris/object/IrisEntity.java +++ b/src/main/java/com/volmit/iris/object/IrisEntity.java @@ -17,7 +17,7 @@ import org.bukkit.loot.LootTable; import org.bukkit.loot.Lootable; import com.volmit.iris.Iris; -import com.volmit.iris.gen.IrisTerrainProvider; +import com.volmit.iris.gen.ParallaxTerrainProvider; import com.volmit.iris.util.ArrayType; import com.volmit.iris.util.C; import com.volmit.iris.util.Desc; @@ -122,12 +122,12 @@ public class IrisEntity extends IrisRegistrant @Desc("If specified, this entity will be leashed by this entity. I.e. THIS ENTITY Leashed by SPECIFIED. This has no effect on EnderDragons, Withers, Players, or Bats.Non-living entities excluding leashes will not persist as leashholders.") private IrisEntity leashHolder = null; - public Entity spawn(IrisTerrainProvider gen, Location at) + public Entity spawn(ParallaxTerrainProvider gen, Location at) { return spawn(gen, at, new RNG(at.hashCode())); } - public Entity spawn(IrisTerrainProvider gen, Location at, RNG rng) + public Entity spawn(ParallaxTerrainProvider gen, Location at, RNG rng) { Entity e = at.getWorld().spawnEntity(at, getType()); e.setCustomName(getCustomName() != null ? C.translateAlternateColorCodes('&', getCustomName()) : null); diff --git a/src/main/java/com/volmit/iris/object/IrisEntityInitialSpawn.java b/src/main/java/com/volmit/iris/object/IrisEntityInitialSpawn.java new file mode 100644 index 000000000..423a3c5e4 --- /dev/null +++ b/src/main/java/com/volmit/iris/object/IrisEntityInitialSpawn.java @@ -0,0 +1,94 @@ +package com.volmit.iris.object; + +import org.bukkit.Chunk; +import org.bukkit.Location; +import org.bukkit.entity.Entity; + +import com.volmit.iris.gen.ParallaxTerrainProvider; +import com.volmit.iris.gen.atomics.AtomicCache; +import com.volmit.iris.util.Desc; +import com.volmit.iris.util.DontObfuscate; +import com.volmit.iris.util.MinNumber; +import com.volmit.iris.util.RNG; +import com.volmit.iris.util.RegistryListEntity; +import com.volmit.iris.util.Required; + +import lombok.Data; + +@Desc("Represents an entity spawn during initial chunk generation") +@Data +public class IrisEntityInitialSpawn +{ + @RegistryListEntity + @Required + @DontObfuscate + @Desc("The entity") + private String entity = ""; + + @MinNumber(1) + @DontObfuscate + @Desc("The 1 in RARITY chance for this entity to spawn") + private int rarity = 1; + + @MinNumber(1) + @DontObfuscate + @Desc("The minumum of this entity to spawn") + private int minSpawns = 1; + + @MinNumber(1) + @DontObfuscate + @Desc("The max of this entity to spawn") + private int maxSpawns = 1; + + private transient AtomicCache rng = new AtomicCache<>(); + private transient AtomicCache ent = new AtomicCache<>(); + + @SuppressWarnings("unused") + public boolean spawn(ParallaxTerrainProvider gen, Chunk c, RNG rng) + { + int spawns = rng.i(1, rarity) == 1 ? rng.i(minSpawns, maxSpawns) : 0; + + if(spawns > 0) + { + for(int i = 0; i < spawns; i++) + { + int x = (c.getX() * 16) + rng.i(15); + int z = (c.getZ() * 16) + rng.i(15); + int h = gen.getCarvedHeight(x, z, false); + return spawn100(gen, new Location(c.getWorld(), x, h, z)) != null; + } + } + + return false; + } + + public IrisEntity getRealEntity(ParallaxTerrainProvider g) + { + return ent.aquire(() -> g.getData().getEntityLoader().load(getEntity())); + } + + public Entity spawn(ParallaxTerrainProvider g, Location at) + { + if(getRealEntity(g) == null) + { + return null; + } + + if(rng.aquire(() -> new RNG(g.getTarget().getSeed() + 4)).i(1, getRarity()) == 1) + { + return spawn100(g, at); + } + + return null; + } + + private Entity spawn100(ParallaxTerrainProvider g, Location at) + { + return getRealEntity(g).spawn(g, at, rng.aquire(() -> new RNG(g.getTarget().getSeed() + 4))); + } + + public IrisEntityInitialSpawn() + { + + } +} diff --git a/src/main/java/com/volmit/iris/object/IrisEntitySpawn.java b/src/main/java/com/volmit/iris/object/IrisEntitySpawnOverride.java similarity index 96% rename from src/main/java/com/volmit/iris/object/IrisEntitySpawn.java rename to src/main/java/com/volmit/iris/object/IrisEntitySpawnOverride.java index 57309f04d..20009c991 100644 --- a/src/main/java/com/volmit/iris/object/IrisEntitySpawn.java +++ b/src/main/java/com/volmit/iris/object/IrisEntitySpawnOverride.java @@ -18,7 +18,7 @@ import lombok.Data; @Desc("Represents an entity spawn") @Data -public class IrisEntitySpawn +public class IrisEntitySpawnOverride { @RegistryListEntity @Required @@ -84,7 +84,7 @@ public class IrisEntitySpawn return null; } - public IrisEntitySpawn() + public IrisEntitySpawnOverride() { } diff --git a/src/main/java/com/volmit/iris/object/IrisRegion.java b/src/main/java/com/volmit/iris/object/IrisRegion.java index 6d2d9e99f..54ec1d727 100644 --- a/src/main/java/com/volmit/iris/object/IrisRegion.java +++ b/src/main/java/com/volmit/iris/object/IrisRegion.java @@ -38,8 +38,13 @@ public class IrisRegion extends IrisRegistrant implements IRare @DontObfuscate @Desc("Entity spawns to override or add to this region") - @ArrayType(min = 1, type = IrisEntitySpawn.class) - private KList entitySpawns = new KList<>(); + @ArrayType(min = 1, type = IrisEntitySpawnOverride.class) + private KList entitySpawnOverrides = new KList<>(); + + @DontObfuscate + @Desc("Entity spawns during generation") + @ArrayType(min = 1, type = IrisEntityInitialSpawn.class) + private KList entityInitialSpawns = new KList<>(); @MinNumber(1) @MaxNumber(256) diff --git a/src/main/java/com/volmit/iris/object/IrisStructure.java b/src/main/java/com/volmit/iris/object/IrisStructure.java index de3f78b5e..004420acc 100644 --- a/src/main/java/com/volmit/iris/object/IrisStructure.java +++ b/src/main/java/com/volmit/iris/object/IrisStructure.java @@ -29,9 +29,14 @@ public class IrisStructure extends IrisRegistrant @DontObfuscate @Desc("Entity spawns to override or add to this structure") - @ArrayType(min = 1, type = IrisEntitySpawn.class) - private KList entitySpawns = new KList<>(); + @ArrayType(min = 1, type = IrisEntitySpawnOverride.class) + private KList entitySpawnOverrides = new KList<>(); + @DontObfuscate + @Desc("Entity spawns during generation") + @ArrayType(min = 1, type = IrisEntityInitialSpawn.class) + private KList entityInitialSpawns = new KList<>(); + @DontObfuscate @Desc("Wall style noise") private IrisGeneratorStyle wallStyle = NoiseStyle.STATIC.style(); diff --git a/src/main/java/com/volmit/iris/object/IrisStructureTile.java b/src/main/java/com/volmit/iris/object/IrisStructureTile.java index b4f2a6418..361a0ed16 100644 --- a/src/main/java/com/volmit/iris/object/IrisStructureTile.java +++ b/src/main/java/com/volmit/iris/object/IrisStructureTile.java @@ -26,8 +26,13 @@ public class IrisStructureTile @DontObfuscate @Desc("Entity spawns to override or add to this structure tile") - @ArrayType(min = 1, type = IrisEntitySpawn.class) - private KList entitySpawns = new KList<>(); + @ArrayType(min = 1, type = IrisEntitySpawnOverride.class) + private KList entitySpawnOverrides = new KList<>(); + + @DontObfuscate + @Desc("Entity spawns during generation") + @ArrayType(min = 1, type = IrisEntityInitialSpawn.class) + private KList entityInitialSpawns = new KList<>(); @DontObfuscate @Desc("The place mode for this tile")