From 41d6e1c648c5590386bd42ff108a2978f3e7f873 Mon Sep 17 00:00:00 2001 From: xieve Date: Thu, 15 Apr 2021 18:18:27 +0200 Subject: [PATCH 01/98] Fixed populator disable config (#130) --- .../java/com/dfsek/terra/world/population/FloraPopulator.java | 2 +- .../java/com/dfsek/terra/world/population/OrePopulator.java | 2 +- .../com/dfsek/terra/world/population/StructurePopulator.java | 2 +- .../java/com/dfsek/terra/world/population/TreePopulator.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/world/population/FloraPopulator.java b/common/src/main/java/com/dfsek/terra/world/population/FloraPopulator.java index 4bb62c2db..5360b2bec 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/FloraPopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/FloraPopulator.java @@ -33,7 +33,7 @@ public class FloraPopulator implements TerraBlockPopulator { public void populate(@NotNull World world, @NotNull Chunk chunk) { TerraWorld tw = main.getWorld(world); try(ProfileFuture ignored = tw.getProfiler().measure("FloraTime")) { - if(tw.getConfig().getTemplate().disableCarvers()) return; + if(tw.getConfig().getTemplate().disableFlora()) return; if(!tw.isSafe()) return; BiomeProvider provider = tw.getBiomeProvider(); diff --git a/common/src/main/java/com/dfsek/terra/world/population/OrePopulator.java b/common/src/main/java/com/dfsek/terra/world/population/OrePopulator.java index d6a0f7779..810455b30 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/OrePopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/OrePopulator.java @@ -28,7 +28,7 @@ public class OrePopulator implements TerraBlockPopulator { public void populate(@NotNull World world, @NotNull Chunk chunk) { TerraWorld tw = main.getWorld(world); try(ProfileFuture ignored = tw.getProfiler().measure("OreTime")) { - if(tw.getConfig().getTemplate().disableCarvers()) return; + if(tw.getConfig().getTemplate().disableOres()) return; if(!tw.isSafe()) return; for(int cx = -1; cx <= 1; cx++) { diff --git a/common/src/main/java/com/dfsek/terra/world/population/StructurePopulator.java b/common/src/main/java/com/dfsek/terra/world/population/StructurePopulator.java index 4a0ae6826..ec85aeccd 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/StructurePopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/StructurePopulator.java @@ -33,7 +33,7 @@ public class StructurePopulator implements TerraBlockPopulator, Chunkified { public void populate(@NotNull World world, @NotNull Chunk chunk) { TerraWorld tw = main.getWorld(world); try(ProfileFuture ignored = tw.getProfiler().measure("StructureTime")) { - if(tw.getConfig().getTemplate().disableCarvers()) return; + if(tw.getConfig().getTemplate().disableStructures()) return; int cx = (chunk.getX() << 4); int cz = (chunk.getZ() << 4); diff --git a/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java b/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java index 5700da165..5e2145989 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java @@ -33,7 +33,7 @@ public class TreePopulator implements TerraBlockPopulator { public void populate(@NotNull World world, @NotNull Chunk chunk) { TerraWorld tw = main.getWorld(world); try(ProfileFuture ignored = tw.getProfiler().measure("TreeTime")) { - if(tw.getConfig().getTemplate().disableCarvers()) return; + if(tw.getConfig().getTemplate().disableTrees()) return; if(!tw.isSafe()) return; BiomeProvider provider = tw.getBiomeProvider(); From 5501f53056de410a50e74812de3d2510a9c656ab Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 15 Apr 2021 09:59:13 -0700 Subject: [PATCH 02/98] implement TerraFabricPlugin#getWorld(long) --- .../main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 57a326726..bb5630b9c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -157,6 +157,12 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { }); } + public TerraWorld getWorld(long seed) { + TerraWorld world = worldMap.get(seed); + if(world == null) throw new IllegalArgumentException("No world exists with seed " + seed); + return world; + } + @Override public Logger logger() { return logger; From 1195a6676f73fe508d2b19d105d3c1aa0db2a3c0 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 15 Apr 2021 10:00:22 -0700 Subject: [PATCH 03/98] implement getHeight on Fabric --- .../generator/FabricChunkGeneratorWrapper.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index a15267e2d..afe8ceb19 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -7,7 +7,9 @@ import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.handles.world.FabricSeededWorldAccess; +import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.generation.generators.DefaultChunkGenerator3D; +import com.dfsek.terra.world.generation.math.samplers.Sampler; import com.dfsek.terra.world.population.CavePopulator; import com.dfsek.terra.world.population.FloraPopulator; import com.dfsek.terra.world.population.OrePopulator; @@ -15,6 +17,7 @@ import com.dfsek.terra.world.population.StructurePopulator; import com.dfsek.terra.world.population.TreePopulator; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.jafama.FastMath; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.structure.StructureManager; @@ -107,7 +110,18 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener @Override public int getHeight(int x, int z, Heightmap.Type heightmapType) { - return 0; + TerraWorld world = TerraFabricPlugin.getInstance().getWorld(seed); + Sampler sampler = world.getConfig().getSamplerCache().getChunk(FastMath.floorDiv(x, 16), FastMath.floorDiv(z, 16)); + int cx = FastMath.floorMod(x, 16); + int cz = FastMath.floorMod(z, 16); + + int height = world.getWorld().getMaxHeight(); + + while (height >= 0 && sampler.sample(cx, height - 1, cz) < 0) { + height--; + } + + return height; } @Override From 414dcdae3eedcd82cbd5a406617d36ad958559c8 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 15 Apr 2021 10:20:14 -0700 Subject: [PATCH 04/98] use vanilla delegate spawn rules --- .../main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index bb5630b9c..ea70c4247 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -248,10 +248,6 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { } private Biome createBiome(BiomeBuilder biome) { - SpawnSettings.Builder spawnSettings = new SpawnSettings.Builder(); - DefaultBiomeFeatures.addFarmAnimals(spawnSettings); - DefaultBiomeFeatures.addMonsters(spawnSettings, 95, 5, 100); - BiomeTemplate template = biome.getTemplate(); Map colors = template.getColors(); @@ -289,7 +285,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { .temperature(vanilla.getTemperature()) .downfall(vanilla.getDownfall()) .effects(effects.build()) - .spawnSettings(spawnSettings.build()) + .spawnSettings(vanilla.getSpawnSettings()) .generationSettings(generationSettings.build()) .build(); } From 40188c671f04452884ae94821e4bee7068ef3845 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 11 Apr 2021 22:54:55 -0700 Subject: [PATCH 05/98] basic profiler implementation --- .../java/com/dfsek/terra/profiler/Frame.java | 24 +++++++ .../com/dfsek/terra/profiler/Profiler.java | 21 ++++++ .../dfsek/terra/profiler/ProfilerImpl.java | 70 +++++++++++++++++++ .../com/dfsek/terra/profiler/Timings.java | 56 +++++++++++++++ .../exception/MalformedStackException.java | 17 +++++ .../profiler/exception/ProfilerException.java | 17 +++++ .../src/test/java/profiler/ProfilerTest.java | 45 ++++++++++++ 7 files changed, 250 insertions(+) create mode 100644 common/src/main/java/com/dfsek/terra/profiler/Frame.java create mode 100644 common/src/main/java/com/dfsek/terra/profiler/Profiler.java create mode 100644 common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java create mode 100644 common/src/main/java/com/dfsek/terra/profiler/Timings.java create mode 100644 common/src/main/java/com/dfsek/terra/profiler/exception/MalformedStackException.java create mode 100644 common/src/main/java/com/dfsek/terra/profiler/exception/ProfilerException.java create mode 100644 common/src/test/java/profiler/ProfilerTest.java diff --git a/common/src/main/java/com/dfsek/terra/profiler/Frame.java b/common/src/main/java/com/dfsek/terra/profiler/Frame.java new file mode 100644 index 000000000..7b7be66b5 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/profiler/Frame.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.profiler; + +public class Frame { + private final String id; + private final long start; + + public Frame(String id) { + this.id = id; + this.start = System.nanoTime(); + } + + public String getId() { + return id; + } + + public long getStart() { + return start; + } + + @Override + public String toString() { + return id; + } +} diff --git a/common/src/main/java/com/dfsek/terra/profiler/Profiler.java b/common/src/main/java/com/dfsek/terra/profiler/Profiler.java new file mode 100644 index 000000000..ce0fa48c9 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/profiler/Profiler.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.profiler; + +import java.util.Map; + +public interface Profiler { + ProfilerImpl INSTANCE = new ProfilerImpl(); + + static Profiler getInstance() { + return INSTANCE; + } + + void push(String frame); + + void pop(String frame); + + void start(); + + void stop(); + + Map getTimings(); +} diff --git a/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java b/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java new file mode 100644 index 000000000..c1410842c --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java @@ -0,0 +1,70 @@ +package com.dfsek.terra.profiler; + +import com.dfsek.terra.profiler.exception.MalformedStackException; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Stack; + +public class ProfilerImpl implements Profiler { + private static final ThreadLocal> THREAD_STACK = ThreadLocal.withInitial(Stack::new); + private static final ThreadLocal> TIMINGS = ThreadLocal.withInitial(HashMap::new); + private final List> accessibleThreadMaps = new ArrayList<>(); + private volatile boolean running = false; + + + protected ProfilerImpl() { + + } + + @Override + public void push(String frame) { + if(running) THREAD_STACK.get().push(new Frame(frame)); + } + + @Override + public void pop(String frame) { + if(running) { + long time = System.nanoTime(); + Stack stack = THREAD_STACK.get(); + + Map timingsMap = TIMINGS.get(); + + if(timingsMap.size() == 0) { + synchronized(accessibleThreadMaps) { + accessibleThreadMaps.add(timingsMap); + } + } + + Timings bottom = timingsMap.computeIfAbsent(stack.get(0).getId(), id -> new Timings()); + + for(int i = 1; i < stack.size(); i++) { + bottom = bottom.getSubItem(stack.get(i).getId()); + } + + Frame top = stack.pop(); + if(!top.getId().equals(frame)) throw new MalformedStackException("Expected " + frame + ", found " + top); + + bottom.addTime(time - top.getStart()); + } + } + + @Override + public void start() { + running = true; + } + + @Override + public void stop() { + running = false; + } + + @Override + public Map getTimings() { + Map map = new HashMap<>(); + accessibleThreadMaps.forEach(map::putAll); + return map; + } +} diff --git a/common/src/main/java/com/dfsek/terra/profiler/Timings.java b/common/src/main/java/com/dfsek/terra/profiler/Timings.java new file mode 100644 index 000000000..383211ef6 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/profiler/Timings.java @@ -0,0 +1,56 @@ +package com.dfsek.terra.profiler; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Timings { + private final Map subItems = new HashMap<>(); + + private final List timings = new ArrayList<>(); + + public void addTime(long time) { + timings.add(time); + } + + public List getTimings() { + return timings; + } + + public double average() { + return (double) timings.stream().reduce(0L, Long::sum) / timings.size(); + } + + public long max() { + return timings.stream().mapToLong(Long::longValue).max().orElse(0L); + } + + public long min() { + return timings.stream().mapToLong(Long::longValue).min().orElse(0L); + } + + public Timings getSubItem(String id) { + return subItems.computeIfAbsent(id, s -> new Timings()); + } + + public String toString(int indent) { + StringBuilder builder = new StringBuilder(); + + builder.append("Avg ").append(average() / 1000000).append("ms"); + + subItems.forEach((id, timings) -> { + builder.append('\n'); + for(int i = 0; i <= indent; i++) { + builder.append('\t'); + } + builder.append(id).append(": ").append(timings.toString(indent + 1)); + }); + return builder.toString(); + } + + @Override + public String toString() { + return toString(0); + } +} diff --git a/common/src/main/java/com/dfsek/terra/profiler/exception/MalformedStackException.java b/common/src/main/java/com/dfsek/terra/profiler/exception/MalformedStackException.java new file mode 100644 index 000000000..0ae345a0f --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/profiler/exception/MalformedStackException.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.profiler.exception; + +public class MalformedStackException extends ProfilerException { + private static final long serialVersionUID = -3009539681021691054L; + + public MalformedStackException(String message) { + super(message); + } + + public MalformedStackException(String message, Throwable cause) { + super(message, cause); + } + + public MalformedStackException(Throwable cause) { + super(cause); + } +} diff --git a/common/src/main/java/com/dfsek/terra/profiler/exception/ProfilerException.java b/common/src/main/java/com/dfsek/terra/profiler/exception/ProfilerException.java new file mode 100644 index 000000000..27c6d734f --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/profiler/exception/ProfilerException.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.profiler.exception; + +public class ProfilerException extends RuntimeException { + private static final long serialVersionUID = 8206737998791649002L; + + public ProfilerException(String message) { + super(message); + } + + public ProfilerException(String message, Throwable cause) { + super(message, cause); + } + + public ProfilerException(Throwable cause) { + super(cause); + } +} diff --git a/common/src/test/java/profiler/ProfilerTest.java b/common/src/test/java/profiler/ProfilerTest.java new file mode 100644 index 000000000..1660310f8 --- /dev/null +++ b/common/src/test/java/profiler/ProfilerTest.java @@ -0,0 +1,45 @@ +package profiler; + +import com.dfsek.terra.profiler.Profiler; + +public class ProfilerTest { + //@Test + public static void main(String... a) throws InterruptedException { + Profiler.INSTANCE.start(); + for(int i = 0; i < 100; i++) { + doThing(); + } + + for(int i = 0; i < 100; i++) { + doThirdOtherThing(); + } + + for(int i = 0; i < 100; i++) { + doOtherThing(); + } + Profiler.INSTANCE.stop(); + Profiler.INSTANCE.getTimings().forEach((id, timings) -> { + System.out.println(id + ": " + timings.toString()); + }); + } + + private static void doThing() throws InterruptedException { + Profiler.INSTANCE.push("thing"); + Thread.sleep(1); + doOtherThing(); + Profiler.INSTANCE.pop("thing"); + } + + private static void doOtherThing() throws InterruptedException { + Profiler.INSTANCE.push("thing2"); + Thread.sleep(2); + doThirdOtherThing(); + Profiler.INSTANCE.pop("thing2"); + } + + private static void doThirdOtherThing() throws InterruptedException { + Profiler.INSTANCE.push("thing3"); + Thread.sleep(2); + Profiler.INSTANCE.pop("thing3"); + } +} From 5d4bdb431b29160404057479bcad0d435c2cf76d Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 11 Apr 2021 23:08:32 -0700 Subject: [PATCH 06/98] improve data output --- .../src/main/java/com/dfsek/terra/api/TerraPlugin.java | 3 +++ .../main/java/com/dfsek/terra/profiler/Profiler.java | 4 ---- .../java/com/dfsek/terra/profiler/ProfilerImpl.java | 2 +- .../main/java/com/dfsek/terra/profiler/Timings.java | 10 ++++++---- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/TerraPlugin.java b/common/src/main/java/com/dfsek/terra/api/TerraPlugin.java index fb9f87613..aeeb5e814 100644 --- a/common/src/main/java/com/dfsek/terra/api/TerraPlugin.java +++ b/common/src/main/java/com/dfsek/terra/api/TerraPlugin.java @@ -12,6 +12,7 @@ import com.dfsek.terra.api.util.logging.Logger; import com.dfsek.terra.config.PluginConfig; import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.world.TerraWorld; import java.io.File; @@ -64,4 +65,6 @@ public interface TerraPlugin extends LoaderRegistrar { default void runPossiblyUnsafeTask(Runnable task) { task.run(); } + + Profiler getProfiler(); } diff --git a/common/src/main/java/com/dfsek/terra/profiler/Profiler.java b/common/src/main/java/com/dfsek/terra/profiler/Profiler.java index ce0fa48c9..d2f625c43 100644 --- a/common/src/main/java/com/dfsek/terra/profiler/Profiler.java +++ b/common/src/main/java/com/dfsek/terra/profiler/Profiler.java @@ -5,10 +5,6 @@ import java.util.Map; public interface Profiler { ProfilerImpl INSTANCE = new ProfilerImpl(); - static Profiler getInstance() { - return INSTANCE; - } - void push(String frame); void pop(String frame); diff --git a/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java b/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java index c1410842c..b84986e3d 100644 --- a/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java +++ b/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java @@ -15,7 +15,7 @@ public class ProfilerImpl implements Profiler { private volatile boolean running = false; - protected ProfilerImpl() { + public ProfilerImpl() { } diff --git a/common/src/main/java/com/dfsek/terra/profiler/Timings.java b/common/src/main/java/com/dfsek/terra/profiler/Timings.java index 383211ef6..e632e4cf0 100644 --- a/common/src/main/java/com/dfsek/terra/profiler/Timings.java +++ b/common/src/main/java/com/dfsek/terra/profiler/Timings.java @@ -34,23 +34,25 @@ public class Timings { return subItems.computeIfAbsent(id, s -> new Timings()); } - public String toString(int indent) { + public String toString(int indent, Timings parent) { StringBuilder builder = new StringBuilder(); - builder.append("Avg ").append(average() / 1000000).append("ms"); + builder.append((double) min() / 1000000).append("ms min / ").append(average() / 1000000).append("ms avg / ") + .append((double) max() / 1000000).append("ms max (").append(timings.size()).append(" samples, ") + .append((average() / parent.average()) * 100).append("% of parent)"); subItems.forEach((id, timings) -> { builder.append('\n'); for(int i = 0; i <= indent; i++) { builder.append('\t'); } - builder.append(id).append(": ").append(timings.toString(indent + 1)); + builder.append(id).append(": ").append(timings.toString(indent + 1, this)); }); return builder.toString(); } @Override public String toString() { - return toString(0); + return toString(0, this); } } From 168c0ced13d37760265ab64edfb9f13da71ab66a Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 11 Apr 2021 23:24:44 -0700 Subject: [PATCH 07/98] improve performance in deep operations --- .../dfsek/terra/profiler/ProfilerImpl.java | 35 ++++++++++++------- .../src/test/java/profiler/ProfilerTest.java | 2 +- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java b/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java index b84986e3d..5e4998010 100644 --- a/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java +++ b/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java @@ -10,8 +10,8 @@ import java.util.Stack; public class ProfilerImpl implements Profiler { private static final ThreadLocal> THREAD_STACK = ThreadLocal.withInitial(Stack::new); - private static final ThreadLocal> TIMINGS = ThreadLocal.withInitial(HashMap::new); - private final List> accessibleThreadMaps = new ArrayList<>(); + private static final ThreadLocal>> TIMINGS = ThreadLocal.withInitial(HashMap::new); + private final List>> accessibleThreadMaps = new ArrayList<>(); private volatile boolean running = false; @@ -21,7 +21,10 @@ public class ProfilerImpl implements Profiler { @Override public void push(String frame) { - if(running) THREAD_STACK.get().push(new Frame(frame)); + if(running) { + Stack stack = THREAD_STACK.get(); + stack.push(new Frame(stack.size() == 0 ? frame : stack.peek().getId() + "." + frame)); + } } @Override @@ -30,7 +33,7 @@ public class ProfilerImpl implements Profiler { long time = System.nanoTime(); Stack stack = THREAD_STACK.get(); - Map timingsMap = TIMINGS.get(); + Map> timingsMap = TIMINGS.get(); if(timingsMap.size() == 0) { synchronized(accessibleThreadMaps) { @@ -38,16 +41,13 @@ public class ProfilerImpl implements Profiler { } } - Timings bottom = timingsMap.computeIfAbsent(stack.get(0).getId(), id -> new Timings()); - - for(int i = 1; i < stack.size(); i++) { - bottom = bottom.getSubItem(stack.get(i).getId()); - } - Frame top = stack.pop(); - if(!top.getId().equals(frame)) throw new MalformedStackException("Expected " + frame + ", found " + top); + if((stack.size() != 0 && !top.getId().endsWith("." + frame)) || (stack.size() == 0 && !top.getId().equals(frame))) + throw new MalformedStackException("Expected " + frame + ", found " + top); - bottom.addTime(time - top.getStart()); + List timings = timingsMap.computeIfAbsent(top.getId(), id -> new ArrayList<>()); + + timings.add(time - top.getStart()); } } @@ -64,7 +64,16 @@ public class ProfilerImpl implements Profiler { @Override public Map getTimings() { Map map = new HashMap<>(); - accessibleThreadMaps.forEach(map::putAll); + accessibleThreadMaps.forEach(smap -> { + smap.forEach((key, list) -> { + String[] keys = key.split("\\."); + Timings timings = map.computeIfAbsent(keys[0], id -> new Timings()); + for(int i = 1; i < keys.length; i++) { + timings = timings.getSubItem(keys[i]); + } + list.forEach(timings::addTime); + }); + }); return map; } } diff --git a/common/src/test/java/profiler/ProfilerTest.java b/common/src/test/java/profiler/ProfilerTest.java index 1660310f8..813e08eae 100644 --- a/common/src/test/java/profiler/ProfilerTest.java +++ b/common/src/test/java/profiler/ProfilerTest.java @@ -6,7 +6,7 @@ public class ProfilerTest { //@Test public static void main(String... a) throws InterruptedException { Profiler.INSTANCE.start(); - for(int i = 0; i < 100; i++) { + for(int i = 0; i < 1000; i++) { doThing(); } From eb4bf74cc6a3cc3761a4f0c1b1d72eb23c8bc131 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 12 Apr 2021 00:05:53 -0700 Subject: [PATCH 08/98] implement TerraPlugin#getProfier --- .../com/dfsek/terra/profiler/Profiler.java | 2 -- .../dfsek/terra/profiler/ProfilerImpl.java | 22 +++++++++---------- .../src/test/java/profiler/ProfilerTest.java | 20 +++++++++-------- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 9 ++++++++ .../dfsek/terra/fabric/TerraFabricPlugin.java | 10 +++++++++ .../com/dfsek/terra/StandalonePlugin.java | 9 ++++++++ .../dfsek/terra/sponge/TerraSpongePlugin.java | 6 +++++ 7 files changed, 56 insertions(+), 22 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/profiler/Profiler.java b/common/src/main/java/com/dfsek/terra/profiler/Profiler.java index d2f625c43..9d984fcf6 100644 --- a/common/src/main/java/com/dfsek/terra/profiler/Profiler.java +++ b/common/src/main/java/com/dfsek/terra/profiler/Profiler.java @@ -3,8 +3,6 @@ package com.dfsek.terra.profiler; import java.util.Map; public interface Profiler { - ProfilerImpl INSTANCE = new ProfilerImpl(); - void push(String frame); void pop(String frame); diff --git a/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java b/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java index 5e4998010..23f00d495 100644 --- a/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java +++ b/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java @@ -13,10 +13,12 @@ public class ProfilerImpl implements Profiler { private static final ThreadLocal>> TIMINGS = ThreadLocal.withInitial(HashMap::new); private final List>> accessibleThreadMaps = new ArrayList<>(); private volatile boolean running = false; + private static boolean instantiated = false; public ProfilerImpl() { - + if(instantiated) throw new IllegalStateException("Only one instance of Profiler may exist!"); + instantiated = true; } @Override @@ -64,16 +66,14 @@ public class ProfilerImpl implements Profiler { @Override public Map getTimings() { Map map = new HashMap<>(); - accessibleThreadMaps.forEach(smap -> { - smap.forEach((key, list) -> { - String[] keys = key.split("\\."); - Timings timings = map.computeIfAbsent(keys[0], id -> new Timings()); - for(int i = 1; i < keys.length; i++) { - timings = timings.getSubItem(keys[i]); - } - list.forEach(timings::addTime); - }); - }); + accessibleThreadMaps.forEach(smap -> smap.forEach((key, list) -> { + String[] keys = key.split("\\."); + Timings timings = map.computeIfAbsent(keys[0], id -> new Timings()); + for(int i = 1; i < keys.length; i++) { + timings = timings.getSubItem(keys[i]); + } + list.forEach(timings::addTime); + })); return map; } } diff --git a/common/src/test/java/profiler/ProfilerTest.java b/common/src/test/java/profiler/ProfilerTest.java index 813e08eae..b60ea32e5 100644 --- a/common/src/test/java/profiler/ProfilerTest.java +++ b/common/src/test/java/profiler/ProfilerTest.java @@ -1,11 +1,13 @@ package profiler; import com.dfsek.terra.profiler.Profiler; +import com.dfsek.terra.profiler.ProfilerImpl; public class ProfilerTest { + private static final Profiler PROFILER = new ProfilerImpl(); //@Test public static void main(String... a) throws InterruptedException { - Profiler.INSTANCE.start(); + PROFILER.start(); for(int i = 0; i < 1000; i++) { doThing(); } @@ -17,29 +19,29 @@ public class ProfilerTest { for(int i = 0; i < 100; i++) { doOtherThing(); } - Profiler.INSTANCE.stop(); - Profiler.INSTANCE.getTimings().forEach((id, timings) -> { + PROFILER.stop(); + PROFILER.getTimings().forEach((id, timings) -> { System.out.println(id + ": " + timings.toString()); }); } private static void doThing() throws InterruptedException { - Profiler.INSTANCE.push("thing"); + PROFILER.push("thing"); Thread.sleep(1); doOtherThing(); - Profiler.INSTANCE.pop("thing"); + PROFILER.pop("thing"); } private static void doOtherThing() throws InterruptedException { - Profiler.INSTANCE.push("thing2"); + PROFILER.push("thing2"); Thread.sleep(2); doThirdOtherThing(); - Profiler.INSTANCE.pop("thing2"); + PROFILER.pop("thing2"); } private static void doThirdOtherThing() throws InterruptedException { - Profiler.INSTANCE.push("thing3"); + PROFILER.push("thing3"); Thread.sleep(2); - Profiler.INSTANCE.pop("thing3"); + PROFILER.pop("thing3"); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index e1254e51e..e65a918fc 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -40,6 +40,8 @@ import com.dfsek.terra.config.PluginConfig; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.profiler.Profiler; +import com.dfsek.terra.profiler.ProfilerImpl; import com.dfsek.terra.registry.master.AddonRegistry; import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.world.TerraWorld; @@ -64,6 +66,8 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { private final Map worldMap = new HashMap<>(); private final Map worlds = new HashMap<>(); + private final Profiler profiler = new ProfilerImpl(); + private final ConfigRegistry registry = new ConfigRegistry(); private final CheckedRegistry checkedRegistry = new CheckedRegistry<>(registry); @@ -141,6 +145,11 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { Bukkit.getScheduler().runTask(this, task); } + @Override + public Profiler getProfiler() { + return profiler; + } + @Override public void onDisable() { BukkitChunkGeneratorWrapper.saveAll(); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index ea70c4247..adec7ee11 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -46,6 +46,8 @@ import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.features.PopulatorFeature; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; +import com.dfsek.terra.profiler.Profiler; +import com.dfsek.terra.profiler.ProfilerImpl; import com.dfsek.terra.registry.exception.DuplicateEntryException; import com.dfsek.terra.registry.master.AddonRegistry; import com.dfsek.terra.registry.master.ConfigRegistry; @@ -105,6 +107,9 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private final Map worldMap = new HashMap<>(); private final EventManager eventManager = new TerraEventManager(this); private final GenericLoaders genericLoaders = new GenericLoaders(this); + + private final Profiler profiler = new ProfilerImpl(); + private final Logger logger = new Logger() { private final org.apache.logging.log4j.Logger logger = LogManager.getLogger(); @@ -391,6 +396,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { return eventManager; } + @Override + public Profiler getProfiler() { + return profiler; + } + @Addon("Terra-Fabric") @Author("Terra") @Version("1.0.0") diff --git a/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java b/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java index a1dd2e4c9..ff426a5c0 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java +++ b/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java @@ -21,6 +21,8 @@ import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.platform.RawBiome; import com.dfsek.terra.platform.RawWorldHandle; +import com.dfsek.terra.profiler.Profiler; +import com.dfsek.terra.profiler.ProfilerImpl; import com.dfsek.terra.registry.master.AddonRegistry; import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.world.TerraWorld; @@ -39,6 +41,8 @@ public class StandalonePlugin implements TerraPlugin { private final RawWorldHandle worldHandle = new RawWorldHandle(); private final EventManager eventManager = new TerraEventManager(this); + private final Profiler profiler = new ProfilerImpl(); + @Override public WorldHandle getWorldHandle() { return worldHandle; @@ -147,4 +151,9 @@ public class StandalonePlugin implements TerraPlugin { public EventManager getEventManager() { return eventManager; } + + @Override + public Profiler getProfiler() { + return profiler; + } } diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java index 78baf45d5..536850875 100644 --- a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java @@ -14,6 +14,7 @@ import com.dfsek.terra.api.util.logging.DebugLogger; import com.dfsek.terra.config.PluginConfig; import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.registry.master.AddonRegistry; import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.sponge.world.SpongeWorldHandle; @@ -138,4 +139,9 @@ public class TerraSpongePlugin implements TerraPlugin { public EventManager getEventManager() { return eventManager; } + + @Override + public Profiler getProfiler() { + return null; + } } From da366a75e83ab2709a192b146501dd28871d9ffc Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 12 Apr 2021 00:07:22 -0700 Subject: [PATCH 09/98] add autocloseable option --- common/src/main/java/com/dfsek/terra/profiler/Profiler.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/common/src/main/java/com/dfsek/terra/profiler/Profiler.java b/common/src/main/java/com/dfsek/terra/profiler/Profiler.java index 9d984fcf6..b2b2a578e 100644 --- a/common/src/main/java/com/dfsek/terra/profiler/Profiler.java +++ b/common/src/main/java/com/dfsek/terra/profiler/Profiler.java @@ -12,4 +12,9 @@ public interface Profiler { void stop(); Map getTimings(); + + default AutoCloseable profile(String frame) { + push(frame); + return () -> pop(frame); + } } From 8a10867e5f011552e999ca4a152126713a0b3e18 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 12 Apr 2021 00:24:13 -0700 Subject: [PATCH 10/98] implement new profiler --- .../profiler/ProfileQueryCommand.java | 13 +-- .../profiler/ProfileResetCommand.java | 12 +-- .../profiler/ProfileStartCommand.java | 12 +-- .../commands/profiler/ProfileStopCommand.java | 12 +-- .../com/dfsek/terra/profiler/DataHolder.java | 36 -------- .../com/dfsek/terra/profiler/DataType.java | 24 ----- .../java/com/dfsek/terra/profiler/Desire.java | 10 --- .../com/dfsek/terra/profiler/Measurement.java | 87 ------------------- .../dfsek/terra/profiler/ProfileFrame.java | 14 +++ .../dfsek/terra/profiler/ProfileFuture.java | 18 ---- .../com/dfsek/terra/profiler/Profiler.java | 8 +- .../dfsek/terra/profiler/WorldProfiler.java | 85 ------------------ .../com/dfsek/terra/world/TerraWorld.java | 6 -- .../generators/DefaultChunkGenerator2D.java | 4 +- .../generators/DefaultChunkGenerator3D.java | 4 +- .../terra/world/population/CavePopulator.java | 6 +- .../world/population/FloraPopulator.java | 4 +- .../terra/world/population/OrePopulator.java | 4 +- .../world/population/StructurePopulator.java | 5 +- .../terra/world/population/TreePopulator.java | 4 +- .../BukkitChunkGeneratorWrapper.java | 13 --- .../bukkit/population/PopulationManager.java | 16 +--- 22 files changed, 47 insertions(+), 350 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/profiler/DataHolder.java delete mode 100644 common/src/main/java/com/dfsek/terra/profiler/DataType.java delete mode 100644 common/src/main/java/com/dfsek/terra/profiler/Desire.java delete mode 100644 common/src/main/java/com/dfsek/terra/profiler/Measurement.java create mode 100644 common/src/main/java/com/dfsek/terra/profiler/ProfileFrame.java delete mode 100644 common/src/main/java/com/dfsek/terra/profiler/ProfileFuture.java delete mode 100644 common/src/main/java/com/dfsek/terra/profiler/WorldProfiler.java diff --git a/common/src/main/java/com/dfsek/terra/commands/profiler/ProfileQueryCommand.java b/common/src/main/java/com/dfsek/terra/commands/profiler/ProfileQueryCommand.java index 16f383b2d..eb54976e5 100644 --- a/common/src/main/java/com/dfsek/terra/commands/profiler/ProfileQueryCommand.java +++ b/common/src/main/java/com/dfsek/terra/commands/profiler/ProfileQueryCommand.java @@ -4,16 +4,10 @@ import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.command.CommandTemplate; import com.dfsek.terra.api.command.annotation.Command; import com.dfsek.terra.api.command.annotation.type.DebugCommand; -import com.dfsek.terra.api.command.annotation.type.PlayerCommand; -import com.dfsek.terra.api.command.annotation.type.WorldCommand; import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.platform.CommandSender; -import com.dfsek.terra.api.platform.entity.Player; -import com.dfsek.terra.world.TerraWorld; @Command -@WorldCommand -@PlayerCommand @DebugCommand public class ProfileQueryCommand implements CommandTemplate { @Inject @@ -21,8 +15,9 @@ public class ProfileQueryCommand implements CommandTemplate { @Override public void execute(CommandSender sender) { - Player player = (Player) sender; - TerraWorld world = main.getWorld(player.getWorld()); - player.sendMessage(world.getProfiler().getResultsFormatted()); + StringBuilder data = new StringBuilder("Terra Profiler data dump: \n"); + main.getProfiler().getTimings().forEach((id, timings) -> data.append(id).append(": ").append(timings.toString()).append('\n')); + main.logger().info(data.toString()); + sender.sendMessage("Profiler data dumped to console."); } } diff --git a/common/src/main/java/com/dfsek/terra/commands/profiler/ProfileResetCommand.java b/common/src/main/java/com/dfsek/terra/commands/profiler/ProfileResetCommand.java index 1a4c47e6e..2e5a97d6d 100644 --- a/common/src/main/java/com/dfsek/terra/commands/profiler/ProfileResetCommand.java +++ b/common/src/main/java/com/dfsek/terra/commands/profiler/ProfileResetCommand.java @@ -4,16 +4,10 @@ import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.command.CommandTemplate; import com.dfsek.terra.api.command.annotation.Command; import com.dfsek.terra.api.command.annotation.type.DebugCommand; -import com.dfsek.terra.api.command.annotation.type.PlayerCommand; -import com.dfsek.terra.api.command.annotation.type.WorldCommand; import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.platform.CommandSender; -import com.dfsek.terra.api.platform.entity.Player; -import com.dfsek.terra.world.TerraWorld; @Command -@WorldCommand -@PlayerCommand @DebugCommand public class ProfileResetCommand implements CommandTemplate { @Inject @@ -21,9 +15,7 @@ public class ProfileResetCommand implements CommandTemplate { @Override public void execute(CommandSender sender) { - Player player = (Player) sender; - TerraWorld world = main.getWorld(player.getWorld()); - world.getProfiler().reset(); - player.sendMessage("Profiler reset."); + main.getProfiler().reset(); + sender.sendMessage("Profiler reset."); } } diff --git a/common/src/main/java/com/dfsek/terra/commands/profiler/ProfileStartCommand.java b/common/src/main/java/com/dfsek/terra/commands/profiler/ProfileStartCommand.java index 36dcec85b..63c28c472 100644 --- a/common/src/main/java/com/dfsek/terra/commands/profiler/ProfileStartCommand.java +++ b/common/src/main/java/com/dfsek/terra/commands/profiler/ProfileStartCommand.java @@ -4,16 +4,10 @@ import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.command.CommandTemplate; import com.dfsek.terra.api.command.annotation.Command; import com.dfsek.terra.api.command.annotation.type.DebugCommand; -import com.dfsek.terra.api.command.annotation.type.PlayerCommand; -import com.dfsek.terra.api.command.annotation.type.WorldCommand; import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.platform.CommandSender; -import com.dfsek.terra.api.platform.entity.Player; -import com.dfsek.terra.world.TerraWorld; @Command -@WorldCommand -@PlayerCommand @DebugCommand public class ProfileStartCommand implements CommandTemplate { @Inject @@ -21,9 +15,7 @@ public class ProfileStartCommand implements CommandTemplate { @Override public void execute(CommandSender sender) { - Player player = (Player) sender; - TerraWorld world = main.getWorld(player.getWorld()); - world.getProfiler().setProfiling(true); - player.sendMessage("Profiling enabled."); + main.getProfiler().start(); + sender.sendMessage("Profiling enabled."); } } diff --git a/common/src/main/java/com/dfsek/terra/commands/profiler/ProfileStopCommand.java b/common/src/main/java/com/dfsek/terra/commands/profiler/ProfileStopCommand.java index 64e46fe39..baa5aeab3 100644 --- a/common/src/main/java/com/dfsek/terra/commands/profiler/ProfileStopCommand.java +++ b/common/src/main/java/com/dfsek/terra/commands/profiler/ProfileStopCommand.java @@ -4,16 +4,10 @@ import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.command.CommandTemplate; import com.dfsek.terra.api.command.annotation.Command; import com.dfsek.terra.api.command.annotation.type.DebugCommand; -import com.dfsek.terra.api.command.annotation.type.PlayerCommand; -import com.dfsek.terra.api.command.annotation.type.WorldCommand; import com.dfsek.terra.api.injection.annotations.Inject; import com.dfsek.terra.api.platform.CommandSender; -import com.dfsek.terra.api.platform.entity.Player; -import com.dfsek.terra.world.TerraWorld; @Command -@WorldCommand -@PlayerCommand @DebugCommand public class ProfileStopCommand implements CommandTemplate { @Inject @@ -21,9 +15,7 @@ public class ProfileStopCommand implements CommandTemplate { @Override public void execute(CommandSender sender) { - Player player = (Player) sender; - TerraWorld world = main.getWorld(player.getWorld()); - world.getProfiler().setProfiling(false); - player.sendMessage("Profiling disabled."); + main.getProfiler().stop(); + sender.sendMessage("Profiling disabled."); } } diff --git a/common/src/main/java/com/dfsek/terra/profiler/DataHolder.java b/common/src/main/java/com/dfsek/terra/profiler/DataHolder.java deleted file mode 100644 index e90671e7f..000000000 --- a/common/src/main/java/com/dfsek/terra/profiler/DataHolder.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.dfsek.terra.profiler; - -/** - * Class to hold a profiler data value. Contains formatting method to highlight value based on desired range. - */ -public class DataHolder { - private final long desired; - private final DataType type; - private final double desiredRangePercent; - - /** - * Constructs a DataHolder with a DataType and a desired value, including a percentage around the desired value considered acceptable - * - * @param type The type of data held in this instance. - * @param desired The desired value. This should be the average value of whatever is being measured. - * @param desiredRangePercent The percentage around the desired value to be considered acceptable. - */ - public DataHolder(DataType type, long desired, double desiredRangePercent) { - this.desired = desired; - this.type = type; - this.desiredRangePercent = desiredRangePercent; - } - - /** - * Returns a String, formatted with Bungee ChatColors.
- * GREEN if the value is better than desired and outside of acceptable range.
- * YELLOW if the value is better or worse than desired, and within acceptable range.
- * RED if the value is worse than desired and outside of acceptable range.
- * - * @param data The data to format. - * @return String - The formatted data. - */ - public String getFormattedData(long data) { - return type.getFormatted(data); - } -} diff --git a/common/src/main/java/com/dfsek/terra/profiler/DataType.java b/common/src/main/java/com/dfsek/terra/profiler/DataType.java deleted file mode 100644 index eaaad91ea..000000000 --- a/common/src/main/java/com/dfsek/terra/profiler/DataType.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.dfsek.terra.profiler; - -import net.jafama.FastMath; - -public enum DataType { - PERIOD_MILLISECONDS(Desire.LOW, 1000000, "ms"), PERIOD_NANOSECONDS(Desire.LOW, 1, "ns"); - private final Desire desire; - private final long divisor; - private final String unit; - - DataType(Desire d, long divisor, String unit) { - this.desire = d; - this.divisor = divisor; - this.unit = unit; - } - - public String getFormatted(long value) { - return (double) FastMath.round(((double) value / divisor) * 100D) / 100D + unit; - } - - public Desire getDesire() { - return desire; - } -} diff --git a/common/src/main/java/com/dfsek/terra/profiler/Desire.java b/common/src/main/java/com/dfsek/terra/profiler/Desire.java deleted file mode 100644 index df1488138..000000000 --- a/common/src/main/java/com/dfsek/terra/profiler/Desire.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dfsek.terra.profiler; - - -/** - * Enum to represent the "goal" of a value, whether it is desirable for the value to be high (e.g. Frequency), or low (e.g. Period) - */ -public enum Desire { - LOW, HIGH - -} diff --git a/common/src/main/java/com/dfsek/terra/profiler/Measurement.java b/common/src/main/java/com/dfsek/terra/profiler/Measurement.java deleted file mode 100644 index 3bae77f52..000000000 --- a/common/src/main/java/com/dfsek/terra/profiler/Measurement.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.dfsek.terra.profiler; - -import com.dfsek.terra.api.math.MathUtil; -import com.dfsek.terra.api.util.GlueList; -import net.jafama.FastMath; - -import java.math.BigInteger; -import java.util.LinkedList; -import java.util.List; - -/** - * Class to record and hold all data for a single type of measurement performed by the profiler. - */ -public class Measurement { - private final List measurements = new LinkedList<>(); - private final long desirable; - private final DataType type; - private long min = Long.MAX_VALUE; - private long max = Long.MIN_VALUE; - - /** - * Constructs a new Measurement with a desired value and DataType. - * - * @param desirable The desired value of the measurement. - * @param type The type of data the measurement is holding. - */ - public Measurement(long desirable, DataType type) { - this.desirable = desirable; - this.type = type; - } - - public void record(long value) { - max = FastMath.max(value, max); - min = FastMath.min(value, min); - measurements.add(value); - } - - public int size() { - return measurements.size(); - } - - public ProfileFuture beginMeasurement() { - ProfileFuture future = new ProfileFuture(); - long current = System.nanoTime(); - future.thenRun(() -> record(System.nanoTime() - current)); - return future; - } - - public void reset() { - min = Long.MAX_VALUE; - max = Long.MIN_VALUE; - measurements.clear(); - } - - public DataHolder getDataHolder() { - return new DataHolder(type, desirable, 0.25); - } - - public long getMin() { - if(min == Long.MAX_VALUE) return 0; - return min; - } - - public long getMax() { - if(max == Long.MIN_VALUE) return 0; - return max; - } - - public long average() { - BigInteger running = BigInteger.valueOf(0); - List mTemp = new GlueList<>(measurements); - for(Long l : mTemp) { - running = running.add(BigInteger.valueOf(l)); - } - if(measurements.size() == 0) return 0; - return running.divide(BigInteger.valueOf(measurements.size())).longValue(); - } - - public double getStdDev() { - return MathUtil.standardDeviation(new GlueList<>(measurements)); - } - - public int entries() { - return measurements.size(); - } - -} diff --git a/common/src/main/java/com/dfsek/terra/profiler/ProfileFrame.java b/common/src/main/java/com/dfsek/terra/profiler/ProfileFrame.java new file mode 100644 index 000000000..bf5c64dab --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/profiler/ProfileFrame.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.profiler; + +public class ProfileFrame implements AutoCloseable { + private final Runnable action; + + public ProfileFrame(Runnable action) { + this.action = action; + } + + @Override + public void close() { + action.run(); + } +} diff --git a/common/src/main/java/com/dfsek/terra/profiler/ProfileFuture.java b/common/src/main/java/com/dfsek/terra/profiler/ProfileFuture.java deleted file mode 100644 index fdecac8f8..000000000 --- a/common/src/main/java/com/dfsek/terra/profiler/ProfileFuture.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dfsek.terra.profiler; - -import java.util.concurrent.CompletableFuture; - -public class ProfileFuture extends CompletableFuture implements AutoCloseable { - public ProfileFuture() { - super(); - } - - public boolean complete() { - return super.complete(true); - } - - @Override - public void close() { - this.complete(); - } -} diff --git a/common/src/main/java/com/dfsek/terra/profiler/Profiler.java b/common/src/main/java/com/dfsek/terra/profiler/Profiler.java index b2b2a578e..226b8860e 100644 --- a/common/src/main/java/com/dfsek/terra/profiler/Profiler.java +++ b/common/src/main/java/com/dfsek/terra/profiler/Profiler.java @@ -13,8 +13,12 @@ public interface Profiler { Map getTimings(); - default AutoCloseable profile(String frame) { + default ProfileFrame profile(String frame) { push(frame); - return () -> pop(frame); + return new ProfileFrame(() -> pop(frame)); + } + + default void reset() { + // todo: impl } } diff --git a/common/src/main/java/com/dfsek/terra/profiler/WorldProfiler.java b/common/src/main/java/com/dfsek/terra/profiler/WorldProfiler.java deleted file mode 100644 index a1ea04908..000000000 --- a/common/src/main/java/com/dfsek/terra/profiler/WorldProfiler.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.dfsek.terra.profiler; - -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.world.TerraWorld; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import net.jafama.FastMath; - -import java.util.Map; - -public class WorldProfiler { - private final BiMap measures = HashBiMap.create(); - private final World world; - private boolean isProfiling; - - public WorldProfiler(World w) { - if(!TerraWorld.isTerraWorld(w)) - throw new IllegalArgumentException("Attempted to instantiate profiler on non-Terra managed world!"); - this.addMeasurement(new Measurement(2500000, DataType.PERIOD_MILLISECONDS), "TotalChunkGenTime") - .addMeasurement(new Measurement(1500000, DataType.PERIOD_MILLISECONDS), "FloraTime") - .addMeasurement(new Measurement(10000000, DataType.PERIOD_MILLISECONDS), "TreeTime") - .addMeasurement(new Measurement(1500000, DataType.PERIOD_MILLISECONDS), "OreTime") - .addMeasurement(new Measurement(5000000, DataType.PERIOD_MILLISECONDS), "CaveTime") - .addMeasurement(new Measurement(1500000, DataType.PERIOD_MILLISECONDS), "StructureTime"); - - isProfiling = false; - this.world = w; - } - - public String getResultsFormatted() { - if(! isProfiling) return "Profiler is not currently running."; - StringBuilder result = new StringBuilder("Gaea World Profiler Results (Min / Avg / Max / Std Dev): \n"); - for(Map.Entry e : measures.entrySet()) { - result - .append(e.getKey()) - .append(": ") - .append(e.getValue().getDataHolder().getFormattedData(e.getValue().getMin())) - .append(" / ") - .append(e.getValue().getDataHolder().getFormattedData(e.getValue().average())) - .append(" / ") - .append(e.getValue().getDataHolder().getFormattedData(e.getValue().getMax())) - .append(" / ") - .append((double) FastMath.round((e.getValue().getStdDev() / 1000000) * 100D) / 100D) - .append("ms") - .append(" (x").append(e.getValue().size()).append(")\n"); - } - return result.toString(); - } - - public void reset() { - for(Map.Entry e : measures.entrySet()) { - e.getValue().reset(); - } - } - - public com.dfsek.terra.profiler.WorldProfiler addMeasurement(Measurement m, String name) { - measures.put(name, m); - return this; - } - - public void setMeasurement(String id, long value) { - if(isProfiling) measures.get(id).record(value); - } - - public ProfileFuture measure(String id) { - if(isProfiling) return measures.get(id).beginMeasurement(); - else return null; - } - - public String getID(Measurement m) { - return measures.inverse().get(m); - } - - public boolean isProfiling() { - return isProfiling; - } - - public void setProfiling(boolean enabled) { - this.isProfiling = enabled; - } - - public World getWorld() { - return world; - } -} diff --git a/common/src/main/java/com/dfsek/terra/world/TerraWorld.java b/common/src/main/java/com/dfsek/terra/world/TerraWorld.java index bbf0ac9f3..eefd72fc7 100644 --- a/common/src/main/java/com/dfsek/terra/world/TerraWorld.java +++ b/common/src/main/java/com/dfsek/terra/world/TerraWorld.java @@ -13,7 +13,6 @@ import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.pack.WorldConfig; -import com.dfsek.terra.profiler.WorldProfiler; import com.dfsek.terra.world.generation.math.samplers.Sampler; import net.jafama.FastMath; @@ -21,7 +20,6 @@ public class TerraWorld { private final BiomeProvider provider; private final WorldConfig config; private final boolean safe; - private final WorldProfiler profiler; private final World world; private final BlockData air; @@ -31,7 +29,6 @@ public class TerraWorld { this.world = w; config = c.toWorldConfig(this); this.provider = config.getProvider(); - profiler = new WorldProfiler(w); air = main.getWorldHandle().createBlockData("minecraft:air"); main.getEventManager().callEvent(new TerraWorldLoadEvent(this, c)); safe = true; @@ -61,9 +58,6 @@ public class TerraWorld { return safe; } - public WorldProfiler getProfiler() { - return profiler; - } /** * Get a block at an ungenerated location diff --git a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator2D.java b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator2D.java index c4f384b07..be9268205 100644 --- a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator2D.java +++ b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator2D.java @@ -15,7 +15,7 @@ import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.profiler.ProfileFuture; +import com.dfsek.terra.profiler.ProfileFrame; import com.dfsek.terra.world.Carver; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.carving.NoiseCarver; @@ -94,7 +94,7 @@ public class DefaultChunkGenerator2D implements TerraChunkGenerator { public ChunkData generateChunkData(@NotNull World world, Random random, int chunkX, int chunkZ, ChunkData chunk) { TerraWorld tw = main.getWorld(world); BiomeProvider grid = tw.getBiomeProvider(); - try(ProfileFuture ignore = tw.getProfiler().measure("TotalChunkGenTime")) { + try(ProfileFrame ignore = main.getProfiler().profile("chunk_base_2d")) { if(!tw.isSafe()) return chunk; int xOrig = (chunkX << 4); int zOrig = (chunkZ << 4); diff --git a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java index f63676161..42ba25006 100644 --- a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java +++ b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java @@ -23,7 +23,7 @@ import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.SinglePalette; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.profiler.ProfileFuture; +import com.dfsek.terra.profiler.ProfileFrame; import com.dfsek.terra.world.Carver; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.carving.NoiseCarver; @@ -106,7 +106,7 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator { public ChunkData generateChunkData(@NotNull World world, Random random, int chunkX, int chunkZ, ChunkData chunk) { TerraWorld tw = main.getWorld(world); BiomeProvider grid = tw.getBiomeProvider(); - try(ProfileFuture ignore = tw.getProfiler().measure("TotalChunkGenTime")) { + try(ProfileFrame ignore = main.getProfiler().profile("chunk_base_3d")) { if(!tw.isSafe()) return chunk; int xOrig = (chunkX << 4); int zOrig = (chunkZ << 4); diff --git a/common/src/main/java/com/dfsek/terra/world/population/CavePopulator.java b/common/src/main/java/com/dfsek/terra/world/population/CavePopulator.java index ee3aa0553..361469fa4 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/CavePopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/CavePopulator.java @@ -14,7 +14,7 @@ import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.pack.WorldConfig; import com.dfsek.terra.config.templates.CarverTemplate; -import com.dfsek.terra.profiler.ProfileFuture; +import com.dfsek.terra.profiler.ProfileFrame; import com.dfsek.terra.world.TerraWorld; import org.jetbrains.annotations.NotNull; @@ -38,7 +38,7 @@ public class CavePopulator implements TerraBlockPopulator, Chunkified { TerraWorld tw = main.getWorld(world); WorldHandle handle = main.getWorldHandle(); BlockData AIR = handle.createBlockData("minecraft:air"); - try(ProfileFuture ignored = tw.getProfiler().measure("CaveTime")) { + try(ProfileFrame ignore = main.getProfiler().profile("carving")) { Random random = PopulationUtil.getRandom(chunk); if(!tw.isSafe()) return; WorldConfig config = tw.getConfig(); @@ -93,7 +93,7 @@ public class CavePopulator implements TerraBlockPopulator, Chunkified { if(template.getShift().get(entry.getValue().getBlockType()).contains(mut.getBlock().getBlockData().getBlockType())) { mut.getBlock().setBlockData(shiftStorage.computeIfAbsent(entry.getValue().getBlockType(), BlockType::getDefaultData), false); } - } catch(NullPointerException ignore) { + } catch(NullPointerException ignored) { } } for(Block b : updateNeeded) { diff --git a/common/src/main/java/com/dfsek/terra/world/population/FloraPopulator.java b/common/src/main/java/com/dfsek/terra/world/population/FloraPopulator.java index 5360b2bec..99c97f411 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/FloraPopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/FloraPopulator.java @@ -8,7 +8,7 @@ import com.dfsek.terra.api.util.world.PopulationUtil; import com.dfsek.terra.api.world.biome.UserDefinedBiome; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; -import com.dfsek.terra.profiler.ProfileFuture; +import com.dfsek.terra.profiler.ProfileFrame; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.population.items.flora.FloraLayer; import org.jetbrains.annotations.NotNull; @@ -32,7 +32,7 @@ public class FloraPopulator implements TerraBlockPopulator { @Override public void populate(@NotNull World world, @NotNull Chunk chunk) { TerraWorld tw = main.getWorld(world); - try(ProfileFuture ignored = tw.getProfiler().measure("FloraTime")) { + try(ProfileFrame ignore = main.getProfiler().profile("flora")) { if(tw.getConfig().getTemplate().disableFlora()) return; if(!tw.isSafe()) return; diff --git a/common/src/main/java/com/dfsek/terra/world/population/OrePopulator.java b/common/src/main/java/com/dfsek/terra/world/population/OrePopulator.java index 810455b30..f82083d1c 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/OrePopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/OrePopulator.java @@ -10,7 +10,7 @@ import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.UserDefinedBiome; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.profiler.ProfileFuture; +import com.dfsek.terra.profiler.ProfileFrame; import com.dfsek.terra.world.TerraWorld; import org.jetbrains.annotations.NotNull; @@ -27,7 +27,7 @@ public class OrePopulator implements TerraBlockPopulator { @Override public void populate(@NotNull World world, @NotNull Chunk chunk) { TerraWorld tw = main.getWorld(world); - try(ProfileFuture ignored = tw.getProfiler().measure("OreTime")) { + try(ProfileFrame ignore = main.getProfiler().profile("ore")) { if(tw.getConfig().getTemplate().disableOres()) return; if(!tw.isSafe()) return; diff --git a/common/src/main/java/com/dfsek/terra/world/population/StructurePopulator.java b/common/src/main/java/com/dfsek/terra/world/population/StructurePopulator.java index ec85aeccd..30346917c 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/StructurePopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/StructurePopulator.java @@ -11,9 +11,8 @@ import com.dfsek.terra.api.world.biome.UserDefinedBiome; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; import com.dfsek.terra.api.world.generation.Chunkified; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; -import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.pack.WorldConfig; -import com.dfsek.terra.profiler.ProfileFuture; +import com.dfsek.terra.profiler.ProfileFrame; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.population.items.TerraStructure; import net.jafama.FastMath; @@ -32,7 +31,7 @@ public class StructurePopulator implements TerraBlockPopulator, Chunkified { @Override public void populate(@NotNull World world, @NotNull Chunk chunk) { TerraWorld tw = main.getWorld(world); - try(ProfileFuture ignored = tw.getProfiler().measure("StructureTime")) { + try(ProfileFrame ignore = main.getProfiler().profile("structure")) { if(tw.getConfig().getTemplate().disableStructures()) return; int cx = (chunk.getX() << 4); diff --git a/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java b/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java index 5e2145989..e9fafd9b6 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java @@ -8,7 +8,7 @@ import com.dfsek.terra.api.util.world.PopulationUtil; import com.dfsek.terra.api.world.biome.UserDefinedBiome; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; -import com.dfsek.terra.profiler.ProfileFuture; +import com.dfsek.terra.profiler.ProfileFrame; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.population.items.tree.TreeLayer; import net.jafama.FastMath; @@ -32,7 +32,7 @@ public class TreePopulator implements TerraBlockPopulator { @SuppressWarnings("try") public void populate(@NotNull World world, @NotNull Chunk chunk) { TerraWorld tw = main.getWorld(world); - try(ProfileFuture ignored = tw.getProfiler().measure("TreeTime")) { + try(ProfileFrame ignore = main.getProfiler().profile("tree")) { if(tw.getConfig().getTemplate().disableTrees()) return; if(!tw.isSafe()) return; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java index 96ae67747..cae7325db 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -3,19 +3,11 @@ package com.dfsek.terra.bukkit.generator; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; -import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.bukkit.population.PopulationManager; import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.bukkit.world.BukkitBiomeGrid; -import com.dfsek.terra.profiler.DataType; -import com.dfsek.terra.profiler.Measurement; import com.dfsek.terra.world.TerraWorld; -import com.dfsek.terra.world.population.CavePopulator; -import com.dfsek.terra.world.population.FloraPopulator; -import com.dfsek.terra.world.population.OrePopulator; -import com.dfsek.terra.world.population.StructurePopulator; -import com.dfsek.terra.world.population.TreePopulator; import org.bukkit.World; import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.ChunkGenerator; @@ -24,13 +16,10 @@ import org.jetbrains.annotations.NotNull; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Random; -import java.util.stream.Collectors; public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements GeneratorWrapper { @@ -76,8 +65,6 @@ public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements Gener e.printStackTrace(); } popMap.put(w, popMan); - main.getWorld(w).getProfiler().addMeasurement(new Measurement(15000000, DataType.PERIOD_MILLISECONDS), "PopulationManagerTime"); - popMan.attachProfiler(main.getWorld(w).getProfiler()); needsLoad = false; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java index 9b9c7a100..e7d67d224 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java @@ -5,12 +5,10 @@ import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.generation.Chunkified; -import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.bukkit.TerraBukkitPlugin; import com.dfsek.terra.bukkit.world.BukkitAdapter; -import com.dfsek.terra.profiler.ProfileFuture; -import com.dfsek.terra.profiler.WorldProfiler; +import com.dfsek.terra.profiler.ProfileFrame; import org.bukkit.generator.BlockPopulator; import org.jetbrains.annotations.NotNull; @@ -26,22 +24,12 @@ public class PopulationManager extends BlockPopulator { private final TerraChunkGenerator generator; private final HashSet needsPop = new HashSet<>(); private final TerraPlugin main; - private WorldProfiler profiler; public PopulationManager(TerraChunkGenerator generator, TerraPlugin main) { this.generator = generator; this.main = main; } - private ProfileFuture measure() { - if(profiler != null) return profiler.measure("PopulationManagerTime"); - return null; - } - - public void attachProfiler(WorldProfiler p) { - this.profiler = p; - } - @SuppressWarnings("unchecked") public synchronized void saveBlocks(World w) throws IOException { File f = new File(Gaea.getGaeaFolder(w), "chunks.bin"); @@ -79,7 +67,7 @@ public class PopulationManager extends BlockPopulator { @Override public void populate(org.bukkit.@NotNull World world, @NotNull Random random, org.bukkit.@NotNull Chunk source) { - try(ProfileFuture ignored = measure()) { + try(ProfileFrame ignore = main.getProfiler().profile("popman")) { Chunk chunk = BukkitAdapter.adapt(source); needsPop.add(new ChunkCoordinate(chunk)); int x = chunk.getX(); From e5f4c5dc8d1b89808195dc8bc0e3e1e4656d0d12 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 12 Apr 2021 00:45:52 -0700 Subject: [PATCH 11/98] implement terrascript profiling --- .../structures/script/StructureScript.java | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 108b3b101..c90de52f7 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -29,6 +29,7 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.structure.buffer.DirectBuffer; import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer; +import com.dfsek.terra.profiler.ProfileFrame; import com.dfsek.terra.registry.config.FunctionRegistry; import com.dfsek.terra.registry.config.LootRegistry; import com.dfsek.terra.registry.config.ScriptRegistry; @@ -105,21 +106,27 @@ public class StructureScript { * @return Whether generation was successful */ public boolean execute(Location location, Random random, Rotation rotation) { - StructureBuffer buffer = new StructureBuffer(location); - boolean level = applyBlock(new TerraImplementationArguments(buffer, rotation, random, 0)); - buffer.paste(); - return level; + try(ProfileFrame ignore = main.getProfiler().profile("terrascript:" + id)) { + StructureBuffer buffer = new StructureBuffer(location); + boolean level = applyBlock(new TerraImplementationArguments(buffer, rotation, random, 0)); + buffer.paste(); + return level; + } } public boolean execute(Location location, Chunk chunk, Random random, Rotation rotation) { - StructureBuffer buffer = computeBuffer(location, random, rotation); - buffer.paste(chunk); - return buffer.succeeded(); + try(ProfileFrame ignore = main.getProfiler().profile("terrascript_chunk:" + id)) { + StructureBuffer buffer = computeBuffer(location, random, rotation); + buffer.paste(chunk); + return buffer.succeeded(); + } } public boolean test(Location location, Random random, Rotation rotation) { - StructureBuffer buffer = computeBuffer(location, random, rotation); - return buffer.succeeded(); + try(ProfileFrame ignore = main.getProfiler().profile("terrascript_test:" + id)) { + StructureBuffer buffer = computeBuffer(location, random, rotation); + return buffer.succeeded(); + } } private StructureBuffer computeBuffer(Location location, Random random, Rotation rotation) { @@ -135,12 +142,16 @@ public class StructureScript { } public boolean executeInBuffer(Buffer buffer, Random random, Rotation rotation, int recursions) { - return applyBlock(new TerraImplementationArguments(buffer, rotation, random, recursions)); + try(ProfileFrame ignore = main.getProfiler().profile("terrascript_recursive:" + id)) { + return applyBlock(new TerraImplementationArguments(buffer, rotation, random, recursions)); + } } public boolean executeDirect(Location location, Random random, Rotation rotation) { - DirectBuffer buffer = new DirectBuffer(location); - return applyBlock(new TerraImplementationArguments(buffer, rotation, random, 0)); + try(ProfileFrame ignore = main.getProfiler().profile("terrascript_direct:" + id)) { + DirectBuffer buffer = new DirectBuffer(location); + return applyBlock(new TerraImplementationArguments(buffer, rotation, random, 0)); + } } public String getId() { From f8e7e343cbd96be7e6223f4cf4cf6eaef4aac0f9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 12 Apr 2021 00:46:00 -0700 Subject: [PATCH 12/98] fix % parent issue --- common/src/main/java/com/dfsek/terra/profiler/Timings.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/com/dfsek/terra/profiler/Timings.java b/common/src/main/java/com/dfsek/terra/profiler/Timings.java index e632e4cf0..22ef0f003 100644 --- a/common/src/main/java/com/dfsek/terra/profiler/Timings.java +++ b/common/src/main/java/com/dfsek/terra/profiler/Timings.java @@ -30,6 +30,10 @@ public class Timings { return timings.stream().mapToLong(Long::longValue).min().orElse(0L); } + public double sum() { + return timings.stream().mapToDouble(Long::doubleValue).sum(); + } + public Timings getSubItem(String id) { return subItems.computeIfAbsent(id, s -> new Timings()); } @@ -39,7 +43,7 @@ public class Timings { builder.append((double) min() / 1000000).append("ms min / ").append(average() / 1000000).append("ms avg / ") .append((double) max() / 1000000).append("ms max (").append(timings.size()).append(" samples, ") - .append((average() / parent.average()) * 100).append("% of parent)"); + .append((sum() / parent.sum()) * 100).append("% of parent)"); subItems.forEach((id, timings) -> { builder.append('\n'); From 23fb7753abadd6a265159b0fc5efe72a21ea77e4 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 12 Apr 2021 01:16:26 -0700 Subject: [PATCH 13/98] fancy unicode symbols B) --- .../com/dfsek/terra/profiler/Timings.java | 25 +++++++++++++------ .../src/test/java/profiler/ProfilerTest.java | 8 ++++++ 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/profiler/Timings.java b/common/src/main/java/com/dfsek/terra/profiler/Timings.java index 22ef0f003..3875285b3 100644 --- a/common/src/main/java/com/dfsek/terra/profiler/Timings.java +++ b/common/src/main/java/com/dfsek/terra/profiler/Timings.java @@ -1,9 +1,12 @@ package com.dfsek.terra.profiler; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; public class Timings { private final Map subItems = new HashMap<>(); @@ -38,25 +41,33 @@ public class Timings { return subItems.computeIfAbsent(id, s -> new Timings()); } - public String toString(int indent, Timings parent) { + public String toString(int indent, Timings parent, Set branches) { StringBuilder builder = new StringBuilder(); builder.append((double) min() / 1000000).append("ms min / ").append(average() / 1000000).append("ms avg / ") .append((double) max() / 1000000).append("ms max (").append(timings.size()).append(" samples, ") .append((sum() / parent.sum()) * 100).append("% of parent)"); - subItems.forEach((id, timings) -> { + List frames = new ArrayList<>(); + Set newBranches = new HashSet<>(branches); + newBranches.add(indent); + subItems.forEach((id, timings) -> frames.add(id + ": " + timings.toString(indent + 1, this, newBranches))); + + for(int i = 0; i < frames.size(); i++) { builder.append('\n'); - for(int i = 0; i <= indent; i++) { - builder.append('\t'); + for(int j = 0; j < indent; j++) { + if(branches.contains(j)) builder.append("│ "); + else builder.append(" "); } - builder.append(id).append(": ").append(timings.toString(indent + 1, this)); - }); + if(i == frames.size() - 1 && !frames.get(i).contains("\n")) builder.append("└───"); + else builder.append("├───"); + builder.append(frames.get(i)); + } return builder.toString(); } @Override public String toString() { - return toString(0, this); + return toString(1, this, Collections.emptySet()); } } diff --git a/common/src/test/java/profiler/ProfilerTest.java b/common/src/test/java/profiler/ProfilerTest.java index b60ea32e5..86ad4e5a1 100644 --- a/common/src/test/java/profiler/ProfilerTest.java +++ b/common/src/test/java/profiler/ProfilerTest.java @@ -29,6 +29,7 @@ public class ProfilerTest { PROFILER.push("thing"); Thread.sleep(1); doOtherThing(); + thing4(); PROFILER.pop("thing"); } @@ -36,6 +37,7 @@ public class ProfilerTest { PROFILER.push("thing2"); Thread.sleep(2); doThirdOtherThing(); + thing4(); PROFILER.pop("thing2"); } @@ -44,4 +46,10 @@ public class ProfilerTest { Thread.sleep(2); PROFILER.pop("thing3"); } + + private static void thing4() throws InterruptedException { + PROFILER.push("thing4"); + Thread.sleep(2); + PROFILER.pop("thing4"); + } } From 5d3a2b6e84950f38997f7ff0af52bafa5eb5cb12 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 12 Apr 2021 08:46:56 -0700 Subject: [PATCH 14/98] profile more things --- .../loaders/config/OreHolderLoader.java | 2 +- .../terra/world/population/CavePopulator.java | 66 ++++++++++--------- .../terra/world/population/OrePopulator.java | 12 ++-- .../terra/world/population/TreePopulator.java | 3 +- .../world/population/items/ores/Ore.java | 1 - .../population/items/ores/OreHolder.java | 17 +++-- .../dfsek/terra/bukkit/world/BukkitTree.java | 6 +- .../dfsek/terra/fabric/world/FabricTree.java | 10 ++- 8 files changed, 68 insertions(+), 49 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/OreHolderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/OreHolderLoader.java index 71b021fa3..08f682171 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/OreHolderLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/OreHolderLoader.java @@ -18,7 +18,7 @@ public class OreHolderLoader implements TypeLoader { Map map = (Map) o; for(Map.Entry entry : map.entrySet()) { - holder.add(configLoader.loadClass(Ore.class, entry.getKey()), (OreConfig) configLoader.loadType(OreConfig.class, entry.getValue())); + holder.add(configLoader.loadClass(Ore.class, entry.getKey()), configLoader.loadClass(OreConfig.class, entry.getValue()), entry.getKey()); } return holder; diff --git a/common/src/main/java/com/dfsek/terra/world/population/CavePopulator.java b/common/src/main/java/com/dfsek/terra/world/population/CavePopulator.java index 361469fa4..8b6e0bab0 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/CavePopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/CavePopulator.java @@ -49,38 +49,40 @@ public class CavePopulator implements TerraBlockPopulator, Chunkified { Map shiftCandidate = new HashMap<>(); Set updateNeeded = new HashSet<>(); c.carve(chunk.getX(), chunk.getZ(), world, (v, type) -> { - Block b = chunk.getBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ()); - BlockData m = b.getBlockData(); - BlockType re = m.getBlockType(); - switch(type) { - case CENTER: - if(template.getInner().canReplace(re)) { - b.setBlockData(template.getInner().get(v.getBlockY()).get(random), false); - if(template.getUpdate().contains(re)) updateNeeded.add(b); - if(template.getShift().containsKey(re)) shiftCandidate.put(b.getLocation(), m); - } - break; - case WALL: - if(template.getOuter().canReplace(re)) { - b.setBlockData(template.getOuter().get(v.getBlockY()).get(random), false); - if(template.getUpdate().contains(re)) updateNeeded.add(b); - if(template.getShift().containsKey(re)) shiftCandidate.put(b.getLocation(), m); - } - break; - case TOP: - if(template.getTop().canReplace(re)) { - b.setBlockData(template.getTop().get(v.getBlockY()).get(random), false); - if(template.getUpdate().contains(re)) updateNeeded.add(b); - if(template.getShift().containsKey(re)) shiftCandidate.put(b.getLocation(), m); - } - break; - case BOTTOM: - if(template.getBottom().canReplace(re)) { - b.setBlockData(template.getBottom().get(v.getBlockY()).get(random), false); - if(template.getUpdate().contains(re)) updateNeeded.add(b); - if(template.getShift().containsKey(re)) shiftCandidate.put(b.getLocation(), m); - } - break; + try(ProfileFrame ignored = main.getProfiler().profile("carving:" + c.getConfig().getID())) { + Block b = chunk.getBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ()); + BlockData m = b.getBlockData(); + BlockType re = m.getBlockType(); + switch(type) { + case CENTER: + if(template.getInner().canReplace(re)) { + b.setBlockData(template.getInner().get(v.getBlockY()).get(random), false); + if(template.getUpdate().contains(re)) updateNeeded.add(b); + if(template.getShift().containsKey(re)) shiftCandidate.put(b.getLocation(), m); + } + break; + case WALL: + if(template.getOuter().canReplace(re)) { + b.setBlockData(template.getOuter().get(v.getBlockY()).get(random), false); + if(template.getUpdate().contains(re)) updateNeeded.add(b); + if(template.getShift().containsKey(re)) shiftCandidate.put(b.getLocation(), m); + } + break; + case TOP: + if(template.getTop().canReplace(re)) { + b.setBlockData(template.getTop().get(v.getBlockY()).get(random), false); + if(template.getUpdate().contains(re)) updateNeeded.add(b); + if(template.getShift().containsKey(re)) shiftCandidate.put(b.getLocation(), m); + } + break; + case BOTTOM: + if(template.getBottom().canReplace(re)) { + b.setBlockData(template.getBottom().get(v.getBlockY()).get(random), false); + if(template.getUpdate().contains(re)) updateNeeded.add(b); + if(template.getShift().containsKey(re)) shiftCandidate.put(b.getLocation(), m); + } + break; + } } }); for(Map.Entry entry : shiftCandidate.entrySet()) { diff --git a/common/src/main/java/com/dfsek/terra/world/population/OrePopulator.java b/common/src/main/java/com/dfsek/terra/world/population/OrePopulator.java index f82083d1c..3d5c0966a 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/OrePopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/OrePopulator.java @@ -40,11 +40,13 @@ public class OrePopulator implements TerraBlockPopulator { BiomeTemplate config = ((UserDefinedBiome) b).getConfig(); int finalCx = cx; int finalCz = cz; - config.getOreHolder().forEach((ore, oreConfig) -> { - int amount = oreConfig.getAmount().get(random); - for(int i = 0; i < amount; i++) { - Vector3 location = new Vector3(random.nextInt(16) + 16 * finalCx, oreConfig.getHeight().get(random), random.nextInt(16) + 16 * finalCz); - ore.generate(location, chunk, random); + config.getOreHolder().forEach((id, orePair) -> { + try(ProfileFrame ignored = main.getProfiler().profile("ore:" + id)) { + int amount = orePair.getRight().getAmount().get(random); + for(int i = 0; i < amount; i++) { + Vector3 location = new Vector3(random.nextInt(16) + 16 * finalCx, orePair.getRight().getHeight().get(random), random.nextInt(16) + 16 * finalCz); + orePair.getLeft().generate(location, chunk, random); + } } }); } diff --git a/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java b/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java index e9fafd9b6..5dd58fb92 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java @@ -42,8 +42,9 @@ public class TreePopulator implements TerraBlockPopulator { for(int z = 0; z < 16; z += 2) { UserDefinedBiome biome = (UserDefinedBiome) provider.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z); for(TreeLayer layer : biome.getConfig().getTrees()) { - if(layer.getDensity() >= random.nextDouble() * 100) + if(layer.getDensity() >= random.nextDouble() * 100) { layer.place(chunk, new Vector2(offset(random, x), offset(random, z))); + } } } } diff --git a/common/src/main/java/com/dfsek/terra/world/population/items/ores/Ore.java b/common/src/main/java/com/dfsek/terra/world/population/items/ores/Ore.java index 541a7dacf..e7f3faedd 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/items/ores/Ore.java +++ b/common/src/main/java/com/dfsek/terra/world/population/items/ores/Ore.java @@ -16,7 +16,6 @@ public abstract class Ore { protected TerraPlugin main; public Ore(BlockData material, MaterialSet replaceable, boolean applyGravity, TerraPlugin main) { - this.material = material; this.replaceable = replaceable; this.applyGravity = applyGravity; diff --git a/common/src/main/java/com/dfsek/terra/world/population/items/ores/OreHolder.java b/common/src/main/java/com/dfsek/terra/world/population/items/ores/OreHolder.java index e7cc81d5c..43e461895 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/items/ores/OreHolder.java +++ b/common/src/main/java/com/dfsek/terra/world/population/items/ores/OreHolder.java @@ -1,6 +1,7 @@ package com.dfsek.terra.world.population.items.ores; import com.dfsek.terra.api.util.GlueList; +import com.dfsek.terra.api.util.generic.pair.ImmutablePair; import java.util.List; import java.util.function.BiConsumer; @@ -11,22 +12,24 @@ import java.util.function.BiConsumer; public class OreHolder { private final List entries = new GlueList<>(); - public void forEach(BiConsumer consumer) { - entries.forEach(entry -> consumer.accept(entry.getOre(), entry.getConfig())); + public void forEach(BiConsumer> consumer) { + entries.forEach(entry -> consumer.accept(entry.getId(), ImmutablePair.of(entry.getOre(), entry.getConfig()))); } - public OreHolder add(Ore ore, OreConfig config) { - entries.add(new Entry(ore, config)); + public OreHolder add(Ore ore, OreConfig config, String id) { + entries.add(new Entry(ore, config, id)); return this; } private static final class Entry { private final Ore ore; private final OreConfig config; + private final String id; - private Entry(Ore ore, OreConfig config) { + private Entry(Ore ore, OreConfig config, String id) { this.ore = ore; this.config = config; + this.id = id; } public OreConfig getConfig() { @@ -36,5 +39,9 @@ public class OreHolder { public Ore getOre() { return ore; } + + public String getId() { + return id; + } } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitTree.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitTree.java index b502639a4..5464963b8 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitTree.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitTree.java @@ -5,8 +5,10 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.util.collections.MaterialSet; +import com.dfsek.terra.profiler.ProfileFrame; import org.bukkit.TreeType; +import java.util.Locale; import java.util.Random; public class BukkitTree implements Tree { @@ -41,7 +43,9 @@ public class BukkitTree implements Tree { @Override public boolean plant(Location l, Random r) { - return ((BukkitWorld) l.getWorld()).getHandle().generateTree(BukkitAdapter.adapt(l), delegate); + try(ProfileFrame ignore = main.getProfiler().profile("bukkit_tree:" + delegate.toString().toLowerCase(Locale.ROOT))) { + return ((BukkitWorld) l.getWorld()).getHandle().generateTree(BukkitAdapter.adapt(l), delegate); + } } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java index 3a9567a15..c8415ad1b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java @@ -6,11 +6,13 @@ import com.dfsek.terra.api.util.collections.MaterialSet; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; +import com.dfsek.terra.profiler.ProfileFrame; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.ConfiguredFeature; +import java.util.Locale; import java.util.Random; public class FabricTree implements Tree { @@ -22,9 +24,11 @@ public class FabricTree implements Tree { @Override public boolean plant(Location l, Random r) { - FabricWorldAccess fabricWorldAccess = ((FabricWorldAccess) l.getWorld()); - ChunkGenerator generatorWrapper = ((FabricChunkGenerator) fabricWorldAccess.getGenerator()).getHandle(); - return delegate.generate((StructureWorldAccess) fabricWorldAccess.getHandle(), generatorWrapper, r, new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ())); + try(ProfileFrame ignore = TerraFabricPlugin.getInstance().getProfiler().profile("fabric_tree:" + delegate.toString().toLowerCase(Locale.ROOT))) { + FabricWorldAccess fabricWorldAccess = ((FabricWorldAccess) l.getWorld()); + ChunkGenerator generatorWrapper = ((FabricChunkGenerator) fabricWorldAccess.getGenerator()).getHandle(); + return delegate.generate((StructureWorldAccess) fabricWorldAccess.getHandle(), generatorWrapper, r, new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ())); + } } @Override From 8823d6d65ea6dfedbcf2055ac6bbb55b8e090bea Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 12 Apr 2021 09:19:03 -0700 Subject: [PATCH 15/98] fix stack size assumption at profiler start --- .../com/dfsek/terra/profiler/ProfilerImpl.java | 15 +++++++++++---- common/src/test/java/profiler/ProfilerTest.java | 10 +++++++++- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java b/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java index 23f00d495..0ffd824e1 100644 --- a/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java +++ b/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java @@ -1,5 +1,6 @@ package com.dfsek.terra.profiler; +import com.dfsek.terra.api.util.mutable.MutableInteger; import com.dfsek.terra.profiler.exception.MalformedStackException; import java.util.ArrayList; @@ -15,6 +16,8 @@ public class ProfilerImpl implements Profiler { private volatile boolean running = false; private static boolean instantiated = false; + private static final ThreadLocal SAFE = ThreadLocal.withInitial(() -> false); + private static final ThreadLocal STACK_SIZE = ThreadLocal.withInitial(() -> new MutableInteger(0)); public ProfilerImpl() { if(instantiated) throw new IllegalStateException("Only one instance of Profiler may exist!"); @@ -23,15 +26,18 @@ public class ProfilerImpl implements Profiler { @Override public void push(String frame) { - if(running) { + STACK_SIZE.get().increment(); + if(running && SAFE.get()) { Stack stack = THREAD_STACK.get(); - stack.push(new Frame(stack.size() == 0 ? frame : stack.peek().getId() + "." + frame)); - } + stack.push(new Frame(stack.isEmpty() ? frame : stack.peek().getId() + "." + frame)); + } else SAFE.set(false); } @Override public void pop(String frame) { - if(running) { + MutableInteger size = STACK_SIZE.get(); + size.decrement(); + if(running && SAFE.get()) { long time = System.nanoTime(); Stack stack = THREAD_STACK.get(); @@ -51,6 +57,7 @@ public class ProfilerImpl implements Profiler { timings.add(time - top.getStart()); } + if(size.get() == 0) SAFE.set(true); } @Override diff --git a/common/src/test/java/profiler/ProfilerTest.java b/common/src/test/java/profiler/ProfilerTest.java index 86ad4e5a1..b4d97856d 100644 --- a/common/src/test/java/profiler/ProfilerTest.java +++ b/common/src/test/java/profiler/ProfilerTest.java @@ -7,7 +7,7 @@ public class ProfilerTest { private static final Profiler PROFILER = new ProfilerImpl(); //@Test public static void main(String... a) throws InterruptedException { - PROFILER.start(); + //PROFILER.start(); for(int i = 0; i < 1000; i++) { doThing(); } @@ -20,6 +20,14 @@ public class ProfilerTest { doOtherThing(); } PROFILER.stop(); + PROFILER.push("thing"); + PROFILER.push("thing2"); + PROFILER.start(); + PROFILER.pop("thing2"); + PROFILER.pop("thing"); + PROFILER.push("thing4"); + PROFILER.pop("thing4"); + PROFILER.getTimings().forEach((id, timings) -> { System.out.println(id + ": " + timings.toString()); }); From bcb68853d5d848de78ac54dbe455960faacfb5ac Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 12 Apr 2021 09:19:26 -0700 Subject: [PATCH 16/98] @SuppressWarnings go brrr --- .../terra/api/structures/script/StructureScript.java | 8 +++++++- .../java/com/dfsek/terra/api/transform/Transformer.java | 1 + common/src/test/java/structure/ParserTest.java | 3 ++- .../dfsek/terra/bukkit/population/PopulationManager.java | 1 + .../java/com/dfsek/terra/bukkit/world/BukkitTree.java | 1 + .../dfsek/terra/bukkit/world/block/state/BukkitSign.java | 1 + 6 files changed, 13 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index c90de52f7..65e6d9923 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -40,6 +40,7 @@ import org.apache.commons.io.IOUtils; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.Charset; import java.util.Random; import java.util.concurrent.ExecutionException; @@ -53,7 +54,7 @@ public class StructureScript { public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry, LootRegistry lootRegistry, FunctionRegistry functionRegistry) throws ParseException { Parser parser; try { - parser = new Parser(IOUtils.toString(inputStream)); + parser = new Parser(IOUtils.toString(inputStream, Charset.defaultCharset())); } catch(IOException e) { throw new RuntimeException(e); } @@ -105,6 +106,7 @@ public class StructureScript { * @param rotation Rotation of structure * @return Whether generation was successful */ + @SuppressWarnings("try") public boolean execute(Location location, Random random, Rotation rotation) { try(ProfileFrame ignore = main.getProfiler().profile("terrascript:" + id)) { StructureBuffer buffer = new StructureBuffer(location); @@ -114,6 +116,7 @@ public class StructureScript { } } + @SuppressWarnings("try") public boolean execute(Location location, Chunk chunk, Random random, Rotation rotation) { try(ProfileFrame ignore = main.getProfiler().profile("terrascript_chunk:" + id)) { StructureBuffer buffer = computeBuffer(location, random, rotation); @@ -122,6 +125,7 @@ public class StructureScript { } } + @SuppressWarnings("try") public boolean test(Location location, Random random, Rotation rotation) { try(ProfileFrame ignore = main.getProfiler().profile("terrascript_test:" + id)) { StructureBuffer buffer = computeBuffer(location, random, rotation); @@ -141,12 +145,14 @@ public class StructureScript { } } + @SuppressWarnings("try") public boolean executeInBuffer(Buffer buffer, Random random, Rotation rotation, int recursions) { try(ProfileFrame ignore = main.getProfiler().profile("terrascript_recursive:" + id)) { return applyBlock(new TerraImplementationArguments(buffer, rotation, random, recursions)); } } + @SuppressWarnings("try") public boolean executeDirect(Location location, Random random, Rotation rotation) { try(ProfileFrame ignore = main.getProfiler().profile("terrascript_direct:" + id)) { DirectBuffer buffer = new DirectBuffer(location); diff --git a/common/src/main/java/com/dfsek/terra/api/transform/Transformer.java b/common/src/main/java/com/dfsek/terra/api/transform/Transformer.java index 30ce77b6f..efd801dd8 100644 --- a/common/src/main/java/com/dfsek/terra/api/transform/Transformer.java +++ b/common/src/main/java/com/dfsek/terra/api/transform/Transformer.java @@ -53,6 +53,7 @@ public class Transformer { private final LinkedHashMap, List>> transforms = new LinkedHashMap<>(); @SafeVarargs + @SuppressWarnings("varargs") public final Builder addTransform(Transform transform, Validator... validators) { transforms.put(transform, Arrays.asList(validators)); return this; diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index 1b18d2a3c..fd1ff30c1 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -13,6 +13,7 @@ import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.Test; import java.io.IOException; +import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,7 +21,7 @@ import java.util.Map; public class ParserTest { @Test public void parse() throws IOException, ParseException { - Parser parser = new Parser(IOUtils.toString(getClass().getResourceAsStream("/test.tesf"))); + Parser parser = new Parser(IOUtils.toString(getClass().getResourceAsStream("/test.tesf"), Charset.defaultCharset())); parser.registerFunction("test", new FunctionBuilder() { @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java index e7d67d224..583aa0fb9 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java @@ -66,6 +66,7 @@ public class PopulationManager extends BlockPopulator { } @Override + @SuppressWarnings("try") public void populate(org.bukkit.@NotNull World world, @NotNull Random random, org.bukkit.@NotNull Chunk source) { try(ProfileFrame ignore = main.getProfiler().profile("popman")) { Chunk chunk = BukkitAdapter.adapt(source); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitTree.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitTree.java index 5464963b8..41445619f 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitTree.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitTree.java @@ -42,6 +42,7 @@ public class BukkitTree implements Tree { } @Override + @SuppressWarnings("try") public boolean plant(Location l, Random r) { try(ProfileFrame ignore = main.getProfiler().profile("bukkit_tree:" + delegate.toString().toLowerCase(Locale.ROOT))) { return ((BukkitWorld) l.getWorld()).getHandle().generateTree(BukkitAdapter.adapt(l), delegate); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java index fe19fac78..05625cc1a 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.platform.block.state.SerialState; import com.dfsek.terra.api.platform.block.state.Sign; import org.jetbrains.annotations.NotNull; +@SuppressWarnings("deprecation") public class BukkitSign extends BukkitBlockState implements Sign { protected BukkitSign(org.bukkit.block.Sign block) { super(block); From 8737b0d984611bb38676ddec61b932a4d7e00bba Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 25 Apr 2021 17:12:42 -0700 Subject: [PATCH 17/98] resolve merge conflict --- common/src/test/java/biome/DistributionTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/common/src/test/java/biome/DistributionTest.java b/common/src/test/java/biome/DistributionTest.java index 711aba9c7..227afe1df 100644 --- a/common/src/test/java/biome/DistributionTest.java +++ b/common/src/test/java/biome/DistributionTest.java @@ -40,6 +40,7 @@ import com.dfsek.terra.config.loaders.config.sampler.NoiseSamplerBuilderLoader; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.AbstractableTemplate; import com.dfsek.terra.config.templates.BiomeTemplate; +import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.registry.config.BiomeRegistry; import com.dfsek.terra.registry.config.NoiseRegistry; import com.dfsek.terra.world.TerraWorld; @@ -137,6 +138,11 @@ public class DistributionTest { return null; } + @Override + public Profiler getProfiler() { + return null; + } + @Override public void register(TypeRegistry registry) { From 632f898dc829c52a8219a2a826828b5c8d887668 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 26 Apr 2021 19:01:53 -0700 Subject: [PATCH 18/98] implement Profiler#reset --- common/src/main/java/com/dfsek/terra/profiler/Profiler.java | 4 +--- .../src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java | 5 +++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/profiler/Profiler.java b/common/src/main/java/com/dfsek/terra/profiler/Profiler.java index 226b8860e..090839d28 100644 --- a/common/src/main/java/com/dfsek/terra/profiler/Profiler.java +++ b/common/src/main/java/com/dfsek/terra/profiler/Profiler.java @@ -18,7 +18,5 @@ public interface Profiler { return new ProfileFrame(() -> pop(frame)); } - default void reset() { - // todo: impl - } + void reset(); } diff --git a/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java b/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java index 0ffd824e1..f91deecd1 100644 --- a/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java +++ b/common/src/main/java/com/dfsek/terra/profiler/ProfilerImpl.java @@ -83,4 +83,9 @@ public class ProfilerImpl implements Profiler { })); return map; } + + @Override + public void reset() { + accessibleThreadMaps.forEach(Map::clear); + } } From 9323abc7885d81ce02ab7bc86459b35fda1ddffd Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 26 Apr 2021 19:04:20 -0700 Subject: [PATCH 19/98] document Profiler --- .../com/dfsek/terra/profiler/Profiler.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/common/src/main/java/com/dfsek/terra/profiler/Profiler.java b/common/src/main/java/com/dfsek/terra/profiler/Profiler.java index 090839d28..65560ad56 100644 --- a/common/src/main/java/com/dfsek/terra/profiler/Profiler.java +++ b/common/src/main/java/com/dfsek/terra/profiler/Profiler.java @@ -3,20 +3,54 @@ package com.dfsek.terra.profiler; import java.util.Map; public interface Profiler { + /** + * Push a frame to this profiler. + * + * @param frame ID of frame. + */ void push(String frame); + /** + * Pop a frame from this profiler. + * + * @param frame ID of frame. Must match ID + * at the top of the profiler stack. + */ void pop(String frame); + /** + * Start profiling. + */ void start(); + /** + * Stop profiling. + */ void stop(); + /** + * Get the profiler data. + * + * @return Profiler data. + */ Map getTimings(); + /** + * Return a {@link AutoCloseable} implementation that + * may be used in a try-with-resources statement for + * more intuitive profiling, with auto-push/pop. + * + * @param frame ID of frame. + * @return {@link AutoCloseable} implementation for use + * in try-with-resources. + */ default ProfileFrame profile(String frame) { push(frame); return new ProfileFrame(() -> pop(frame)); } + /** + * Clear the profiler data. + */ void reset(); } From a0c5631ebaf40d37b96ecd3ba8d154f6db7adfde Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 26 Apr 2021 20:46:36 -0700 Subject: [PATCH 20/98] bump version --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 8d567f9d9..ca6752c10 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ import com.dfsek.terra.getGitHash -val versionObj = Version("5", "1", "3", true) +val versionObj = Version("5", "2", "0", true) allprojects { version = versionObj From 205499220dbb48f83b64cc83b6086d723219e787 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 26 Apr 2021 20:59:21 -0700 Subject: [PATCH 21/98] profile more things --- .../generators/DefaultChunkGenerator3D.java | 22 ++++++++++--------- .../dfsek/terra/fabric/TerraFabricPlugin.java | 4 +--- .../dfsek/terra/fabric/world/FabricTree.java | 6 +++-- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java index 42ba25006..76501b1a9 100644 --- a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java +++ b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java @@ -50,7 +50,6 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator { private final Carver carver; - public DefaultChunkGenerator3D(ConfigPack c, TerraPlugin main) { this.configPack = c; this.main = main; @@ -227,17 +226,20 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator { return false; } + @SuppressWarnings({"try"}) static void biomes(@NotNull World world, int chunkX, int chunkZ, @NotNull BiomeGrid biome, TerraPlugin main) { - int xOrig = (chunkX << 4); - int zOrig = (chunkZ << 4); - BiomeProvider grid = main.getWorld(world).getBiomeProvider(); - for(int x = 0; x < 4; x++) { - for(int z = 0; z < 4; z++) { - int cx = xOrig + (x << 2); - int cz = zOrig + (z << 2); - TerraBiome b = grid.getBiome(cx, cz); + try(ProfileFrame ignore = main.getProfiler().profile("biomes")) { + int xOrig = (chunkX << 4); + int zOrig = (chunkZ << 4); + BiomeProvider grid = main.getWorld(world).getBiomeProvider(); + for(int x = 0; x < 4; x++) { + for(int z = 0; z < 4; z++) { + int cx = xOrig + (x << 2); + int cz = zOrig + (z << 2); + TerraBiome b = grid.getBiome(cx, cz); - biome.setBiome(cx, cz, b.getVanillaBiomes().get(b.getGenerator(world).getBiomeNoise(), cx, 0, cz)); + biome.setBiome(cx, cz, b.getVanillaBiomes().get(b.getGenerator(world).getBiomeNoise(), cx, 0, cz)); + } } } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index adec7ee11..fe81d65b6 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -69,7 +69,6 @@ import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeEffects; import net.minecraft.world.biome.GenerationSettings; -import net.minecraft.world.biome.SpawnSettings; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; @@ -77,7 +76,6 @@ import net.minecraft.world.gen.decorator.Decorator; import net.minecraft.world.gen.decorator.NopeDecoratorConfig; import net.minecraft.world.gen.feature.ConfiguredFeature; import net.minecraft.world.gen.feature.ConfiguredFeatures; -import net.minecraft.world.gen.feature.DefaultBiomeFeatures; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import net.minecraft.world.gen.feature.FeatureConfig; import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; @@ -445,7 +443,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private void injectTree(CheckedRegistry registry, String id, ConfiguredFeature tree) { try { - registry.add(id, new FabricTree(tree)); + registry.add(id, new FabricTree(tree, id)); } catch(DuplicateEntryException ignore) { } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java index c8415ad1b..83c5a6e18 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java @@ -17,14 +17,16 @@ import java.util.Random; public class FabricTree implements Tree { private final ConfiguredFeature delegate; + private final String id; - public FabricTree(ConfiguredFeature delegate) { + public FabricTree(ConfiguredFeature delegate, String id) { this.delegate = delegate; + this.id = id; } @Override public boolean plant(Location l, Random r) { - try(ProfileFrame ignore = TerraFabricPlugin.getInstance().getProfiler().profile("fabric_tree:" + delegate.toString().toLowerCase(Locale.ROOT))) { + try(ProfileFrame ignore = TerraFabricPlugin.getInstance().getProfiler().profile("fabric_tree:" + id.toLowerCase(Locale.ROOT))) { FabricWorldAccess fabricWorldAccess = ((FabricWorldAccess) l.getWorld()); ChunkGenerator generatorWrapper = ((FabricChunkGenerator) fabricWorldAccess.getGenerator()).getHandle(); return delegate.generate((StructureWorldAccess) fabricWorldAccess.getHandle(), generatorWrapper, r, new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ())); From 6f1b1611ab5a18696629a9794156f272fa86f222 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 26 Apr 2021 21:26:44 -0700 Subject: [PATCH 22/98] fix dumb gradle issue --- platforms/bukkit/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index 6e8f30a0e..1a4d3cce6 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -70,8 +70,8 @@ fun installServer(dir: String) { // Cloning test setup. gitClone("https://github.com/PolyhedralDev/WorldGenTestServer") // Copying plugins - Files.move(Paths.get("WorldGenTestServer/plugins"), - Paths.get("$testDir/$dir/plugins"), + Files.move(file("WorldGenTestServer/plugins").toPath(), + file("$testDir/$dir/plugins").toPath(), StandardCopyOption.REPLACE_EXISTING) // Copying config val serverText = URL("https://raw.githubusercontent.com/PolyhedralDev/WorldGenTestServer/master/server.properties").readText() From 4c1e1bb7d5553d3032786d778f588b9c49adb1fd Mon Sep 17 00:00:00 2001 From: solonovamax Date: Wed, 28 Apr 2021 20:41:57 -0400 Subject: [PATCH 23/98] Improve gradle performance significantly Signed-off-by: solonovamax --- build.gradle.kts | 17 ++++++++++++ .../kotlin/com/dfsek/terra/CommonConfig.kt | 11 -------- .../com/dfsek/terra/CompilationConfig.kt | 20 +++++++++++--- .../com/dfsek/terra/DependencyConfig.kt | 16 ++++++++++-- .../com/dfsek/terra/DistributionConfig.kt | 26 ------------------- common/build.gradle.kts | 6 ++++- gradle.properties | 10 +++++++ settings.gradle.kts | 2 +- 8 files changed, 64 insertions(+), 44 deletions(-) create mode 100644 gradle.properties diff --git a/build.gradle.kts b/build.gradle.kts index ca6752c10..c9cdc4361 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,6 +5,23 @@ val versionObj = Version("5", "2", "0", true) allprojects { version = versionObj group = "com.dfsek.terra" + + tasks.withType().configureEach { + options.isFork = true + options.isIncremental = true + } + tasks.withType().configureEach { + useJUnitPlatform() + + maxHeapSize = "2G" + ignoreFailures = false + failFast = true + maxParallelForks = (Runtime.getRuntime().availableProcessors()).takeIf { it > 0 } ?: 1 + + reports.html.isEnabled = false + reports.junitXml.isEnabled = false + } + } /** * Version class that does version stuff. diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt index c06a71b2d..2a20247ec 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt @@ -16,17 +16,6 @@ fun Project.configureCommon() { configureDistribution() version = rootProject.version - - - - tasks.withType().configureEach { - useJUnitPlatform() - - maxHeapSize = "2G" - ignoreFailures = false - failFast = true - maxParallelForks = 12 - } } fun Project.getGitHash(): String { diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt index a6619cc1f..d94c7380f 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt @@ -3,11 +3,10 @@ package com.dfsek.terra import org.gradle.api.JavaVersion import org.gradle.api.Project import org.gradle.api.plugins.JavaPluginConvention +import org.gradle.api.tasks.bundling.Jar import org.gradle.api.tasks.compile.JavaCompile import org.gradle.api.tasks.javadoc.Javadoc -import org.gradle.kotlin.dsl.configure -import org.gradle.kotlin.dsl.filter -import org.gradle.kotlin.dsl.withType +import org.gradle.kotlin.dsl.* import org.gradle.language.jvm.tasks.ProcessResources fun Project.configureCompilation() { @@ -35,4 +34,19 @@ fun Project.configureCompilation() { tasks.withType { options.encoding = "UTF-8" } + + tasks.withType { + archiveBaseName.set("Terra-${archiveBaseName.get()}") + from("../LICENSE", "../../LICENSE") + } + + tasks.register("sourcesJar") { + archiveClassifier.set("sources") + } + + tasks.register("javadocJar") { + dependsOn("javadoc") + archiveClassifier.set("javadoc") + from(tasks.getByName("javadoc").destinationDir) + } } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt index 4bab053e4..748bc6e0a 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt @@ -2,12 +2,24 @@ package com.dfsek.terra import org.gradle.api.Project import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.invoke import org.gradle.kotlin.dsl.repositories fun Project.configureDependencies() { + configurations { + val shaded = create("shaded") + getByName("compile").extendsFrom(shaded) + val shadedApi = create("shadedApi") + shaded.extendsFrom(shadedApi) + getByName("api").extendsFrom(shadedApi) + val shadedImplementation = create("shadedImplementation") + shaded.extendsFrom(shadedImplementation) + getByName("implementation").extendsFrom(shadedImplementation) + } + repositories { - maven { url = uri("http://maven.enginehub.org/repo/") } + maven { url = uri("https://maven.enginehub.org/repo/") } maven { url = uri("https://repo.codemc.org/repository/maven-public") } maven { url = uri("https://papermc.io/repo/repository/maven-public/") } maven { url = uri("https://maven.fabricmc.net/") } @@ -19,6 +31,6 @@ fun Project.configureDependencies() { dependencies { "testImplementation"("org.junit.jupiter:junit-jupiter-api:5.7.0") "testImplementation"("org.junit.jupiter:junit-jupiter-engine:5.7.0") - "compileOnly"("org.jetbrains:annotations:20.1.0") + "api"("org.jetbrains:annotations:20.1.0") } } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt index c874d8820..ee81dc9b8 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt @@ -14,17 +14,6 @@ fun Project.configureDistribution() { apply(plugin = "java-library") apply(plugin = "com.github.johnrengelman.shadow") - configurations { - val shaded = create("shaded") - getByName("compile").extendsFrom(shaded) - val shadedApi = create("shadedApi") - shaded.extendsFrom(shadedApi) - getByName("api").extendsFrom(shadedApi) - val shadedImplementation = create("shadedImplementation") - shaded.extendsFrom(shadedImplementation) - getByName("implementation").extendsFrom(shadedImplementation) - } - val downloadDefaultPacks = tasks.create("downloadDefaultPacks") { group = "terra" doFirst { @@ -38,21 +27,6 @@ fun Project.configureDistribution() { } tasks["processResources"].dependsOn(downloadDefaultPacks) - tasks.withType { - archiveBaseName.set("Terra-${archiveBaseName.get()}") - from("../LICENSE", "../../LICENSE") - } - - tasks.register("sourcesJar") { - archiveClassifier.set("sources") - } - - tasks.register("javadocJar") { - dependsOn("javadoc") - archiveClassifier.set("javadoc") - from(tasks.getByName("javadoc").destinationDir) - } - tasks.named("shadowJar") { // Tell shadow to download the packs dependsOn(downloadDefaultPacks) diff --git a/common/build.gradle.kts b/common/build.gradle.kts index ec58b60e9..a1a6fcd8b 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -1,11 +1,15 @@ import com.dfsek.terra.configureCommon +import com.dfsek.terra.configureCompilation +import com.dfsek.terra.configureDependencies plugins { `java-library` `maven-publish` + idea } -configureCommon() +configureCompilation() +configureDependencies() group = "com.dfsek.terra.common" diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 000000000..1fca82ba1 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,10 @@ +# Magic options for more perf +org.gradle.jvmargs=-Xmx2048M -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC +org.gradle.vfs.watch=true +kapt.use.worker.api=true +kapt.include.compile.classpath=false +org.gradle.parallel=true +org.gradle.caching=true +org.gradle.warning.mode=all +#org.gradle.logging.level=info +org.gradle.configureondemand=true diff --git a/settings.gradle.kts b/settings.gradle.kts index 303d70045..c5e7a4a77 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -16,7 +16,7 @@ include("platforms:sponge") pluginManagement { repositories { - maven(url = "http://maven.fabricmc.net") { + maven(url = "https://maven.fabricmc.net") { name = "Fabric" } gradlePluginPortal() From 59b655ce5db450bd461c72c2d1212410abaa7099 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 29 Apr 2021 01:27:28 -0700 Subject: [PATCH 24/98] working forge buildscript --- gradle/wrapper/gradle-wrapper.properties | 2 +- platforms/forge/build.gradle.kts | 60 ++++++++++++++++++++++++ settings.gradle.kts | 1 + 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 platforms/forge/build.gradle.kts diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index aec6aa17c..a29c5e5c5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists org.gradle.jvmargs=-Xmx4096m \ No newline at end of file diff --git a/platforms/forge/build.gradle.kts b/platforms/forge/build.gradle.kts new file mode 100644 index 000000000..b70ffb094 --- /dev/null +++ b/platforms/forge/build.gradle.kts @@ -0,0 +1,60 @@ +import com.dfsek.terra.configureCommon +import net.minecraftforge.gradle.userdev.UserDevExtension +import net.minecraftforge.gradle.common.util.RunConfig + +buildscript { + repositories { + maven { url = uri("https://files.minecraftforge.net/maven") } + jcenter() + mavenCentral() + maven { url = uri("https://repo.spongepowered.org/repository/maven-public/") } + } + dependencies { + classpath(group = "net.minecraftforge.gradle", name = "ForgeGradle", version = "4.1.+") + classpath("org.spongepowered:mixingradle:0.7-SNAPSHOT") + } +} +apply(plugin = "net.minecraftforge.gradle") + +plugins { + java +} + +configureCommon() + +group = "com.dfsek.terra.forge" + +repositories { + maven { url = uri("https://files.minecraftforge.net/maven") } + jcenter() + mavenCentral() + maven { url = uri("https://repo.spongepowered.org/repository/maven-public/") } +} + +val forgeVersion = "36.1.13" +val mcVersion = "1.16.5" +dependencies { + "shadedApi"(project(":common")) + "minecraft"("net.minecraftforge:forge:$mcVersion-$forgeVersion") +} + + + +configure { + mappings(mapOf( + "channel" to "official", + "version" to mcVersion + )) + runs { + val runConfig = Action { + properties(mapOf( + "forge.logging.markers" to "SCAN,REGISTRIES,REGISTRYDUMP", + "forge.logging.console.level" to "debug" + )) + workingDirectory = project.file("run").canonicalPath + source(sourceSets["main"]) + } + create("client", runConfig) + create("server", runConfig) + } +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 303d70045..43854b601 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -13,6 +13,7 @@ include("platforms:bukkit") include("platforms:fabric") include("platforms:region") include("platforms:sponge") +include("platforms:forge") pluginManagement { repositories { From 54bb4ef109e0fb35d470e094003a7c5ae362e261 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 29 Apr 2021 01:55:24 -0700 Subject: [PATCH 25/98] sort of working Forge project --- platforms/forge/build.gradle.kts | 37 ++++++++++++++++++- .../dfsek/terra/forge/TerraForgePlugin.java | 7 ++++ .../src/test/resources/META-INF/mods.toml | 20 ++++++++++ .../forge/src/test/resources/pack.mcmeta | 6 +++ 4 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java create mode 100644 platforms/forge/src/test/resources/META-INF/mods.toml create mode 100644 platforms/forge/src/test/resources/pack.mcmeta diff --git a/platforms/forge/build.gradle.kts b/platforms/forge/build.gradle.kts index b70ffb094..039f820c9 100644 --- a/platforms/forge/build.gradle.kts +++ b/platforms/forge/build.gradle.kts @@ -1,6 +1,9 @@ import com.dfsek.terra.configureCommon -import net.minecraftforge.gradle.userdev.UserDevExtension +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import net.minecraftforge.gradle.common.util.RunConfig +import net.minecraftforge.gradle.mcp.task.GenerateSRG +import net.minecraftforge.gradle.userdev.UserDevExtension +import net.minecraftforge.gradle.userdev.tasks.RenameJarInPlace buildscript { repositories { @@ -38,7 +41,12 @@ dependencies { "minecraft"("net.minecraftforge:forge:$mcVersion-$forgeVersion") } - +afterEvaluate { + val reobf = extensions.getByName>("reobf") + reobf.maybeCreate("shadowJar").run { + mappings = tasks.getByName("createMcpToSrg").output + } +} configure { mappings(mapOf( @@ -57,4 +65,29 @@ configure { create("client", runConfig) create("server", runConfig) } +} + +tasks.register("deobfJar") { + from(sourceSets["main"].output) + archiveClassifier.set("dev") +} + +val deobfElements = configurations.register("deobfElements") { + isVisible = false + description = "De-obfuscated elements for libs" + isCanBeResolved = false + isCanBeConsumed = true + attributes { + attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage.JAVA_API)) + attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.LIBRARY)) + attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling.EXTERNAL)) + attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, project.objects.named(LibraryElements.JAR)) + attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 8) + } + outgoing.artifact(tasks.named("deobfJar")) +} + +val javaComponent = components["java"] as AdhocComponentWithVariants +javaComponent.addVariantsFromConfiguration(deobfElements.get()) { + mapToMavenScope("runtime") } \ No newline at end of file diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java new file mode 100644 index 000000000..126b9ef49 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java @@ -0,0 +1,7 @@ +package com.dfsek.terra.forge; +import net.minecraftforge.fml.common.Mod; + +@Mod("Terra") +public class TerraForgePlugin { + +} diff --git a/platforms/forge/src/test/resources/META-INF/mods.toml b/platforms/forge/src/test/resources/META-INF/mods.toml new file mode 100644 index 000000000..bb8120be8 --- /dev/null +++ b/platforms/forge/src/test/resources/META-INF/mods.toml @@ -0,0 +1,20 @@ +modLoader = "javafml" +loaderVersion = "[33,)" +license = "GNU General Public License, version 3.0" +issueTrackerURL = "https://github.com/PolyhedralDev/Terra/issues" +[[mods]] +modId = "terra" +version = "@VERSION@" +displayName = "Terra" +displayURL = "https://github.com/PolyhedralDev/Terra" +logoFile = "logo_text.png" +authors = "dfsek & Terra contributors" +description = ''' +Powerful data-driven world generator +''' +[[dependencies.terra]] +modId = "forge" +mandatory = true +versionRange = "[36.0.4,)" +ordering = "NONE" +side = "BOTH" \ No newline at end of file diff --git a/platforms/forge/src/test/resources/pack.mcmeta b/platforms/forge/src/test/resources/pack.mcmeta new file mode 100644 index 000000000..5ed246b25 --- /dev/null +++ b/platforms/forge/src/test/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "Terra resources", + "pack_format": 6 + } +} \ No newline at end of file From ce8ec51ae42b40090e0804127f9742862b74d29f Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 29 Apr 2021 12:24:29 -0700 Subject: [PATCH 26/98] forge actually loads now --- platforms/forge/build.gradle.kts | 2 ++ .../dfsek/terra/forge/TerraForgePlugin.java | 32 ++++++++++++++++++- .../src/main/resources/META-INF/mods.toml | 17 ++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 platforms/forge/src/main/resources/META-INF/mods.toml diff --git a/platforms/forge/build.gradle.kts b/platforms/forge/build.gradle.kts index 039f820c9..e4f2e255e 100644 --- a/platforms/forge/build.gradle.kts +++ b/platforms/forge/build.gradle.kts @@ -19,6 +19,8 @@ buildscript { } apply(plugin = "net.minecraftforge.gradle") + + plugins { java } diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java index 126b9ef49..f547c4c7e 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java @@ -1,7 +1,37 @@ package com.dfsek.terra.forge; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLFingerprintViolationEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; -@Mod("Terra") +@Mod("terra") public class TerraForgePlugin { + public Logger getLogger() + { + return LogManager.getLogger("terra"); + } + public TerraForgePlugin() { + IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + modEventBus.addListener(this::setup); + + MinecraftForge.EVENT_BUS.register(this); + } + + public void setup(final FMLCommonSetupEvent event) { + } + + @SubscribeEvent + public void onFingerprintViolation(final FMLFingerprintViolationEvent event) + { + getLogger().warn("Invalid fingerprint detected! The file " + event.getSource().getName() + + " may have been tampered with. This version will NOT be supported by the author!"); + getLogger().warn("Expected " + event.getExpectedFingerprint() + " found " + event.getFingerprints().toString()); + } } diff --git a/platforms/forge/src/main/resources/META-INF/mods.toml b/platforms/forge/src/main/resources/META-INF/mods.toml new file mode 100644 index 000000000..15baa899e --- /dev/null +++ b/platforms/forge/src/main/resources/META-INF/mods.toml @@ -0,0 +1,17 @@ +modLoader="javafml" +loaderVersion="[36,)" +license="GNU General Public License, version 3.0" +issueTrackerURL="https://github.com/PolyhedralDev/Terra/issues/" +[[mods]] +modId="terra" +version="@VERSION@" +displayName="Terra" +displayURL="https://github.com/PolyhedralDev/Terra/" +authors="dfsek & Terra contributors" +description="Data-driven world generator" +[[dependencies.terra]] + modId="forge" + mandatory=true + versionRange="[36,)" + ordering="NONE" + side="BOTH" \ No newline at end of file From 3ea12ceeab370e4fb1d97a967dace559eec64582 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 29 Apr 2021 12:30:17 -0700 Subject: [PATCH 27/98] start implementing terraplugin --- .../dfsek/terra/forge/TerraForgePlugin.java | 140 ++++++++++++++++-- 1 file changed, 126 insertions(+), 14 deletions(-) diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java index f547c4c7e..e7047e1aa 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java @@ -1,21 +1,40 @@ package com.dfsek.terra.forge; + +import com.dfsek.tectonic.loading.TypeRegistry; +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.addons.TerraAddon; +import com.dfsek.terra.api.event.EventManager; +import com.dfsek.terra.api.event.TerraEventManager; +import com.dfsek.terra.api.platform.handle.ItemHandle; +import com.dfsek.terra.api.platform.handle.WorldHandle; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.registry.LockedRegistry; +import com.dfsek.terra.api.util.logging.DebugLogger; +import com.dfsek.terra.config.GenericLoaders; +import com.dfsek.terra.config.PluginConfig; +import com.dfsek.terra.config.lang.Language; +import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.profiler.Profiler; +import com.dfsek.terra.profiler.ProfilerImpl; +import com.dfsek.terra.world.TerraWorld; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.event.lifecycle.FMLFingerprintViolationEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.io.File; + @Mod("terra") -public class TerraForgePlugin { - public Logger getLogger() - { - return LogManager.getLogger("terra"); - } +public class TerraForgePlugin implements TerraPlugin { + private final GenericLoaders genericLoaders = new GenericLoaders(this); + private static final Logger LOGGER = LogManager.getLogger(); + + private final EventManager eventManager = new TerraEventManager(this); + private final Profiler profiler = new ProfilerImpl(); public TerraForgePlugin() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); @@ -25,13 +44,106 @@ public class TerraForgePlugin { } public void setup(final FMLCommonSetupEvent event) { + logger().info("Initializing..."); } - @SubscribeEvent - public void onFingerprintViolation(final FMLFingerprintViolationEvent event) - { - getLogger().warn("Invalid fingerprint detected! The file " + event.getSource().getName() - + " may have been tampered with. This version will NOT be supported by the author!"); - getLogger().warn("Expected " + event.getExpectedFingerprint() + " found " + event.getFingerprints().toString()); + @Override + public void register(TypeRegistry registry) { + genericLoaders.register(registry); + } + + @Override + public WorldHandle getWorldHandle() { + return null; + } + + @Override + public TerraWorld getWorld(World world) { + return null; + } + + @Override + public com.dfsek.terra.api.util.logging.Logger logger() { + return new com.dfsek.terra.api.util.logging.Logger() { + @Override + public void info(String message) { + LOGGER.info(message); + } + + @Override + public void warning(String message) { + LOGGER.warn(message); + } + + @Override + public void severe(String message) { + LOGGER.error(message); + } + }; + } + + @Override + public PluginConfig getTerraConfig() { + return null; + } + + @Override + public File getDataFolder() { + return null; + } + + @Override + public boolean isDebug() { + return true; + } + + @Override + public Language getLanguage() { + return null; + } + + @Override + public CheckedRegistry getConfigRegistry() { + return null; + } + + @Override + public LockedRegistry getAddons() { + return null; + } + + @Override + public boolean reload() { + return false; + } + + @Override + public ItemHandle getItemHandle() { + return null; + } + + @Override + public void saveDefaultConfig() { + + } + + @Override + public String platformName() { + return null; + } + + @Override + public DebugLogger getDebugLogger() { + return new DebugLogger(logger()); + } + + @Override + public EventManager getEventManager() { + return eventManager; + } + + @Override + public Profiler getProfiler() { + return profiler; } } From 93a2f103f791115844b998085f7b50aab0b44d53 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 29 Apr 2021 16:41:14 -0700 Subject: [PATCH 28/98] add pack.mcmeta --- platforms/forge/src/main/resources/pack.mcmeta | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 platforms/forge/src/main/resources/pack.mcmeta diff --git a/platforms/forge/src/main/resources/pack.mcmeta b/platforms/forge/src/main/resources/pack.mcmeta new file mode 100644 index 000000000..e33bc0eb4 --- /dev/null +++ b/platforms/forge/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "Terra Resources", + "pack_format": 6 + } +} \ No newline at end of file From 9f3dcf07b65ebd1e103f8b5848179b51e46fba5e Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 29 Apr 2021 20:30:48 -0700 Subject: [PATCH 29/98] Pack loading on Forge --- .../dfsek/terra/forge/TerraForgePlugin.java | 376 ++++++++++++++++-- .../com/dfsek/terra/forge/TerraLevelType.java | 23 ++ .../forge/inventory/ForgeEnchantment.java | 41 ++ .../terra/forge/inventory/ForgeInventory.java | 36 ++ .../terra/forge/inventory/ForgeItem.java | 27 ++ .../forge/inventory/ForgeItemHandle.java | 36 ++ .../terra/forge/inventory/ForgeItemStack.java | 46 +++ .../forge/inventory/meta/ForgeDamageable.java | 25 ++ .../forge/inventory/meta/ForgeItemMeta.java | 43 ++ .../dfsek/terra/forge/world/ForgeAdapter.java | 128 ++++++ .../dfsek/terra/forge/world/ForgeBiome.java | 17 + .../dfsek/terra/forge/world/ForgeTree.java | 44 ++ .../terra/forge/world/ForgeWorldHandle.java | 35 ++ .../terra/forge/world/TerraBiomeSource.java | 57 +++ .../terra/forge/world/block/ForgeBlock.java | 96 +++++ .../forge/world/block/ForgeBlockData.java | 64 +++ .../forge/world/block/ForgeBlockType.java | 46 +++ .../block/data/ForgeAnaloguePowerable.java | 29 ++ .../world/block/data/ForgeDirectional.java | 42 ++ .../world/block/data/ForgeEnumAdapter.java | 159 ++++++++ .../world/block/data/ForgeMultipleFacing.java | 70 ++++ .../world/block/data/ForgeOrientable.java | 37 ++ .../world/block/data/ForgeRotatable.java | 111 ++++++ .../forge/world/block/data/ForgeSlab.java | 21 + .../forge/world/block/data/ForgeStairs.java | 42 ++ .../world/block/data/ForgeWaterlogged.java | 22 + .../world/block/state/ForgeBlockState.java | 73 ++++ .../world/block/state/ForgeContainer.java | 18 + .../world/block/state/ForgeMobSpawner.java | 133 +++++++ .../forge/world/block/state/ForgeSign.java | 44 ++ .../world/entity/ForgeCommandSender.java | 23 ++ .../terra/forge/world/entity/ForgeEntity.java | 43 ++ .../forge/world/entity/ForgeEntityType.java | 16 + .../terra/forge/world/entity/ForgePlayer.java | 42 ++ .../world/features/PopulatorFeature.java | 34 ++ .../forge/world/generator/ForgeChunkData.java | 37 ++ .../world/generator/ForgeChunkGenerator.java | 16 + .../generator/ForgeChunkGeneratorWrapper.java | 141 +++++++ .../terra/forge/world/handles/ForgeWorld.java | 127 ++++++ .../forge/world/handles/chunk/ForgeChunk.java | 52 +++ .../handles/chunk/ForgeChunkWorldAccess.java | 60 +++ .../handles/world/ForgeSeededWorldAccess.java | 133 +++++++ .../world/handles/world/ForgeWorldAccess.java | 108 +++++ .../world/handles/world/ForgeWorldHandle.java | 7 + 44 files changed, 2744 insertions(+), 36 deletions(-) create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/TerraLevelType.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeEnchantment.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeInventory.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeItem.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeItemHandle.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeItemStack.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/meta/ForgeDamageable.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/meta/ForgeItemMeta.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeAdapter.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeBiome.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeTree.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeWorldHandle.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/TerraBiomeSource.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlock.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlockData.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlockType.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeAnaloguePowerable.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeDirectional.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeEnumAdapter.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeMultipleFacing.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeOrientable.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeRotatable.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeSlab.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeStairs.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeWaterlogged.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeBlockState.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeContainer.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeMobSpawner.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeSign.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/entity/ForgeCommandSender.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/entity/ForgeEntity.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/entity/ForgeEntityType.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/entity/ForgePlayer.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/features/PopulatorFeature.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/generator/ForgeChunkData.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/generator/ForgeChunkGenerator.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/generator/ForgeChunkGeneratorWrapper.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/ForgeWorld.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/chunk/ForgeChunk.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/chunk/ForgeChunkWorldAccess.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeSeededWorldAccess.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeWorldAccess.java create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeWorldHandle.java diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java index e7047e1aa..9a5c7c0dd 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java @@ -3,93 +3,243 @@ package com.dfsek.terra.forge; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.addons.TerraAddon; +import com.dfsek.terra.api.addons.annotations.Addon; +import com.dfsek.terra.api.addons.annotations.Author; +import com.dfsek.terra.api.addons.annotations.Version; +import com.dfsek.terra.api.command.CommandManager; +import com.dfsek.terra.api.command.TerraCommandManager; +import com.dfsek.terra.api.command.exception.MalformedCommandException; +import com.dfsek.terra.api.event.EventListener; import com.dfsek.terra.api.event.EventManager; import com.dfsek.terra.api.event.TerraEventManager; +import com.dfsek.terra.api.event.annotations.Global; +import com.dfsek.terra.api.event.annotations.Priority; +import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.handle.WorldHandle; +import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.LockedRegistry; +import com.dfsek.terra.api.transform.NotNullValidator; +import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.api.util.logging.DebugLogger; +import com.dfsek.terra.commands.CommandUtil; import com.dfsek.terra.config.GenericLoaders; import com.dfsek.terra.config.PluginConfig; +import com.dfsek.terra.config.builder.BiomeBuilder; +import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.config.templates.BiomeTemplate; +import com.dfsek.terra.forge.inventory.ForgeItemHandle; +import com.dfsek.terra.forge.world.ForgeBiome; +import com.dfsek.terra.forge.world.ForgeTree; +import com.dfsek.terra.forge.world.ForgeWorldHandle; +import com.dfsek.terra.forge.world.TerraBiomeSource; +import com.dfsek.terra.forge.world.features.PopulatorFeature; +import com.dfsek.terra.forge.world.generator.ForgeChunkGenerator; +import com.dfsek.terra.forge.world.generator.ForgeChunkGeneratorWrapper; import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.profiler.ProfilerImpl; +import com.dfsek.terra.registry.exception.DuplicateEntryException; +import com.dfsek.terra.registry.master.AddonRegistry; +import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.world.TerraWorld; +import net.minecraft.block.Blocks; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.button.Button; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.BiomeGenerationSettings; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.Features; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.placement.DecoratedPlacement; +import net.minecraft.world.gen.placement.NoPlacementConfig; +import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder; +import net.minecraft.world.gen.surfacebuilders.SurfaceBuilderConfig; +import net.minecraftforge.client.ForgeWorldTypeScreens; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.world.ForgeWorldType; +import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.ForgeRegistries; +import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; @Mod("terra") +@Mod.EventBusSubscriber(modid = "terra", bus = Mod.EventBusSubscriber.Bus.MOD) public class TerraForgePlugin implements TerraPlugin { - private final GenericLoaders genericLoaders = new GenericLoaders(this); - private static final Logger LOGGER = LogManager.getLogger(); + public static final PopulatorFeature POPULATOR_FEATURE = new PopulatorFeature(NoFeatureConfig.CODEC); + public static final ConfiguredFeature POPULATOR_CONFIGURED_FEATURE = POPULATOR_FEATURE.configured(IFeatureConfig.NONE).decorated(DecoratedPlacement.NOPE.configured(NoPlacementConfig.INSTANCE)); + private static TerraForgePlugin INSTANCE; + private final Map worldMap = new HashMap<>(); private final EventManager eventManager = new TerraEventManager(this); + private final GenericLoaders genericLoaders = new GenericLoaders(this); private final Profiler profiler = new ProfilerImpl(); + private final com.dfsek.terra.api.util.logging.Logger logger = new com.dfsek.terra.api.util.logging.Logger() { + private final org.apache.logging.log4j.Logger logger = LogManager.getLogger(); + + @Override + public void info(String message) { + logger.info(message); + } + + @Override + public void warning(String message) { + logger.warn(message); + } + + @Override + public void severe(String message) { + logger.error(message); + } + }; + private final DebugLogger debugLogger = new DebugLogger(logger); + private final ItemHandle itemHandle = new ForgeItemHandle(); + private final WorldHandle worldHandle = new ForgeWorldHandle(); + private final ConfigRegistry registry = new ConfigRegistry(); + private final CheckedRegistry checkedRegistry = new CheckedRegistry<>(registry); + private final AddonRegistry addonRegistry = new AddonRegistry(new FabricAddon(this), this); + private final LockedRegistry addonLockedRegistry = new LockedRegistry<>(addonRegistry); + private final PluginConfig config = new PluginConfig(); + private final Transformer biomeFixer = new Transformer.Builder() + .addTransform(id -> ForgeRegistries.BIOMES.getValue(ResourceLocation.tryParse(id)), new NotNullValidator<>()) + .addTransform(id -> ForgeRegistries.BIOMES.getValue(ResourceLocation.tryParse("minecraft:" + id.toLowerCase())), new NotNullValidator<>()).build(); + private File dataFolder; public TerraForgePlugin() { + if(INSTANCE != null) throw new IllegalStateException("Only one TerraPlugin instance may exist."); + INSTANCE = this; IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); modEventBus.addListener(this::setup); MinecraftForge.EVENT_BUS.register(this); } - public void setup(final FMLCommonSetupEvent event) { - logger().info("Initializing..."); + public static TerraForgePlugin getInstance() { + return INSTANCE; } - @Override - public void register(TypeRegistry registry) { - genericLoaders.register(registry); + public static String createBiomeID(ConfigPack pack, String biomeID) { + return pack.getTemplate().getID().toLowerCase() + "/" + biomeID.toLowerCase(Locale.ROOT); + } + + + @SubscribeEvent + public static void register(RegistryEvent.Register event) { + INSTANCE.registry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> event.getRegistry().register(createBiome(biome)))); // Register all Terra biomes. + } + + public void setup(final FMLCommonSetupEvent event) { + this.dataFolder = Paths.get("config", "Terra").toFile(); + saveDefaultConfig(); + config.load(this); + LangUtil.load(config.getLanguage(), this); + logger.info("Initializing Terra..."); + + if(!addonRegistry.loadAll()) { + throw new IllegalStateException("Failed to load addons. Please correct addon installations to continue."); + } + logger.info("Loaded addons."); + + registry.loadAll(this); + + logger.info("Loaded packs."); + + Registry.register(Registry.CHUNK_GENERATOR, new ResourceLocation("terra:terra"), ForgeChunkGeneratorWrapper.CODEC); + Registry.register(Registry.BIOME_SOURCE, new ResourceLocation("terra:terra"), TerraBiomeSource.CODEC); + + registry.forEach(configPack -> { + ForgeWorldType world = new ForgeWorldType(new TerraLevelType(configPack)).setRegistryName("terra", configPack.getTemplate().getID().toLowerCase(Locale.ROOT)); + ForgeWorldTypeScreens.registerFactory(world, (returnTo, dimensionGeneratorSettings) -> new Screen(world.getDisplayName()) { + @Override + protected void init() { + addButton(new Button(0, 0, 120, 20, new StringTextComponent("close"), btn -> Minecraft.getInstance().setScreen(returnTo))); + } + }); + }); + + CommandManager manager = new TerraCommandManager(this); + try { + CommandUtil.registerAll(manager); + } catch(MalformedCommandException e) { + e.printStackTrace(); // TODO do something here even though this should literally never happen + } + + + /* + CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> { + int max = manager.getMaxArgumentDepth(); + RequiredArgumentBuilder arg = argument("arg" + (max - 1), StringArgumentType.word()); + for(int i = 0; i < max; i++) { + RequiredArgumentBuilder next = argument("arg" + (max - i - 1), StringArgumentType.word()); + + arg = next.then(assemble(arg, manager)); + } + + dispatcher.register(literal("terra").executes(context -> 1).then(assemble(arg, manager))); + dispatcher.register(literal("te").executes(context -> 1).then(assemble(arg, manager))); + //dispatcher.register(literal("te").redirect(root)); + } + ); + + */ } @Override public WorldHandle getWorldHandle() { - return null; + return worldHandle; } @Override public TerraWorld getWorld(World world) { - return null; + return worldMap.computeIfAbsent(world.getSeed(), w -> { + logger.info("Loading world " + w); + return new TerraWorld(world, ((ForgeChunkGeneratorWrapper) ((ForgeChunkGenerator) world.getGenerator()).getHandle()).getPack(), this); + }); + } + + public TerraWorld getWorld(long seed) { + TerraWorld world = worldMap.get(seed); + if(world == null) throw new IllegalArgumentException("No world exists with seed " + seed); + return world; } @Override public com.dfsek.terra.api.util.logging.Logger logger() { - return new com.dfsek.terra.api.util.logging.Logger() { - @Override - public void info(String message) { - LOGGER.info(message); - } - - @Override - public void warning(String message) { - LOGGER.warn(message); - } - - @Override - public void severe(String message) { - LOGGER.error(message); - } - }; + return logger; } @Override public PluginConfig getTerraConfig() { - return null; + return config; } @Override public File getDataFolder() { - return null; + return dataFolder; } @Override @@ -99,44 +249,148 @@ public class TerraForgePlugin implements TerraPlugin { @Override public Language getLanguage() { - return null; + return LangUtil.getLanguage(); } @Override public CheckedRegistry getConfigRegistry() { - return null; + return checkedRegistry; } @Override public LockedRegistry getAddons() { - return null; + return addonLockedRegistry; } @Override public boolean reload() { - return false; + config.load(this); + LangUtil.load(config.getLanguage(), this); // Load language. + boolean succeed = registry.loadAll(this); + Map newMap = new HashMap<>(); + worldMap.forEach((seed, tw) -> { + tw.getConfig().getSamplerCache().clear(); + String packID = tw.getConfig().getTemplate().getID(); + newMap.put(seed, new TerraWorld(tw.getWorld(), registry.get(packID), this)); + }); + worldMap.clear(); + worldMap.putAll(newMap); + return succeed; } @Override public ItemHandle getItemHandle() { - return null; + return itemHandle; } @Override public void saveDefaultConfig() { - + try(InputStream stream = getClass().getResourceAsStream("/config.yml")) { + File configFile = new File(getDataFolder(), "config.yml"); + if(!configFile.exists()) FileUtils.copyInputStreamToFile(stream, configFile); + } catch(IOException e) { + e.printStackTrace(); + } } @Override public String platformName() { - return null; + return "Fabric"; } @Override public DebugLogger getDebugLogger() { - return new DebugLogger(logger()); + return debugLogger; } + @Override + public void register(TypeRegistry registry) { + genericLoaders.register(registry); + registry + .registerLoader(BlockData.class, (t, o, l) -> worldHandle.createBlockData((String) o)) + .registerLoader(com.dfsek.terra.api.platform.world.Biome.class, (t, o, l) -> new ForgeBiome(biomeFixer.translate((String) o))); + } + + private static Biome createBiome(BiomeBuilder biome) { + BiomeTemplate template = biome.getTemplate(); + Map colors = template.getColors(); + + Biome vanilla = ((ForgeBiome) new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0)).getHandle(); + + BiomeGenerationSettings.Builder generationSettings = new BiomeGenerationSettings.Builder(); + generationSettings.surfaceBuilder(SurfaceBuilder.DEFAULT.configured(new SurfaceBuilderConfig(Blocks.GRASS_BLOCK.defaultBlockState(), Blocks.DIRT.defaultBlockState(), Blocks.GRAVEL.defaultBlockState()))); // It needs a surfacebuilder, even though we dont use it. + generationSettings.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, POPULATOR_CONFIGURED_FEATURE); + + + /* + BiomeAmbience.Builder effects = new BiomeAmbience.Builder() + .waterColor(colors.getOrDefault("water", vanilla.getSpecialEffects().waterColor)) + .waterFogColor(colors.getOrDefault("water-fog", vanilla.getSpecialEffects().waterFogColor)) + .fogColor(colors.getOrDefault("fog", vanilla.getSpecialEffects().fogColor)) + .skyColor(colors.getOrDefault("sky", vanilla.getSpecialEffects().skyColor)) + .grassColorModifier(vanilla.getSpecialEffects().grassColorModifier); + + if(colors.containsKey("grass")) { + effects.grassColorOverride(colors.get("grass")); + } else { + vanilla.getSpecialEffects().grassColor.ifPresent(effects::grassColor); + } + vanilla.getEffects().foliageColor.ifPresent(effects::foliageColor); + if(colors.containsKey("foliage")) { + effects.foliageColor(colors.get("foliage")); + } else { + vanilla.getEffects().foliageColor.ifPresent(effects::foliageColor); + } + + */ + + return new Biome.Builder() + .precipitation(vanilla.getPrecipitation()) + .biomeCategory(vanilla.getBiomeCategory()) + .depth(vanilla.getDepth()) + .scale(vanilla.getScale()) + .temperature(vanilla.getBaseTemperature()) + .downfall(vanilla.getDownfall()) + //.specialEffects(effects.build()) + .specialEffects(vanilla.getSpecialEffects()) + .mobSpawnSettings(vanilla.getMobSettings()) + .generationSettings(generationSettings.build()) + .build(); + } + + /* + private RequiredArgumentBuilder assemble(RequiredArgumentBuilder in, CommandManager manager) { + return in.suggests((context, builder) -> { + List args = parseCommand(context.getInput()); + CommandSender sender = FabricAdapter.adapt(context.getSource()); + try { + manager.tabComplete(args.remove(0), sender, args).forEach(builder::suggest); + } catch(CommandException e) { + sender.sendMessage(e.getMessage()); + } + return builder.buildFuture(); + }).executes(context -> { + List args = parseCommand(context.getInput()); + try { + manager.execute(args.remove(0), FabricAdapter.adapt(context.getSource()), args); + } catch(CommandException e) { + context.getSource().sendError(new LiteralText(e.getMessage())); + } + return 1; + }); + } + + private List parseCommand(String command) { + if(command.startsWith("/terra ")) command = command.substring("/terra ".length()); + else if(command.startsWith("/te ")) command = command.substring("/te ".length()); + List c = new ArrayList<>(Arrays.asList(command.split(" "))); + if(command.endsWith(" ")) c.add(""); + return c; + } + + */ + + @Override public EventManager getEventManager() { return eventManager; @@ -146,4 +400,54 @@ public class TerraForgePlugin implements TerraPlugin { public Profiler getProfiler() { return profiler; } + + @Addon("Terra-Fabric") + @Author("Terra") + @Version("1.0.0") + private static final class FabricAddon extends TerraAddon implements EventListener { + + private final TerraPlugin main; + + private FabricAddon(TerraPlugin main) { + this.main = main; + } + + @Override + public void initialize() { + main.getEventManager().registerListener(this, this); + } + + @Priority(Priority.LOWEST) + @Global + public void injectTrees(ConfigPackPreLoadEvent event) { + CheckedRegistry treeRegistry = event.getPack().getTreeRegistry(); + injectTree(treeRegistry, "BROWN_MUSHROOM", Features.HUGE_BROWN_MUSHROOM); + injectTree(treeRegistry, "RED_MUSHROOM", Features.HUGE_RED_MUSHROOM); + injectTree(treeRegistry, "JUNGLE", Features.MEGA_JUNGLE_TREE); + injectTree(treeRegistry, "JUNGLE_COCOA", Features.JUNGLE_TREE); + injectTree(treeRegistry, "LARGE_OAK", Features.FANCY_OAK); + injectTree(treeRegistry, "LARGE_SPRUCE", Features.PINE); + injectTree(treeRegistry, "SMALL_JUNGLE", Features.JUNGLE_TREE); + injectTree(treeRegistry, "SWAMP_OAK", Features.SWAMP_TREE); + injectTree(treeRegistry, "TALL_BIRCH", Features.BIRCH_TALL); + injectTree(treeRegistry, "ACACIA", Features.ACACIA); + injectTree(treeRegistry, "BIRCH", Features.BIRCH); + injectTree(treeRegistry, "DARK_OAK", Features.DARK_OAK); + injectTree(treeRegistry, "OAK", Features.OAK); + injectTree(treeRegistry, "CHORUS_PLANT", Features.CHORUS_PLANT); + injectTree(treeRegistry, "SPRUCE", Features.SPRUCE); + injectTree(treeRegistry, "JUNGLE_BUSH", Features.JUNGLE_BUSH); + injectTree(treeRegistry, "MEGA_SPRUCE", Features.MEGA_SPRUCE); + injectTree(treeRegistry, "CRIMSON_FUNGUS", Features.CRIMSON_FUNGI); + injectTree(treeRegistry, "WARPED_FUNGUS", Features.WARPED_FUNGI); + } + + + private void injectTree(CheckedRegistry registry, String id, ConfiguredFeature tree) { + try { + registry.add(id, new ForgeTree(tree, id, TerraForgePlugin.getInstance())); + } catch(DuplicateEntryException ignore) { + } + } + } } diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraLevelType.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraLevelType.java new file mode 100644 index 000000000..1dd456ad9 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraLevelType.java @@ -0,0 +1,23 @@ +package com.dfsek.terra.forge; + +import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.forge.world.TerraBiomeSource; +import com.dfsek.terra.forge.world.generator.ForgeChunkGeneratorWrapper; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.gen.DimensionSettings; +import net.minecraftforge.common.world.ForgeWorldType; + +public class TerraLevelType implements ForgeWorldType.IChunkGeneratorFactory { + private final ConfigPack pack; + + public TerraLevelType(ConfigPack pack) { + this.pack = pack; + } + + @Override + public ChunkGenerator createChunkGenerator(Registry biomeRegistry, Registry dimensionSettingsRegistry, long seed, String generatorSettings) { + return new ForgeChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, seed, pack), seed, pack); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeEnchantment.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeEnchantment.java new file mode 100644 index 000000000..8b0110ffa --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeEnchantment.java @@ -0,0 +1,41 @@ +package com.dfsek.terra.forge.inventory; + +import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.api.platform.inventory.item.Enchantment; +import com.dfsek.terra.forge.world.ForgeAdapter; +import net.minecraft.util.registry.Registry; + +import java.util.Objects; + +public class ForgeEnchantment implements Enchantment { + private final net.minecraft.enchantment.Enchantment enchantment; + + public ForgeEnchantment(net.minecraft.enchantment.Enchantment enchantment) { + this.enchantment = enchantment; + } + + @Override + public net.minecraft.enchantment.Enchantment getHandle() { + return enchantment; + } + + @Override + public boolean canEnchantItem(ItemStack itemStack) { + return enchantment.canEnchant(ForgeAdapter.adapt(itemStack)); + } + + @Override + public String getID() { + return Objects.requireNonNull(Registry.ENCHANTMENT.getKey(enchantment)).toString(); + } + + @Override + public boolean conflictsWith(Enchantment other) { + return !enchantment.isCompatibleWith(ForgeAdapter.adapt(other)); + } + + @Override + public int getMaxLevel() { + return enchantment.getMaxLevel(); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeInventory.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeInventory.java new file mode 100644 index 000000000..3109b1498 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeInventory.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.forge.inventory; + +import com.dfsek.terra.api.platform.inventory.Inventory; +import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.forge.world.ForgeAdapter; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Items; + +public class ForgeInventory implements Inventory { + private final net.minecraft.inventory.IInventory delegate; + + public ForgeInventory(IInventory delegate) { + this.delegate = delegate; + } + + @Override + public net.minecraft.inventory.IInventory getHandle() { + return delegate; + } + + @Override + public int getSize() { + return delegate.getContainerSize(); + } + + @Override + public ItemStack getItem(int slot) { + net.minecraft.item.ItemStack itemStack = delegate.getItem(slot); + return itemStack.getItem() == Items.AIR ? null : ForgeAdapter.adapt(itemStack); + } + + @Override + public void setItem(int slot, ItemStack newStack) { + delegate.setItem(slot, ForgeAdapter.adapt(newStack)); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeItem.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeItem.java new file mode 100644 index 000000000..2f332f768 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeItem.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.forge.inventory; + +import com.dfsek.terra.api.platform.inventory.Item; +import com.dfsek.terra.api.platform.inventory.ItemStack; + +public class ForgeItem implements Item { + private final net.minecraft.item.Item delegate; + + public ForgeItem(net.minecraft.item.Item delegate) { + this.delegate = delegate; + } + + @Override + public net.minecraft.item.Item getHandle() { + return delegate; + } + + @Override + public ItemStack newItemStack(int amount) { + return new ForgeItemStack(new net.minecraft.item.ItemStack(delegate, amount)); + } + + @Override + public double getMaxDurability() { + return delegate.getMaxDamage(); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeItemHandle.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeItemHandle.java new file mode 100644 index 000000000..041cab37b --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeItemHandle.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.forge.inventory; + +import com.dfsek.terra.api.platform.handle.ItemHandle; +import com.dfsek.terra.api.platform.inventory.Item; +import com.dfsek.terra.api.platform.inventory.item.Enchantment; +import com.dfsek.terra.forge.world.ForgeAdapter; +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.command.arguments.ItemArgument; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.registry.Registry; + +import java.util.Set; +import java.util.stream.Collectors; + +public class ForgeItemHandle implements ItemHandle { + + @Override + public Item createItem(String data) { + try { + return ForgeAdapter.adapt(new ItemArgument().parse(new StringReader(data)).getItem()); + } catch(CommandSyntaxException e) { + throw new IllegalArgumentException("Invalid item data \"" + data + "\"", e); + } + } + + @Override + public Enchantment getEnchantment(String id) { + return ForgeAdapter.adapt(Registry.ENCHANTMENT.get(ResourceLocation.tryParse(id))); + } + + @Override + public Set getEnchantments() { + return Registry.ENCHANTMENT.stream().map(ForgeAdapter::adapt).collect(Collectors.toSet()); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeItemStack.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeItemStack.java new file mode 100644 index 000000000..01e186bdb --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeItemStack.java @@ -0,0 +1,46 @@ +package com.dfsek.terra.forge.inventory; + +import com.dfsek.terra.api.platform.inventory.Item; +import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.api.platform.inventory.item.ItemMeta; +import com.dfsek.terra.forge.inventory.meta.ForgeDamageable; +import com.dfsek.terra.forge.inventory.meta.ForgeItemMeta; + +public class ForgeItemStack implements ItemStack { + private net.minecraft.item.ItemStack delegate; + + public ForgeItemStack(net.minecraft.item.ItemStack delegate) { + this.delegate = delegate; + } + + @Override + public int getAmount() { + return delegate.getCount(); + } + + @Override + public void setAmount(int i) { + delegate.setCount(i); + } + + @Override + public Item getType() { + return new ForgeItem(delegate.getItem()); + } + + @Override + public ItemMeta getItemMeta() { + if(delegate.isDamageableItem()) return new ForgeDamageable(delegate.copy()); + return new ForgeItemMeta(delegate.copy()); + } + + @Override + public void setItemMeta(ItemMeta meta) { + this.delegate = ((ForgeItemMeta) meta).getHandle(); + } + + @Override + public net.minecraft.item.ItemStack getHandle() { + return delegate; + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/meta/ForgeDamageable.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/meta/ForgeDamageable.java new file mode 100644 index 000000000..6c0fab95d --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/meta/ForgeDamageable.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.forge.inventory.meta; + +import com.dfsek.terra.api.platform.inventory.item.Damageable; +import net.minecraft.item.ItemStack; + +public class ForgeDamageable extends ForgeItemMeta implements Damageable { + public ForgeDamageable(ItemStack delegate) { + super(delegate); + } + + @Override + public int getDamage() { + return delegate.getDamageValue(); + } + + @Override + public void setDamage(int damage) { + delegate.setDamageValue(damage); + } + + @Override + public boolean hasDamage() { + return delegate.isDamaged(); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/meta/ForgeItemMeta.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/meta/ForgeItemMeta.java new file mode 100644 index 000000000..7a28ade66 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/meta/ForgeItemMeta.java @@ -0,0 +1,43 @@ +package com.dfsek.terra.forge.inventory.meta; + +import com.dfsek.terra.api.platform.inventory.item.Enchantment; +import com.dfsek.terra.api.platform.inventory.item.ItemMeta; +import com.dfsek.terra.forge.world.ForgeAdapter; +import net.minecraft.command.arguments.NBTCompoundTagArgument; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.registry.Registry; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +public class ForgeItemMeta implements ItemMeta { + protected final ItemStack delegate; + + public ForgeItemMeta(ItemStack delegate) { + this.delegate = delegate; + } + + @Override + public ItemStack getHandle() { + return delegate; + } + + @Override + public Map getEnchantments() { + if(!delegate.isEnchanted()) return Collections.emptyMap(); + Map map = new HashMap<>(); + + delegate.getEnchantmentTags().forEach(enchantment -> { + CompoundNBT eTag = (CompoundNBT) enchantment; + map.put(ForgeAdapter.adapt(Registry.ENCHANTMENT.byId(eTag.getInt("id"))), eTag.getInt("lvl")); + }); + return map; + } + + @Override + public void addEnchantment(Enchantment enchantment, int level) { + delegate.enchant(ForgeAdapter.adapt(enchantment), level); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeAdapter.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeAdapter.java new file mode 100644 index 000000000..1d34cdf03 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeAdapter.java @@ -0,0 +1,128 @@ +package com.dfsek.terra.forge.world; + +import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.platform.CommandSender; +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.BlockType; +import com.dfsek.terra.api.platform.entity.EntityType; +import com.dfsek.terra.api.platform.inventory.item.Enchantment; +import com.dfsek.terra.forge.inventory.ForgeEnchantment; +import com.dfsek.terra.forge.inventory.ForgeItem; +import com.dfsek.terra.forge.inventory.ForgeItemStack; +import com.dfsek.terra.forge.world.block.ForgeBlockData; +import com.dfsek.terra.forge.world.block.ForgeBlockType; +import com.dfsek.terra.forge.world.block.data.ForgeDirectional; +import com.dfsek.terra.forge.world.block.data.ForgeMultipleFacing; +import com.dfsek.terra.forge.world.block.data.ForgeOrientable; +import com.dfsek.terra.forge.world.block.data.ForgeRotatable; +import com.dfsek.terra.forge.world.block.data.ForgeSlab; +import com.dfsek.terra.forge.world.block.data.ForgeStairs; +import com.dfsek.terra.forge.world.block.data.ForgeWaterlogged; +import com.dfsek.terra.forge.world.entity.ForgeCommandSender; +import com.dfsek.terra.forge.world.entity.ForgeEntityType; +import com.dfsek.terra.forge.world.entity.ForgePlayer; +import com.dfsek.terra.forge.world.handles.world.ForgeWorldHandle; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.command.CommandSource; +import net.minecraft.command.ICommandSource; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorld; + +import java.util.Arrays; + +public final class ForgeAdapter { + public static BlockPos adapt(Vector3 v) { + return new BlockPos(v.getBlockX(), v.getBlockY(), v.getBlockZ()); + } + + public static Vector3 adapt(BlockPos pos) { + return new Vector3(pos.getX(), pos.getY(), pos.getZ()); + } + + public static ForgeBlockData adapt(BlockState state) { + if(state.hasProperty(BlockStateProperties.STAIRS_SHAPE)) return new ForgeStairs(state); + + if(state.hasProperty(BlockStateProperties.SLAB_TYPE)) return new ForgeSlab(state); + + if(state.hasProperty(BlockStateProperties.AXIS)) return new ForgeOrientable(state, BlockStateProperties.AXIS); + if(state.hasProperty(BlockStateProperties.HORIZONTAL_AXIS)) return new ForgeOrientable(state, BlockStateProperties.HORIZONTAL_AXIS); + + if(state.hasProperty(BlockStateProperties.ROTATION_16)) return new ForgeRotatable(state); + + if(state.hasProperty(BlockStateProperties.FACING)) return new ForgeDirectional(state, BlockStateProperties.FACING); + if(state.hasProperty(BlockStateProperties.FACING_HOPPER)) return new ForgeDirectional(state, BlockStateProperties.FACING_HOPPER); + if(state.hasProperty(BlockStateProperties.HORIZONTAL_FACING)) return new ForgeDirectional(state, BlockStateProperties.HORIZONTAL_FACING); + + if(state.getProperties().containsAll(Arrays.asList(BlockStateProperties.NORTH, BlockStateProperties.SOUTH, BlockStateProperties.EAST, BlockStateProperties.WEST))) + return new ForgeMultipleFacing(state); + if(state.hasProperty(BlockStateProperties.WATERLOGGED)) return new ForgeWaterlogged(state); + return new ForgeBlockData(state); + } + + public static CommandSender adapt(CommandSource serverCommandSource) { + if(serverCommandSource.getEntity() instanceof PlayerEntity) return new ForgePlayer((PlayerEntity) serverCommandSource.getEntity()); + return new ForgeCommandSender(serverCommandSource); + } + + public static Direction adapt(BlockFace face) { + switch(face) { + case NORTH: + return Direction.NORTH; + case WEST: + return Direction.WEST; + case SOUTH: + return Direction.SOUTH; + case EAST: + return Direction.EAST; + case UP: + return Direction.UP; + case DOWN: + return Direction.DOWN; + default: + throw new IllegalArgumentException("Illegal direction: " + face); + } + } + + public static BlockType adapt(Block block) { + return new ForgeBlockType(block); + } + + public static EntityType adapt(net.minecraft.entity.EntityType entityType) { + return new ForgeEntityType(entityType); + } + + public static net.minecraft.entity.EntityType adapt(EntityType entityType) { + return ((ForgeEntityType) entityType).getHandle(); + } + + public static ItemStack adapt(com.dfsek.terra.api.platform.inventory.ItemStack itemStack) { + return ((ForgeItemStack) itemStack).getHandle(); + } + + public static com.dfsek.terra.api.platform.inventory.ItemStack adapt(ItemStack itemStack) { + return new ForgeItemStack(itemStack); + } + + public static com.dfsek.terra.api.platform.inventory.Item adapt(Item item) { + return new ForgeItem(item); + } + + public static Enchantment adapt(net.minecraft.enchantment.Enchantment enchantment) { + return new ForgeEnchantment(enchantment); + } + + public static net.minecraft.enchantment.Enchantment adapt(Enchantment enchantment) { + return ((ForgeEnchantment) enchantment).getHandle(); + } + + public IWorld adapt(ForgeWorldHandle worldHandle) { + return worldHandle.getWorld(); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeBiome.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeBiome.java new file mode 100644 index 000000000..cfddb6e88 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeBiome.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.forge.world; + +import com.dfsek.terra.api.platform.world.Biome; + +public class ForgeBiome implements Biome { + private final net.minecraft.world.biome.Biome delegate; + + public ForgeBiome(net.minecraft.world.biome.Biome delegate) { + this.delegate = delegate; + } + + + @Override + public net.minecraft.world.biome.Biome getHandle() { + return delegate; + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeTree.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeTree.java new file mode 100644 index 000000000..c94b85a29 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeTree.java @@ -0,0 +1,44 @@ +package com.dfsek.terra.forge.world; + +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Tree; +import com.dfsek.terra.api.util.collections.MaterialSet; +import com.dfsek.terra.forge.world.generator.ForgeChunkGenerator; +import com.dfsek.terra.forge.world.handles.world.ForgeWorldAccess; +import com.dfsek.terra.profiler.ProfileFrame; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.gen.feature.ConfiguredFeature; + +import java.util.Locale; +import java.util.Random; + +public class ForgeTree implements Tree { + private final ConfiguredFeature delegate; + private final String id; + private final TerraPlugin main; + + public ForgeTree(ConfiguredFeature delegate, String id, TerraPlugin main) { + this.delegate = delegate; + this.id = id; + this.main = main; + } + + @Override + public boolean plant(Location l, Random r) { + try(ProfileFrame ignore = main.getProfiler().profile("fabric_tree:" + id.toLowerCase(Locale.ROOT))) { + ForgeWorldAccess fabricWorldAccess = ((ForgeWorldAccess) l.getWorld()); + ChunkGenerator generatorWrapper = ((ForgeChunkGenerator) fabricWorldAccess.getGenerator()).getHandle(); + return delegate.place((ISeedReader) fabricWorldAccess.getHandle(), generatorWrapper, r, new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ())); + } + } + + @Override + public MaterialSet getSpawnable() { + return MaterialSet.get(main.getWorldHandle().createBlockData("minecraft:grass_block"), + main.getWorldHandle().createBlockData("minecraft:podzol"), + main.getWorldHandle().createBlockData("minecraft:mycelium")); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeWorldHandle.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeWorldHandle.java new file mode 100644 index 000000000..9d3cc5914 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeWorldHandle.java @@ -0,0 +1,35 @@ +package com.dfsek.terra.forge.world; + +import com.dfsek.terra.api.platform.entity.EntityType; +import com.dfsek.terra.api.platform.handle.WorldHandle; +import com.dfsek.terra.forge.world.block.ForgeBlockData; +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.block.BlockState; +import net.minecraft.command.arguments.BlockStateParser; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.registry.Registry; + +import java.util.Locale; + +public class ForgeWorldHandle implements WorldHandle { + + @Override + public ForgeBlockData createBlockData(String data) { + BlockStateParser parser = new BlockStateParser(new StringReader(data), true); + try { + BlockState state = parser.parse(true).getState(); + if(state == null) throw new IllegalArgumentException("Invalid data: " + data); + return ForgeAdapter.adapt(state); + } catch(CommandSyntaxException e) { + throw new IllegalArgumentException(e); + } + } + + @Override + public EntityType getEntity(String id) { + ResourceLocation identifier = ResourceLocation.tryParse(id); + if(identifier == null) identifier = ResourceLocation.tryParse("minecraft:" + id.toLowerCase(Locale.ROOT)); + return ForgeAdapter.adapt(Registry.ENTITY_TYPE.get(identifier)); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/TerraBiomeSource.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/TerraBiomeSource.java new file mode 100644 index 000000000..5edb03e61 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/TerraBiomeSource.java @@ -0,0 +1,57 @@ +package com.dfsek.terra.forge.world; + +import com.dfsek.terra.api.world.biome.UserDefinedBiome; +import com.dfsek.terra.api.world.biome.provider.BiomeProvider; +import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.forge.TerraForgePlugin; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.registry.RegistryLookupCodec; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.feature.StructureFeature; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; +import java.util.stream.Collectors; + +public class TerraBiomeSource extends net.minecraft.world.biome.provider.BiomeProvider { + public static final Codec PACK_CODEC = (RecordCodecBuilder.create(config -> config.group( + Codec.STRING.fieldOf("pack").forGetter(pack -> pack.getTemplate().getID()) + ).apply(config, config.stable(TerraForgePlugin.getInstance().getConfigRegistry()::get)))); + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + RegistryLookupCodec.create(Registry.BIOME_REGISTRY).forGetter(source -> source.biomeRegistry), + Codec.LONG.fieldOf("seed").stable().forGetter(source -> source.seed), + PACK_CODEC.fieldOf("pack").stable().forGetter(source -> source.pack)) + .apply(instance, instance.stable(TerraBiomeSource::new))); + + private final Registry biomeRegistry; + private final long seed; + private final BiomeProvider grid; + private final ConfigPack pack; + + public TerraBiomeSource(Registry biomes, long seed, ConfigPack pack) { + super(biomes.stream().collect(Collectors.toList())); + this.biomeRegistry = biomes; + this.seed = seed; + this.grid = pack.getBiomeProviderBuilder().build(seed); + this.pack = pack; + } + + @Override + protected @NotNull Codec codec() { + return CODEC; + } + + @Override + public net.minecraft.world.biome.provider.@NotNull BiomeProvider withSeed(long seed) { + return new TerraBiomeSource(this.biomeRegistry, seed, pack); + } + + @Override + public @NotNull Biome getNoiseBiome(int biomeX, int biomeY, int biomeZ) { + UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome(biomeX << 2, biomeZ << 2); + return Objects.requireNonNull(biomeRegistry.get(new ResourceLocation("terra", TerraForgePlugin.createBiomeID(pack, biome.getID())))); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlock.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlock.java new file mode 100644 index 000000000..3d439d5d0 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlock.java @@ -0,0 +1,96 @@ +package com.dfsek.terra.forge.world.block; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.BlockType; +import com.dfsek.terra.api.platform.block.state.BlockState; +import com.dfsek.terra.forge.world.ForgeAdapter; +import com.dfsek.terra.forge.world.block.state.ForgeBlockState; +import com.dfsek.terra.forge.world.handles.world.ForgeWorldAccess; +import net.minecraft.block.FlowingFluidBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorld; + +public class ForgeBlock implements Block { + private final Handle delegate; + + public ForgeBlock(BlockPos position, IWorld worldAccess) { + this.delegate = new Handle(position, worldAccess); + } + + @Override + public void setBlockData(BlockData data, boolean physics) { + delegate.worldAccess.setBlock(delegate.position, ((ForgeBlockData) data).getHandle(), physics ? 3 : 1042); + if(physics && ((ForgeBlockData) data).getHandle().getBlock() instanceof FlowingFluidBlock) { + delegate.worldAccess.getLiquidTicks().scheduleTick(delegate.position, ((FlowingFluidBlock) ((ForgeBlockData) data).getHandle().getBlock()).getFluidState(((ForgeBlockData) data).getHandle()).getFluidState().getType(), 0); + } + } + + @Override + public BlockData getBlockData() { + return new ForgeBlockData(delegate.worldAccess.getBlockState(delegate.position)); + } + + @Override + public BlockState getState() { + return ForgeBlockState.newInstance(this); + } + + @Override + public Block getRelative(BlockFace face, int len) { + BlockPos newPos = delegate.position.offset(face.getModX() * len, face.getModY() * len, face.getModZ() * len); + return new ForgeBlock(newPos, delegate.worldAccess); + } + + @Override + public boolean isEmpty() { + return getBlockData().isAir(); + } + + @Override + public Location getLocation() { + return ForgeAdapter.adapt(delegate.position).toLocation(new ForgeWorldAccess(delegate.worldAccess)); + } + + @Override + public BlockType getType() { + return getBlockData().getBlockType(); + } + + @Override + public int getX() { + return delegate.position.getX(); + } + + @Override + public int getZ() { + return delegate.position.getZ(); + } + + @Override + public int getY() { + return delegate.position.getY(); + } + + @Override + public boolean isPassable() { + return isEmpty(); + } + + @Override + public Handle getHandle() { + return delegate; + } + + public static final class Handle { + private final BlockPos position; + private final IWorld worldAccess; + + public Handle(BlockPos position, IWorld worldAccess) { + this.position = position; + this.worldAccess = worldAccess; + } + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlockData.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlockData.java new file mode 100644 index 000000000..7faa39e76 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlockData.java @@ -0,0 +1,64 @@ +package com.dfsek.terra.forge.world.block; + +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockType; +import com.dfsek.terra.forge.world.ForgeAdapter; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; + +public class ForgeBlockData implements BlockData { + protected BlockState delegate; + + public ForgeBlockData(BlockState delegate) { + this.delegate = delegate; + } + + @Override + public BlockType getBlockType() { + return ForgeAdapter.adapt(delegate.getBlock()); + } + + @Override + public boolean matches(BlockData other) { + return delegate.getBlock() == ((ForgeBlockData) other).delegate.getBlock(); + } + + @Override + public BlockData clone() { + try { + return (ForgeBlockData) super.clone(); + } catch(CloneNotSupportedException e) { + throw new Error(e); + } + } + + @Override + public String getAsString() { + /* + StringBuilder data = new StringBuilder(Registry.BLOCK.getId(delegate.getBlock()).toString()); + if(!delegate.getProperties().isEmpty()) { + data.append('['); + data.append(delegate.getProperties().stream().map(State.PROPERTY_MAP_PRINTER).collect(Collectors.joining(","))); + data.append(']'); + } + return data.toString(); + + */ + throw new UnsupportedOperationException("TODO: implement this"); // TODO + } + + @Override + public boolean isAir() { + return delegate.isAir(); + } + + @Override + public boolean isStructureVoid() { + return delegate.getBlock() == Blocks.STRUCTURE_VOID; + } + + @Override + public BlockState getHandle() { + return delegate; + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlockType.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlockType.java new file mode 100644 index 000000000..05c87167a --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlockType.java @@ -0,0 +1,46 @@ +package com.dfsek.terra.forge.world.block; + +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockType; +import com.dfsek.terra.forge.world.ForgeAdapter; +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; + +public class ForgeBlockType implements BlockType { + private final Block delegate; + + public ForgeBlockType(Block delegate) { + this.delegate = delegate; + } + + @Override + public Block getHandle() { + return delegate; + } + + @Override + public BlockData getDefaultData() { + return ForgeAdapter.adapt(delegate.defaultBlockState()); + } + + @Override + public boolean isSolid() { + return delegate.defaultBlockState().canOcclude(); + } + + @Override + public boolean isWater() { + return delegate == Blocks.WATER; + } + + @Override + public int hashCode() { + return delegate.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof ForgeBlockType)) return false; + return ((ForgeBlockType) obj).delegate == delegate; + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeAnaloguePowerable.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeAnaloguePowerable.java new file mode 100644 index 000000000..ff59ff1be --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeAnaloguePowerable.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.forge.world.block.data; + +import com.dfsek.terra.api.platform.block.data.AnaloguePowerable; +import com.dfsek.terra.forge.world.block.ForgeBlockData; +import net.minecraft.block.BlockState; + +/** + * None of this actually has implementation, TODO: implement this if we ever end up needing it. + */ +public class ForgeAnaloguePowerable extends ForgeBlockData implements AnaloguePowerable { + public ForgeAnaloguePowerable(BlockState delegate) { + super(delegate); + } + + @Override + public int getMaximumPower() { + return 0; + } + + @Override + public int getPower() { + return 0; + } + + @Override + public void setPower(int power) { + + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeDirectional.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeDirectional.java new file mode 100644 index 000000000..ec7c34242 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeDirectional.java @@ -0,0 +1,42 @@ +package com.dfsek.terra.forge.world.block.data; + +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.Directional; +import com.dfsek.terra.forge.world.ForgeAdapter; +import com.dfsek.terra.forge.world.block.ForgeBlockData; +import net.minecraft.block.BlockState; +import net.minecraft.state.DirectionProperty; + +public class ForgeDirectional extends ForgeBlockData implements Directional { + private final DirectionProperty property; + + public ForgeDirectional(BlockState delegate, DirectionProperty property) { + super(delegate); + this.property = property; + } + + @Override + public BlockFace getFacing() { + switch(delegate.getValue(property)) { + case SOUTH: + return BlockFace.SOUTH; + case DOWN: + return BlockFace.DOWN; + case UP: + return BlockFace.UP; + case EAST: + return BlockFace.EAST; + case WEST: + return BlockFace.WEST; + case NORTH: + return BlockFace.NORTH; + default: + throw new IllegalStateException(); + } + } + + @Override + public void setFacing(BlockFace facing) { + delegate = delegate.setValue(property, ForgeAdapter.adapt(facing)); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeEnumAdapter.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeEnumAdapter.java new file mode 100644 index 000000000..d01c59f37 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeEnumAdapter.java @@ -0,0 +1,159 @@ +package com.dfsek.terra.forge.world.block.data; + +import com.dfsek.terra.api.platform.block.Axis; +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.Bisected; +import com.dfsek.terra.api.platform.block.data.Slab; +import com.dfsek.terra.api.platform.block.data.Stairs; +import net.minecraft.state.properties.Half; +import net.minecraft.state.properties.SlabType; +import net.minecraft.state.properties.StairsShape; +import net.minecraft.util.Direction; + +public final class ForgeEnumAdapter { + public static Stairs.Shape adapt(StairsShape shape) { + switch(shape) { + case OUTER_RIGHT: + return Stairs.Shape.OUTER_RIGHT; + case INNER_RIGHT: + return Stairs.Shape.INNER_RIGHT; + case OUTER_LEFT: + return Stairs.Shape.OUTER_LEFT; + case INNER_LEFT: + return Stairs.Shape.INNER_LEFT; + case STRAIGHT: + return Stairs.Shape.STRAIGHT; + default: + throw new IllegalStateException(); + } + } + + public static Bisected.Half adapt(Half half) { + switch(half) { + case BOTTOM: + return Bisected.Half.BOTTOM; + case TOP: + return Bisected.Half.TOP; + default: + throw new IllegalStateException(); + } + } + + public static BlockFace adapt(Direction direction) { + switch(direction) { + case DOWN: + return BlockFace.DOWN; + case UP: + return BlockFace.UP; + case WEST: + return BlockFace.WEST; + case EAST: + return BlockFace.EAST; + case NORTH: + return BlockFace.NORTH; + case SOUTH: + return BlockFace.SOUTH; + default: + throw new IllegalStateException(); + } + } + + public static Slab.Type adapt(SlabType type) { + switch(type) { + case BOTTOM: + return Slab.Type.BOTTOM; + case TOP: + return Slab.Type.TOP; + case DOUBLE: + return Slab.Type.DOUBLE; + default: + throw new IllegalStateException(); + } + } + + public static StairsShape adapt(Stairs.Shape shape) { + switch(shape) { + case STRAIGHT: + return StairsShape.STRAIGHT; + case INNER_LEFT: + return StairsShape.INNER_LEFT; + case OUTER_LEFT: + return StairsShape.OUTER_LEFT; + case INNER_RIGHT: + return StairsShape.INNER_RIGHT; + case OUTER_RIGHT: + return StairsShape.OUTER_RIGHT; + default: + throw new IllegalStateException(); + } + } + + public static Half adapt(Bisected.Half half) { + switch(half) { + case TOP: + return Half.TOP; + case BOTTOM: + return Half.BOTTOM; + default: + throw new IllegalStateException(); + } + } + + public static Direction adapt(BlockFace face) { + switch(face) { + case SOUTH: + return Direction.SOUTH; + case NORTH: + return Direction.NORTH; + case EAST: + return Direction.EAST; + case WEST: + return Direction.WEST; + case UP: + return Direction.UP; + case DOWN: + return Direction.DOWN; + default: + throw new IllegalArgumentException(); + } + } + + public static SlabType adapt(Slab.Type type) { + switch(type) { + case DOUBLE: + return SlabType.DOUBLE; + case TOP: + return SlabType.TOP; + case BOTTOM: + return SlabType.BOTTOM; + default: + throw new IllegalStateException(); + } + } + + public static Axis adapt(Direction.Axis axis) { + switch(axis) { + case X: + return Axis.X; + case Y: + return Axis.Y; + case Z: + return Axis.Z; + default: + throw new IllegalStateException(); + } + } + + public static Direction.Axis adapt(Axis axis) { + switch(axis) { + case Z: + return Direction.Axis.Z; + case Y: + return Direction.Axis.Y; + case X: + return Direction.Axis.X; + default: + throw new IllegalStateException(); + } + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeMultipleFacing.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeMultipleFacing.java new file mode 100644 index 000000000..4bfde3fcc --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeMultipleFacing.java @@ -0,0 +1,70 @@ +package com.dfsek.terra.forge.world.block.data; + +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.MultipleFacing; +import com.dfsek.terra.forge.world.block.ForgeBlockData; +import net.minecraft.block.BlockState; +import net.minecraft.state.properties.BlockStateProperties; + + +import java.util.HashSet; +import java.util.Set; + +public class ForgeMultipleFacing extends ForgeBlockData implements MultipleFacing { + public ForgeMultipleFacing(BlockState delegate) { + super(delegate); + } + + @Override + public Set getFaces() { + Set set = new HashSet<>(); + if(delegate.getValue(BlockStateProperties.NORTH)) set.add(BlockFace.NORTH); + if(delegate.getValue(BlockStateProperties.SOUTH)) set.add(BlockFace.SOUTH); + if(delegate.getValue(BlockStateProperties.EAST)) set.add(BlockFace.EAST); + if(delegate.getValue(BlockStateProperties.WEST)) set.add(BlockFace.WEST); + if(delegate.hasProperty(BlockStateProperties.UP) && delegate.getValue(BlockStateProperties.UP)) set.add(BlockFace.UP); + if(delegate.hasProperty(BlockStateProperties.DOWN) && delegate.getValue(BlockStateProperties.DOWN)) set.add(BlockFace.DOWN); + return set; + } + + @Override + public void setFace(BlockFace face, boolean facing) { + switch(face) { + case NORTH: + delegate = delegate.setValue(BlockStateProperties.NORTH, facing); + break; + case SOUTH: + delegate = delegate.setValue(BlockStateProperties.SOUTH, facing); + break; + case EAST: + delegate = delegate.setValue(BlockStateProperties.EAST, facing); + break; + case WEST: + delegate = delegate.setValue(BlockStateProperties.WEST, facing); + break; + case UP: + delegate = delegate.setValue(BlockStateProperties.UP, facing); + break; + case DOWN: + delegate = delegate.setValue(BlockStateProperties.DOWN, facing); + break; + } + } + + @Override + public Set getAllowedFaces() { + Set set = new HashSet<>(); + if(delegate.hasProperty(BlockStateProperties.NORTH)) set.add(BlockFace.NORTH); + if(delegate.hasProperty(BlockStateProperties.SOUTH)) set.add(BlockFace.SOUTH); + if(delegate.hasProperty(BlockStateProperties.EAST)) set.add(BlockFace.EAST); + if(delegate.hasProperty(BlockStateProperties.WEST)) set.add(BlockFace.WEST); + if(delegate.hasProperty(BlockStateProperties.UP)) set.add(BlockFace.UP); + if(delegate.hasProperty(BlockStateProperties.DOWN)) set.add(BlockFace.DOWN); + return set; + } + + @Override + public boolean hasFace(BlockFace f) { + return getFaces().contains(f); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeOrientable.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeOrientable.java new file mode 100644 index 000000000..39d3aa7f6 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeOrientable.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.forge.world.block.data; + +import com.dfsek.terra.api.platform.block.Axis; +import com.dfsek.terra.api.platform.block.data.Orientable; +import com.dfsek.terra.forge.world.block.ForgeBlockData; +import net.minecraft.block.BlockState; +import net.minecraft.state.EnumProperty; +import net.minecraft.util.Direction; + + +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; + +public class ForgeOrientable extends ForgeBlockData implements Orientable { + private final EnumProperty property; + + public ForgeOrientable(BlockState delegate, EnumProperty property) { + super(delegate); + this.property = property; + } + + @Override + public Set getAxes() { + return Arrays.stream(Axis.values()).collect(Collectors.toSet()); + } + + @Override + public Axis getAxis() { + return ForgeEnumAdapter.adapt(getHandle().getValue(property)); + } + + @Override + public void setAxis(Axis axis) { + delegate = delegate.setValue(property, ForgeEnumAdapter.adapt(axis)); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeRotatable.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeRotatable.java new file mode 100644 index 000000000..70bc30111 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeRotatable.java @@ -0,0 +1,111 @@ +package com.dfsek.terra.forge.world.block.data; + +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.Rotatable; +import com.dfsek.terra.forge.world.block.ForgeBlockData; +import net.minecraft.block.BlockState; +import net.minecraft.state.properties.BlockStateProperties; + +public class ForgeRotatable extends ForgeBlockData implements Rotatable { + public ForgeRotatable(BlockState delegate) { + super(delegate); + } + + @Override + public BlockFace getRotation() { + int r = delegate.getValue(BlockStateProperties.ROTATION_16); + switch(r) { + case 0: + return BlockFace.SOUTH; + case 1: + return BlockFace.SOUTH_SOUTH_WEST; + case 2: + return BlockFace.SOUTH_WEST; + case 3: + return BlockFace.WEST_SOUTH_WEST; + case 4: + return BlockFace.WEST; + case 5: + return BlockFace.WEST_NORTH_WEST; + case 6: + return BlockFace.NORTH_WEST; + case 7: + return BlockFace.NORTH_NORTH_WEST; + case 8: + return BlockFace.NORTH; + case 9: + return BlockFace.NORTH_NORTH_EAST; + case 10: + return BlockFace.NORTH_EAST; + case 11: + return BlockFace.EAST_NORTH_EAST; + case 12: + return BlockFace.EAST; + case 13: + return BlockFace.EAST_SOUTH_EAST; + case 14: + return BlockFace.SOUTH_EAST; + case 15: + return BlockFace.SOUTH_SOUTH_EAST; + default: + throw new IllegalArgumentException("Unknown rotation " + r); + } + } + + @Override + public void setRotation(BlockFace face) { + switch(face) { + case UP: + case DOWN: + throw new IllegalArgumentException("Illegal rotation " + face); + case SOUTH: + delegate = delegate.setValue(BlockStateProperties.ROTATION_16, 0); + return; + case SOUTH_SOUTH_WEST: + delegate = delegate.setValue(BlockStateProperties.ROTATION_16, 1); + return; + case SOUTH_WEST: + delegate = delegate.setValue(BlockStateProperties.ROTATION_16, 2); + return; + case WEST_SOUTH_WEST: + delegate = delegate.setValue(BlockStateProperties.ROTATION_16, 3); + return; + case WEST: + delegate = delegate.setValue(BlockStateProperties.ROTATION_16, 4); + return; + case WEST_NORTH_WEST: + delegate = delegate.setValue(BlockStateProperties.ROTATION_16, 5); + return; + case NORTH_WEST: + delegate = delegate.setValue(BlockStateProperties.ROTATION_16, 6); + return; + case NORTH_NORTH_WEST: + delegate = delegate.setValue(BlockStateProperties.ROTATION_16, 7); + return; + case NORTH: + delegate = delegate.setValue(BlockStateProperties.ROTATION_16, 8); + return; + case NORTH_NORTH_EAST: + delegate = delegate.setValue(BlockStateProperties.ROTATION_16, 9); + return; + case NORTH_EAST: + delegate = delegate.setValue(BlockStateProperties.ROTATION_16, 10); + return; + case EAST_NORTH_EAST: + delegate = delegate.setValue(BlockStateProperties.ROTATION_16, 11); + return; + case EAST: + delegate = delegate.setValue(BlockStateProperties.ROTATION_16, 12); + return; + case EAST_SOUTH_EAST: + delegate = delegate.setValue(BlockStateProperties.ROTATION_16, 13); + return; + case SOUTH_EAST: + delegate = delegate.setValue(BlockStateProperties.ROTATION_16, 14); + return; + case SOUTH_SOUTH_EAST: + delegate = delegate.setValue(BlockStateProperties.ROTATION_16, 15); + return; + } + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeSlab.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeSlab.java new file mode 100644 index 000000000..55c8daa2a --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeSlab.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.forge.world.block.data; + +import com.dfsek.terra.api.platform.block.data.Slab; +import net.minecraft.block.BlockState; +import net.minecraft.state.properties.BlockStateProperties; + +public class ForgeSlab extends ForgeWaterlogged implements Slab { + public ForgeSlab(BlockState delegate) { + super(delegate); + } + + @Override + public Type getType() { + return ForgeEnumAdapter.adapt(delegate.getValue(BlockStateProperties.SLAB_TYPE)); + } + + @Override + public void setType(Type type) { + delegate = delegate.setValue(BlockStateProperties.SLAB_TYPE, ForgeEnumAdapter.adapt(type)); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeStairs.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeStairs.java new file mode 100644 index 000000000..87fae372d --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeStairs.java @@ -0,0 +1,42 @@ +package com.dfsek.terra.forge.world.block.data; + +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.Stairs; +import net.minecraft.block.BlockState; +import net.minecraft.state.properties.BlockStateProperties; + +public class ForgeStairs extends ForgeWaterlogged implements Stairs { + public ForgeStairs(BlockState delegate) { + super(delegate); + } + + @Override + public Shape getShape() { + return ForgeEnumAdapter.adapt(getHandle().getValue(BlockStateProperties.STAIRS_SHAPE)); + } + + @Override + public void setShape(Shape shape) { + super.delegate = getHandle().setValue(BlockStateProperties.STAIRS_SHAPE, ForgeEnumAdapter.adapt(shape)); + } + + @Override + public Half getHalf() { + return ForgeEnumAdapter.adapt(getHandle().getValue(BlockStateProperties.HALF)); + } + + @Override + public void setHalf(Half half) { + super.delegate = getHandle().setValue(BlockStateProperties.HALF, ForgeEnumAdapter.adapt(half)); + } + + @Override + public BlockFace getFacing() { + return ForgeEnumAdapter.adapt(getHandle().getValue(BlockStateProperties.HORIZONTAL_FACING)); + } + + @Override + public void setFacing(BlockFace facing) { + super.delegate = getHandle().setValue(BlockStateProperties.HORIZONTAL_FACING, ForgeEnumAdapter.adapt(facing)); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeWaterlogged.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeWaterlogged.java new file mode 100644 index 000000000..c67aa0be0 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/data/ForgeWaterlogged.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.forge.world.block.data; + +import com.dfsek.terra.api.platform.block.data.Waterlogged; +import com.dfsek.terra.forge.world.block.ForgeBlockData; +import net.minecraft.block.BlockState; +import net.minecraft.state.properties.BlockStateProperties; + +public class ForgeWaterlogged extends ForgeBlockData implements Waterlogged { + public ForgeWaterlogged(BlockState delegate) { + super(delegate); + } + + @Override + public boolean isWaterlogged() { + return delegate.getValue(BlockStateProperties.WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + super.delegate = delegate.setValue(BlockStateProperties.WATERLOGGED, waterlogged); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeBlockState.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeBlockState.java new file mode 100644 index 000000000..1ad7a6098 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeBlockState.java @@ -0,0 +1,73 @@ +package com.dfsek.terra.forge.world.block.state; + +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.state.BlockState; +import com.dfsek.terra.forge.world.ForgeAdapter; +import com.dfsek.terra.forge.world.block.ForgeBlock; +import com.dfsek.terra.forge.world.handles.world.ForgeWorldHandle; +import net.minecraft.tileentity.LockableLootTileEntity; +import net.minecraft.tileentity.MobSpawnerTileEntity; +import net.minecraft.tileentity.SignTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IWorld; + +public class ForgeBlockState implements BlockState { + protected final TileEntity blockEntity; + private final IWorld worldAccess; + + public ForgeBlockState(TileEntity blockEntity, IWorld worldAccess) { + this.blockEntity = blockEntity; + this.worldAccess = worldAccess; + } + + public static ForgeBlockState newInstance(Block block) { + IWorld worldAccess = ((ForgeWorldHandle) block.getLocation().getWorld()).getWorld(); + + TileEntity entity = worldAccess.getBlockEntity(ForgeAdapter.adapt(block.getLocation().toVector())); + if(entity instanceof SignTileEntity) { + return new ForgeSign((SignTileEntity) entity, worldAccess); + } else if(entity instanceof MobSpawnerTileEntity) { + return new ForgeMobSpawner((MobSpawnerTileEntity) entity, worldAccess); + } else if(entity instanceof LockableLootTileEntity) { + return new ForgeContainer((LockableLootTileEntity) entity, worldAccess); + } + return null; + } + + @Override + public TileEntity getHandle() { + return blockEntity; + } + + @Override + public Block getBlock() { + return new ForgeBlock(blockEntity.getBlockPos(), blockEntity.getLevel()); + } + + @Override + public int getX() { + return blockEntity.getBlockPos().getX(); + } + + @Override + public int getY() { + return blockEntity.getBlockPos().getY(); + } + + @Override + public int getZ() { + return blockEntity.getBlockPos().getZ(); + } + + @Override + public BlockData getBlockData() { + return ForgeAdapter.adapt(blockEntity.getBlockState()); + } + + @Override + public boolean update(boolean applyPhysics) { + worldAccess.getChunk(blockEntity.getBlockPos()).setBlockEntity(blockEntity.getBlockPos(), blockEntity); + return true; + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeContainer.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeContainer.java new file mode 100644 index 000000000..c10c9ef03 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeContainer.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.forge.world.block.state; + +import com.dfsek.terra.api.platform.block.state.Container; +import com.dfsek.terra.api.platform.inventory.Inventory; +import com.dfsek.terra.forge.inventory.ForgeInventory; +import net.minecraft.tileentity.LockableLootTileEntity; +import net.minecraft.world.IWorld; + +public class ForgeContainer extends ForgeBlockState implements Container { + public ForgeContainer(LockableLootTileEntity blockEntity, IWorld worldAccess) { + super(blockEntity, worldAccess); + } + + @Override + public Inventory getInventory() { + return new ForgeInventory(((LockableLootTileEntity) blockEntity)); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeMobSpawner.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeMobSpawner.java new file mode 100644 index 000000000..0cda8e206 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeMobSpawner.java @@ -0,0 +1,133 @@ +package com.dfsek.terra.forge.world.block.state; + +import com.dfsek.terra.api.platform.block.state.MobSpawner; +import com.dfsek.terra.api.platform.block.state.SerialState; +import com.dfsek.terra.api.platform.entity.EntityType; +import com.dfsek.terra.forge.TerraForgePlugin; +import com.dfsek.terra.forge.world.ForgeAdapter; +import net.minecraft.tileentity.MobSpawnerTileEntity; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.IWorld; +import org.jetbrains.annotations.NotNull; + +public class ForgeMobSpawner extends ForgeBlockState implements MobSpawner { // TODO: finish implementation / refactor API because bukkit doesnt expose most of the stuff spawners can do + + + public ForgeMobSpawner(MobSpawnerTileEntity blockEntity, IWorld worldAccess) { + super(blockEntity, worldAccess); + } + + @Override + public EntityType getSpawnedType() { + return ForgeAdapter.adapt(Registry.ENTITY_TYPE.get(((MobSpawnerTileEntity) blockEntity).getSpawner().getSpawnerEntity().getType().getRegistryName())); + } + + @Override + public void setSpawnedType(@NotNull EntityType creatureType) { + ((MobSpawnerTileEntity) blockEntity).getSpawner().setEntityId(ForgeAdapter.adapt(creatureType)); + } + + @Override + public int getDelay() { + return 0; + } + + @Override + public void setDelay(int delay) { + + } + + @Override + public int getMinSpawnDelay() { + return 0; + } + + @Override + public void setMinSpawnDelay(int delay) { + + } + + @Override + public int getMaxSpawnDelay() { + return 0; + } + + @Override + public void setMaxSpawnDelay(int delay) { + + } + + @Override + public int getSpawnCount() { + return 0; + } + + @Override + public void setSpawnCount(int spawnCount) { + + } + + @Override + public int getMaxNearbyEntities() { + return 0; + } + + @Override + public void setMaxNearbyEntities(int maxNearbyEntities) { + + } + + @Override + public int getRequiredPlayerRange() { + return 0; + } + + @Override + public void setRequiredPlayerRange(int requiredPlayerRange) { + + } + + @Override + public int getSpawnRange() { + return 0; + } + + @Override + public void setSpawnRange(int spawnRange) { + + } + + @Override + public void applyState(String state) { + SerialState.parse(state).forEach((k, v) -> { + switch(k) { + case "type": + setSpawnedType(TerraForgePlugin.getInstance().getWorldHandle().getEntity(v)); + return; + case "delay": + setDelay(Integer.parseInt(v)); + return; + case "min_delay": + setMinSpawnDelay(Integer.parseInt(v)); + return; + case "max_delay": + setMaxSpawnDelay(Integer.parseInt(v)); + return; + case "spawn_count": + setSpawnCount(Integer.parseInt(v)); + return; + case "spawn_range": + setSpawnRange(Integer.parseInt(v)); + return; + case "max_nearby": + setMaxNearbyEntities(Integer.parseInt(v)); + return; + case "required_player_range": + setRequiredPlayerRange(Integer.parseInt(v)); + return; + default: + throw new IllegalArgumentException("Invalid property: " + k); + } + }); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeSign.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeSign.java new file mode 100644 index 000000000..899fe900e --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeSign.java @@ -0,0 +1,44 @@ +package com.dfsek.terra.forge.world.block.state; + +import com.dfsek.terra.api.platform.block.state.SerialState; +import com.dfsek.terra.api.platform.block.state.Sign; +import net.minecraft.tileentity.SignTileEntity; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.world.IWorld; +import org.jetbrains.annotations.NotNull; + +public class ForgeSign extends ForgeBlockState implements Sign { + public ForgeSign(SignTileEntity blockEntity, IWorld worldAccess) { + super(blockEntity, worldAccess); + } + + @Override + public @NotNull String[] getLines() { + SignTileEntity sign = (SignTileEntity) blockEntity; + + return new String[] { + sign.getMessage(0).getString(), + sign.getMessage(1).getString(), + sign.getMessage(2).getString(), + sign.getMessage(3).getString() + }; + } + + @Override + public @NotNull String getLine(int index) throws IndexOutOfBoundsException { + return ((SignTileEntity) blockEntity).getMessage(index).getString(); + } + + @Override + public void setLine(int index, @NotNull String line) throws IndexOutOfBoundsException { + ((SignTileEntity) blockEntity).setMessage(index, new StringTextComponent(line)); + } + + @Override + public void applyState(String state) { + SerialState.parse(state).forEach((k, v) -> { + if(!k.startsWith("text")) throw new IllegalArgumentException("Invalid property: " + k); + setLine(Integer.parseInt(k.substring(4)), v); + }); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/entity/ForgeCommandSender.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/entity/ForgeCommandSender.java new file mode 100644 index 000000000..042efbae3 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/entity/ForgeCommandSender.java @@ -0,0 +1,23 @@ +package com.dfsek.terra.forge.world.entity; + +import com.dfsek.terra.api.platform.CommandSender; +import net.minecraft.command.CommandSource; +import net.minecraft.util.text.StringTextComponent; + +public class ForgeCommandSender implements CommandSender { + private final CommandSource delegate; + + public ForgeCommandSender(CommandSource delegate) { + this.delegate = delegate; + } + + @Override + public void sendMessage(String message) { + delegate.sendSuccess(new StringTextComponent(message), true); + } + + @Override + public Object getHandle() { + return delegate; + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/entity/ForgeEntity.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/entity/ForgeEntity.java new file mode 100644 index 000000000..df35af7fb --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/entity/ForgeEntity.java @@ -0,0 +1,43 @@ +package com.dfsek.terra.forge.world.entity; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.entity.Entity; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.forge.world.ForgeAdapter; +import com.dfsek.terra.forge.world.handles.world.ForgeWorldAccess; +import com.dfsek.terra.forge.world.handles.world.ForgeWorldHandle; +import net.minecraft.world.server.ServerWorld; + +public class ForgeEntity implements Entity { + private final net.minecraft.entity.Entity delegate; + + public ForgeEntity(net.minecraft.entity.Entity delegate) { + this.delegate = delegate; + } + + @Override + public void sendMessage(String message) { + + } + + @Override + public Object getHandle() { + return null; + } + + @Override + public Location getLocation() { + return new Location(new ForgeWorldAccess(delegate.level), ForgeAdapter.adapt(delegate.blockPosition())); + } + + @Override + public void setLocation(Location location) { + delegate.teleportTo(location.getX(), location.getY(), location.getZ()); + delegate.setLevel((ServerWorld) ((ForgeWorldHandle) location).getWorld()); + } + + @Override + public World getWorld() { + return new ForgeWorldAccess(delegate.level); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/entity/ForgeEntityType.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/entity/ForgeEntityType.java new file mode 100644 index 000000000..42ad0e91d --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/entity/ForgeEntityType.java @@ -0,0 +1,16 @@ +package com.dfsek.terra.forge.world.entity; + +import com.dfsek.terra.api.platform.entity.EntityType; + +public class ForgeEntityType implements EntityType { + private final net.minecraft.entity.EntityType type; + + public ForgeEntityType(net.minecraft.entity.EntityType type) { + this.type = type; + } + + @Override + public net.minecraft.entity.EntityType getHandle() { + return type; + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/entity/ForgePlayer.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/entity/ForgePlayer.java new file mode 100644 index 000000000..87ea1ebc1 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/entity/ForgePlayer.java @@ -0,0 +1,42 @@ +package com.dfsek.terra.forge.world.entity; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.entity.Player; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.forge.world.ForgeAdapter; +import com.dfsek.terra.forge.world.handles.world.ForgeWorldAccess; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.util.text.StringTextComponent; + +public class ForgePlayer implements Player { + private final PlayerEntity delegate; + + public ForgePlayer(PlayerEntity delegate) { + this.delegate = delegate; + } + + @Override + public void sendMessage(String message) { + delegate.displayClientMessage(new StringTextComponent(message), false); + } + + @Override + public Object getHandle() { + return delegate; + } + + @Override + public Location getLocation() { + return ForgeAdapter.adapt(delegate.blockPosition()).toLocation(new ForgeWorldAccess(delegate.level)); + } + + @Override + public World getWorld() { + return new ForgeWorldAccess(delegate.level); + } + + @Override + public void setLocation(Location location) { + delegate.teleportTo(location.getX(), location.getY(), location.getZ()); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/features/PopulatorFeature.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/features/PopulatorFeature.java new file mode 100644 index 000000000..6082b4d4e --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/features/PopulatorFeature.java @@ -0,0 +1,34 @@ +package com.dfsek.terra.forge.world.features; + +import com.dfsek.terra.forge.world.generator.ForgeChunkGenerator; +import com.dfsek.terra.forge.world.generator.ForgeChunkGeneratorWrapper; +import com.dfsek.terra.forge.world.handles.ForgeWorld; +import com.dfsek.terra.forge.world.handles.chunk.ForgeChunkWorldAccess; +import com.mojang.serialization.Codec; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import org.jetbrains.annotations.NotNull; + +import java.util.Random; + +/** + * Feature wrapper for Terra populator + */ +public class PopulatorFeature extends Feature { + public PopulatorFeature(Codec codec) { + super(codec); + } + + @Override + public boolean place(@NotNull ISeedReader world, @NotNull ChunkGenerator generator, @NotNull Random random, BlockPos pos, @NotNull NoFeatureConfig config) { + ForgeChunkGeneratorWrapper gen = (ForgeChunkGeneratorWrapper) generator; + ForgeChunkWorldAccess chunk = new ForgeChunkWorldAccess(world, pos.getX() >> 4, pos.getZ() >> 4); + ForgeWorld world1 = new ForgeWorld(world.getLevel(), new ForgeChunkGenerator(generator)); + gen.getHandle().getPopulators().forEach(populator -> populator.populate(world1, chunk)); + return true; + } + +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/generator/ForgeChunkData.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/generator/ForgeChunkData.java new file mode 100644 index 000000000..14415feed --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/generator/ForgeChunkData.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.forge.world.generator; + +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.world.generator.ChunkData; +import com.dfsek.terra.forge.world.block.ForgeBlockData; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunk; +import org.jetbrains.annotations.NotNull; + +public class ForgeChunkData implements ChunkData { + private final IChunk handle; + + public ForgeChunkData(IChunk handle) { + this.handle = handle; + } + + @Override + public IChunk getHandle() { + return handle; + } + + @Override + public int getMaxHeight() { + return handle.getMaxBuildHeight(); + } + + @Override + public void setBlock(int x, int y, int z, @NotNull BlockData blockData) { + handle.setBlockState(new BlockPos(x, y, z), ((ForgeBlockData) blockData).getHandle(), false); + } + + @Override + public @NotNull BlockData getBlockData(int x, int y, int z) { + return new ForgeBlockData(handle.getBlockState(new BlockPos(x, y, z))); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/generator/ForgeChunkGenerator.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/generator/ForgeChunkGenerator.java new file mode 100644 index 000000000..dad4fe98b --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/generator/ForgeChunkGenerator.java @@ -0,0 +1,16 @@ +package com.dfsek.terra.forge.world.generator; + +import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; + +public class ForgeChunkGenerator implements ChunkGenerator { + private final net.minecraft.world.gen.ChunkGenerator delegate; + + public ForgeChunkGenerator(net.minecraft.world.gen.ChunkGenerator delegate) { + this.delegate = delegate; + } + + @Override + public net.minecraft.world.gen.ChunkGenerator getHandle() { + return delegate; + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/generator/ForgeChunkGeneratorWrapper.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/generator/ForgeChunkGeneratorWrapper.java new file mode 100644 index 000000000..e9a5ce20d --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/generator/ForgeChunkGeneratorWrapper.java @@ -0,0 +1,141 @@ +package com.dfsek.terra.forge.world.generator; + +import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; +import com.dfsek.terra.api.util.FastRandom; +import com.dfsek.terra.api.world.generation.TerraChunkGenerator; +import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.forge.TerraForgePlugin; +import com.dfsek.terra.forge.world.TerraBiomeSource; +import com.dfsek.terra.forge.world.handles.world.ForgeSeededWorldAccess; +import com.dfsek.terra.world.TerraWorld; +import com.dfsek.terra.world.generation.generators.DefaultChunkGenerator3D; +import com.dfsek.terra.world.generation.math.samplers.Sampler; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.jafama.FastMath; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.registry.DynamicRegistries; +import net.minecraft.world.Blockreader; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorld; +import net.minecraft.world.biome.BiomeManager; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunk; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.WorldGenRegion; +import net.minecraft.world.gen.feature.structure.StructureManager; +import net.minecraft.world.gen.feature.template.TemplateManager; +import net.minecraft.world.gen.settings.DimensionStructuresSettings; +import net.minecraft.world.gen.settings.StructureSpreadSettings; +import org.jetbrains.annotations.NotNull; + +public class ForgeChunkGeneratorWrapper extends ChunkGenerator implements GeneratorWrapper { + private final long seed; + private final DefaultChunkGenerator3D delegate; + private final TerraBiomeSource biomeSource; + public static final Codec PACK_CODEC = (RecordCodecBuilder.create(config -> config.group( + Codec.STRING.fieldOf("pack").forGetter(pack -> pack.getTemplate().getID()) + ).apply(config, config.stable(TerraForgePlugin.getInstance().getConfigRegistry()::get)))); + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + TerraBiomeSource.CODEC.fieldOf("biome_source").forGetter(generator -> generator.biomeSource), + Codec.LONG.fieldOf("seed").stable().forGetter(generator -> generator.seed), + PACK_CODEC.fieldOf("pack").stable().forGetter(generator -> generator.pack)) + .apply(instance, instance.stable(ForgeChunkGeneratorWrapper::new))); + private final ConfigPack pack; + + public ConfigPack getPack() { + return pack; + } + + public ForgeChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed, ConfigPack configPack) { + super(biomeSource, new DimensionStructuresSettings(false)); + this.pack = configPack; + + this.delegate = new DefaultChunkGenerator3D(pack, TerraForgePlugin.getInstance()); + delegate.getMain().logger().info("Loading world with config pack " + pack.getTemplate().getID()); + this.biomeSource = biomeSource; + + this.seed = seed; + } + + @Override + protected @NotNull Codec codec() { + return CODEC; + } + + @Override + public @NotNull ChunkGenerator withSeed(long seed) { + return new ForgeChunkGeneratorWrapper((TerraBiomeSource) this.biomeSource.withSeed(seed), seed, pack); + } + + @Override + public void buildSurfaceAndBedrock(@NotNull WorldGenRegion p_225551_1_, @NotNull IChunk p_225551_2_) { + + } + + @Override + public boolean hasStronghold(@NotNull ChunkPos p_235952_1_) { + return false; + } + + @Override + public void createStructures(@NotNull DynamicRegistries p_242707_1_, @NotNull StructureManager p_242707_2_, @NotNull IChunk p_242707_3_, @NotNull TemplateManager p_242707_4_, long p_242707_5_) { + + } + + @Override + public void applyCarvers(long p_230350_1_, @NotNull BiomeManager p_230350_3_, @NotNull IChunk p_230350_4_, GenerationStage.@NotNull Carving p_230350_5_) { + // No caves + } + + @Override + public void fillFromNoise(@NotNull IWorld world, @NotNull StructureManager p_230352_2_, @NotNull IChunk chunk) { + ForgeSeededWorldAccess worldAccess = new ForgeSeededWorldAccess(world, seed, this); + delegate.generateChunkData(worldAccess, new FastRandom(), chunk.getPos().x, chunk.getPos().z, new ForgeChunkData(chunk)); + } + + @Override + public int getBaseHeight(int x, int z, Heightmap.@NotNull Type p_222529_3_) { + TerraWorld world = TerraForgePlugin.getInstance().getWorld(seed); + Sampler sampler = world.getConfig().getSamplerCache().getChunk(FastMath.floorDiv(x, 16), FastMath.floorDiv(z, 16)); + int cx = FastMath.floorMod(x, 16); + int cz = FastMath.floorMod(z, 16); + + int height = world.getWorld().getMaxHeight(); + + while (height >= 0 && sampler.sample(cx, height - 1, cz) < 0) { + height--; + } + + return height; + } + + @Override + public @NotNull IBlockReader getBaseColumn(int p_230348_1_, int p_230348_2_) { + int height = 64; // TODO: implementation + BlockState[] array = new BlockState[256]; + for(int y = 255; y >= 0; y--) { + if(y > height) { + if(y > getSeaLevel()) { + array[y] = Blocks.AIR.defaultBlockState(); + } else { + array[y] = Blocks.WATER.defaultBlockState(); + } + } else { + array[y] = Blocks.STONE.defaultBlockState(); + } + } + + return new Blockreader(array); + } + + + @Override + public TerraChunkGenerator getHandle() { + return delegate; + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/ForgeWorld.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/ForgeWorld.java new file mode 100644 index 000000000..c4da23628 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/ForgeWorld.java @@ -0,0 +1,127 @@ +package com.dfsek.terra.forge.world.handles; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.entity.Entity; +import com.dfsek.terra.api.platform.entity.EntityType; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; +import com.dfsek.terra.forge.world.ForgeAdapter; +import com.dfsek.terra.forge.world.block.ForgeBlock; +import com.dfsek.terra.forge.world.entity.ForgeEntity; +import com.dfsek.terra.forge.world.handles.chunk.ForgeChunk; +import com.dfsek.terra.forge.world.handles.world.ForgeWorldHandle; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IServerWorld; +import net.minecraft.world.server.ServerWorld; + +import java.io.File; +import java.util.UUID; + +public class ForgeWorld implements World, ForgeWorldHandle { + + private final Handle delegate; + + public ForgeWorld(ServerWorld world, ChunkGenerator generator) { + this.delegate = new Handle(world, generator); + } + + @Override + public long getSeed() { + return delegate.world.getSeed(); + } + + @Override + public int getMaxHeight() { + return delegate.world.getHeight(); + } + + @Override + public ChunkGenerator getGenerator() { + return delegate.generator; + } + + @Override + public String getName() { + return delegate.world.toString(); + } + + @Override + public UUID getUID() { + return null; + } + + @Override + public boolean isChunkGenerated(int x, int z) { + return false; + } + + @Override + public Chunk getChunkAt(int x, int z) { + return new ForgeChunk(delegate.world.getChunk(x, z)); + } + + @Override + public File getWorldFolder() { + return null; + } + + @Override + public Block getBlockAt(int x, int y, int z) { + BlockPos pos = new BlockPos(x, y, z); + return new ForgeBlock(pos, delegate.world); + } + + @Override + public int hashCode() { + return ((IServerWorld) delegate.world).getLevel().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof ForgeWorld)) return false; + return ((IServerWorld) ((ForgeWorld) obj).delegate.world).getLevel().equals(((IServerWorld) delegate.world).getLevel()); + } + + @Override + public Entity spawnEntity(Location location, EntityType entityType) { + net.minecraft.entity.Entity entity = ForgeAdapter.adapt(entityType).create(delegate.world); + entity.setPos(location.getX(), location.getY(), location.getZ()); + delegate.world.addFreshEntity(entity); + return new ForgeEntity(entity); + } + + @Override + public int getMinHeight() { + return 0; + } + + @Override + public Handle getHandle() { + return null; + } + + @Override + public ServerWorld getWorld() { + return delegate.getWorld(); + } + + public static final class Handle { + private final ServerWorld world; + private final ChunkGenerator generator; + + private Handle(ServerWorld world, ChunkGenerator generator) { + this.world = world; + this.generator = generator; + } + + public ChunkGenerator getGenerator() { + return generator; + } + + public ServerWorld getWorld() { + return world; + } + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/chunk/ForgeChunk.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/chunk/ForgeChunk.java new file mode 100644 index 000000000..da28514f9 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/chunk/ForgeChunk.java @@ -0,0 +1,52 @@ +package com.dfsek.terra.forge.world.handles.chunk; + +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.forge.world.block.ForgeBlockData; +import net.minecraft.util.math.BlockPos; +import org.jetbrains.annotations.NotNull; + +public class ForgeChunk implements Chunk { + private final net.minecraft.world.chunk.Chunk chunk; + + public ForgeChunk(net.minecraft.world.chunk.Chunk chunk) { + this.chunk = chunk; + } + + @Override + public int getX() { + return chunk.getPos().x; + } + + @Override + public int getZ() { + return chunk.getPos().z; + } + + @Override + public World getWorld() { + return null; + } + + @Override + public Block getBlock(int x, int y, int z) { + return null; + } + + @Override + public net.minecraft.world.chunk.Chunk getHandle() { + return chunk; + } + + @Override + public void setBlock(int x, int y, int z, @NotNull BlockData blockData) { + chunk.setBlockState(new BlockPos(x, y, z), ((ForgeBlockData) blockData).getHandle(), false); + } + + @Override + public @NotNull BlockData getBlockData(int x, int y, int z) { + return getBlock(x, y, z).getBlockData(); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/chunk/ForgeChunkWorldAccess.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/chunk/ForgeChunkWorldAccess.java new file mode 100644 index 000000000..a405910c4 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/chunk/ForgeChunkWorldAccess.java @@ -0,0 +1,60 @@ +package com.dfsek.terra.forge.world.handles.chunk; + +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.forge.world.block.ForgeBlock; +import com.dfsek.terra.forge.world.block.ForgeBlockData; +import com.dfsek.terra.forge.world.handles.world.ForgeWorldAccess; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorld; +import org.jetbrains.annotations.NotNull; + +public class ForgeChunkWorldAccess implements Chunk { + private final IWorld chunkRegion; + private final int x; + private final int z; + + public ForgeChunkWorldAccess(IWorld chunkRegion, int x, int z) { + this.chunkRegion = chunkRegion; + this.x = x << 4; + this.z = z << 4; + } + + @Override + public int getX() { + return x >> 4; + } + + @Override + public int getZ() { + return z >> 4; + } + + @Override + public World getWorld() { + return new ForgeWorldAccess(chunkRegion); + } + + @Override + public Block getBlock(int x, int y, int z) { + BlockPos pos = new BlockPos(x + this.x, y, z + this.z); + return new ForgeBlock(pos, chunkRegion); + } + + @Override + public IWorld getHandle() { + return chunkRegion; + } + + @Override + public void setBlock(int x, int y, int z, @NotNull BlockData blockData) { + chunkRegion.setBlock(new BlockPos(x + this.x, y, z + this.z), ((ForgeBlockData) blockData).getHandle(), 0); + } + + @Override + public @NotNull BlockData getBlockData(int x, int y, int z) { + return getBlock(x, y, z).getBlockData(); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeSeededWorldAccess.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeSeededWorldAccess.java new file mode 100644 index 000000000..659c7569b --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeSeededWorldAccess.java @@ -0,0 +1,133 @@ +package com.dfsek.terra.forge.world.handles.world; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.entity.Entity; +import com.dfsek.terra.api.platform.entity.EntityType; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; +import com.dfsek.terra.forge.world.ForgeAdapter; +import com.dfsek.terra.forge.world.block.ForgeBlock; +import com.dfsek.terra.forge.world.entity.ForgeEntity; +import com.dfsek.terra.forge.world.generator.ForgeChunkGenerator; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IServerWorld; +import net.minecraft.world.IWorld; +import net.minecraft.world.server.ServerWorld; + +import java.io.File; +import java.util.UUID; + +public class ForgeSeededWorldAccess implements World, ForgeWorldHandle { + + private final Handle handle; + + public ForgeSeededWorldAccess(IWorld access, long seed, net.minecraft.world.gen.ChunkGenerator generator) { + this.handle = new Handle(access, seed, generator); + } + + @Override + public long getSeed() { + return handle.getSeed(); + } + + @Override + public int getMaxHeight() { + return handle.getWorldAccess().getMaxBuildHeight(); + } + + @Override + public ChunkGenerator getGenerator() { + return new ForgeChunkGenerator(handle.getGenerator()); + } + + @Override + public String getName() { + return handle.toString(); // TODO: implementation + } + + @Override + public UUID getUID() { + return UUID.randomUUID(); // TODO: implementation + } + + @Override + public boolean isChunkGenerated(int x, int z) { + return false; + } + + @Override + public Chunk getChunkAt(int x, int z) { + return null; + } + + @Override + public File getWorldFolder() { + return null; + } + + @Override + public Block getBlockAt(int x, int y, int z) { + BlockPos pos = new BlockPos(x, y, z); + return new ForgeBlock(pos, handle.worldAccess); + } + + @Override + public Entity spawnEntity(Location location, EntityType entityType) { + net.minecraft.entity.Entity entity = ForgeAdapter.adapt(entityType).create((ServerWorld) handle.worldAccess); + entity.setPos(location.getX(), location.getY(), location.getZ()); + handle.worldAccess.addFreshEntity(entity); + return new ForgeEntity(entity); + } + + @Override + public int getMinHeight() { + return 0; + } + + @Override + public int hashCode() { + return ((IServerWorld) handle.worldAccess).getLevel().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof ForgeSeededWorldAccess)) return false; + return ((IServerWorld) ((ForgeSeededWorldAccess) obj).handle.worldAccess).getLevel().equals(((IServerWorld) handle.worldAccess).getLevel()); + } + + @Override + public Handle getHandle() { + return handle; + } + + @Override + public IWorld getWorld() { + return handle.worldAccess; + } + + public static class Handle { + private final IWorld worldAccess; + private final long seed; + private final net.minecraft.world.gen.ChunkGenerator generator; + + public Handle(IWorld worldAccess, long seed, net.minecraft.world.gen.ChunkGenerator generator) { + this.worldAccess = worldAccess; + this.seed = seed; + this.generator = generator; + } + + public net.minecraft.world.gen.ChunkGenerator getGenerator() { + return generator; + } + + public long getSeed() { + return seed; + } + + public IWorld getWorldAccess() { + return worldAccess; + } + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeWorldAccess.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeWorldAccess.java new file mode 100644 index 000000000..27176acf3 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeWorldAccess.java @@ -0,0 +1,108 @@ +package com.dfsek.terra.forge.world.handles.world; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.entity.Entity; +import com.dfsek.terra.api.platform.entity.EntityType; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; +import com.dfsek.terra.forge.world.ForgeAdapter; +import com.dfsek.terra.forge.world.block.ForgeBlock; +import com.dfsek.terra.forge.world.entity.ForgeEntity; +import com.dfsek.terra.forge.world.generator.ForgeChunkGenerator; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IServerWorld; +import net.minecraft.world.IWorld; + +import java.io.File; +import java.util.UUID; + +public class ForgeWorldAccess implements World, ForgeWorldHandle { + private final IWorld delegate; + + public ForgeWorldAccess(IWorld delegate) { + this.delegate = delegate; + } + + @Override + public long getSeed() { + return ((ISeedReader) delegate).getSeed(); + } + + @Override + public int getMaxHeight() { + return delegate.getHeight(); + } + + @Override + public ChunkGenerator getGenerator() { + return new ForgeChunkGenerator(((IServerWorld) delegate).getLevel().getChunkSource().getGenerator()); + } + + @Override + public String getName() { + return ((IServerWorld) delegate).getLevel().toString(); + } + + @Override + public UUID getUID() { + return null; + } + + @Override + public boolean isChunkGenerated(int x, int z) { + return false; + } + + @Override + public Chunk getChunkAt(int x, int z) { + return null; + } + + @Override + public File getWorldFolder() { + return null; + } + + @Override + public Block getBlockAt(int x, int y, int z) { + BlockPos pos = new BlockPos(x, y, z); + return new ForgeBlock(pos, delegate); + } + + @Override + public Entity spawnEntity(Location location, EntityType entityType) { + net.minecraft.entity.Entity entity = ForgeAdapter.adapt(entityType).create(((IServerWorld) delegate).getLevel()); + entity.setPos(location.getX(), location.getY(), location.getZ()); + delegate.addFreshEntity(entity); + return new ForgeEntity(entity); + } + + @Override + public int getMinHeight() { + return 0; + } + + @Override + public IWorld getHandle() { + return delegate; + } + + @Override + public IWorld getWorld() { + return delegate; + } + + @Override + public int hashCode() { + return ((IServerWorld) delegate).getLevel().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof ForgeWorldAccess)) return false; + return ((IServerWorld) ((ForgeWorldAccess) obj).delegate).getLevel().equals(((IServerWorld) delegate).getLevel()); + } +} diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeWorldHandle.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeWorldHandle.java new file mode 100644 index 000000000..a0790e276 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeWorldHandle.java @@ -0,0 +1,7 @@ +package com.dfsek.terra.forge.world.handles.world; + +import net.minecraft.world.IWorld; + +public interface ForgeWorldHandle { + IWorld getWorld(); +} From ee1c889d54b4d2b5d5466b93b70e0dabb63027ca Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 29 Apr 2021 21:11:26 -0700 Subject: [PATCH 30/98] world screen type --- .../dfsek/terra/forge/TerraForgePlugin.java | 147 ++++++++++-------- .../com/dfsek/terra/forge/TerraLevelType.java | 11 +- 2 files changed, 85 insertions(+), 73 deletions(-) diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java index 9a5c7c0dd..5fe372ec6 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java @@ -65,6 +65,7 @@ import net.minecraft.world.gen.placement.DecoratedPlacement; import net.minecraft.world.gen.placement.NoPlacementConfig; import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder; import net.minecraft.world.gen.surfacebuilders.SurfaceBuilderConfig; +import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.ForgeWorldTypeScreens; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.world.ForgeWorldType; @@ -72,6 +73,7 @@ import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.ForgeRegistries; @@ -84,6 +86,7 @@ import java.io.InputStream; import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; @@ -121,7 +124,7 @@ public class TerraForgePlugin implements TerraPlugin { private final WorldHandle worldHandle = new ForgeWorldHandle(); private final ConfigRegistry registry = new ConfigRegistry(); private final CheckedRegistry checkedRegistry = new CheckedRegistry<>(registry); - private final AddonRegistry addonRegistry = new AddonRegistry(new FabricAddon(this), this); + private final AddonRegistry addonRegistry = new AddonRegistry(new ForgeAddon(this), this); private final LockedRegistry addonLockedRegistry = new LockedRegistry<>(addonRegistry); private final PluginConfig config = new PluginConfig(); private final Transformer biomeFixer = new Transformer.Builder() @@ -146,13 +149,65 @@ public class TerraForgePlugin implements TerraPlugin { return pack.getTemplate().getID().toLowerCase() + "/" + biomeID.toLowerCase(Locale.ROOT); } - @SubscribeEvent public static void register(RegistryEvent.Register event) { INSTANCE.registry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> event.getRegistry().register(createBiome(biome)))); // Register all Terra biomes. } - public void setup(final FMLCommonSetupEvent event) { + @SubscribeEvent + public static void registerLevels(RegistryEvent.Register event) { + getInstance().logger.info("Registering level types..."); + event.getRegistry().register(TerraLevelType.FORGE_WORLD_TYPE); + } + + private static Biome createBiome(BiomeBuilder biome) { + BiomeTemplate template = biome.getTemplate(); + Map colors = template.getColors(); + + Biome vanilla = ((ForgeBiome) new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0)).getHandle(); + + BiomeGenerationSettings.Builder generationSettings = new BiomeGenerationSettings.Builder(); + generationSettings.surfaceBuilder(SurfaceBuilder.DEFAULT.configured(new SurfaceBuilderConfig(Blocks.GRASS_BLOCK.defaultBlockState(), Blocks.DIRT.defaultBlockState(), Blocks.GRAVEL.defaultBlockState()))); // It needs a surfacebuilder, even though we dont use it. + generationSettings.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, POPULATOR_CONFIGURED_FEATURE); + + + /* + BiomeAmbience.Builder effects = new BiomeAmbience.Builder() + .waterColor(colors.getOrDefault("water", vanilla.getSpecialEffects().waterColor)) + .waterFogColor(colors.getOrDefault("water-fog", vanilla.getSpecialEffects().waterFogColor)) + .fogColor(colors.getOrDefault("fog", vanilla.getSpecialEffects().fogColor)) + .skyColor(colors.getOrDefault("sky", vanilla.getSpecialEffects().skyColor)) + .grassColorModifier(vanilla.getSpecialEffects().grassColorModifier); + + if(colors.containsKey("grass")) { + effects.grassColorOverride(colors.get("grass")); + } else { + vanilla.getSpecialEffects().grassColor.ifPresent(effects::grassColor); + } + vanilla.getEffects().foliageColor.ifPresent(effects::foliageColor); + if(colors.containsKey("foliage")) { + effects.foliageColor(colors.get("foliage")); + } else { + vanilla.getEffects().foliageColor.ifPresent(effects::foliageColor); + } + + */ + + return new Biome.Builder() + .precipitation(vanilla.getPrecipitation()) + .biomeCategory(vanilla.getBiomeCategory()) + .depth(vanilla.getDepth()) + .scale(vanilla.getScale()) + .temperature(vanilla.getBaseTemperature()) + .downfall(vanilla.getDownfall()) + //.specialEffects(effects.build()) + .specialEffects(vanilla.getSpecialEffects()) + .mobSpawnSettings(vanilla.getMobSettings()) + .generationSettings(generationSettings.build()) + .build(); + } + + public void setup(FMLCommonSetupEvent event) { this.dataFolder = Paths.get("config", "Terra").toFile(); saveDefaultConfig(); config.load(this); @@ -171,16 +226,6 @@ public class TerraForgePlugin implements TerraPlugin { Registry.register(Registry.CHUNK_GENERATOR, new ResourceLocation("terra:terra"), ForgeChunkGeneratorWrapper.CODEC); Registry.register(Registry.BIOME_SOURCE, new ResourceLocation("terra:terra"), TerraBiomeSource.CODEC); - registry.forEach(configPack -> { - ForgeWorldType world = new ForgeWorldType(new TerraLevelType(configPack)).setRegistryName("terra", configPack.getTemplate().getID().toLowerCase(Locale.ROOT)); - ForgeWorldTypeScreens.registerFactory(world, (returnTo, dimensionGeneratorSettings) -> new Screen(world.getDisplayName()) { - @Override - protected void init() { - addButton(new Button(0, 0, 120, 20, new StringTextComponent("close"), btn -> Minecraft.getInstance().setScreen(returnTo))); - } - }); - }); - CommandManager manager = new TerraCommandManager(this); try { CommandUtil.registerAll(manager); @@ -311,51 +356,9 @@ public class TerraForgePlugin implements TerraPlugin { .registerLoader(com.dfsek.terra.api.platform.world.Biome.class, (t, o, l) -> new ForgeBiome(biomeFixer.translate((String) o))); } - private static Biome createBiome(BiomeBuilder biome) { - BiomeTemplate template = biome.getTemplate(); - Map colors = template.getColors(); - - Biome vanilla = ((ForgeBiome) new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0)).getHandle(); - - BiomeGenerationSettings.Builder generationSettings = new BiomeGenerationSettings.Builder(); - generationSettings.surfaceBuilder(SurfaceBuilder.DEFAULT.configured(new SurfaceBuilderConfig(Blocks.GRASS_BLOCK.defaultBlockState(), Blocks.DIRT.defaultBlockState(), Blocks.GRAVEL.defaultBlockState()))); // It needs a surfacebuilder, even though we dont use it. - generationSettings.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, POPULATOR_CONFIGURED_FEATURE); - - - /* - BiomeAmbience.Builder effects = new BiomeAmbience.Builder() - .waterColor(colors.getOrDefault("water", vanilla.getSpecialEffects().waterColor)) - .waterFogColor(colors.getOrDefault("water-fog", vanilla.getSpecialEffects().waterFogColor)) - .fogColor(colors.getOrDefault("fog", vanilla.getSpecialEffects().fogColor)) - .skyColor(colors.getOrDefault("sky", vanilla.getSpecialEffects().skyColor)) - .grassColorModifier(vanilla.getSpecialEffects().grassColorModifier); - - if(colors.containsKey("grass")) { - effects.grassColorOverride(colors.get("grass")); - } else { - vanilla.getSpecialEffects().grassColor.ifPresent(effects::grassColor); - } - vanilla.getEffects().foliageColor.ifPresent(effects::foliageColor); - if(colors.containsKey("foliage")) { - effects.foliageColor(colors.get("foliage")); - } else { - vanilla.getEffects().foliageColor.ifPresent(effects::foliageColor); - } - - */ - - return new Biome.Builder() - .precipitation(vanilla.getPrecipitation()) - .biomeCategory(vanilla.getBiomeCategory()) - .depth(vanilla.getDepth()) - .scale(vanilla.getScale()) - .temperature(vanilla.getBaseTemperature()) - .downfall(vanilla.getDownfall()) - //.specialEffects(effects.build()) - .specialEffects(vanilla.getSpecialEffects()) - .mobSpawnSettings(vanilla.getMobSettings()) - .generationSettings(generationSettings.build()) - .build(); + @Override + public EventManager getEventManager() { + return eventManager; } /* @@ -390,25 +393,35 @@ public class TerraForgePlugin implements TerraPlugin { */ - - @Override - public EventManager getEventManager() { - return eventManager; - } - @Override public Profiler getProfiler() { return profiler; } - @Addon("Terra-Fabric") + @Mod.EventBusSubscriber(value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) + public static final class ClientEvents { + @SubscribeEvent + public static void register(FMLClientSetupEvent event) { + getInstance().logger.info("Client setup..."); + + ForgeWorldType world = TerraLevelType.FORGE_WORLD_TYPE; + ForgeWorldTypeScreens.registerFactory(world, (returnTo, dimensionGeneratorSettings) -> new Screen(world.getDisplayName()) { + @Override + protected void init() { + addButton(new Button(0, 0, 120, 20, new StringTextComponent("close"), btn -> Minecraft.getInstance().setScreen(returnTo))); + } + }); + } + } + + @Addon("Terra-Forge") @Author("Terra") @Version("1.0.0") - private static final class FabricAddon extends TerraAddon implements EventListener { + private static final class ForgeAddon extends TerraAddon implements EventListener { private final TerraPlugin main; - private FabricAddon(TerraPlugin main) { + private ForgeAddon(TerraPlugin main) { this.main = main; } diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraLevelType.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraLevelType.java index 1dd456ad9..de6b4d2c9 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraLevelType.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraLevelType.java @@ -3,6 +3,7 @@ package com.dfsek.terra.forge; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.forge.world.TerraBiomeSource; import com.dfsek.terra.forge.world.generator.ForgeChunkGeneratorWrapper; +import jdk.nashorn.internal.runtime.regexp.joni.Config; import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.ChunkGenerator; @@ -10,14 +11,12 @@ import net.minecraft.world.gen.DimensionSettings; import net.minecraftforge.common.world.ForgeWorldType; public class TerraLevelType implements ForgeWorldType.IChunkGeneratorFactory { - private final ConfigPack pack; - - public TerraLevelType(ConfigPack pack) { - this.pack = pack; - } - + public static final TerraLevelType TERRA_LEVEL_TYPE = new TerraLevelType(); + public static final ForgeWorldType FORGE_WORLD_TYPE = new ForgeWorldType(TERRA_LEVEL_TYPE).setRegistryName("terra", "world"); @Override public ChunkGenerator createChunkGenerator(Registry biomeRegistry, Registry dimensionSettingsRegistry, long seed, String generatorSettings) { + ConfigPack pack = TerraForgePlugin.getInstance().getConfigRegistry().get("DEFAULT"); + TerraForgePlugin.getInstance().logger().info("Creating generator for config pack " + pack.getTemplate().getID()); return new ForgeChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, seed, pack), seed, pack); } } From 756619edb62cb23558c48b27fa2bbed5190ebc4c Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 29 Apr 2021 21:48:32 -0700 Subject: [PATCH 31/98] Forge actually loads to worlds now --- .../dfsek/terra/forge/TerraForgePlugin.java | 27 +++++++++++-------- .../com/dfsek/terra/forge/TerraLevelType.java | 2 ++ .../terra/forge/world/TerraBiomeSource.java | 1 - .../forge/world/block/ForgeBlockData.java | 1 + 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java index 5fe372ec6..10a609096 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java @@ -53,11 +53,13 @@ import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.button.Button; import net.minecraft.util.ResourceLocation; import net.minecraft.util.registry.Registry; +import net.minecraft.util.registry.WorldSettingsImport; import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeGenerationSettings; import net.minecraft.world.gen.GenerationStage; import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.Feature; import net.minecraft.world.gen.feature.Features; import net.minecraft.world.gen.feature.IFeatureConfig; import net.minecraft.world.gen.feature.NoFeatureConfig; @@ -93,7 +95,7 @@ import java.util.Map; @Mod("terra") @Mod.EventBusSubscriber(modid = "terra", bus = Mod.EventBusSubscriber.Bus.MOD) public class TerraForgePlugin implements TerraPlugin { - public static final PopulatorFeature POPULATOR_FEATURE = new PopulatorFeature(NoFeatureConfig.CODEC); + public static final PopulatorFeature POPULATOR_FEATURE = (PopulatorFeature) new PopulatorFeature(NoFeatureConfig.CODEC).setRegistryName("terra", "terra"); public static final ConfiguredFeature POPULATOR_CONFIGURED_FEATURE = POPULATOR_FEATURE.configured(IFeatureConfig.NONE).decorated(DecoratedPlacement.NOPE.configured(NoPlacementConfig.INSTANCE)); private static TerraForgePlugin INSTANCE; @@ -135,10 +137,6 @@ public class TerraForgePlugin implements TerraPlugin { public TerraForgePlugin() { if(INSTANCE != null) throw new IllegalStateException("Only one TerraPlugin instance may exist."); INSTANCE = this; - IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); - modEventBus.addListener(this::setup); - - MinecraftForge.EVENT_BUS.register(this); } public static TerraForgePlugin getInstance() { @@ -151,7 +149,12 @@ public class TerraForgePlugin implements TerraPlugin { @SubscribeEvent public static void register(RegistryEvent.Register event) { - INSTANCE.registry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> event.getRegistry().register(createBiome(biome)))); // Register all Terra biomes. + INSTANCE.setup(); // Setup now because we need the biomes, and this event happens after blocks n stuff + INSTANCE.registry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> { + Biome minecraftBiome = createBiome(biome); + INSTANCE.logger().info("Registering biome " + minecraftBiome.getRegistryName()); + event.getRegistry().register(minecraftBiome); + })); // Register all Terra biomes. } @SubscribeEvent @@ -160,6 +163,11 @@ public class TerraForgePlugin implements TerraPlugin { event.getRegistry().register(TerraLevelType.FORGE_WORLD_TYPE); } + @SubscribeEvent + public static void registerPop(RegistryEvent.Register> event) { + event.getRegistry().register(POPULATOR_FEATURE); + } + private static Biome createBiome(BiomeBuilder biome) { BiomeTemplate template = biome.getTemplate(); Map colors = template.getColors(); @@ -204,10 +212,10 @@ public class TerraForgePlugin implements TerraPlugin { .specialEffects(vanilla.getSpecialEffects()) .mobSpawnSettings(vanilla.getMobSettings()) .generationSettings(generationSettings.build()) - .build(); + .build().setRegistryName("terra", createBiomeID(template.getPack(), template.getID())); } - public void setup(FMLCommonSetupEvent event) { + public void setup() { this.dataFolder = Paths.get("config", "Terra").toFile(); saveDefaultConfig(); config.load(this); @@ -223,9 +231,6 @@ public class TerraForgePlugin implements TerraPlugin { logger.info("Loaded packs."); - Registry.register(Registry.CHUNK_GENERATOR, new ResourceLocation("terra:terra"), ForgeChunkGeneratorWrapper.CODEC); - Registry.register(Registry.BIOME_SOURCE, new ResourceLocation("terra:terra"), TerraBiomeSource.CODEC); - CommandManager manager = new TerraCommandManager(this); try { CommandUtil.registerAll(manager); diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraLevelType.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraLevelType.java index de6b4d2c9..852dfeb56 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraLevelType.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraLevelType.java @@ -9,6 +9,8 @@ import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.ChunkGenerator; import net.minecraft.world.gen.DimensionSettings; import net.minecraftforge.common.world.ForgeWorldType; +import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.registries.ForgeRegistries; public class TerraLevelType implements ForgeWorldType.IChunkGeneratorFactory { public static final TerraLevelType TERRA_LEVEL_TYPE = new TerraLevelType(); diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/TerraBiomeSource.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/TerraBiomeSource.java index 5edb03e61..5f87a10b1 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/TerraBiomeSource.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/TerraBiomeSource.java @@ -10,7 +10,6 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryLookupCodec; import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.StructureFeature; import org.jetbrains.annotations.NotNull; import java.util.Objects; diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlockData.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlockData.java index 7faa39e76..f1107f71a 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlockData.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlockData.java @@ -34,6 +34,7 @@ public class ForgeBlockData implements BlockData { @Override public String getAsString() { + /* StringBuilder data = new StringBuilder(Registry.BLOCK.getId(delegate.getBlock()).toString()); if(!delegate.getProperties().isEmpty()) { From c67817b9d2083a928860ccc72a264de0cbfa4ed1 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 29 Apr 2021 22:00:40 -0700 Subject: [PATCH 32/98] fix structure issues --- .../forge/world/block/ForgeBlockData.java | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlockData.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlockData.java index f1107f71a..1a4ddb4b5 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlockData.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/ForgeBlockData.java @@ -5,8 +5,32 @@ import com.dfsek.terra.api.platform.block.BlockType; import com.dfsek.terra.forge.world.ForgeAdapter; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.state.Property; +import net.minecraftforge.registries.ForgeRegistries; + +import javax.annotation.Nullable; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; public class ForgeBlockData implements BlockData { + private static final Function, Comparable>, String> PROPERTY_MAPPER = new Function, Comparable>, String>() { + public String apply(@Nullable Map.Entry, Comparable> entry) { + if (entry == null) { + return ""; + } else { + Property property = entry.getKey(); + return property.getName() + "=" + this.getName(property, entry.getValue()); + } + } + + @SuppressWarnings("unchecked") + private > String getName(Property property, Comparable comparable) { + return property.getName((T)comparable); + } + }; + protected BlockState delegate; public ForgeBlockData(BlockState delegate) { @@ -34,18 +58,13 @@ public class ForgeBlockData implements BlockData { @Override public String getAsString() { - - /* - StringBuilder data = new StringBuilder(Registry.BLOCK.getId(delegate.getBlock()).toString()); + StringBuilder data = new StringBuilder(Objects.requireNonNull(ForgeRegistries.BLOCKS.getKey(delegate.getBlock())).toString()); if(!delegate.getProperties().isEmpty()) { data.append('['); - data.append(delegate.getProperties().stream().map(State.PROPERTY_MAP_PRINTER).collect(Collectors.joining(","))); + data.append(delegate.getValues().entrySet().stream().map(PROPERTY_MAPPER).collect(Collectors.joining(","))); data.append(']'); } return data.toString(); - - */ - throw new UnsupportedOperationException("TODO: implement this"); // TODO } @Override From 3561e5f30fd90fcece85c2ff30b3a56416a15926 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 29 Apr 2021 23:19:49 -0700 Subject: [PATCH 33/98] commands on Forge --- .../dfsek/terra/forge/TerraForgePlugin.java | 175 ++++++++++-------- .../generator/config}/TerraLevelType.java | 8 +- 2 files changed, 104 insertions(+), 79 deletions(-) rename platforms/forge/src/main/java/com/dfsek/terra/forge/{ => world/generator/config}/TerraLevelType.java (85%) diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java index 10a609096..2f40a4c67 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java @@ -8,6 +8,7 @@ import com.dfsek.terra.api.addons.annotations.Author; import com.dfsek.terra.api.addons.annotations.Version; import com.dfsek.terra.api.command.CommandManager; import com.dfsek.terra.api.command.TerraCommandManager; +import com.dfsek.terra.api.command.exception.CommandException; import com.dfsek.terra.api.command.exception.MalformedCommandException; import com.dfsek.terra.api.event.EventListener; import com.dfsek.terra.api.event.EventManager; @@ -15,6 +16,7 @@ import com.dfsek.terra.api.event.TerraEventManager; import com.dfsek.terra.api.event.annotations.Global; import com.dfsek.terra.api.event.annotations.Priority; import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent; +import com.dfsek.terra.api.platform.CommandSender; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.handle.WorldHandle; @@ -25,6 +27,7 @@ import com.dfsek.terra.api.registry.LockedRegistry; import com.dfsek.terra.api.transform.NotNullValidator; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.api.util.logging.DebugLogger; +import com.dfsek.terra.api.util.mutable.MutableInteger; import com.dfsek.terra.commands.CommandUtil; import com.dfsek.terra.config.GenericLoaders; import com.dfsek.terra.config.PluginConfig; @@ -34,26 +37,29 @@ import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.forge.inventory.ForgeItemHandle; +import com.dfsek.terra.forge.world.ForgeAdapter; import com.dfsek.terra.forge.world.ForgeBiome; import com.dfsek.terra.forge.world.ForgeTree; import com.dfsek.terra.forge.world.ForgeWorldHandle; -import com.dfsek.terra.forge.world.TerraBiomeSource; import com.dfsek.terra.forge.world.features.PopulatorFeature; import com.dfsek.terra.forge.world.generator.ForgeChunkGenerator; import com.dfsek.terra.forge.world.generator.ForgeChunkGeneratorWrapper; +import com.dfsek.terra.forge.world.generator.config.TerraLevelType; import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.profiler.ProfilerImpl; import com.dfsek.terra.registry.exception.DuplicateEntryException; import com.dfsek.terra.registry.master.AddonRegistry; import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.world.TerraWorld; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.mojang.brigadier.builder.RequiredArgumentBuilder; import net.minecraft.block.Blocks; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.button.Button; +import net.minecraft.command.CommandSource; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.registry.Registry; -import net.minecraft.util.registry.WorldSettingsImport; import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeGenerationSettings; @@ -71,13 +77,11 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.ForgeWorldTypeScreens; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.world.ForgeWorldType; +import net.minecraftforge.event.RegisterCommandsEvent; import net.minecraftforge.event.RegistryEvent; -import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.ForgeRegistries; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; @@ -87,10 +91,15 @@ import java.io.IOException; import java.io.InputStream; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.function.Consumer; + +import static com.mojang.brigadier.builder.LiteralArgumentBuilder.literal; +import static com.mojang.brigadier.builder.RequiredArgumentBuilder.argument; @Mod("terra") @Mod.EventBusSubscriber(modid = "terra", bus = Mod.EventBusSubscriber.Bus.MOD) @@ -103,6 +112,9 @@ public class TerraForgePlugin implements TerraPlugin { private final EventManager eventManager = new TerraEventManager(this); private final GenericLoaders genericLoaders = new GenericLoaders(this); private final Profiler profiler = new ProfilerImpl(); + + private final CommandManager manager = new TerraCommandManager(this); + private final com.dfsek.terra.api.util.logging.Logger logger = new com.dfsek.terra.api.util.logging.Logger() { private final org.apache.logging.log4j.Logger logger = LogManager.getLogger(); @@ -137,6 +149,9 @@ public class TerraForgePlugin implements TerraPlugin { public TerraForgePlugin() { if(INSTANCE != null) throw new IllegalStateException("Only one TerraPlugin instance may exist."); INSTANCE = this; + MinecraftForge.EVENT_BUS.register(ClientEvents.class); + MinecraftForge.EVENT_BUS.register(getClass()); + MinecraftForge.EVENT_BUS.register(ForgeEvents.class); } public static TerraForgePlugin getInstance() { @@ -147,11 +162,40 @@ public class TerraForgePlugin implements TerraPlugin { return pack.getTemplate().getID().toLowerCase() + "/" + biomeID.toLowerCase(Locale.ROOT); } + private static RequiredArgumentBuilder assemble(RequiredArgumentBuilder in, CommandManager manager) { + return in.suggests((context, builder) -> { + List args = parseCommand(context.getInput()); + CommandSender sender = ForgeAdapter.adapt(context.getSource()); + try { + manager.tabComplete(args.remove(0), sender, args).forEach(builder::suggest); + } catch(CommandException e) { + sender.sendMessage(e.getMessage()); + } + return builder.buildFuture(); + }).executes(context -> { + List args = parseCommand(context.getInput()); + try { + manager.execute(args.remove(0), ForgeAdapter.adapt(context.getSource()), args); + } catch(CommandException e) { + context.getSource().sendFailure(new StringTextComponent(e.getMessage())); + } + return 1; + }); + } + + private static List parseCommand(String command) { + if(command.startsWith("/terra ")) command = command.substring("/terra ".length()); + else if(command.startsWith("/te ")) command = command.substring("/te ".length()); + List c = new ArrayList<>(Arrays.asList(command.split(" "))); + if(command.endsWith(" ")) c.add(""); + return c; + } + @SubscribeEvent public static void register(RegistryEvent.Register event) { INSTANCE.setup(); // Setup now because we need the biomes, and this event happens after blocks n stuff - INSTANCE.registry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> { - Biome minecraftBiome = createBiome(biome); + INSTANCE.getConfigRegistry().forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> { + Biome minecraftBiome = INSTANCE.createBiome(biome); INSTANCE.logger().info("Registering biome " + minecraftBiome.getRegistryName()); event.getRegistry().register(minecraftBiome); })); // Register all Terra biomes. @@ -159,7 +203,7 @@ public class TerraForgePlugin implements TerraPlugin { @SubscribeEvent public static void registerLevels(RegistryEvent.Register event) { - getInstance().logger.info("Registering level types..."); + INSTANCE.logger().info("Registering level types..."); event.getRegistry().register(TerraLevelType.FORGE_WORLD_TYPE); } @@ -168,9 +212,9 @@ public class TerraForgePlugin implements TerraPlugin { event.getRegistry().register(POPULATOR_FEATURE); } - private static Biome createBiome(BiomeBuilder biome) { + public Biome createBiome(BiomeBuilder biome) { BiomeTemplate template = biome.getTemplate(); - Map colors = template.getColors(); + //Map colors = template.getColors(); Biome vanilla = ((ForgeBiome) new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0)).getHandle(); @@ -231,31 +275,12 @@ public class TerraForgePlugin implements TerraPlugin { logger.info("Loaded packs."); - CommandManager manager = new TerraCommandManager(this); + try { CommandUtil.registerAll(manager); } catch(MalformedCommandException e) { e.printStackTrace(); // TODO do something here even though this should literally never happen } - - - /* - CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> { - int max = manager.getMaxArgumentDepth(); - RequiredArgumentBuilder arg = argument("arg" + (max - 1), StringArgumentType.word()); - for(int i = 0; i < max; i++) { - RequiredArgumentBuilder next = argument("arg" + (max - i - 1), StringArgumentType.word()); - - arg = next.then(assemble(arg, manager)); - } - - dispatcher.register(literal("terra").executes(context -> 1).then(assemble(arg, manager))); - dispatcher.register(literal("te").executes(context -> 1).then(assemble(arg, manager))); - //dispatcher.register(literal("te").redirect(root)); - } - ); - - */ } @Override @@ -345,7 +370,7 @@ public class TerraForgePlugin implements TerraPlugin { @Override public String platformName() { - return "Fabric"; + return "Forge"; } @Override @@ -366,56 +391,27 @@ public class TerraForgePlugin implements TerraPlugin { return eventManager; } - /* - private RequiredArgumentBuilder assemble(RequiredArgumentBuilder in, CommandManager manager) { - return in.suggests((context, builder) -> { - List args = parseCommand(context.getInput()); - CommandSender sender = FabricAdapter.adapt(context.getSource()); - try { - manager.tabComplete(args.remove(0), sender, args).forEach(builder::suggest); - } catch(CommandException e) { - sender.sendMessage(e.getMessage()); - } - return builder.buildFuture(); - }).executes(context -> { - List args = parseCommand(context.getInput()); - try { - manager.execute(args.remove(0), FabricAdapter.adapt(context.getSource()), args); - } catch(CommandException e) { - context.getSource().sendError(new LiteralText(e.getMessage())); - } - return 1; - }); - } - - private List parseCommand(String command) { - if(command.startsWith("/terra ")) command = command.substring("/terra ".length()); - else if(command.startsWith("/te ")) command = command.substring("/te ".length()); - List c = new ArrayList<>(Arrays.asList(command.split(" "))); - if(command.endsWith(" ")) c.add(""); - return c; - } - - */ - @Override public Profiler getProfiler() { return profiler; } - @Mod.EventBusSubscriber(value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) - public static final class ClientEvents { + @Mod.EventBusSubscriber(modid = "terra", bus = Mod.EventBusSubscriber.Bus.FORGE) + public static final class ForgeEvents { + @SuppressWarnings({"unchecked", "rawtypes"}) @SubscribeEvent - public static void register(FMLClientSetupEvent event) { - getInstance().logger.info("Client setup..."); + public static void registerCommands(RegisterCommandsEvent event) { + int max = INSTANCE.manager.getMaxArgumentDepth(); + RequiredArgumentBuilder arg = argument("arg" + (max - 1), StringArgumentType.word()); + for(int i = 0; i < max; i++) { + RequiredArgumentBuilder next = argument("arg" + (max - i - 1), StringArgumentType.word()); - ForgeWorldType world = TerraLevelType.FORGE_WORLD_TYPE; - ForgeWorldTypeScreens.registerFactory(world, (returnTo, dimensionGeneratorSettings) -> new Screen(world.getDisplayName()) { - @Override - protected void init() { - addButton(new Button(0, 0, 120, 20, new StringTextComponent("close"), btn -> Minecraft.getInstance().setScreen(returnTo))); - } - }); + arg = next.then(assemble(arg, INSTANCE.manager)); + } + + event.getDispatcher().register(literal("terra").executes(context -> 1).then((ArgumentBuilder) assemble(arg, INSTANCE.manager))); + event.getDispatcher().register(literal("te").executes(context -> 1).then((ArgumentBuilder) assemble(arg, INSTANCE.manager))); + //dispatcher.register(literal("te").redirect(root)); } } @@ -468,4 +464,33 @@ public class TerraForgePlugin implements TerraPlugin { } } } + + @Mod.EventBusSubscriber(value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) + public static final class ClientEvents { + @SubscribeEvent + public static void register(FMLClientSetupEvent event) { + INSTANCE.logger.info("Client setup..."); + + ForgeWorldType world = TerraLevelType.FORGE_WORLD_TYPE; + ForgeWorldTypeScreens.registerFactory(world, (returnTo, dimensionGeneratorSettings) -> new Screen(world.getDisplayName()) { + private final MutableInteger num = new MutableInteger(0); + private final List packs = new ArrayList<>(); + private final Button toggle = new Button(0, 25, 120, 20, new StringTextComponent(""), button -> { + num.increment(); + if(num.get() >= packs.size()) num.set(0); + button.setMessage(new StringTextComponent("Pack: " + packs.get(num.get()).getTemplate().getID())); + }); + + @Override + protected void init() { + packs.clear(); + INSTANCE.registry.forEach((Consumer) packs::add); + addButton(new Button(0, 0, 120, 20, new StringTextComponent("Close"), btn -> Minecraft.getInstance().setScreen(returnTo))); + toggle.setMessage(new StringTextComponent("Pack: " + packs.get(num.get()).getTemplate().getID())); + addButton(toggle); + } + }); + } + } + } diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraLevelType.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/generator/config/TerraLevelType.java similarity index 85% rename from platforms/forge/src/main/java/com/dfsek/terra/forge/TerraLevelType.java rename to platforms/forge/src/main/java/com/dfsek/terra/forge/world/generator/config/TerraLevelType.java index 852dfeb56..2d8503af7 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraLevelType.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/generator/config/TerraLevelType.java @@ -1,22 +1,22 @@ -package com.dfsek.terra.forge; +package com.dfsek.terra.forge.world.generator.config; import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.forge.TerraForgePlugin; import com.dfsek.terra.forge.world.TerraBiomeSource; import com.dfsek.terra.forge.world.generator.ForgeChunkGeneratorWrapper; -import jdk.nashorn.internal.runtime.regexp.joni.Config; import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.ChunkGenerator; import net.minecraft.world.gen.DimensionSettings; import net.minecraftforge.common.world.ForgeWorldType; -import net.minecraftforge.fml.common.registry.GameRegistry; -import net.minecraftforge.registries.ForgeRegistries; public class TerraLevelType implements ForgeWorldType.IChunkGeneratorFactory { public static final TerraLevelType TERRA_LEVEL_TYPE = new TerraLevelType(); public static final ForgeWorldType FORGE_WORLD_TYPE = new ForgeWorldType(TERRA_LEVEL_TYPE).setRegistryName("terra", "world"); @Override public ChunkGenerator createChunkGenerator(Registry biomeRegistry, Registry dimensionSettingsRegistry, long seed, String generatorSettings) { + System.out.println(generatorSettings); + dimensionSettingsRegistry.forEach(System.out::println); ConfigPack pack = TerraForgePlugin.getInstance().getConfigRegistry().get("DEFAULT"); TerraForgePlugin.getInstance().logger().info("Creating generator for config pack " + pack.getTemplate().getID()); return new ForgeChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, seed, pack), seed, pack); From f81ccee02026109c0ed93aa1f8627e1478d6ffd6 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 29 Apr 2021 23:31:03 -0700 Subject: [PATCH 34/98] cleanup --- .../fabric/command/FabricCommandAdapter.java | 7 ------- .../fabric/command/StringListArgumentType.java | 17 ----------------- 2 files changed, 24 deletions(-) delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/command/FabricCommandAdapter.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/command/StringListArgumentType.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/command/FabricCommandAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/command/FabricCommandAdapter.java deleted file mode 100644 index a8db1bb54..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/command/FabricCommandAdapter.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.dfsek.terra.fabric.command; - -public class FabricCommandAdapter { - public static void register() { - - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/command/StringListArgumentType.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/command/StringListArgumentType.java deleted file mode 100644 index 392aaf1af..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/command/StringListArgumentType.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.dfsek.terra.fabric.command; - -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.arguments.ArgumentType; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class StringListArgumentType implements ArgumentType> { - @Override - public List parse(StringReader reader) { - final String text = reader.getRemaining(); - reader.setCursor(reader.getTotalLength()); - return new ArrayList<>(Arrays.asList(text.split(" "))); - } -} From 762b248641714470d975680432ecde595f6c2bbf Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 29 Apr 2021 23:42:56 -0700 Subject: [PATCH 35/98] update to latest Tectonic --- common/build.gradle.kts | 2 +- .../com/dfsek/terra/config/fileloaders/Loader.java | 9 +++++++-- .../dfsek/terra/config/fileloaders/ZIPLoader.java | 2 +- .../com/dfsek/terra/config/pack/ConfigPack.java | 14 +++++++------- .../com/dfsek/terra/registry/OpenRegistry.java | 4 +++- .../dfsek/terra/registry/config/FloraRegistry.java | 6 ------ 6 files changed, 19 insertions(+), 18 deletions(-) diff --git a/common/build.gradle.kts b/common/build.gradle.kts index ec58b60e9..ef4e40978 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -14,7 +14,7 @@ dependencies { "shadedApi"("commons-io:commons-io:2.4") "shadedApi"("com.dfsek:Paralithic:0.3.2") - "shadedApi"("com.dfsek:Tectonic:1.2.3") + "shadedApi"("com.dfsek:Tectonic:1.3.1") "shadedApi"("net.jafama:jafama:2.3.2") "shadedApi"("org.yaml:snakeyaml:1.27") "shadedApi"("org.ow2.asm:asm:9.0") diff --git a/common/src/main/java/com/dfsek/terra/config/fileloaders/Loader.java b/common/src/main/java/com/dfsek/terra/config/fileloaders/Loader.java index b6d2a4b8a..c4b0bf6c7 100644 --- a/common/src/main/java/com/dfsek/terra/config/fileloaders/Loader.java +++ b/common/src/main/java/com/dfsek/terra/config/fileloaders/Loader.java @@ -1,5 +1,6 @@ package com.dfsek.terra.config.fileloaders; +import com.dfsek.tectonic.config.Configuration; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.terra.api.util.GlueList; @@ -18,8 +19,12 @@ public abstract class Loader { * * @param consumer Something to do with the streams. */ - public Loader then(ExceptionalConsumer> consumer) throws ConfigException { - consumer.accept(new GlueList<>(streams.values())); + public Loader then(ExceptionalConsumer> consumer) throws ConfigException { + List list = new GlueList<>(); + streams.forEach((id, stream) -> { + list.add(new Configuration(stream, id)); + }); + consumer.accept(list); return this; } diff --git a/common/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java b/common/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java index d10449a37..8c94af81a 100644 --- a/common/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java @@ -30,7 +30,7 @@ public class ZIPLoader extends Loader { ZipEntry entry = entries.nextElement(); if(!entry.isDirectory() && entry.getName().startsWith(directory) && entry.getName().endsWith(extension)) { try { - String rel = entry.getName().substring(directory.length() + 1); + String rel = entry.getName().substring(directory.length()); streams.put(rel, file.getInputStream(entry)); } catch(IOException e) { e.printStackTrace(); diff --git a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java index abfeb2266..02772f633 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java @@ -237,13 +237,13 @@ public class ConfigPack implements LoaderRegistrar { }).close(); loader - .open("carving", ".yml").then(streams -> buildAll(new CarverFactory(this), carverRegistry, abstractConfigLoader.load(streams, CarverTemplate::new), main)).close() - .open("palettes", ".yml").then(streams -> buildAll(new PaletteFactory(), paletteRegistry, abstractConfigLoader.load(streams, PaletteTemplate::new), main)).close() - .open("ores", ".yml").then(streams -> buildAll(new OreFactory(), oreRegistry, abstractConfigLoader.load(streams, OreTemplate::new), main)).close() - .open("structures/trees", ".yml").then(streams -> buildAll(new TreeFactory(), treeRegistry, abstractConfigLoader.load(streams, TreeTemplate::new), main)).close() - .open("structures/structures", ".yml").then(streams -> buildAll(new StructureFactory(), structureRegistry, abstractConfigLoader.load(streams, StructureTemplate::new), main)).close() - .open("flora", ".yml").then(streams -> buildAll(new FloraFactory(), floraRegistry, abstractConfigLoader.load(streams, FloraTemplate::new), main)).close() - .open("biomes", ".yml").then(streams -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.load(streams, () -> new BiomeTemplate(this, main)), main)).close(); + .open("carving", ".yml").then(configs -> buildAll(new CarverFactory(this), carverRegistry, abstractConfigLoader.loadConfigs(configs, CarverTemplate::new), main)).close() + .open("palettes", ".yml").then(configs -> buildAll(new PaletteFactory(), paletteRegistry, abstractConfigLoader.loadConfigs(configs, PaletteTemplate::new), main)).close() + .open("ores", ".yml").then(configs -> buildAll(new OreFactory(), oreRegistry, abstractConfigLoader.loadConfigs(configs, OreTemplate::new), main)).close() + .open("structures/trees", ".yml").then(configs -> buildAll(new TreeFactory(), treeRegistry, abstractConfigLoader.loadConfigs(configs, TreeTemplate::new), main)).close() + .open("structures/structures", ".yml").then(configs -> buildAll(new StructureFactory(), structureRegistry, abstractConfigLoader.loadConfigs(configs, StructureTemplate::new), main)).close() + .open("flora", ".yml").then(configs -> buildAll(new FloraFactory(), floraRegistry, abstractConfigLoader.loadConfigs(configs, FloraTemplate::new), main)).close() + .open("biomes", ".yml").then(configs -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.loadConfigs(configs, () -> new BiomeTemplate(this, main)), main)).close(); main.getEventManager().callEvent(new ConfigPackPostLoadEvent(this)); main.logger().info("Loaded config pack \"" + template.getID() + "\" v" + template.getVersion() + " by " + template.getAuthor() + " in " + (System.nanoTime() - start) / 1000000D + "ms."); diff --git a/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java b/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java index 597b5f607..6f4c179f0 100644 --- a/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/OpenRegistry.java @@ -65,7 +65,9 @@ public class OpenRegistry implements Registry { @Override public T get(String identifier) { - return objects.get(identifier).getValue(); + Entry entry = objects.get(identifier); + if(entry == null) return null; + return entry.getValue(); } @Override diff --git a/common/src/main/java/com/dfsek/terra/registry/config/FloraRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/FloraRegistry.java index 878890bff..65858b8ad 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/FloraRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/FloraRegistry.java @@ -68,10 +68,4 @@ public class FloraRegistry extends OpenRegistry { private BlockData data(String s) { return main.getWorldHandle().createBlockData(s); } - - - @Override - public Flora get(String identifier) { - return super.get(identifier); - } } From e493825ab7857aa052499ccd8fe1df69e8f55c34 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 30 Apr 2021 09:25:56 -0700 Subject: [PATCH 36/98] bump version --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index ca6752c10..10619408a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ import com.dfsek.terra.getGitHash -val versionObj = Version("5", "2", "0", true) +val versionObj = Version("5", "2", "1", true) allprojects { version = versionObj From 02870805c7fad00944a4604f509f1b90379cffd7 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 30 Apr 2021 09:35:15 -0700 Subject: [PATCH 37/98] hoist calculations in chunk generator --- .../generation/generators/DefaultChunkGenerator3D.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java index 76501b1a9..01ddbe380 100644 --- a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java +++ b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java @@ -103,9 +103,10 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator { @Override @SuppressWarnings({"try"}) public ChunkData generateChunkData(@NotNull World world, Random random, int chunkX, int chunkZ, ChunkData chunk) { - TerraWorld tw = main.getWorld(world); - BiomeProvider grid = tw.getBiomeProvider(); try(ProfileFrame ignore = main.getProfiler().profile("chunk_base_3d")) { + TerraWorld tw = main.getWorld(world); + BiomeProvider grid = tw.getBiomeProvider(); + if(!tw.isSafe()) return chunk; int xOrig = (chunkX << 4); int zOrig = (chunkZ << 4); @@ -119,7 +120,7 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator { int cx = xOrig + x; int cz = zOrig + z; - TerraBiome b = grid.getBiome(xOrig + x, zOrig + z); + TerraBiome b = grid.getBiome(cx, cz); BiomeTemplate c = ((UserDefinedBiome) b).getConfig(); int sea = c.getSeaLevel(); From aa9e33af1dfbd47159fab75cb6eb556857ea0b26 Mon Sep 17 00:00:00 2001 From: solonovamax Date: Sat, 1 May 2021 16:45:52 -0400 Subject: [PATCH 38/98] Remove old and deprecated `compile` configuration + some minor refactoring Signed-off-by: solonovamax --- buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt | 4 ---- buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt | 3 +++ buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt | 4 +++- common/build.gradle.kts | 1 - 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt index 2a20247ec..3f10dc573 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt @@ -7,10 +7,6 @@ import org.gradle.kotlin.dsl.withType import java.io.ByteArrayOutputStream fun Project.configureCommon() { - apply(plugin = "java-library") - apply(plugin = "maven-publish") - apply(plugin = "idea") - configureDependencies() configureCompilation() configureDistribution() diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt index d94c7380f..1c50177dc 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt @@ -10,6 +10,9 @@ import org.gradle.kotlin.dsl.* import org.gradle.language.jvm.tasks.ProcessResources fun Project.configureCompilation() { + apply(plugin = "maven-publish") + apply(plugin = "idea") + configure { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt index 748bc6e0a..a73154b3f 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt @@ -1,15 +1,17 @@ package com.dfsek.terra import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.invoke import org.gradle.kotlin.dsl.repositories fun Project.configureDependencies() { + apply(plugin = "java") + apply(plugin = "java-library") configurations { val shaded = create("shaded") - getByName("compile").extendsFrom(shaded) val shadedApi = create("shadedApi") shaded.extendsFrom(shadedApi) getByName("api").extendsFrom(shadedApi) diff --git a/common/build.gradle.kts b/common/build.gradle.kts index a1a6fcd8b..e41d28497 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -1,4 +1,3 @@ -import com.dfsek.terra.configureCommon import com.dfsek.terra.configureCompilation import com.dfsek.terra.configureDependencies From 2d41dd8f082c2219ea6f0536f66b872cb6d08064 Mon Sep 17 00:00:00 2001 From: solonovamax Date: Sat, 1 May 2021 16:49:16 -0400 Subject: [PATCH 39/98] Don't use all cores processors for tests Signed-off-by: solonovamax --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index c9cdc4361..aadaac0e8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -16,7 +16,7 @@ allprojects { maxHeapSize = "2G" ignoreFailures = false failFast = true - maxParallelForks = (Runtime.getRuntime().availableProcessors()).takeIf { it > 0 } ?: 1 + maxParallelForks = (Runtime.getRuntime().availableProcessors() - 1).takeIf { it > 0 } ?: 1 reports.html.isEnabled = false reports.junitXml.isEnabled = false From 049a56fcb07cecf8efadaf8d4833ecdcfda2de9e Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 1 May 2021 18:20:11 -0700 Subject: [PATCH 40/98] Mixin on Forge --- platforms/forge/build.gradle.kts | 31 ++++++++++- .../dfsek/terra/forge/TerraForgePlugin.java | 30 +++++------ .../forge/mixin/BiomeAmbienceAccessor.java | 51 +++++++++++++++++++ .../src/main/resources/terra.mixins.json | 15 ++++++ 4 files changed, 109 insertions(+), 18 deletions(-) create mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/BiomeAmbienceAccessor.java create mode 100644 platforms/forge/src/main/resources/terra.mixins.json diff --git a/platforms/forge/build.gradle.kts b/platforms/forge/build.gradle.kts index e4f2e255e..6585d3f61 100644 --- a/platforms/forge/build.gradle.kts +++ b/platforms/forge/build.gradle.kts @@ -1,9 +1,9 @@ import com.dfsek.terra.configureCommon -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import net.minecraftforge.gradle.common.util.RunConfig import net.minecraftforge.gradle.mcp.task.GenerateSRG import net.minecraftforge.gradle.userdev.UserDevExtension import net.minecraftforge.gradle.userdev.tasks.RenameJarInPlace +import java.util.Date buildscript { repositories { @@ -18,8 +18,11 @@ buildscript { } } apply(plugin = "net.minecraftforge.gradle") +apply(plugin = "org.spongepowered.mixin") - +configure { + add(sourceSets.main.orNull, "terra.refmap.json") +} plugins { java @@ -41,6 +44,15 @@ val mcVersion = "1.16.5" dependencies { "shadedApi"(project(":common")) "minecraft"("net.minecraftforge:forge:$mcVersion-$forgeVersion") + "annotationProcessor"("org.spongepowered:mixin:0.8.2:processor") +} + +if (System.getProperty("idea.sync.active") == "true") { + afterEvaluate { + tasks.withType().all { + options.annotationProcessorPath = files() + } + } } afterEvaluate { @@ -61,6 +73,7 @@ configure { "forge.logging.markers" to "SCAN,REGISTRIES,REGISTRYDUMP", "forge.logging.console.level" to "debug" )) + arg("-mixin.config=terra.mixins.json") workingDirectory = project.file("run").canonicalPath source(sourceSets["main"]) } @@ -92,4 +105,18 @@ val deobfElements = configurations.register("deobfElements") { val javaComponent = components["java"] as AdhocComponentWithVariants javaComponent.addVariantsFromConfiguration(deobfElements.get()) { mapToMavenScope("runtime") +} + +tasks.jar { + manifest { + attributes(mapOf( + "Specification-Title" to "terra", + "Specification-Vendor" to "Terra", + "Specification-Version" to "1.0", + "Implementation-Title" to "Terra", + "Implementation-Version" to project.version, + "Implementation-Vendor" to "terra", + "MixinConfigs" to "terra.mixins.json" + )) + } } \ No newline at end of file diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java index 2f40a4c67..d75bd8bd2 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java @@ -37,6 +37,7 @@ import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.forge.inventory.ForgeItemHandle; +import com.dfsek.terra.forge.mixin.BiomeAmbienceAccessor; import com.dfsek.terra.forge.world.ForgeAdapter; import com.dfsek.terra.forge.world.ForgeBiome; import com.dfsek.terra.forge.world.ForgeTree; @@ -62,6 +63,7 @@ import net.minecraft.command.CommandSource; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.BiomeAmbience; import net.minecraft.world.biome.BiomeGenerationSettings; import net.minecraft.world.gen.GenerationStage; import net.minecraft.world.gen.feature.ConfiguredFeature; @@ -214,7 +216,7 @@ public class TerraForgePlugin implements TerraPlugin { public Biome createBiome(BiomeBuilder biome) { BiomeTemplate template = biome.getTemplate(); - //Map colors = template.getColors(); + Map colors = template.getColors(); Biome vanilla = ((ForgeBiome) new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0)).getHandle(); @@ -222,29 +224,26 @@ public class TerraForgePlugin implements TerraPlugin { generationSettings.surfaceBuilder(SurfaceBuilder.DEFAULT.configured(new SurfaceBuilderConfig(Blocks.GRASS_BLOCK.defaultBlockState(), Blocks.DIRT.defaultBlockState(), Blocks.GRAVEL.defaultBlockState()))); // It needs a surfacebuilder, even though we dont use it. generationSettings.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, POPULATOR_CONFIGURED_FEATURE); - - /* + BiomeAmbienceAccessor accessor = ((BiomeAmbienceAccessor) vanilla.getSpecialEffects()); BiomeAmbience.Builder effects = new BiomeAmbience.Builder() - .waterColor(colors.getOrDefault("water", vanilla.getSpecialEffects().waterColor)) - .waterFogColor(colors.getOrDefault("water-fog", vanilla.getSpecialEffects().waterFogColor)) - .fogColor(colors.getOrDefault("fog", vanilla.getSpecialEffects().fogColor)) - .skyColor(colors.getOrDefault("sky", vanilla.getSpecialEffects().skyColor)) - .grassColorModifier(vanilla.getSpecialEffects().grassColorModifier); + .waterColor(colors.getOrDefault("water", accessor.getWaterColor())) + .waterFogColor(colors.getOrDefault("water-fog", accessor.getWaterFogColor())) + .fogColor(colors.getOrDefault("fog", accessor.getFogColor())) + .skyColor(colors.getOrDefault("sky", accessor.getSkyColor())) + .grassColorModifier(accessor.getGrassColorModifier()); if(colors.containsKey("grass")) { effects.grassColorOverride(colors.get("grass")); } else { - vanilla.getSpecialEffects().grassColor.ifPresent(effects::grassColor); + accessor.getGrassColorOverride().ifPresent(effects::grassColorOverride); } - vanilla.getEffects().foliageColor.ifPresent(effects::foliageColor); + accessor.getFoliageColorOverride().ifPresent(effects::foliageColorOverride); if(colors.containsKey("foliage")) { - effects.foliageColor(colors.get("foliage")); + effects.foliageColorOverride(colors.get("foliage")); } else { - vanilla.getEffects().foliageColor.ifPresent(effects::foliageColor); + accessor.getFoliageColorOverride().ifPresent(effects::foliageColorOverride); } - */ - return new Biome.Builder() .precipitation(vanilla.getPrecipitation()) .biomeCategory(vanilla.getBiomeCategory()) @@ -252,8 +251,7 @@ public class TerraForgePlugin implements TerraPlugin { .scale(vanilla.getScale()) .temperature(vanilla.getBaseTemperature()) .downfall(vanilla.getDownfall()) - //.specialEffects(effects.build()) - .specialEffects(vanilla.getSpecialEffects()) + .specialEffects(effects.build()) .mobSpawnSettings(vanilla.getMobSettings()) .generationSettings(generationSettings.build()) .build().setRegistryName("terra", createBiomeID(template.getPack(), template.getID())); diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/BiomeAmbienceAccessor.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/BiomeAmbienceAccessor.java new file mode 100644 index 000000000..bfbe7baa3 --- /dev/null +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/BiomeAmbienceAccessor.java @@ -0,0 +1,51 @@ +package com.dfsek.terra.forge.mixin; + +import net.minecraft.client.audio.BackgroundMusicSelector; +import net.minecraft.util.SoundEvent; +import net.minecraft.world.biome.BiomeAmbience; +import net.minecraft.world.biome.MoodSoundAmbience; +import net.minecraft.world.biome.ParticleEffectAmbience; +import net.minecraft.world.biome.SoundAdditionsAmbience; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Optional; + +@Mixin(BiomeAmbience.class) +public interface BiomeAmbienceAccessor { + @Accessor + int getFogColor(); + + @Accessor + int getWaterColor(); + + @Accessor + int getWaterFogColor(); + + @Accessor + int getSkyColor(); + + @Accessor + Optional getFoliageColorOverride(); + + @Accessor + Optional getGrassColorOverride(); + + @Accessor + BiomeAmbience.GrassColorModifier getGrassColorModifier(); + + @Accessor + Optional getAmbientParticleSettings(); + + @Accessor + Optional getAmbientLoopSoundEvent(); + + @Accessor + Optional getAmbientMoodSettings(); + + @Accessor + Optional getAmbientAdditionsSettings(); + + @Accessor + Optional getBackgroundMusic(); +} diff --git a/platforms/forge/src/main/resources/terra.mixins.json b/platforms/forge/src/main/resources/terra.mixins.json new file mode 100644 index 000000000..06f3b15ec --- /dev/null +++ b/platforms/forge/src/main/resources/terra.mixins.json @@ -0,0 +1,15 @@ +{ + "required": true, + "package": "com.dfsek.terra.forge.mixin", + "compatibilityLevel": "JAVA_8", + "refmap": "terra.refmap.json", + "mixins": [ + "BiomeAmbienceAccessor" + ], + "client": [ + ], + "injectors": { + "defaultRequire": 1 + }, + "minVersion": "0.8" +} \ No newline at end of file From c8c3a3391208a248af8a68da9204b226de6b22d5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 1 May 2021 18:40:31 -0700 Subject: [PATCH 41/98] fix loot table issue --- .../main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java | 2 +- .../src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java b/common/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java index 8c94af81a..d10449a37 100644 --- a/common/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/fileloaders/ZIPLoader.java @@ -30,7 +30,7 @@ public class ZIPLoader extends Loader { ZipEntry entry = entries.nextElement(); if(!entry.isDirectory() && entry.getName().startsWith(directory) && entry.getName().endsWith(extension)) { try { - String rel = entry.getName().substring(directory.length()); + String rel = entry.getName().substring(directory.length() + 1); streams.put(rel, file.getInputStream(entry)); } catch(IOException e) { e.printStackTrace(); diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java index d75bd8bd2..ea1eee4bc 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java @@ -409,7 +409,6 @@ public class TerraForgePlugin implements TerraPlugin { event.getDispatcher().register(literal("terra").executes(context -> 1).then((ArgumentBuilder) assemble(arg, INSTANCE.manager))); event.getDispatcher().register(literal("te").executes(context -> 1).then((ArgumentBuilder) assemble(arg, INSTANCE.manager))); - //dispatcher.register(literal("te").redirect(root)); } } From e2a52afb67b72ab6757a13f748e952adcd48c669 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 1 May 2021 19:07:19 -0700 Subject: [PATCH 42/98] remove methods only used for cursed Bukkit stuff from common World interface. --- .../dfsek/terra/api/platform/world/World.java | 6 ------ .../dfsek/terra/config/dummy/DummyWorld.java | 18 ------------------ .../bukkit/population/ChunkCoordinate.java | 3 ++- .../dfsek/terra/bukkit/population/Gaea.java | 3 ++- .../bukkit/population/PopulationManager.java | 6 ++++-- .../dfsek/terra/bukkit/world/BukkitWorld.java | 3 --- .../fabric/world/handles/FabricWorld.java | 18 ------------------ .../handles/world/FabricSeededWorldAccess.java | 18 ------------------ .../world/handles/world/FabricWorldAccess.java | 18 ------------------ .../terra/forge/world/handles/ForgeWorld.java | 18 ------------------ .../handles/world/ForgeSeededWorldAccess.java | 18 ------------------ .../world/handles/world/ForgeWorldAccess.java | 18 ------------------ .../com/dfsek/terra/platform/DirectWorld.java | 16 ---------------- 13 files changed, 8 insertions(+), 155 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/World.java b/common/src/main/java/com/dfsek/terra/api/platform/world/World.java index 1dbcd85a6..8bf12f352 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/World.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/World.java @@ -19,18 +19,12 @@ public interface World extends Handle { String getName(); - UUID getUID(); - - boolean isChunkGenerated(int x, int z); - Chunk getChunkAt(int x, int z); default Chunk getChunkAt(Location location) { return getChunkAt(location.getBlockX() >> 4, location.getBlockZ() >> 4); } - File getWorldFolder(); - Block getBlockAt(int x, int y, int z); default Block getBlockAt(Location l) { diff --git a/common/src/main/java/com/dfsek/terra/config/dummy/DummyWorld.java b/common/src/main/java/com/dfsek/terra/config/dummy/DummyWorld.java index 06cd712fc..087748a9f 100644 --- a/common/src/main/java/com/dfsek/terra/config/dummy/DummyWorld.java +++ b/common/src/main/java/com/dfsek/terra/config/dummy/DummyWorld.java @@ -9,9 +9,6 @@ import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; -import java.io.File; -import java.util.UUID; - public class DummyWorld implements World { @Override public Object getHandle() { @@ -38,26 +35,11 @@ public class DummyWorld implements World { return "DUMMY"; } - @Override - public UUID getUID() { - return UUID.randomUUID(); - } - - @Override - public boolean isChunkGenerated(int x, int z) { - return false; - } - @Override public Chunk getChunkAt(int x, int z) { throw new UnsupportedOperationException("Cannot get chunk in DummyWorld"); } - @Override - public File getWorldFolder() { - throw new UnsupportedOperationException("Cannot get folder of DummyWorld"); - } - @Override public Block getBlockAt(int x, int y, int z) { throw new UnsupportedOperationException("Cannot get block in DummyWorld"); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/ChunkCoordinate.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/ChunkCoordinate.java index 6e2c87e00..a68e575fa 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/ChunkCoordinate.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/ChunkCoordinate.java @@ -2,6 +2,7 @@ package com.dfsek.terra.bukkit.population; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.bukkit.world.BukkitWorld; import java.io.Serializable; import java.util.UUID; @@ -21,7 +22,7 @@ public class ChunkCoordinate implements Serializable { public ChunkCoordinate(Chunk c) { this.x = c.getX(); this.z = c.getZ(); - this.worldID = c.getWorld().getUID(); + this.worldID = ((BukkitWorld) c.getWorld()).getUID(); } public UUID getWorldID() { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/Gaea.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/Gaea.java index 0b38547d6..d1c856dcd 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/Gaea.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/Gaea.java @@ -2,6 +2,7 @@ package com.dfsek.terra.bukkit.population; import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.bukkit.world.BukkitWorld; import java.io.File; @@ -9,7 +10,7 @@ public class Gaea { private static boolean debug; public static File getGaeaFolder(World w) { - File f = new File(w.getWorldFolder(), "gaea"); + File f = new File(((BukkitWorld) w).getWorldFolder(), "gaea"); f.mkdirs(); return f; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java index 583aa0fb9..2ed5fcd1c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java @@ -8,6 +8,7 @@ import com.dfsek.terra.api.world.generation.Chunkified; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.bukkit.TerraBukkitPlugin; import com.dfsek.terra.bukkit.world.BukkitAdapter; +import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.profiler.ProfileFrame; import org.bukkit.generator.BlockPopulator; import org.jetbrains.annotations.NotNull; @@ -45,8 +46,9 @@ public class PopulationManager extends BlockPopulator { // Synchronize to prevent chunks from being queued for population multiple times. - public synchronized void checkNeighbors(int x, int z, World w) { - ChunkCoordinate c = new ChunkCoordinate(x, z, w.getUID()); + public synchronized void checkNeighbors(int x, int z, World world) { + BukkitWorld w = (BukkitWorld) world; + ChunkCoordinate c = new ChunkCoordinate(x, z, (w).getUID()); if(w.isChunkGenerated(x + 1, z) && w.isChunkGenerated(x - 1, z) && w.isChunkGenerated(x, z + 1) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java index 294314cbf..6ef00484f 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java @@ -42,12 +42,10 @@ public class BukkitWorld implements World { return delegate.getName(); } - @Override public UUID getUID() { return delegate.getUID(); } - @Override public boolean isChunkGenerated(int x, int z) { return delegate.isChunkGenerated(x, z); } @@ -57,7 +55,6 @@ public class BukkitWorld implements World { return BukkitAdapter.adapt(delegate.getChunkAt(x, z)); } - @Override public File getWorldFolder() { return delegate.getWorldFolder(); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java index 097ddfcb1..062c17dbc 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java @@ -17,9 +17,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.ServerWorldAccess; import net.minecraft.world.WorldAccess; -import java.io.File; -import java.util.UUID; - public class FabricWorld implements World, FabricWorldHandle { private final Handle delegate; @@ -48,26 +45,11 @@ public class FabricWorld implements World, FabricWorldHandle { return delegate.world.worldProperties.getLevelName(); } - @Override - public UUID getUID() { - return null; - } - - @Override - public boolean isChunkGenerated(int x, int z) { - return false; - } - @Override public Chunk getChunkAt(int x, int z) { return new FabricChunk(delegate.world.getChunk(x, z)); } - @Override - public File getWorldFolder() { - return null; - } - @Override public Block getBlockAt(int x, int y, int z) { BlockPos pos = new BlockPos(x, y, z); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java index 05b1dbb1e..162d4a4d6 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java @@ -16,9 +16,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.ServerWorldAccess; import net.minecraft.world.WorldAccess; -import java.io.File; -import java.util.UUID; - public class FabricSeededWorldAccess implements World, FabricWorldHandle { private final Handle handle; @@ -47,26 +44,11 @@ public class FabricSeededWorldAccess implements World, FabricWorldHandle { return handle.toString(); // TODO: implementation } - @Override - public UUID getUID() { - return UUID.randomUUID(); // TODO: implementation - } - - @Override - public boolean isChunkGenerated(int x, int z) { - return false; - } - @Override public Chunk getChunkAt(int x, int z) { return null; } - @Override - public File getWorldFolder() { - return null; - } - @Override public Block getBlockAt(int x, int y, int z) { BlockPos pos = new BlockPos(x, y, z); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java index 8cb464353..8cbce1d7a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java @@ -16,9 +16,6 @@ import net.minecraft.world.ServerWorldAccess; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.WorldAccess; -import java.io.File; -import java.util.UUID; - public class FabricWorldAccess implements World, FabricWorldHandle { private final WorldAccess delegate; @@ -46,26 +43,11 @@ public class FabricWorldAccess implements World, FabricWorldHandle { return ((ServerWorldAccess) delegate).toServerWorld().worldProperties.getLevelName(); } - @Override - public UUID getUID() { - return null; - } - - @Override - public boolean isChunkGenerated(int x, int z) { - return false; - } - @Override public Chunk getChunkAt(int x, int z) { return null; } - @Override - public File getWorldFolder() { - return null; - } - @Override public Block getBlockAt(int x, int y, int z) { BlockPos pos = new BlockPos(x, y, z); diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/ForgeWorld.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/ForgeWorld.java index c4da23628..9da1051f2 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/ForgeWorld.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/ForgeWorld.java @@ -16,9 +16,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.IServerWorld; import net.minecraft.world.server.ServerWorld; -import java.io.File; -import java.util.UUID; - public class ForgeWorld implements World, ForgeWorldHandle { private final Handle delegate; @@ -47,26 +44,11 @@ public class ForgeWorld implements World, ForgeWorldHandle { return delegate.world.toString(); } - @Override - public UUID getUID() { - return null; - } - - @Override - public boolean isChunkGenerated(int x, int z) { - return false; - } - @Override public Chunk getChunkAt(int x, int z) { return new ForgeChunk(delegate.world.getChunk(x, z)); } - @Override - public File getWorldFolder() { - return null; - } - @Override public Block getBlockAt(int x, int y, int z) { BlockPos pos = new BlockPos(x, y, z); diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeSeededWorldAccess.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeSeededWorldAccess.java index 659c7569b..f2158ad04 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeSeededWorldAccess.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeSeededWorldAccess.java @@ -16,9 +16,6 @@ import net.minecraft.world.IServerWorld; import net.minecraft.world.IWorld; import net.minecraft.world.server.ServerWorld; -import java.io.File; -import java.util.UUID; - public class ForgeSeededWorldAccess implements World, ForgeWorldHandle { private final Handle handle; @@ -47,26 +44,11 @@ public class ForgeSeededWorldAccess implements World, ForgeWorldHandle { return handle.toString(); // TODO: implementation } - @Override - public UUID getUID() { - return UUID.randomUUID(); // TODO: implementation - } - - @Override - public boolean isChunkGenerated(int x, int z) { - return false; - } - @Override public Chunk getChunkAt(int x, int z) { return null; } - @Override - public File getWorldFolder() { - return null; - } - @Override public Block getBlockAt(int x, int y, int z) { BlockPos pos = new BlockPos(x, y, z); diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeWorldAccess.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeWorldAccess.java index 27176acf3..968a979c0 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeWorldAccess.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeWorldAccess.java @@ -16,9 +16,6 @@ import net.minecraft.world.ISeedReader; import net.minecraft.world.IServerWorld; import net.minecraft.world.IWorld; -import java.io.File; -import java.util.UUID; - public class ForgeWorldAccess implements World, ForgeWorldHandle { private final IWorld delegate; @@ -46,26 +43,11 @@ public class ForgeWorldAccess implements World, ForgeWorldHandle { return ((IServerWorld) delegate).getLevel().toString(); } - @Override - public UUID getUID() { - return null; - } - - @Override - public boolean isChunkGenerated(int x, int z) { - return false; - } - @Override public Chunk getChunkAt(int x, int z) { return null; } - @Override - public File getWorldFolder() { - return null; - } - @Override public Block getBlockAt(int x, int y, int z) { BlockPos pos = new BlockPos(x, y, z); diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java index 3aacfabb9..ab997a6b1 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java @@ -19,7 +19,6 @@ import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.UUID; public class DirectWorld implements World { private final long seed; @@ -51,16 +50,6 @@ public class DirectWorld implements World { return null; } - @Override - public UUID getUID() { - return null; - } - - @Override - public boolean isChunkGenerated(int x, int z) { - return false; - } - @Override public Chunk getChunkAt(int x, int z) { MCAFile file = compute(x, z); @@ -72,11 +61,6 @@ public class DirectWorld implements World { return new DirectChunkData(chunk, this, x, z); } - @Override - public File getWorldFolder() { - return null; - } - @Override public Block getBlockAt(int x, int y, int z) { return new DirectBlock(this, new Vector3(x, y, z)); From fddf0c51b712d6ea2ffc72ba30f56fc040759922 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 1 May 2021 20:27:59 -0700 Subject: [PATCH 43/98] cleanup PopulationManager --- .../dfsek/terra/bukkit/population/Gaea.java | 21 ------------------- .../bukkit/population/PopulationManager.java | 10 +++++++-- 2 files changed, 8 insertions(+), 23 deletions(-) delete mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/Gaea.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/Gaea.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/Gaea.java deleted file mode 100644 index d1c856dcd..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/Gaea.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.dfsek.terra.bukkit.population; - - -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.bukkit.world.BukkitWorld; - -import java.io.File; - -public class Gaea { - private static boolean debug; - - public static File getGaeaFolder(World w) { - File f = new File(((BukkitWorld) w).getWorldFolder(), "gaea"); - f.mkdirs(); - return f; - } - - public static boolean isDebug() { - return debug; - } -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java index 2ed5fcd1c..e783c0118 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java @@ -33,17 +33,23 @@ public class PopulationManager extends BlockPopulator { @SuppressWarnings("unchecked") public synchronized void saveBlocks(World w) throws IOException { - File f = new File(Gaea.getGaeaFolder(w), "chunks.bin"); + File f = new File(getDataFolder(w), "chunks.bin"); f.createNewFile(); SerializationUtil.toFile((HashSet) needsPop.clone(), f); } @SuppressWarnings("unchecked") public synchronized void loadBlocks(World w) throws IOException, ClassNotFoundException { - File f = new File(Gaea.getGaeaFolder(w), "chunks.bin"); + File f = new File(getDataFolder(w), "chunks.bin"); needsPop.addAll((HashSet) SerializationUtil.fromFile(f)); } + public static File getDataFolder(World w) { + File f = new File(((BukkitWorld) w).getWorldFolder(), "gaea"); + f.mkdirs(); + return f; + } + // Synchronize to prevent chunks from being queued for population multiple times. public synchronized void checkNeighbors(int x, int z, World world) { From 9956cab5074d8a9f16d1886fd90daf719bd8e9a1 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 1 May 2021 22:21:27 -0700 Subject: [PATCH 44/98] dont use vanilla registries --- platforms/forge/build.gradle.kts | 12 ++++++++--- .../forge/inventory/ForgeEnchantment.java | 3 ++- .../forge/inventory/ForgeItemHandle.java | 5 +++-- .../forge/mixin/BiomeAmbienceAccessor.java | 20 ------------------- .../terra/forge/world/ForgeWorldHandle.java | 3 ++- .../world/block/state/ForgeMobSpawner.java | 3 ++- 6 files changed, 18 insertions(+), 28 deletions(-) diff --git a/platforms/forge/build.gradle.kts b/platforms/forge/build.gradle.kts index 6585d3f61..0d2454aff 100644 --- a/platforms/forge/build.gradle.kts +++ b/platforms/forge/build.gradle.kts @@ -3,7 +3,6 @@ import net.minecraftforge.gradle.common.util.RunConfig import net.minecraftforge.gradle.mcp.task.GenerateSRG import net.minecraftforge.gradle.userdev.UserDevExtension import net.minecraftforge.gradle.userdev.tasks.RenameJarInPlace -import java.util.Date buildscript { repositories { @@ -21,11 +20,12 @@ apply(plugin = "net.minecraftforge.gradle") apply(plugin = "org.spongepowered.mixin") configure { - add(sourceSets.main.orNull, "terra.refmap.json") + add(sourceSets.main.get(), "terra.refmap.json") } plugins { java + id("com.modrinth.minotaur").version("1.1.0") } configureCommon() @@ -47,7 +47,7 @@ dependencies { "annotationProcessor"("org.spongepowered:mixin:0.8.2:processor") } -if (System.getProperty("idea.sync.active") == "true") { +if ("true" == System.getProperty("idea.sync.active")) { afterEvaluate { tasks.withType().all { options.annotationProcessorPath = files() @@ -58,6 +58,7 @@ if (System.getProperty("idea.sync.active") == "true") { afterEvaluate { val reobf = extensions.getByName>("reobf") reobf.maybeCreate("shadowJar").run { + group = "forge" mappings = tasks.getByName("createMcpToSrg").output } } @@ -85,6 +86,7 @@ configure { tasks.register("deobfJar") { from(sourceSets["main"].output) archiveClassifier.set("dev") + group = "forge" } val deobfElements = configurations.register("deobfElements") { @@ -119,4 +121,8 @@ tasks.jar { "MixinConfigs" to "terra.mixins.json" )) } +} + +tasks.named("shadowJar") { + } \ No newline at end of file diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeEnchantment.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeEnchantment.java index 8b0110ffa..8517c7118 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeEnchantment.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeEnchantment.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.platform.inventory.ItemStack; import com.dfsek.terra.api.platform.inventory.item.Enchantment; import com.dfsek.terra.forge.world.ForgeAdapter; import net.minecraft.util.registry.Registry; +import net.minecraftforge.registries.ForgeRegistries; import java.util.Objects; @@ -26,7 +27,7 @@ public class ForgeEnchantment implements Enchantment { @Override public String getID() { - return Objects.requireNonNull(Registry.ENCHANTMENT.getKey(enchantment)).toString(); + return Objects.requireNonNull(ForgeRegistries.ENCHANTMENTS.getKey(enchantment)).toString(); } @Override diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeItemHandle.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeItemHandle.java index 041cab37b..6639b4a59 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeItemHandle.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/inventory/ForgeItemHandle.java @@ -9,6 +9,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.command.arguments.ItemArgument; import net.minecraft.util.ResourceLocation; import net.minecraft.util.registry.Registry; +import net.minecraftforge.registries.ForgeRegistries; import java.util.Set; import java.util.stream.Collectors; @@ -26,11 +27,11 @@ public class ForgeItemHandle implements ItemHandle { @Override public Enchantment getEnchantment(String id) { - return ForgeAdapter.adapt(Registry.ENCHANTMENT.get(ResourceLocation.tryParse(id))); + return ForgeAdapter.adapt(ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryParse(id))); } @Override public Set getEnchantments() { - return Registry.ENCHANTMENT.stream().map(ForgeAdapter::adapt).collect(Collectors.toSet()); + return ForgeRegistries.ENCHANTMENTS.getEntries().stream().map(entry -> ForgeAdapter.adapt(entry.getValue())).collect(Collectors.toSet()); } } diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/BiomeAmbienceAccessor.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/BiomeAmbienceAccessor.java index bfbe7baa3..1474a33e0 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/BiomeAmbienceAccessor.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/BiomeAmbienceAccessor.java @@ -1,11 +1,6 @@ package com.dfsek.terra.forge.mixin; -import net.minecraft.client.audio.BackgroundMusicSelector; -import net.minecraft.util.SoundEvent; import net.minecraft.world.biome.BiomeAmbience; -import net.minecraft.world.biome.MoodSoundAmbience; -import net.minecraft.world.biome.ParticleEffectAmbience; -import net.minecraft.world.biome.SoundAdditionsAmbience; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @@ -33,19 +28,4 @@ public interface BiomeAmbienceAccessor { @Accessor BiomeAmbience.GrassColorModifier getGrassColorModifier(); - - @Accessor - Optional getAmbientParticleSettings(); - - @Accessor - Optional getAmbientLoopSoundEvent(); - - @Accessor - Optional getAmbientMoodSettings(); - - @Accessor - Optional getAmbientAdditionsSettings(); - - @Accessor - Optional getBackgroundMusic(); } diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeWorldHandle.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeWorldHandle.java index 9d3cc5914..8e4cfafe6 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeWorldHandle.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/ForgeWorldHandle.java @@ -9,6 +9,7 @@ import net.minecraft.block.BlockState; import net.minecraft.command.arguments.BlockStateParser; import net.minecraft.util.ResourceLocation; import net.minecraft.util.registry.Registry; +import net.minecraftforge.registries.ForgeRegistries; import java.util.Locale; @@ -30,6 +31,6 @@ public class ForgeWorldHandle implements WorldHandle { public EntityType getEntity(String id) { ResourceLocation identifier = ResourceLocation.tryParse(id); if(identifier == null) identifier = ResourceLocation.tryParse("minecraft:" + id.toLowerCase(Locale.ROOT)); - return ForgeAdapter.adapt(Registry.ENTITY_TYPE.get(identifier)); + return ForgeAdapter.adapt(ForgeRegistries.ENTITIES.getValue(identifier)); } } diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeMobSpawner.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeMobSpawner.java index 0cda8e206..95ca3d941 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeMobSpawner.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/block/state/ForgeMobSpawner.java @@ -8,6 +8,7 @@ import com.dfsek.terra.forge.world.ForgeAdapter; import net.minecraft.tileentity.MobSpawnerTileEntity; import net.minecraft.util.registry.Registry; import net.minecraft.world.IWorld; +import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; public class ForgeMobSpawner extends ForgeBlockState implements MobSpawner { // TODO: finish implementation / refactor API because bukkit doesnt expose most of the stuff spawners can do @@ -19,7 +20,7 @@ public class ForgeMobSpawner extends ForgeBlockState implements MobSpawner { // @Override public EntityType getSpawnedType() { - return ForgeAdapter.adapt(Registry.ENTITY_TYPE.get(((MobSpawnerTileEntity) blockEntity).getSpawner().getSpawnerEntity().getType().getRegistryName())); + return ForgeAdapter.adapt(ForgeRegistries.ENTITIES.getValue(((MobSpawnerTileEntity) blockEntity).getSpawner().getSpawnerEntity().getType().getRegistryName())); } @Override From 4f65555e82a34ab026aeed3e0cb83a4c5ef6bcba Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 14:37:34 -0700 Subject: [PATCH 45/98] remove mixins until annotation processor gets fixed. --- .../src/test/java/biome/DistributionTest.java | 2 +- common/src/test/java/biome/ImageTest.java | 2 +- .../dfsek/terra/forge/TerraForgePlugin.java | 25 ++++++--------- .../forge/mixin/BiomeAmbienceAccessor.java | 31 ------------------- .../src/main/resources/terra.mixins.json | 1 - 5 files changed, 12 insertions(+), 49 deletions(-) delete mode 100644 platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/BiomeAmbienceAccessor.java diff --git a/common/src/test/java/biome/DistributionTest.java b/common/src/test/java/biome/DistributionTest.java index 227afe1df..11b3dcef8 100644 --- a/common/src/test/java/biome/DistributionTest.java +++ b/common/src/test/java/biome/DistributionTest.java @@ -159,7 +159,7 @@ public class DistributionTest { new GenericLoaders(MAIN).register(loader); BiomeRegistry biomeRegistry = new BiomeRegistry(); - folderLoader.open("biomes", ".yml").then(inputStreams -> ConfigPack.buildAll((template, main) -> template, biomeRegistry, loader.load(inputStreams, TestBiome::new), MAIN)); + folderLoader.open("biomes", ".yml").then(inputStreams -> ConfigPack.buildAll((template, main) -> template, biomeRegistry, loader.loadConfigs(inputStreams, TestBiome::new), MAIN)); BiomeProviderTemplate template = new BiomeProviderTemplate(); ConfigLoader pipeLoader = new ConfigLoader() diff --git a/common/src/test/java/biome/ImageTest.java b/common/src/test/java/biome/ImageTest.java index ddc96dafc..04bcee35b 100644 --- a/common/src/test/java/biome/ImageTest.java +++ b/common/src/test/java/biome/ImageTest.java @@ -46,7 +46,7 @@ public class ImageTest { OpenRegistry biomeRegistry = new OpenRegistry() { }; - folderLoader.open("biomes", ".yml").then(inputStreams -> ConfigPack.buildAll((template, main) -> template, biomeRegistry, loader.load(inputStreams, TestBiome::new), null)); + folderLoader.open("biomes", ".yml").then(inputStreams -> ConfigPack.buildAll((template, main) -> template, biomeRegistry, loader.loadConfigs(inputStreams, TestBiome::new), null)); return new ImageBiomeProvider(biomeRegistry.entries(), ImageIO.read(ImageTest.class.getResourceAsStream("/map.jpg")), 1, ImageBiomeProvider.Align.CENTER); } diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java index ea1eee4bc..8f2243b33 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java @@ -37,7 +37,6 @@ import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.forge.inventory.ForgeItemHandle; -import com.dfsek.terra.forge.mixin.BiomeAmbienceAccessor; import com.dfsek.terra.forge.world.ForgeAdapter; import com.dfsek.terra.forge.world.ForgeBiome; import com.dfsek.terra.forge.world.ForgeTree; @@ -196,11 +195,7 @@ public class TerraForgePlugin implements TerraPlugin { @SubscribeEvent public static void register(RegistryEvent.Register event) { INSTANCE.setup(); // Setup now because we need the biomes, and this event happens after blocks n stuff - INSTANCE.getConfigRegistry().forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> { - Biome minecraftBiome = INSTANCE.createBiome(biome); - INSTANCE.logger().info("Registering biome " + minecraftBiome.getRegistryName()); - event.getRegistry().register(minecraftBiome); - })); // Register all Terra biomes. + INSTANCE.getConfigRegistry().forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> event.getRegistry().register(INSTANCE.createBiome(biome)))); // Register all Terra biomes. } @SubscribeEvent @@ -224,24 +219,24 @@ public class TerraForgePlugin implements TerraPlugin { generationSettings.surfaceBuilder(SurfaceBuilder.DEFAULT.configured(new SurfaceBuilderConfig(Blocks.GRASS_BLOCK.defaultBlockState(), Blocks.DIRT.defaultBlockState(), Blocks.GRAVEL.defaultBlockState()))); // It needs a surfacebuilder, even though we dont use it. generationSettings.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, POPULATOR_CONFIGURED_FEATURE); - BiomeAmbienceAccessor accessor = ((BiomeAmbienceAccessor) vanilla.getSpecialEffects()); + BiomeAmbience vanillaEffects = vanilla.getSpecialEffects(); BiomeAmbience.Builder effects = new BiomeAmbience.Builder() - .waterColor(colors.getOrDefault("water", accessor.getWaterColor())) - .waterFogColor(colors.getOrDefault("water-fog", accessor.getWaterFogColor())) - .fogColor(colors.getOrDefault("fog", accessor.getFogColor())) - .skyColor(colors.getOrDefault("sky", accessor.getSkyColor())) - .grassColorModifier(accessor.getGrassColorModifier()); + .waterColor(colors.getOrDefault("water", vanillaEffects.getWaterColor())) + .waterFogColor(colors.getOrDefault("water-fog", vanillaEffects.getWaterFogColor())) + .fogColor(colors.getOrDefault("fog", vanillaEffects.getFogColor())) + .skyColor(colors.getOrDefault("sky", vanillaEffects.getSkyColor())) + .grassColorModifier(vanillaEffects.getGrassColorModifier()); if(colors.containsKey("grass")) { effects.grassColorOverride(colors.get("grass")); } else { - accessor.getGrassColorOverride().ifPresent(effects::grassColorOverride); + vanillaEffects.getGrassColorOverride().ifPresent(effects::grassColorOverride); } - accessor.getFoliageColorOverride().ifPresent(effects::foliageColorOverride); + vanillaEffects.getFoliageColorOverride().ifPresent(effects::foliageColorOverride); if(colors.containsKey("foliage")) { effects.foliageColorOverride(colors.get("foliage")); } else { - accessor.getFoliageColorOverride().ifPresent(effects::foliageColorOverride); + vanillaEffects.getFoliageColorOverride().ifPresent(effects::foliageColorOverride); } return new Biome.Builder() diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/BiomeAmbienceAccessor.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/BiomeAmbienceAccessor.java deleted file mode 100644 index 1474a33e0..000000000 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/mixin/BiomeAmbienceAccessor.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.dfsek.terra.forge.mixin; - -import net.minecraft.world.biome.BiomeAmbience; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.Optional; - -@Mixin(BiomeAmbience.class) -public interface BiomeAmbienceAccessor { - @Accessor - int getFogColor(); - - @Accessor - int getWaterColor(); - - @Accessor - int getWaterFogColor(); - - @Accessor - int getSkyColor(); - - @Accessor - Optional getFoliageColorOverride(); - - @Accessor - Optional getGrassColorOverride(); - - @Accessor - BiomeAmbience.GrassColorModifier getGrassColorModifier(); -} diff --git a/platforms/forge/src/main/resources/terra.mixins.json b/platforms/forge/src/main/resources/terra.mixins.json index 06f3b15ec..c363067da 100644 --- a/platforms/forge/src/main/resources/terra.mixins.json +++ b/platforms/forge/src/main/resources/terra.mixins.json @@ -4,7 +4,6 @@ "compatibilityLevel": "JAVA_8", "refmap": "terra.refmap.json", "mixins": [ - "BiomeAmbienceAccessor" ], "client": [ ], From 19edcbddd5bd1735043bada80a99ff287cd91ace Mon Sep 17 00:00:00 2001 From: DJtheRedstoner <52044242+DJtheRedstoner@users.noreply.github.com> Date: Sun, 2 May 2021 18:17:18 -0400 Subject: [PATCH 46/98] Fix mixin annotation processor issues These issues were caused by CompilationConfig.configureCompilation() overwriting JavaCompile's options.compilerArgs list which removed any previously added arguments, including those added by fabric-loom and mixingradle. --- buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt index a6619cc1f..a2d50f780 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt @@ -19,7 +19,7 @@ fun Project.configureCompilation() { tasks.withType { options.encoding = "UTF-8" doFirst { - options.compilerArgs = mutableListOf("-Xlint:all") + options.compilerArgs.add("-Xlint:all") } } From c41d60c38ff131b2314af545d3a103144a320f16 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 15:43:12 -0700 Subject: [PATCH 47/98] remove manual refmap --- .../fabric/src/main/resources/terra-refmap.json | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 platforms/fabric/src/main/resources/terra-refmap.json diff --git a/platforms/fabric/src/main/resources/terra-refmap.json b/platforms/fabric/src/main/resources/terra-refmap.json deleted file mode 100644 index 8dbf41449..000000000 --- a/platforms/fabric/src/main/resources/terra-refmap.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "mappings": { - "com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor": { - "VALUES": "field_25052:Ljava/util/List;", - "translationKey": "field_25060:Lnet/minecraft/class_2561;" - } - }, - "data": { - "named:intermediary": { - "com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor": { - "VALUES": "field_25052:Ljava/util/List;", - "translationKey": "field_25060:Lnet/minecraft/class_2561;" - } - } - } -} \ No newline at end of file From ea3995afceb54e2258c62218aeb53360930fb675 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 15:44:30 -0700 Subject: [PATCH 48/98] fix refmap name --- platforms/fabric/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index cece1888a..86ba8b1e1 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -33,6 +33,7 @@ dependencies { configure { accessWidener("src/main/resources/terra.accesswidener") + refmapName = "terra.refmap.json" } val remapped = tasks.register("remapShadedJar") { From f4ae2cac680373832abaacd822cd01617f4fff8a Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 15:46:03 -0700 Subject: [PATCH 49/98] add MixinGeneratorOptions --- .../dfsek/terra/fabric/mixin/MixinGeneratorOptions.java | 9 +++++---- platforms/fabric/src/main/resources/terra.mixins.json | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/MixinGeneratorOptions.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/MixinGeneratorOptions.java index aa588249a..badfc176f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/MixinGeneratorOptions.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/MixinGeneratorOptions.java @@ -13,16 +13,17 @@ import net.minecraft.world.dimension.DimensionOptions; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.GeneratorOptions; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.Properties; import java.util.Random; -// Mixins commented out until loom fixes multi-project builds. - -//@Mixin(GeneratorOptions.class) +@Mixin(GeneratorOptions.class) public class MixinGeneratorOptions { - //@Inject(method = "fromProperties(Lnet/minecraft/util/registry/DynamicRegistryManager;Ljava/util/Properties;)Lnet/minecraft/world/gen/GeneratorOptions;", at = @At("HEAD"), cancellable = true) + @Inject(method = "fromProperties(Lnet/minecraft/util/registry/DynamicRegistryManager;Ljava/util/Properties;)Lnet/minecraft/world/gen/GeneratorOptions;", at = @At("HEAD"), cancellable = true) private static void fromProperties(DynamicRegistryManager dynamicRegistryManager, Properties properties, CallbackInfoReturnable cir) { if(properties.get("level-type") == null) { return; diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 8537843c7..ffbbb8bf4 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -4,6 +4,7 @@ "package": "com.dfsek.terra.fabric.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ + "MixinGeneratorOptions" ], "client": [ "GeneratorTypeAccessor" From 51c5f70d646a8ec84493a188990fcbbd568b99ec Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 17:08:59 -0700 Subject: [PATCH 50/98] forge jarfile nightmare "solution" --- .../java/com/dfsek/terra/api/TerraPlugin.java | 8 +++++++ .../com/dfsek/terra/api/util/JarUtil.java | 12 ++++++++++ .../com/dfsek/terra/config/PluginConfig.java | 4 ++-- .../com/dfsek/terra/config/lang/LangUtil.java | 2 +- .../dfsek/terra/forge/TerraForgePlugin.java | 24 ++++++++++++++++++- 5 files changed, 46 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/TerraPlugin.java b/common/src/main/java/com/dfsek/terra/api/TerraPlugin.java index aeeb5e814..2982da04f 100644 --- a/common/src/main/java/com/dfsek/terra/api/TerraPlugin.java +++ b/common/src/main/java/com/dfsek/terra/api/TerraPlugin.java @@ -7,6 +7,7 @@ import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.LockedRegistry; +import com.dfsek.terra.api.util.JarUtil; import com.dfsek.terra.api.util.logging.DebugLogger; import com.dfsek.terra.api.util.logging.Logger; import com.dfsek.terra.config.PluginConfig; @@ -16,6 +17,9 @@ import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.world.TerraWorld; import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.util.jar.JarFile; /** * Represents a Terra mod/plugin instance. @@ -67,4 +71,8 @@ public interface TerraPlugin extends LoaderRegistrar { } Profiler getProfiler(); + + default JarFile getModJar() throws URISyntaxException, IOException { + return JarUtil.getJarFile(); + } } diff --git a/common/src/main/java/com/dfsek/terra/api/util/JarUtil.java b/common/src/main/java/com/dfsek/terra/api/util/JarUtil.java index 20ad875cc..981dfdb7f 100644 --- a/common/src/main/java/com/dfsek/terra/api/util/JarUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/util/JarUtil.java @@ -1,9 +1,13 @@ package com.dfsek.terra.api.util; +import com.dfsek.terra.api.TerraPlugin; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.net.URISyntaxException; +import java.net.URL; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -32,4 +36,12 @@ public class JarUtil { } } } + + public static JarFile getJarFile() throws URISyntaxException, IOException { + return new JarFile(new File(getJarURL().toURI())); + } + + public static URL getJarURL() { + return TerraPlugin.class.getProtectionDomain().getCodeSource().getLocation(); + } } diff --git a/common/src/main/java/com/dfsek/terra/config/PluginConfig.java b/common/src/main/java/com/dfsek/terra/config/PluginConfig.java index e1112dcf4..d391fed8e 100644 --- a/common/src/main/java/com/dfsek/terra/config/PluginConfig.java +++ b/common/src/main/java/com/dfsek/terra/config/PluginConfig.java @@ -69,12 +69,12 @@ public class PluginConfig implements ConfigTemplate { ConfigLoader loader = new ConfigLoader(); loader.load(this, file); if(dumpDefaultConfig) { // Don't dump default config if already loaded. - try(JarFile jar = new JarFile(new File(TerraPlugin.class.getProtectionDomain().getCodeSource().getLocation().toURI()))) { + try(JarFile jar = main.getModJar()) { JarUtil.copyResourcesToDirectory(jar, "packs", new File(main.getDataFolder(), "packs").toString()); } catch(IOException | URISyntaxException e) { main.getDebugLogger().error("Failed to dump default config files!"); e.printStackTrace(); - main.getDebugLogger().error("Report this to Terra!"); + main.getDebugLogger().error("Either you're on Forge, or this is a bug. If it's the latter, report this to Terra!"); } } } catch(ConfigException | IOException e) { diff --git a/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java b/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java index 347a1e577..87f24b13e 100644 --- a/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java +++ b/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java @@ -17,7 +17,7 @@ public final class LangUtil { public static void load(String langID, TerraPlugin main) { Logger logger = main.logger(); File file = new File(main.getDataFolder(), "lang"); - try(JarFile jar = new JarFile(new File(TerraPlugin.class.getProtectionDomain().getCodeSource().getLocation().toURI()))) { + try(JarFile jar = main.getModJar()) { copyResourcesToDirectory(jar, "lang", file.toString()); } catch(IOException | URISyntaxException e) { main.getDebugLogger().error("Failed to dump language files!"); diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java index 8f2243b33..b7cab9f61 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java @@ -26,6 +26,7 @@ import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.LockedRegistry; import com.dfsek.terra.api.transform.NotNullValidator; import com.dfsek.terra.api.transform.Transformer; +import com.dfsek.terra.api.util.JarUtil; import com.dfsek.terra.api.util.logging.DebugLogger; import com.dfsek.terra.api.util.mutable.MutableInteger; import com.dfsek.terra.commands.CommandUtil; @@ -86,10 +87,12 @@ import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.registries.ForgeRegistries; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; +import org.objectweb.asm.Type; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.net.URISyntaxException; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; @@ -97,7 +100,10 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.function.Consumer; +import java.util.jar.JarFile; +import java.util.zip.ZipFile; import static com.mojang.brigadier.builder.LiteralArgumentBuilder.literal; import static com.mojang.brigadier.builder.RequiredArgumentBuilder.argument; @@ -219,7 +225,7 @@ public class TerraForgePlugin implements TerraPlugin { generationSettings.surfaceBuilder(SurfaceBuilder.DEFAULT.configured(new SurfaceBuilderConfig(Blocks.GRASS_BLOCK.defaultBlockState(), Blocks.DIRT.defaultBlockState(), Blocks.GRAVEL.defaultBlockState()))); // It needs a surfacebuilder, even though we dont use it. generationSettings.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, POPULATOR_CONFIGURED_FEATURE); - BiomeAmbience vanillaEffects = vanilla.getSpecialEffects(); + BiomeAmbience vanillaEffects = vanilla.getSpecialEffects(); BiomeAmbience.Builder effects = new BiomeAmbience.Builder() .waterColor(colors.getOrDefault("water", vanillaEffects.getWaterColor())) .waterFogColor(colors.getOrDefault("water-fog", vanillaEffects.getWaterFogColor())) @@ -289,6 +295,22 @@ public class TerraForgePlugin implements TerraPlugin { }); } + @Override + public JarFile getModJar() throws URISyntaxException, IOException { + File modsDir = new File("./mods"); + + if(!modsDir.exists()) return JarUtil.getJarFile(); + + for(File file : Objects.requireNonNull(modsDir.listFiles((dir, name) -> name.endsWith(".jar")))) { + try(ZipFile zipFile = new ZipFile(file)) { + if(zipFile.getEntry(Type.getInternalName(TerraPlugin.class) + ".class") != null) { + return new JarFile(file); + } + } + } + return JarUtil.getJarFile(); + } + public TerraWorld getWorld(long seed) { TerraWorld world = worldMap.get(seed); if(world == null) throw new IllegalArgumentException("No world exists with seed " + seed); From d13be5e1599272f6b9a97e5cb7381fff34afe773 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 17:16:03 -0700 Subject: [PATCH 51/98] add Forge modrinth publish task --- platforms/fabric/build.gradle.kts | 2 +- platforms/forge/build.gradle.kts | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index 86ba8b1e1..71f34c6bb 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -47,7 +47,7 @@ val remapped = tasks.register("remapShadedJar") { } -tasks.register("publishModrinth") { +tasks.register("publishModrinthFabric") { dependsOn("remapShadedJar") group = "fabric" token = System.getenv("MODRINTH_SECRET") diff --git a/platforms/forge/build.gradle.kts b/platforms/forge/build.gradle.kts index 0d2454aff..aab1091e5 100644 --- a/platforms/forge/build.gradle.kts +++ b/platforms/forge/build.gradle.kts @@ -123,6 +123,14 @@ tasks.jar { } } -tasks.named("shadowJar") { - +tasks.register("publishModrinthForge") { + dependsOn("reobfShadedJar") + group = "forge" + token = System.getenv("MODRINTH_SECRET") + projectId = "FIlZB9L0" + versionNumber = project.version.toString() + uploadFile = tasks.named("reobfShadedJar").get().archiveFile.get().asFile + releaseType = "alpha" + addGameVersion("1.16.5") + addLoader("forge") } \ No newline at end of file From dfec26f789a488a0c664332bd9538e23207f35c0 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 17:21:05 -0700 Subject: [PATCH 52/98] fix forge modrinth task --- platforms/forge/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platforms/forge/build.gradle.kts b/platforms/forge/build.gradle.kts index aab1091e5..31a2506eb 100644 --- a/platforms/forge/build.gradle.kts +++ b/platforms/forge/build.gradle.kts @@ -124,12 +124,12 @@ tasks.jar { } tasks.register("publishModrinthForge") { - dependsOn("reobfShadedJar") + dependsOn("reobfShadowJar") group = "forge" token = System.getenv("MODRINTH_SECRET") projectId = "FIlZB9L0" versionNumber = project.version.toString() - uploadFile = tasks.named("reobfShadedJar").get().archiveFile.get().asFile + uploadFile = tasks.named("reobfShadowJar").get().input.absoluteFile releaseType = "alpha" addGameVersion("1.16.5") addLoader("forge") From a7e3a0286eae0eb65c46d3dd5aac11ae7fd9db5e Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 17:46:55 -0700 Subject: [PATCH 53/98] add -forge and -fabric to Modrinth version numbers. --- platforms/fabric/build.gradle.kts | 2 +- platforms/forge/build.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index 71f34c6bb..c414cee4e 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -52,7 +52,7 @@ tasks.register("publishModrinthFabric") { group = "fabric" token = System.getenv("MODRINTH_SECRET") projectId = "FIlZB9L0" - versionNumber = project.version.toString() + versionNumber = "${project.version}-fabric" uploadFile = remapped.get().archiveFile.get().asFile releaseType = "beta" addGameVersion("1.16.4") diff --git a/platforms/forge/build.gradle.kts b/platforms/forge/build.gradle.kts index 31a2506eb..1179ccd85 100644 --- a/platforms/forge/build.gradle.kts +++ b/platforms/forge/build.gradle.kts @@ -128,7 +128,7 @@ tasks.register("publishModrinthForge") group = "forge" token = System.getenv("MODRINTH_SECRET") projectId = "FIlZB9L0" - versionNumber = project.version.toString() + versionNumber = "${project.version}-forge" uploadFile = tasks.named("reobfShadowJar").get().input.absoluteFile releaseType = "alpha" addGameVersion("1.16.5") From 46d0b0806862e3c3126af9c49fdec0518589d54e Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 19:49:59 -0700 Subject: [PATCH 54/98] implement ChunkRegionMixin --- .../fabric/mixin/world/ChunkRegionMixin.java | 59 ++++++++++++++++++ .../world/features/PopulatorFeature.java | 6 +- .../handles/chunk/FabricChunkWorldAccess.java | 60 ------------------- .../src/main/resources/terra.mixins.json | 3 +- 4 files changed, 63 insertions(+), 65 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkWorldAccess.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java new file mode 100644 index 000000000..a8badff2b --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java @@ -0,0 +1,59 @@ +package com.dfsek.terra.fabric.mixin.world; + +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.fabric.world.block.FabricBlock; +import com.dfsek.terra.fabric.world.block.FabricBlockData; +import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ChunkRegion; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(ChunkRegion.class) +@Implements(@Interface(iface = Chunk.class, prefix = "vw$")) +public abstract class ChunkRegionMixin { + @Final + @Shadow + private int centerChunkX; + + @Final + @Shadow + private int centerChunkZ; + + public int vw$getX() { + return centerChunkX; + } + + public int vw$getZ() { + return centerChunkZ; + } + + public World vw$getWorld() { + return new FabricWorldAccess((ChunkRegion) (Object) this); + } + + public Block vw$getBlock(int x, int y, int z) { + BlockPos pos = new BlockPos(x + (centerChunkX << 4), y, z + (centerChunkZ << 4)); + return new FabricBlock(pos, (ChunkRegion) (Object) this); + } + + public @NotNull BlockData vw$getBlockData(int x, int y, int z) { + return vw$getBlock(x, y, z).getBlockData(); + } + + public void vw$setBlock(int x, int y, int z, @NotNull BlockData blockData) { + ((ChunkRegion) (Object) this).setBlockState(new BlockPos(x + (centerChunkX << 4), y, z + (centerChunkZ << 4)), ((FabricBlockData) blockData).getHandle(), 0); + } + + public Object vw$getHandle() { + return (ChunkRegion) (Object) this; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java index b284acd43..985a502d4 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java @@ -1,10 +1,9 @@ package com.dfsek.terra.fabric.world.features; +import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.world.handles.FabricWorld; -import com.dfsek.terra.fabric.world.handles.chunk.FabricChunkWorldAccess; -import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; import com.mojang.serialization.Codec; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; @@ -25,9 +24,8 @@ public class PopulatorFeature extends Feature { @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { FabricChunkGeneratorWrapper gen = (FabricChunkGeneratorWrapper) chunkGenerator; - FabricChunkWorldAccess chunk = new FabricChunkWorldAccess(world, pos.getX() >> 4, pos.getZ() >> 4); FabricWorld world1 = new FabricWorld(world.toServerWorld(), new FabricChunkGenerator(chunkGenerator)); - gen.getHandle().getPopulators().forEach(populator -> populator.populate(world1, chunk)); + gen.getHandle().getPopulators().forEach(populator -> populator.populate(world1, (Chunk) world)); return true; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkWorldAccess.java deleted file mode 100644 index 3eb0662e7..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkWorldAccess.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.dfsek.terra.fabric.world.handles.chunk; - -import com.dfsek.terra.api.platform.block.Block; -import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.fabric.world.block.FabricBlock; -import com.dfsek.terra.fabric.world.block.FabricBlockData; -import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.WorldAccess; -import org.jetbrains.annotations.NotNull; - -public class FabricChunkWorldAccess implements Chunk { - private final WorldAccess chunkRegion; - private final int x; - private final int z; - - public FabricChunkWorldAccess(WorldAccess chunkRegion, int x, int z) { - this.chunkRegion = chunkRegion; - this.x = x << 4; - this.z = z << 4; - } - - @Override - public int getX() { - return x >> 4; - } - - @Override - public int getZ() { - return z >> 4; - } - - @Override - public World getWorld() { - return new FabricWorldAccess(chunkRegion); - } - - @Override - public Block getBlock(int x, int y, int z) { - BlockPos pos = new BlockPos(x + this.x, y, z + this.z); - return new FabricBlock(pos, chunkRegion); - } - - @Override - public WorldAccess getHandle() { - return chunkRegion; - } - - @Override - public void setBlock(int x, int y, int z, @NotNull BlockData blockData) { - chunkRegion.setBlockState(new BlockPos(x + this.x, y, z + this.z), ((FabricBlockData) blockData).getHandle(), 0); - } - - @Override - public @NotNull BlockData getBlockData(int x, int y, int z) { - return getBlock(x, y, z).getBlockData(); - } -} diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index ffbbb8bf4..f526d6ae8 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -4,7 +4,8 @@ "package": "com.dfsek.terra.fabric.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ - "MixinGeneratorOptions" + "MixinGeneratorOptions", + "world.ChunkRegionMixin" ], "client": [ "GeneratorTypeAccessor" From abc069046c896ea5fc6709569b428500193de620 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 20:13:24 -0700 Subject: [PATCH 55/98] add ProtoChunkMixin and WorldChunkMixin --- .../fabric/mixin/world/ChunkRegionMixin.java | 2 +- .../fabric/mixin/world/ProtoChunkMixin.java | 36 ++++++++++++ .../fabric/mixin/world/WorldChunkMixin.java | 58 +++++++++++++++++++ .../FabricChunkGeneratorWrapper.java | 3 +- .../src/main/resources/terra.mixins.json | 4 +- 5 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ProtoChunkMixin.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java index a8badff2b..b34bbb397 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java @@ -54,6 +54,6 @@ public abstract class ChunkRegionMixin { } public Object vw$getHandle() { - return (ChunkRegion) (Object) this; + return this; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ProtoChunkMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ProtoChunkMixin.java new file mode 100644 index 000000000..1a2cf1593 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ProtoChunkMixin.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.fabric.mixin.world; + +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.world.generator.ChunkData; +import com.dfsek.terra.fabric.world.block.FabricBlockData; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.chunk.ProtoChunk; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(ProtoChunk.class) +@Implements(@Interface(iface = ChunkData.class, prefix = "vw$")) +public abstract class ProtoChunkMixin { + @Shadow + public abstract BlockState getBlockState(BlockPos pos); + + public @NotNull BlockData vw$getBlockData(int x, int y, int z) { + return new FabricBlockData(getBlockState(new BlockPos(x, y, z))); + } + + public void vw$setBlock(int x, int y, int z, @NotNull BlockData blockData) { + ((net.minecraft.world.chunk.Chunk) this).setBlockState(new BlockPos(x, y, z), ((FabricBlockData) blockData).getHandle(), false); + } + + public Object vw$getHandle() { + return this; + } + + public int vw$getMaxHeight() { + return 255; // TODO: 1.17 - Implement dynamic height. + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java new file mode 100644 index 000000000..1878963c5 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java @@ -0,0 +1,58 @@ +package com.dfsek.terra.fabric.mixin.world; + +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.fabric.world.block.FabricBlock; +import com.dfsek.terra.fabric.world.block.FabricBlockData; +import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; +import com.dfsek.terra.fabric.world.handles.FabricWorld; +import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ChunkRegion; +import net.minecraft.world.chunk.WorldChunk; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(WorldChunk.class) +@Implements(@Interface(iface = Chunk.class, prefix = "vw$")) +public abstract class WorldChunkMixin { + @Final + @Shadow + private net.minecraft.world.World world; + + public int vw$getX() { + return ((net.minecraft.world.chunk.Chunk) this).getPos().x; + } + + public int vw$getZ() { + return ((net.minecraft.world.chunk.Chunk) this).getPos().z; + } + + public World vw$getWorld() { + return new FabricWorld((ServerWorld) world, new FabricChunkGenerator(((ServerWorld) world).getChunkManager().getChunkGenerator())); + } + + public Block vw$getBlock(int x, int y, int z) { + BlockPos pos = new BlockPos(x + (vw$getX() << 4), y, z + (vw$getZ() << 4)); + return new FabricBlock(pos, world); + } + + public @NotNull BlockData vw$getBlockData(int x, int y, int z) { + return vw$getBlock(x, y, z).getBlockData(); + } + + public void vw$setBlock(int x, int y, int z, @NotNull BlockData blockData) { + ((net.minecraft.world.chunk.Chunk) this).setBlockState(new BlockPos(x, y, z), ((FabricBlockData) blockData).getHandle(), false); + } + + public Object vw$getHandle() { + return this; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index afe8ceb19..d85f0a319 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -1,5 +1,6 @@ package com.dfsek.terra.fabric.world.generator; +import com.dfsek.terra.api.platform.world.generator.ChunkData; import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; @@ -88,7 +89,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener @Override public void populateNoise(WorldAccess world, StructureAccessor accessor, Chunk chunk) { FabricSeededWorldAccess worldAccess = new FabricSeededWorldAccess(world, seed, this); - delegate.generateChunkData(worldAccess, new FastRandom(), chunk.getPos().x, chunk.getPos().z, new FabricChunkData(chunk)); + delegate.generateChunkData(worldAccess, new FastRandom(), chunk.getPos().x, chunk.getPos().z, (ChunkData) chunk); } @Override diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index f526d6ae8..f43fb8ea5 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -5,7 +5,9 @@ "compatibilityLevel": "JAVA_8", "mixins": [ "MixinGeneratorOptions", - "world.ChunkRegionMixin" + "world.ChunkRegionMixin", + "world.ProtoChunkMixin", + "world.WorldChunkMixin" ], "client": [ "GeneratorTypeAccessor" From c0368f1c6db52eeebdd4fa49ede94365a218b19d Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 20:17:59 -0700 Subject: [PATCH 56/98] implement ServerCommandSourceMixin --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 4 +-- .../entity/ServerCommandSourceMixin.java | 25 +++++++++++++++++++ .../terra/fabric/world/FabricAdapter.java | 10 -------- .../world/entity/FabricCommandSender.java | 23 ----------------- .../src/main/resources/terra.mixins.json | 1 + 5 files changed, 28 insertions(+), 35 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/ServerCommandSourceMixin.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricCommandSender.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index fe81d65b6..2e8a33cc5 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -362,7 +362,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private RequiredArgumentBuilder assemble(RequiredArgumentBuilder in, CommandManager manager) { return in.suggests((context, builder) -> { List args = parseCommand(context.getInput()); - CommandSender sender = FabricAdapter.adapt(context.getSource()); + CommandSender sender = (CommandSender) context.getSource(); try { manager.tabComplete(args.remove(0), sender, args).forEach(builder::suggest); } catch(CommandException e) { @@ -372,7 +372,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { }).executes(context -> { List args = parseCommand(context.getInput()); try { - manager.execute(args.remove(0), FabricAdapter.adapt(context.getSource()), args); + manager.execute(args.remove(0), (CommandSender) context.getSource(), args); } catch(CommandException e) { context.getSource().sendError(new LiteralText(e.getMessage())); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/ServerCommandSourceMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/ServerCommandSourceMixin.java new file mode 100644 index 000000000..48cc1c8ba --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/ServerCommandSourceMixin.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.fabric.mixin.entity; + +import com.dfsek.terra.api.platform.CommandSender; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.text.LiteralText; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(ServerCommandSource.class) +@Implements(@Interface(iface = CommandSender.class, prefix = "vw$")) +public abstract class ServerCommandSourceMixin { + @Shadow + public abstract void sendFeedback(Text message, boolean broadcastToOps); + + public void vw$sendMessage(String message) { + sendFeedback(new LiteralText(message), true); + } + + public Object vw$getHandle() { + return this; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java index e151013f0..eb73af5a7 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java @@ -1,7 +1,6 @@ package com.dfsek.terra.fabric.world; import com.dfsek.terra.api.math.vector.Vector3; -import com.dfsek.terra.api.platform.CommandSender; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.BlockType; import com.dfsek.terra.api.platform.entity.EntityType; @@ -18,17 +17,13 @@ import com.dfsek.terra.fabric.world.block.data.FabricRotatable; import com.dfsek.terra.fabric.world.block.data.FabricSlab; import com.dfsek.terra.fabric.world.block.data.FabricStairs; import com.dfsek.terra.fabric.world.block.data.FabricWaterlogged; -import com.dfsek.terra.fabric.world.entity.FabricCommandSender; import com.dfsek.terra.fabric.world.entity.FabricEntityType; -import com.dfsek.terra.fabric.world.entity.FabricPlayer; import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.server.command.ServerCommandSource; import net.minecraft.state.property.Properties; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; @@ -65,11 +60,6 @@ public final class FabricAdapter { return new FabricBlockData(state); } - public static CommandSender adapt(ServerCommandSource serverCommandSource) { - if(serverCommandSource.getEntity() instanceof PlayerEntity) return new FabricPlayer((PlayerEntity) serverCommandSource.getEntity()); - return new FabricCommandSender(serverCommandSource); - } - public static Direction adapt(BlockFace face) { switch(face) { case NORTH: diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricCommandSender.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricCommandSender.java deleted file mode 100644 index e7f946008..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricCommandSender.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.dfsek.terra.fabric.world.entity; - -import com.dfsek.terra.api.platform.CommandSender; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.text.LiteralText; - -public class FabricCommandSender implements CommandSender { - private final ServerCommandSource delegate; - - public FabricCommandSender(ServerCommandSource delegate) { - this.delegate = delegate; - } - - @Override - public void sendMessage(String message) { - delegate.sendFeedback(new LiteralText(message), true); - } - - @Override - public Object getHandle() { - return delegate; - } -} diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index f43fb8ea5..4cd75ab72 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -5,6 +5,7 @@ "compatibilityLevel": "JAVA_8", "mixins": [ "MixinGeneratorOptions", + "entity.ServerCommandSourceMixin", "world.ChunkRegionMixin", "world.ProtoChunkMixin", "world.WorldChunkMixin" From 35d85f2aa3c9b497f584a46c86cc55e5ffbc0a8c Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 20:38:25 -0700 Subject: [PATCH 57/98] PlayerEntityMixin and EntityMixin --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 14 ++++- .../fabric/mixin/entity/EntityMixin.java | 61 +++++++++++++++++++ .../mixin/entity/PlayerEntityMixin.java | 13 ++++ .../fabric/world/entity/FabricEntity.java | 43 ------------- .../fabric/world/entity/FabricPlayer.java | 42 ------------- .../fabric/world/handles/FabricWorld.java | 3 +- .../world/FabricSeededWorldAccess.java | 3 +- .../handles/world/FabricWorldAccess.java | 3 +- .../src/main/resources/terra.mixins.json | 2 + 9 files changed, 92 insertions(+), 92 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/PlayerEntityMixin.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricEntity.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricPlayer.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 2e8a33cc5..f0e1fcdf7 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -18,6 +18,8 @@ import com.dfsek.terra.api.event.annotations.Priority; import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent; import com.dfsek.terra.api.platform.CommandSender; import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.entity.Entity; +import com.dfsek.terra.api.platform.entity.Player; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.Tree; @@ -54,6 +56,7 @@ import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.world.TerraWorld; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.RequiredArgumentBuilder; +import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; @@ -363,6 +366,10 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { return in.suggests((context, builder) -> { List args = parseCommand(context.getInput()); CommandSender sender = (CommandSender) context.getSource(); + try { + sender = (Entity) context.getSource().getEntityOrThrow(); + } catch(CommandSyntaxException ignore) { + } try { manager.tabComplete(args.remove(0), sender, args).forEach(builder::suggest); } catch(CommandException e) { @@ -371,8 +378,13 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { return builder.buildFuture(); }).executes(context -> { List args = parseCommand(context.getInput()); + CommandSender sender = (CommandSender) context.getSource(); try { - manager.execute(args.remove(0), (CommandSender) context.getSource(), args); + sender = (Entity) context.getSource().getEntityOrThrow(); + } catch(CommandSyntaxException ignore) { + } + try { + manager.execute(args.remove(0), sender, args); } catch(CommandException e) { context.getSource().sendError(new LiteralText(e.getMessage())); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java new file mode 100644 index 000000000..abeb13bf8 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java @@ -0,0 +1,61 @@ +package com.dfsek.terra.fabric.mixin.entity; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.fabric.world.FabricAdapter; +import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; +import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle; +import net.minecraft.entity.Entity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.text.LiteralText; +import net.minecraft.text.Text; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.UUID; + +@Mixin(Entity.class) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.entity.Entity.class, prefix = "vw$")) +public abstract class EntityMixin { + @Shadow + public net.minecraft.world.World world; + + @Shadow + private BlockPos blockPos; + + @Shadow + public abstract void teleport(double destX, double destY, double destZ); + + @Shadow + @Nullable + public abstract Entity moveToWorld(ServerWorld destination); + + @Shadow + public abstract void sendSystemMessage(Text message, UUID senderUuid); + + public Object vw$getHandle() { + return this; + } + + public Location vw$getLocation() { + return new Location(new FabricWorldAccess(world), FabricAdapter.adapt(blockPos)); + } + + public void vw$setLocation(Location location) { + teleport(location.getX(), location.getY(), location.getZ()); + moveToWorld((ServerWorld) ((FabricWorldHandle) location).getWorld()); + } + + public World getWorld() { + return new FabricWorldAccess(world); + } + + public void vw$sendMessage(String message) { + sendSystemMessage(new LiteralText(message), UUID.randomUUID()); // TODO: look into how this actually works and make it less jank + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/PlayerEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/PlayerEntityMixin.java new file mode 100644 index 000000000..e86f9c05e --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/PlayerEntityMixin.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.fabric.mixin.entity; + +import com.dfsek.terra.api.platform.entity.Player; +import net.minecraft.entity.player.PlayerEntity; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(PlayerEntity.class) +@Implements(@Interface(iface = Player.class, prefix = "vw$")) +public abstract class PlayerEntityMixin extends EntityMixin { + +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricEntity.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricEntity.java deleted file mode 100644 index 65c26849d..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricEntity.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.dfsek.terra.fabric.world.entity; - -import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.entity.Entity; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.fabric.world.FabricAdapter; -import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; -import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle; -import net.minecraft.server.world.ServerWorld; - -public class FabricEntity implements Entity { - private final net.minecraft.entity.Entity delegate; - - public FabricEntity(net.minecraft.entity.Entity delegate) { - this.delegate = delegate; - } - - @Override - public void sendMessage(String message) { - - } - - @Override - public Object getHandle() { - return null; - } - - @Override - public Location getLocation() { - return new Location(new FabricWorldAccess(delegate.world), FabricAdapter.adapt(delegate.getBlockPos())); - } - - @Override - public void setLocation(Location location) { - delegate.teleport(location.getX(), location.getY(), location.getZ()); - delegate.moveToWorld((ServerWorld) ((FabricWorldHandle) location).getWorld()); - } - - @Override - public World getWorld() { - return new FabricWorldAccess(delegate.world); - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricPlayer.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricPlayer.java deleted file mode 100644 index 143ad024c..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricPlayer.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.dfsek.terra.fabric.world.entity; - -import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.entity.Player; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.fabric.world.FabricAdapter; -import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.text.LiteralText; - -public class FabricPlayer implements Player { - private final PlayerEntity delegate; - - public FabricPlayer(PlayerEntity delegate) { - this.delegate = delegate; - } - - @Override - public void sendMessage(String message) { - delegate.sendMessage(new LiteralText(message), false); - } - - @Override - public Object getHandle() { - return delegate; - } - - @Override - public Location getLocation() { - return FabricAdapter.adapt(delegate.getBlockPos()).toLocation(new FabricWorldAccess(delegate.world)); - } - - @Override - public World getWorld() { - return new FabricWorldAccess(delegate.world); - } - - @Override - public void setLocation(Location location) { - delegate.teleport(location.getX(), location.getY(), location.getZ()); - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java index 062c17dbc..9622d4061 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java @@ -9,7 +9,6 @@ import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; import com.dfsek.terra.fabric.world.FabricAdapter; import com.dfsek.terra.fabric.world.block.FabricBlock; -import com.dfsek.terra.fabric.world.entity.FabricEntity; import com.dfsek.terra.fabric.world.handles.chunk.FabricChunk; import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle; import net.minecraft.server.world.ServerWorld; @@ -72,7 +71,7 @@ public class FabricWorld implements World, FabricWorldHandle { net.minecraft.entity.Entity entity = FabricAdapter.adapt(entityType).create(delegate.world); entity.setPos(location.getX(), location.getY(), location.getZ()); delegate.world.spawnEntity(entity); - return new FabricEntity(entity); + return (Entity) entity; } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java index 162d4a4d6..6682f1952 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java @@ -9,7 +9,6 @@ import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; import com.dfsek.terra.fabric.world.FabricAdapter; import com.dfsek.terra.fabric.world.block.FabricBlock; -import com.dfsek.terra.fabric.world.entity.FabricEntity; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; @@ -60,7 +59,7 @@ public class FabricSeededWorldAccess implements World, FabricWorldHandle { net.minecraft.entity.Entity entity = FabricAdapter.adapt(entityType).create((ServerWorld) handle.worldAccess); entity.setPos(location.getX(), location.getY(), location.getZ()); handle.worldAccess.spawnEntity(entity); - return new FabricEntity(entity); + return (Entity) entity; } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java index 8cbce1d7a..65969525d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java @@ -9,7 +9,6 @@ import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; import com.dfsek.terra.fabric.world.FabricAdapter; import com.dfsek.terra.fabric.world.block.FabricBlock; -import com.dfsek.terra.fabric.world.entity.FabricEntity; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ServerWorldAccess; @@ -59,7 +58,7 @@ public class FabricWorldAccess implements World, FabricWorldHandle { net.minecraft.entity.Entity entity = FabricAdapter.adapt(entityType).create(((ServerWorldAccess) delegate).toServerWorld()); entity.setPos(location.getX(), location.getY(), location.getZ()); delegate.spawnEntity(entity); - return new FabricEntity(entity); + return (Entity) entity; } @Override diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 4cd75ab72..150299d72 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -5,6 +5,8 @@ "compatibilityLevel": "JAVA_8", "mixins": [ "MixinGeneratorOptions", + "entity.EntityMixin", + "entity.PlayerEntityMixin", "entity.ServerCommandSourceMixin", "world.ChunkRegionMixin", "world.ProtoChunkMixin", From 89fdfdfb344271fa0e2bd9209c6cc635f03e0993 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 20:42:54 -0700 Subject: [PATCH 58/98] suppress warnings --- .../src/main/java/com/dfsek/terra/fabric/world/FabricTree.java | 1 + 1 file changed, 1 insertion(+) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java index 83c5a6e18..f02117929 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java @@ -25,6 +25,7 @@ public class FabricTree implements Tree { } @Override + @SuppressWarnings("try") public boolean plant(Location l, Random r) { try(ProfileFrame ignore = TerraFabricPlugin.getInstance().getProfiler().profile("fabric_tree:" + id.toLowerCase(Locale.ROOT))) { FabricWorldAccess fabricWorldAccess = ((FabricWorldAccess) l.getWorld()); From 4704b2ebf757f05093f9c8f1b44a397caf4a73f2 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 21:10:48 -0700 Subject: [PATCH 59/98] implement ItemMixin --- .../fabric/inventory/FabricItemHandle.java | 2 +- .../fabric/inventory/FabricItemStack.java | 2 +- .../fabric/mixin/inventory/ItemMixin.java | 28 +++++++++++++++++++ .../terra/fabric/world/FabricAdapter.java | 6 ---- .../src/main/resources/terra.mixins.json | 1 + 5 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemMixin.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java index ef77d9928..713cb0125 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java @@ -18,7 +18,7 @@ public class FabricItemHandle implements ItemHandle { @Override public Item createItem(String data) { try { - return FabricAdapter.adapt(new ItemStackArgumentType().parse(new StringReader(data)).getItem()); + return (Item) new ItemStackArgumentType().parse(new StringReader(data)).getItem(); } catch(CommandSyntaxException e) { throw new IllegalArgumentException("Invalid item data \"" + data + "\"", e); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java index 19d33b524..f38edca67 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java @@ -25,7 +25,7 @@ public class FabricItemStack implements ItemStack { @Override public Item getType() { - return new FabricItem(delegate.getItem()); + return (Item) delegate.getItem(); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemMixin.java new file mode 100644 index 000000000..c38909f0d --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemMixin.java @@ -0,0 +1,28 @@ +package com.dfsek.terra.fabric.mixin.inventory; + +import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.fabric.inventory.FabricItemStack; +import net.minecraft.item.Item; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(Item.class) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.inventory.Item.class, prefix = "vw$")) +public abstract class ItemMixin { + @Shadow + public abstract int getMaxDamage(); + + public Object vw$getHandle() { + return this; + } + + public ItemStack vw$newItemStack(int amount) { + return new FabricItemStack(new net.minecraft.item.ItemStack((Item) (Object) this, amount)); + } + + public double vw$getMaxDurability() { + return getMaxDamage(); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java index eb73af5a7..e5e186f51 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java @@ -6,7 +6,6 @@ import com.dfsek.terra.api.platform.block.BlockType; import com.dfsek.terra.api.platform.entity.EntityType; import com.dfsek.terra.api.platform.inventory.item.Enchantment; import com.dfsek.terra.fabric.inventory.FabricEnchantment; -import com.dfsek.terra.fabric.inventory.FabricItem; import com.dfsek.terra.fabric.inventory.FabricItemStack; import com.dfsek.terra.fabric.world.block.FabricBlockData; import com.dfsek.terra.fabric.world.block.FabricBlockType; @@ -22,7 +21,6 @@ import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.state.property.Properties; import net.minecraft.util.math.BlockPos; @@ -99,10 +97,6 @@ public final class FabricAdapter { return new FabricItemStack(itemStack); } - public static com.dfsek.terra.api.platform.inventory.Item adapt(Item item) { - return new FabricItem(item); - } - public static Enchantment adapt(net.minecraft.enchantment.Enchantment enchantment) { return new FabricEnchantment(enchantment); } diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 150299d72..577accb57 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -8,6 +8,7 @@ "entity.EntityMixin", "entity.PlayerEntityMixin", "entity.ServerCommandSourceMixin", + "inventory.ItemMixin", "world.ChunkRegionMixin", "world.ProtoChunkMixin", "world.WorldChunkMixin" From c12518fa49bd8270d45ae1a552efb51d468a8912 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 21:11:09 -0700 Subject: [PATCH 60/98] delete FabricItem.java --- .../terra/fabric/inventory/FabricItem.java | 27 ------------------- 1 file changed, 27 deletions(-) delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItem.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItem.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItem.java deleted file mode 100644 index 40c683119..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItem.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.dfsek.terra.fabric.inventory; - -import com.dfsek.terra.api.platform.inventory.Item; -import com.dfsek.terra.api.platform.inventory.ItemStack; - -public class FabricItem implements Item { - private final net.minecraft.item.Item delegate; - - public FabricItem(net.minecraft.item.Item delegate) { - this.delegate = delegate; - } - - @Override - public net.minecraft.item.Item getHandle() { - return delegate; - } - - @Override - public ItemStack newItemStack(int amount) { - return new FabricItemStack(new net.minecraft.item.ItemStack(delegate, amount)); - } - - @Override - public double getMaxDurability() { - return delegate.getMaxDamage(); - } -} From f4253acb78a9a1010c688d08b5cc55a2dd7994fe Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 21:27:25 -0700 Subject: [PATCH 61/98] item mixins --- .../api/platform/inventory/ItemStack.java | 5 ++ .../loot/functions/DamageFunction.java | 2 +- .../fabric/inventory/FabricEnchantment.java | 3 +- .../fabric/inventory/FabricInventory.java | 6 ++- .../fabric/inventory/FabricItemStack.java | 46 ---------------- .../inventory/meta/FabricDamageable.java | 25 --------- .../fabric/inventory/meta/FabricItemMeta.java | 42 --------------- .../fabric/mixin/inventory/ItemMixin.java | 4 +- .../inventory/ItemStackDamageableMixin.java | 19 +++++++ .../mixin/inventory/ItemStackMetaMixin.java | 49 +++++++++++++++++ .../mixin/inventory/ItemStackMixin.java | 52 +++++++++++++++++++ .../terra/fabric/world/FabricAdapter.java | 10 ---- .../src/main/resources/terra.mixins.json | 3 ++ 13 files changed, 137 insertions(+), 129 deletions(-) delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/meta/FabricDamageable.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/meta/FabricItemMeta.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackDamageableMixin.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMetaMixin.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMixin.java diff --git a/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemStack.java b/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemStack.java index dfa8d9719..5b7ac6906 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemStack.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemStack.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.platform.inventory; import com.dfsek.terra.api.platform.Handle; +import com.dfsek.terra.api.platform.inventory.item.Damageable; import com.dfsek.terra.api.platform.inventory.item.ItemMeta; public interface ItemStack extends Handle { @@ -13,4 +14,8 @@ public interface ItemStack extends Handle { ItemMeta getItemMeta(); void setItemMeta(ItemMeta meta); + + default boolean isDamageable() { + return getItemMeta() instanceof Damageable; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/DamageFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/DamageFunction.java index 189a0c100..517777db0 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/DamageFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/DamageFunction.java @@ -34,8 +34,8 @@ public class DamageFunction implements LootFunction { @Override public ItemStack apply(ItemStack original, Random r) { if(original == null) return null; + if(!original.isDamageable()) return original; ItemMeta meta = original.getItemMeta(); - if(!(meta instanceof Damageable)) return original; double itemDurability = (r.nextDouble() * (max - min)) + min; Damageable damage = (Damageable) meta; damage.setDamage((int) (original.getType().getMaxDurability() - (itemDurability / 100) * original.getType().getMaxDurability())); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricEnchantment.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricEnchantment.java index 347f53315..04d1c97d2 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricEnchantment.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricEnchantment.java @@ -19,9 +19,10 @@ public class FabricEnchantment implements Enchantment { return enchantment; } + @SuppressWarnings("ConstantConditions") @Override public boolean canEnchantItem(ItemStack itemStack) { - return enchantment.isAcceptableItem(FabricAdapter.adapt(itemStack)); + return enchantment.isAcceptableItem((net.minecraft.item.ItemStack) (Object) itemStack); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricInventory.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricInventory.java index 8b86f657d..78141d27d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricInventory.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricInventory.java @@ -22,14 +22,16 @@ public class FabricInventory implements Inventory { return delegate.size(); } + @SuppressWarnings("ConstantConditions") @Override public ItemStack getItem(int slot) { net.minecraft.item.ItemStack itemStack = delegate.getStack(slot); - return itemStack.getItem() == Items.AIR ? null : FabricAdapter.adapt(itemStack); + return itemStack.getItem() == Items.AIR ? null : (ItemStack) (Object) itemStack; } + @SuppressWarnings("ConstantConditions") @Override public void setItem(int slot, ItemStack newStack) { - delegate.setStack(slot, FabricAdapter.adapt(newStack)); + delegate.setStack(slot, (net.minecraft.item.ItemStack) (Object) newStack); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java deleted file mode 100644 index f38edca67..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.dfsek.terra.fabric.inventory; - -import com.dfsek.terra.api.platform.inventory.Item; -import com.dfsek.terra.api.platform.inventory.ItemStack; -import com.dfsek.terra.api.platform.inventory.item.ItemMeta; -import com.dfsek.terra.fabric.inventory.meta.FabricDamageable; -import com.dfsek.terra.fabric.inventory.meta.FabricItemMeta; - -public class FabricItemStack implements ItemStack { - private net.minecraft.item.ItemStack delegate; - - public FabricItemStack(net.minecraft.item.ItemStack delegate) { - this.delegate = delegate; - } - - @Override - public int getAmount() { - return delegate.getCount(); - } - - @Override - public void setAmount(int i) { - delegate.setCount(i); - } - - @Override - public Item getType() { - return (Item) delegate.getItem(); - } - - @Override - public ItemMeta getItemMeta() { - if(delegate.isDamageable()) return new FabricDamageable(delegate.copy()); - return new FabricItemMeta(delegate.copy()); - } - - @Override - public void setItemMeta(ItemMeta meta) { - this.delegate = ((FabricItemMeta) meta).getHandle(); - } - - @Override - public net.minecraft.item.ItemStack getHandle() { - return delegate; - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/meta/FabricDamageable.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/meta/FabricDamageable.java deleted file mode 100644 index 4a4cc918e..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/meta/FabricDamageable.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dfsek.terra.fabric.inventory.meta; - -import com.dfsek.terra.api.platform.inventory.item.Damageable; -import net.minecraft.item.ItemStack; - -public class FabricDamageable extends FabricItemMeta implements Damageable { - public FabricDamageable(ItemStack delegate) { - super(delegate); - } - - @Override - public int getDamage() { - return delegate.getDamage(); - } - - @Override - public void setDamage(int damage) { - delegate.setDamage(damage); - } - - @Override - public boolean hasDamage() { - return delegate.isDamageable(); - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/meta/FabricItemMeta.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/meta/FabricItemMeta.java deleted file mode 100644 index 2c4d9d079..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/meta/FabricItemMeta.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.dfsek.terra.fabric.inventory.meta; - -import com.dfsek.terra.api.platform.inventory.item.Enchantment; -import com.dfsek.terra.api.platform.inventory.item.ItemMeta; -import com.dfsek.terra.fabric.world.FabricAdapter; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.util.registry.Registry; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -public class FabricItemMeta implements ItemMeta { - protected final ItemStack delegate; - - public FabricItemMeta(ItemStack delegate) { - this.delegate = delegate; - } - - @Override - public ItemStack getHandle() { - return delegate; - } - - @Override - public Map getEnchantments() { - if(!delegate.hasEnchantments()) return Collections.emptyMap(); - Map map = new HashMap<>(); - - delegate.getEnchantments().forEach(enchantment -> { - CompoundTag eTag = (CompoundTag) enchantment; - map.put(FabricAdapter.adapt(Registry.ENCHANTMENT.get(eTag.getInt("id"))), eTag.getInt("lvl")); - }); - return map; - } - - @Override - public void addEnchantment(Enchantment enchantment, int level) { - delegate.addEnchantment(FabricAdapter.adapt(enchantment), level); - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemMixin.java index c38909f0d..6aadadda9 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemMixin.java @@ -1,7 +1,6 @@ package com.dfsek.terra.fabric.mixin.inventory; import com.dfsek.terra.api.platform.inventory.ItemStack; -import com.dfsek.terra.fabric.inventory.FabricItemStack; import net.minecraft.item.Item; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; @@ -18,8 +17,9 @@ public abstract class ItemMixin { return this; } + @SuppressWarnings("ConstantConditions") public ItemStack vw$newItemStack(int amount) { - return new FabricItemStack(new net.minecraft.item.ItemStack((Item) (Object) this, amount)); + return (ItemStack) (Object) new net.minecraft.item.ItemStack((Item) (Object) this, amount); } public double vw$getMaxDurability() { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackDamageableMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackDamageableMixin.java new file mode 100644 index 000000000..c815b6535 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackDamageableMixin.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.fabric.mixin.inventory; + +import com.dfsek.terra.api.platform.inventory.item.Damageable; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(ItemStack.class) +@Implements(@Interface(iface = Damageable.class, prefix = "vw$")) +public abstract class ItemStackDamageableMixin { + @Shadow + public abstract boolean isDamaged(); + + public boolean vw$hasDamage() { + return isDamaged(); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMetaMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMetaMixin.java new file mode 100644 index 000000000..6fb5d029e --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMetaMixin.java @@ -0,0 +1,49 @@ +package com.dfsek.terra.fabric.mixin.inventory; + +import com.dfsek.terra.api.platform.inventory.item.Enchantment; +import com.dfsek.terra.api.platform.inventory.item.ItemMeta; +import com.dfsek.terra.fabric.world.FabricAdapter; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.util.registry.Registry; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +@Mixin(ItemStack.class) +@Implements(@Interface(iface = ItemMeta.class, prefix = "vw$")) +public abstract class ItemStackMetaMixin { + @Shadow + public abstract boolean hasEnchantments(); + + @Shadow + public abstract ListTag getEnchantments(); + + @Shadow + public abstract void addEnchantment(net.minecraft.enchantment.Enchantment enchantment, int level); + + public Object vw$getHandle() { + return this; + } + + public Map vw$getEnchantments() { + if(!hasEnchantments()) return Collections.emptyMap(); + Map map = new HashMap<>(); + + getEnchantments().forEach(enchantment -> { + CompoundTag eTag = (CompoundTag) enchantment; + map.put(FabricAdapter.adapt(Registry.ENCHANTMENT.get(eTag.getInt("id"))), eTag.getInt("lvl")); + }); + return map; + } + + public void vw$addEnchantment(Enchantment enchantment, int level) { + addEnchantment(FabricAdapter.adapt(enchantment), level); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMixin.java new file mode 100644 index 000000000..453795b11 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMixin.java @@ -0,0 +1,52 @@ +package com.dfsek.terra.fabric.mixin.inventory; + +import com.dfsek.terra.api.platform.inventory.Item; +import com.dfsek.terra.api.platform.inventory.item.ItemMeta; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(ItemStack.class) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.inventory.ItemStack.class, prefix = "vw$")) +public abstract class ItemStackMixin { + @Shadow + public abstract int getCount(); + + @Shadow + public abstract void setCount(int count); + + @Shadow + public abstract net.minecraft.item.Item getItem(); + + @Shadow + public abstract boolean isDamageable(); + + @Shadow + public abstract ItemStack copy(); + + public int vw$getAmount() { + return getCount(); + } + + public void vw$setAmount(int i) { + setCount(i); + } + + public Item getType() { + return (Item) getItem(); + } + + public ItemMeta vw$getItemMeta() { + return (ItemMeta) this; + } + + public void vw$setItemMeta(ItemMeta meta) { + + } + + public Object vw$getHandle() { + return this; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java index e5e186f51..117d8315f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java @@ -6,7 +6,6 @@ import com.dfsek.terra.api.platform.block.BlockType; import com.dfsek.terra.api.platform.entity.EntityType; import com.dfsek.terra.api.platform.inventory.item.Enchantment; import com.dfsek.terra.fabric.inventory.FabricEnchantment; -import com.dfsek.terra.fabric.inventory.FabricItemStack; import com.dfsek.terra.fabric.world.block.FabricBlockData; import com.dfsek.terra.fabric.world.block.FabricBlockType; import com.dfsek.terra.fabric.world.block.data.FabricDirectional; @@ -21,7 +20,6 @@ import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; -import net.minecraft.item.ItemStack; import net.minecraft.state.property.Properties; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; @@ -89,14 +87,6 @@ public final class FabricAdapter { return ((FabricEntityType) entityType).getHandle(); } - public static ItemStack adapt(com.dfsek.terra.api.platform.inventory.ItemStack itemStack) { - return ((FabricItemStack) itemStack).getHandle(); - } - - public static com.dfsek.terra.api.platform.inventory.ItemStack adapt(ItemStack itemStack) { - return new FabricItemStack(itemStack); - } - public static Enchantment adapt(net.minecraft.enchantment.Enchantment enchantment) { return new FabricEnchantment(enchantment); } diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 577accb57..8eca2169f 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -9,6 +9,9 @@ "entity.PlayerEntityMixin", "entity.ServerCommandSourceMixin", "inventory.ItemMixin", + "inventory.ItemStackDamageableMixin", + "inventory.ItemStackMetaMixin", + "inventory.ItemStackMixin", "world.ChunkRegionMixin", "world.ProtoChunkMixin", "world.WorldChunkMixin" From e71df936ab1a31f6ca39c992bff260dcb2c304d6 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 21:35:39 -0700 Subject: [PATCH 62/98] EnchantmentMixin --- .../fabric/inventory/FabricEnchantment.java | 42 ------------------- .../fabric/inventory/FabricItemHandle.java | 4 +- .../mixin/inventory/EnchantmentMixin.java | 39 +++++++++++++++++ .../mixin/inventory/ItemStackMetaMixin.java | 4 +- .../terra/fabric/world/FabricAdapter.java | 10 ----- .../src/main/resources/terra.mixins.json | 1 + 6 files changed, 44 insertions(+), 56 deletions(-) delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricEnchantment.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/EnchantmentMixin.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricEnchantment.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricEnchantment.java deleted file mode 100644 index 04d1c97d2..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricEnchantment.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.dfsek.terra.fabric.inventory; - -import com.dfsek.terra.api.platform.inventory.ItemStack; -import com.dfsek.terra.api.platform.inventory.item.Enchantment; -import com.dfsek.terra.fabric.world.FabricAdapter; -import net.minecraft.util.registry.Registry; - -import java.util.Objects; - -public class FabricEnchantment implements Enchantment { - private final net.minecraft.enchantment.Enchantment enchantment; - - public FabricEnchantment(net.minecraft.enchantment.Enchantment enchantment) { - this.enchantment = enchantment; - } - - @Override - public net.minecraft.enchantment.Enchantment getHandle() { - return enchantment; - } - - @SuppressWarnings("ConstantConditions") - @Override - public boolean canEnchantItem(ItemStack itemStack) { - return enchantment.isAcceptableItem((net.minecraft.item.ItemStack) (Object) itemStack); - } - - @Override - public String getID() { - return Objects.requireNonNull(Registry.ENCHANTMENT.getId(enchantment)).toString(); - } - - @Override - public boolean conflictsWith(Enchantment other) { - return !enchantment.canCombine(FabricAdapter.adapt(other)); - } - - @Override - public int getMaxLevel() { - return enchantment.getMaxLevel(); - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java index 713cb0125..ab0811697 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java @@ -26,11 +26,11 @@ public class FabricItemHandle implements ItemHandle { @Override public Enchantment getEnchantment(String id) { - return FabricAdapter.adapt(Registry.ENCHANTMENT.get(Identifier.tryParse(id))); + return (Enchantment) (Registry.ENCHANTMENT.get(Identifier.tryParse(id))); } @Override public Set getEnchantments() { - return Registry.ENCHANTMENT.stream().map(FabricAdapter::adapt).collect(Collectors.toSet()); + return Registry.ENCHANTMENT.stream().map(enchantment -> (Enchantment) enchantment).collect(Collectors.toSet()); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/EnchantmentMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/EnchantmentMixin.java new file mode 100644 index 000000000..e83164184 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/EnchantmentMixin.java @@ -0,0 +1,39 @@ +package com.dfsek.terra.fabric.mixin.inventory; + +import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.fabric.world.FabricAdapter; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.util.registry.Registry; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Objects; + +@Mixin(Enchantment.class) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.inventory.item.Enchantment.class, prefix = "vw$")) +public abstract class EnchantmentMixin { + @Shadow + public abstract boolean isAcceptableItem(net.minecraft.item.ItemStack stack); + + @Shadow + public abstract boolean canCombine(Enchantment other); + + public Object vw$getHandle() { + return this; + } + + @SuppressWarnings("ConstantConditions") + public boolean vw$canEnchantItem(ItemStack itemStack) { + return isAcceptableItem((net.minecraft.item.ItemStack) (Object) itemStack); + } + + public String vw$getID() { + return Objects.requireNonNull(Registry.ENCHANTMENT.getId((Enchantment) (Object) this)).toString(); + } + + public boolean vw$conflictsWith(com.dfsek.terra.api.platform.inventory.item.Enchantment other) { + return !canCombine((Enchantment) other); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMetaMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMetaMixin.java index 6fb5d029e..a68484ba3 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMetaMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMetaMixin.java @@ -38,12 +38,12 @@ public abstract class ItemStackMetaMixin { getEnchantments().forEach(enchantment -> { CompoundTag eTag = (CompoundTag) enchantment; - map.put(FabricAdapter.adapt(Registry.ENCHANTMENT.get(eTag.getInt("id"))), eTag.getInt("lvl")); + map.put((Enchantment) Registry.ENCHANTMENT.get(eTag.getInt("id")), eTag.getInt("lvl")); }); return map; } public void vw$addEnchantment(Enchantment enchantment, int level) { - addEnchantment(FabricAdapter.adapt(enchantment), level); + addEnchantment((net.minecraft.enchantment.Enchantment) enchantment, level); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java index 117d8315f..26a4616d4 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java @@ -4,8 +4,6 @@ import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.BlockType; import com.dfsek.terra.api.platform.entity.EntityType; -import com.dfsek.terra.api.platform.inventory.item.Enchantment; -import com.dfsek.terra.fabric.inventory.FabricEnchantment; import com.dfsek.terra.fabric.world.block.FabricBlockData; import com.dfsek.terra.fabric.world.block.FabricBlockType; import com.dfsek.terra.fabric.world.block.data.FabricDirectional; @@ -87,14 +85,6 @@ public final class FabricAdapter { return ((FabricEntityType) entityType).getHandle(); } - public static Enchantment adapt(net.minecraft.enchantment.Enchantment enchantment) { - return new FabricEnchantment(enchantment); - } - - public static net.minecraft.enchantment.Enchantment adapt(Enchantment enchantment) { - return ((FabricEnchantment) enchantment).getHandle(); - } - public WorldAccess adapt(FabricWorldHandle worldHandle) { return worldHandle.getWorld(); } diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 8eca2169f..9721af07b 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -8,6 +8,7 @@ "entity.EntityMixin", "entity.PlayerEntityMixin", "entity.ServerCommandSourceMixin", + "inventory.EnchantmentMixin", "inventory.ItemMixin", "inventory.ItemStackDamageableMixin", "inventory.ItemStackMetaMixin", From 061d2b649304eb62e762726ad1272ae367098527 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 21:48:06 -0700 Subject: [PATCH 63/98] implement EntityTypeMixin --- .../fabric/mixin/entity/EntityTypeMixin.java | 14 ++++++++++++++ .../dfsek/terra/fabric/world/FabricAdapter.java | 9 --------- .../terra/fabric/world/FabricWorldHandle.java | 2 +- .../world/block/state/FabricMobSpawner.java | 4 ++-- .../fabric/world/entity/FabricEntityType.java | 16 ---------------- .../terra/fabric/world/handles/FabricWorld.java | 2 +- .../handles/world/FabricSeededWorldAccess.java | 2 +- .../world/handles/world/FabricWorldAccess.java | 2 +- .../fabric/src/main/resources/terra.mixins.json | 1 + 9 files changed, 21 insertions(+), 31 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityTypeMixin.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricEntityType.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityTypeMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityTypeMixin.java new file mode 100644 index 000000000..f2e102b44 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityTypeMixin.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.fabric.mixin.entity; + +import net.minecraft.entity.EntityType; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(EntityType.class) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.entity.EntityType.class, prefix = "vw$")) +public abstract class EntityTypeMixin { + public Object vw$getHandle() { + return this; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java index 26a4616d4..eb0595b6d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java @@ -13,7 +13,6 @@ import com.dfsek.terra.fabric.world.block.data.FabricRotatable; import com.dfsek.terra.fabric.world.block.data.FabricSlab; import com.dfsek.terra.fabric.world.block.data.FabricStairs; import com.dfsek.terra.fabric.world.block.data.FabricWaterlogged; -import com.dfsek.terra.fabric.world.entity.FabricEntityType; import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -77,14 +76,6 @@ public final class FabricAdapter { return new FabricBlockType(block); } - public static EntityType adapt(net.minecraft.entity.EntityType entityType) { - return new FabricEntityType(entityType); - } - - public static net.minecraft.entity.EntityType adapt(EntityType entityType) { - return ((FabricEntityType) entityType).getHandle(); - } - public WorldAccess adapt(FabricWorldHandle worldHandle) { return worldHandle.getWorld(); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java index 8d6919d56..999929ec1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java @@ -30,6 +30,6 @@ public class FabricWorldHandle implements WorldHandle { public EntityType getEntity(String id) { Identifier identifier = Identifier.tryParse(id); if(identifier == null) identifier = Identifier.tryParse("minecraft:" + id.toLowerCase(Locale.ROOT)); - return FabricAdapter.adapt(Registry.ENTITY_TYPE.get(identifier)); + return (EntityType) Registry.ENTITY_TYPE.get(identifier); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricMobSpawner.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricMobSpawner.java index 8486e20c9..9ce0b3ba0 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricMobSpawner.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricMobSpawner.java @@ -19,12 +19,12 @@ public class FabricMobSpawner extends FabricBlockState implements MobSpawner { / @Override public EntityType getSpawnedType() { - return FabricAdapter.adapt(Registry.ENTITY_TYPE.get(((MobSpawnerBlockEntity) blockEntity).getLogic().getEntityId())); + return (EntityType) Registry.ENTITY_TYPE.get(((MobSpawnerBlockEntity) blockEntity).getLogic().getEntityId()); } @Override public void setSpawnedType(@NotNull EntityType creatureType) { - ((MobSpawnerBlockEntity) blockEntity).getLogic().setEntityId(FabricAdapter.adapt(creatureType)); + ((MobSpawnerBlockEntity) blockEntity).getLogic().setEntityId((net.minecraft.entity.EntityType) creatureType); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricEntityType.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricEntityType.java deleted file mode 100644 index 31d6aceb1..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricEntityType.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.dfsek.terra.fabric.world.entity; - -import com.dfsek.terra.api.platform.entity.EntityType; - -public class FabricEntityType implements EntityType { - private final net.minecraft.entity.EntityType type; - - public FabricEntityType(net.minecraft.entity.EntityType type) { - this.type = type; - } - - @Override - public net.minecraft.entity.EntityType getHandle() { - return type; - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java index 9622d4061..cff51432c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java @@ -68,7 +68,7 @@ public class FabricWorld implements World, FabricWorldHandle { @Override public Entity spawnEntity(Location location, EntityType entityType) { - net.minecraft.entity.Entity entity = FabricAdapter.adapt(entityType).create(delegate.world); + net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create(delegate.world); entity.setPos(location.getX(), location.getY(), location.getZ()); delegate.world.spawnEntity(entity); return (Entity) entity; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java index 6682f1952..65996a2b6 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java @@ -56,7 +56,7 @@ public class FabricSeededWorldAccess implements World, FabricWorldHandle { @Override public Entity spawnEntity(Location location, EntityType entityType) { - net.minecraft.entity.Entity entity = FabricAdapter.adapt(entityType).create((ServerWorld) handle.worldAccess); + net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create((ServerWorld) handle.worldAccess); entity.setPos(location.getX(), location.getY(), location.getZ()); handle.worldAccess.spawnEntity(entity); return (Entity) entity; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java index 65969525d..cda41a3ea 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java @@ -55,7 +55,7 @@ public class FabricWorldAccess implements World, FabricWorldHandle { @Override public Entity spawnEntity(Location location, EntityType entityType) { - net.minecraft.entity.Entity entity = FabricAdapter.adapt(entityType).create(((ServerWorldAccess) delegate).toServerWorld()); + net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create(((ServerWorldAccess) delegate).toServerWorld()); entity.setPos(location.getX(), location.getY(), location.getZ()); delegate.spawnEntity(entity); return (Entity) entity; diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 9721af07b..22ad3c7c9 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -6,6 +6,7 @@ "mixins": [ "MixinGeneratorOptions", "entity.EntityMixin", + "entity.EntityTypeMixin", "entity.PlayerEntityMixin", "entity.ServerCommandSourceMixin", "inventory.EnchantmentMixin", From 2c8cae9d45d3ec047493cecee717e7247bb9f406 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 22:21:50 -0700 Subject: [PATCH 64/98] create ChunkGeneratorMixin --- .../api/command/TerraCommandManager.java | 2 +- .../dfsek/terra/api/platform/world/World.java | 10 ++++ .../buffer/items/BufferedEntity.java | 2 +- .../buffer/items/BufferedLootApplication.java | 2 +- .../com/dfsek/terra/world/TerraWorld.java | 8 +-- .../world/generation/math/SamplerCache.java | 2 +- .../dfsek/terra/fabric/TerraFabricPlugin.java | 6 +-- .../mixin/world/ChunkGeneratorMixin.java | 14 +++++ .../fabric/mixin/world/WorldChunkMixin.java | 6 +-- .../dfsek/terra/fabric/world/FabricTree.java | 3 +- .../world/features/PopulatorFeature.java | 3 +- .../world/generator/FabricChunkData.java | 36 ------------- .../world/generator/FabricChunkGenerator.java | 16 ------ .../FabricChunkGeneratorWrapper.java | 5 -- .../fabric/world/handles/FabricWorld.java | 17 ++++-- .../world/handles/chunk/FabricChunk.java | 52 ------------------- .../world/FabricSeededWorldAccess.java | 17 ++++-- .../handles/world/FabricWorldAccess.java | 17 ++++-- .../src/main/resources/terra.mixins.json | 1 + 19 files changed, 78 insertions(+), 141 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkGeneratorMixin.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java diff --git a/common/src/main/java/com/dfsek/terra/api/command/TerraCommandManager.java b/common/src/main/java/com/dfsek/terra/api/command/TerraCommandManager.java index 482aefba9..e58dbbf30 100644 --- a/common/src/main/java/com/dfsek/terra/api/command/TerraCommandManager.java +++ b/common/src/main/java/com/dfsek/terra/api/command/TerraCommandManager.java @@ -65,7 +65,7 @@ public class TerraCommandManager implements CommandManager { return; } - if(commandClass.isAnnotationPresent(WorldCommand.class) && (!(sender instanceof Player) || !TerraWorld.isTerraWorld(((Player) sender).getWorld()))) { + if(commandClass.isAnnotationPresent(WorldCommand.class) && (!(sender instanceof Player) || !(((Player) sender).getWorld()).isTerraWorld())) { sender.sendMessage("Command must be executed in a Terra world."); return; } diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/World.java b/common/src/main/java/com/dfsek/terra/api/platform/world/World.java index 8bf12f352..888d90fb4 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/World.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/World.java @@ -6,6 +6,8 @@ import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.entity.Entity; import com.dfsek.terra.api.platform.entity.EntityType; import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; +import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; +import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import java.io.File; import java.util.UUID; @@ -34,4 +36,12 @@ public interface World extends Handle { Entity spawnEntity(Location location, EntityType entityType); int getMinHeight(); + + default boolean isTerraWorld() { + return getGenerator().getHandle() instanceof GeneratorWrapper; + } + + default TerraChunkGenerator getTerraGenerator() { + return ((GeneratorWrapper) getGenerator().getHandle()).getHandle(); + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedEntity.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedEntity.java index 6b8315ca2..fc90123ce 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedEntity.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedEntity.java @@ -19,6 +19,6 @@ public class BufferedEntity implements BufferedItem { @Override public void paste(Location origin) { Entity entity = origin.clone().add(0.5, 0, 0.5).getWorld().spawnEntity(origin, type); - main.getEventManager().callEvent(new EntitySpawnEvent(main.getWorld(entity.getWorld()).getGenerator().getConfigPack(), entity, entity.getLocation())); + main.getEventManager().callEvent(new EntitySpawnEvent(entity.getWorld().getTerraGenerator().getConfigPack(), entity, entity.getLocation())); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java index a2c474a08..b70b1e35d 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java @@ -32,7 +32,7 @@ public class BufferedLootApplication implements BufferedItem { } Container container = (Container) data; - LootPopulateEvent event = new LootPopulateEvent(block, container, table, main.getWorld(block.getLocation().getWorld()).getGenerator().getConfigPack(), structure); + LootPopulateEvent event = new LootPopulateEvent(block, container, table, block.getLocation().getWorld().getTerraGenerator().getConfigPack(), structure); main.getEventManager().callEvent(event); if(event.isCancelled()) return; diff --git a/common/src/main/java/com/dfsek/terra/world/TerraWorld.java b/common/src/main/java/com/dfsek/terra/world/TerraWorld.java index eefd72fc7..cc37116a2 100644 --- a/common/src/main/java/com/dfsek/terra/world/TerraWorld.java +++ b/common/src/main/java/com/dfsek/terra/world/TerraWorld.java @@ -25,7 +25,7 @@ public class TerraWorld { public TerraWorld(World w, ConfigPack c, TerraPlugin main) { - if(!isTerraWorld(w)) throw new IllegalArgumentException("World " + w + " is not a Terra World!"); + if(!w.isTerraWorld()) throw new IllegalArgumentException("World " + w + " is not a Terra World!"); this.world = w; config = c.toWorldConfig(this); this.provider = config.getProvider(); @@ -34,17 +34,11 @@ public class TerraWorld { safe = true; } - public static boolean isTerraWorld(World w) { - return w.getGenerator().getHandle() instanceof GeneratorWrapper; - } public World getWorld() { return world; } - public TerraChunkGenerator getGenerator() { - return ((GeneratorWrapper) world.getGenerator().getHandle()).getHandle(); - } public BiomeProvider getBiomeProvider() { return provider; diff --git a/common/src/main/java/com/dfsek/terra/world/generation/math/SamplerCache.java b/common/src/main/java/com/dfsek/terra/world/generation/math/SamplerCache.java index 64d4577b1..e9965d49b 100644 --- a/common/src/main/java/com/dfsek/terra/world/generation/math/SamplerCache.java +++ b/common/src/main/java/com/dfsek/terra/world/generation/math/SamplerCache.java @@ -25,7 +25,7 @@ public class SamplerCache { public Sampler load(@NotNull Long key) { int cx = (int) (key >> 32); int cz = (int) key.longValue(); - return world.getGenerator().createSampler(cx, cz, world.getBiomeProvider(), world.getWorld(), world.getConfig().getTemplate().getElevationBlend()); + return world.getWorld().getTerraGenerator().createSampler(cx, cz, world.getBiomeProvider(), world.getWorld(), world.getConfig().getTemplate().getElevationBlend()); } }); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index f0e1fcdf7..7256ea57e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -19,7 +19,6 @@ import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent; import com.dfsek.terra.api.platform.CommandSender; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.entity.Entity; -import com.dfsek.terra.api.platform.entity.Player; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.Tree; @@ -30,6 +29,7 @@ import com.dfsek.terra.api.transform.NotNullValidator; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.api.util.logging.DebugLogger; import com.dfsek.terra.api.util.logging.Logger; +import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.commands.CommandUtil; import com.dfsek.terra.config.GenericLoaders; import com.dfsek.terra.config.PluginConfig; @@ -40,13 +40,11 @@ import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.fabric.inventory.FabricItemHandle; import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; -import com.dfsek.terra.fabric.world.FabricAdapter; import com.dfsek.terra.fabric.world.FabricBiome; import com.dfsek.terra.fabric.world.FabricTree; import com.dfsek.terra.fabric.world.FabricWorldHandle; import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.features.PopulatorFeature; -import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.profiler.ProfilerImpl; @@ -159,7 +157,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { public TerraWorld getWorld(World world) { return worldMap.computeIfAbsent(world.getSeed(), w -> { logger.info("Loading world " + w); - return new TerraWorld(world, ((FabricChunkGeneratorWrapper) ((FabricChunkGenerator) world.getGenerator()).getHandle()).getPack(), this); + return new TerraWorld(world, ((FabricChunkGeneratorWrapper) world.getGenerator()).getPack(), this); }); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkGeneratorMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkGeneratorMixin.java new file mode 100644 index 000000000..dccaf2344 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkGeneratorMixin.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.fabric.mixin.world; + +import net.minecraft.world.gen.chunk.ChunkGenerator; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(ChunkGenerator.class) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.world.generator.ChunkGenerator.class, prefix = "vw$")) +public abstract class ChunkGeneratorMixin { + public Object vw$getHandle() { + return this; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java index 1878963c5..5b0f38c1b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java @@ -4,14 +4,12 @@ import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.block.FabricBlockData; -import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import com.dfsek.terra.fabric.world.handles.FabricWorld; -import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.ChunkRegion; import net.minecraft.world.chunk.WorldChunk; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Final; @@ -36,7 +34,7 @@ public abstract class WorldChunkMixin { } public World vw$getWorld() { - return new FabricWorld((ServerWorld) world, new FabricChunkGenerator(((ServerWorld) world).getChunkManager().getChunkGenerator())); + return new FabricWorld((ServerWorld) world, (ChunkGenerator) ((ServerWorld) world).getChunkManager().getChunkGenerator()); } public Block vw$getBlock(int x, int y, int z) { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java index f02117929..02bcb0a24 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java @@ -4,7 +4,6 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.util.collections.MaterialSet; import com.dfsek.terra.fabric.TerraFabricPlugin; -import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; import com.dfsek.terra.profiler.ProfileFrame; import net.minecraft.util.math.BlockPos; @@ -29,7 +28,7 @@ public class FabricTree implements Tree { public boolean plant(Location l, Random r) { try(ProfileFrame ignore = TerraFabricPlugin.getInstance().getProfiler().profile("fabric_tree:" + id.toLowerCase(Locale.ROOT))) { FabricWorldAccess fabricWorldAccess = ((FabricWorldAccess) l.getWorld()); - ChunkGenerator generatorWrapper = ((FabricChunkGenerator) fabricWorldAccess.getGenerator()).getHandle(); + ChunkGenerator generatorWrapper = (ChunkGenerator) fabricWorldAccess.getGenerator(); return delegate.generate((StructureWorldAccess) fabricWorldAccess.getHandle(), generatorWrapper, r, new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ())); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java index 985a502d4..18b327682 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java @@ -1,7 +1,6 @@ package com.dfsek.terra.fabric.world.features; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.world.handles.FabricWorld; import com.mojang.serialization.Codec; @@ -24,7 +23,7 @@ public class PopulatorFeature extends Feature { @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { FabricChunkGeneratorWrapper gen = (FabricChunkGeneratorWrapper) chunkGenerator; - FabricWorld world1 = new FabricWorld(world.toServerWorld(), new FabricChunkGenerator(chunkGenerator)); + FabricWorld world1 = new FabricWorld(world.toServerWorld(), (com.dfsek.terra.api.platform.world.generator.ChunkGenerator) chunkGenerator); gen.getHandle().getPopulators().forEach(populator -> populator.populate(world1, (Chunk) world)); return true; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java deleted file mode 100644 index 24ea33e9b..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.dfsek.terra.fabric.world.generator; - -import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.api.platform.world.generator.ChunkData; -import com.dfsek.terra.fabric.world.block.FabricBlockData; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.chunk.Chunk; -import org.jetbrains.annotations.NotNull; - -public class FabricChunkData implements ChunkData { - private final Chunk handle; - - public FabricChunkData(Chunk handle) { - this.handle = handle; - } - - @Override - public Chunk getHandle() { - return handle; - } - - @Override - public int getMaxHeight() { - return handle.getHeight(); - } - - @Override - public void setBlock(int x, int y, int z, @NotNull BlockData blockData) { - handle.setBlockState(new BlockPos(x, y, z), ((FabricBlockData) blockData).getHandle(), false); - } - - @Override - public @NotNull BlockData getBlockData(int x, int y, int z) { - return new FabricBlockData(handle.getBlockState(new BlockPos(x, y, z))); - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java deleted file mode 100644 index ae7526326..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.dfsek.terra.fabric.world.generator; - -import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; - -public class FabricChunkGenerator implements ChunkGenerator { - private final net.minecraft.world.gen.chunk.ChunkGenerator delegate; - - public FabricChunkGenerator(net.minecraft.world.gen.chunk.ChunkGenerator delegate) { - this.delegate = delegate; - } - - @Override - public net.minecraft.world.gen.chunk.ChunkGenerator getHandle() { - return delegate; - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index d85f0a319..5f3a68a73 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -11,11 +11,6 @@ import com.dfsek.terra.fabric.world.handles.world.FabricSeededWorldAccess; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.generation.generators.DefaultChunkGenerator3D; import com.dfsek.terra.world.generation.math.samplers.Sampler; -import com.dfsek.terra.world.population.CavePopulator; -import com.dfsek.terra.world.population.FloraPopulator; -import com.dfsek.terra.world.population.OrePopulator; -import com.dfsek.terra.world.population.StructurePopulator; -import com.dfsek.terra.world.population.TreePopulator; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.jafama.FastMath; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java index cff51432c..bf33c7d11 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java @@ -7,9 +7,10 @@ import com.dfsek.terra.api.platform.entity.EntityType; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; -import com.dfsek.terra.fabric.world.FabricAdapter; +import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; +import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.fabric.world.block.FabricBlock; -import com.dfsek.terra.fabric.world.handles.chunk.FabricChunk; +import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; @@ -46,7 +47,7 @@ public class FabricWorld implements World, FabricWorldHandle { @Override public Chunk getChunkAt(int x, int z) { - return new FabricChunk(delegate.world.getChunk(x, z)); + return (Chunk) delegate.world.getChunk(x, z); } @Override @@ -106,4 +107,14 @@ public class FabricWorld implements World, FabricWorldHandle { return world; } } + + @Override + public boolean isTerraWorld() { + return delegate.generator instanceof GeneratorWrapper; + } + + @Override + public TerraChunkGenerator getTerraGenerator() { + return ((FabricChunkGeneratorWrapper) delegate.generator).getHandle(); + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java deleted file mode 100644 index f9b488fdf..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.dfsek.terra.fabric.world.handles.chunk; - -import com.dfsek.terra.api.platform.block.Block; -import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.fabric.world.block.FabricBlockData; -import net.minecraft.util.math.BlockPos; -import org.jetbrains.annotations.NotNull; - -public class FabricChunk implements Chunk { - private final net.minecraft.world.chunk.Chunk chunk; - - public FabricChunk(net.minecraft.world.chunk.Chunk chunk) { - this.chunk = chunk; - } - - @Override - public int getX() { - return chunk.getPos().x; - } - - @Override - public int getZ() { - return chunk.getPos().z; - } - - @Override - public World getWorld() { - return null; - } - - @Override - public Block getBlock(int x, int y, int z) { - return null; - } - - @Override - public net.minecraft.world.chunk.Chunk getHandle() { - return chunk; - } - - @Override - public void setBlock(int x, int y, int z, @NotNull BlockData blockData) { - chunk.setBlockState(new BlockPos(x, y, z), ((FabricBlockData) blockData).getHandle(), false); - } - - @Override - public @NotNull BlockData getBlockData(int x, int y, int z) { - return getBlock(x, y, z).getBlockData(); - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java index 65996a2b6..5983db7d8 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java @@ -7,9 +7,10 @@ import com.dfsek.terra.api.platform.entity.EntityType; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; -import com.dfsek.terra.fabric.world.FabricAdapter; +import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; +import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.fabric.world.block.FabricBlock; -import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; +import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ServerWorldAccess; @@ -35,7 +36,7 @@ public class FabricSeededWorldAccess implements World, FabricWorldHandle { @Override public ChunkGenerator getGenerator() { - return new FabricChunkGenerator(handle.getGenerator()); + return (ChunkGenerator) handle.getGenerator(); } @Override @@ -111,4 +112,14 @@ public class FabricSeededWorldAccess implements World, FabricWorldHandle { return worldAccess; } } + + @Override + public boolean isTerraWorld() { + return handle.generator instanceof GeneratorWrapper; + } + + @Override + public TerraChunkGenerator getTerraGenerator() { + return ((FabricChunkGeneratorWrapper) handle.generator).getHandle(); + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java index cda41a3ea..b79c320a6 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java @@ -7,9 +7,10 @@ import com.dfsek.terra.api.platform.entity.EntityType; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; -import com.dfsek.terra.fabric.world.FabricAdapter; +import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; +import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.fabric.world.block.FabricBlock; -import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; +import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ServerWorldAccess; import net.minecraft.world.StructureWorldAccess; @@ -34,7 +35,7 @@ public class FabricWorldAccess implements World, FabricWorldHandle { @Override public ChunkGenerator getGenerator() { - return new FabricChunkGenerator(((ServerWorldAccess) delegate).toServerWorld().getChunkManager().getChunkGenerator()); + return (ChunkGenerator) ((ServerWorldAccess) delegate).toServerWorld().getChunkManager().getChunkGenerator(); } @Override @@ -86,4 +87,14 @@ public class FabricWorldAccess implements World, FabricWorldHandle { if(!(obj instanceof FabricWorldAccess)) return false; return ((ServerWorldAccess) ((FabricWorldAccess) obj).delegate).toServerWorld().equals(((ServerWorldAccess) delegate).toServerWorld()); } + + @Override + public boolean isTerraWorld() { + return getGenerator() instanceof GeneratorWrapper; + } + + @Override + public TerraChunkGenerator getTerraGenerator() { + return ((FabricChunkGeneratorWrapper) getGenerator()).getHandle(); + } } diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 22ad3c7c9..b0e7a8a2b 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -14,6 +14,7 @@ "inventory.ItemStackDamageableMixin", "inventory.ItemStackMetaMixin", "inventory.ItemStackMixin", + "world.ChunkGeneratorMixin", "world.ChunkRegionMixin", "world.ProtoChunkMixin", "world.WorldChunkMixin" From 138ee0a4484c53f2cafe7c49fc6159aa3da7b69b Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 22:22:32 -0700 Subject: [PATCH 65/98] refactor fabric handles --- .../main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java | 5 ++--- .../terra/fabric/{inventory => handle}/FabricItemHandle.java | 2 +- .../terra/fabric/{world => handle}/FabricWorldHandle.java | 3 ++- 3 files changed, 5 insertions(+), 5 deletions(-) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{inventory => handle}/FabricItemHandle.java (96%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{world => handle}/FabricWorldHandle.java (93%) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 7256ea57e..4f8654f68 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -29,7 +29,6 @@ import com.dfsek.terra.api.transform.NotNullValidator; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.api.util.logging.DebugLogger; import com.dfsek.terra.api.util.logging.Logger; -import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.commands.CommandUtil; import com.dfsek.terra.config.GenericLoaders; import com.dfsek.terra.config.PluginConfig; @@ -38,11 +37,11 @@ import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.fabric.inventory.FabricItemHandle; +import com.dfsek.terra.fabric.handle.FabricItemHandle; import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; import com.dfsek.terra.fabric.world.FabricBiome; import com.dfsek.terra.fabric.world.FabricTree; -import com.dfsek.terra.fabric.world.FabricWorldHandle; +import com.dfsek.terra.fabric.handle.FabricWorldHandle; import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.features.PopulatorFeature; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricItemHandle.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricItemHandle.java index ab0811697..ab526753e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricItemHandle.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.inventory; +package com.dfsek.terra.fabric.handle; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.inventory.Item; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricWorldHandle.java similarity index 93% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricWorldHandle.java index 999929ec1..f7545d5ce 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricWorldHandle.java @@ -1,7 +1,8 @@ -package com.dfsek.terra.fabric.world; +package com.dfsek.terra.fabric.handle; import com.dfsek.terra.api.platform.entity.EntityType; import com.dfsek.terra.api.platform.handle.WorldHandle; +import com.dfsek.terra.fabric.world.FabricAdapter; import com.dfsek.terra.fabric.world.block.FabricBlockData; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; From 1d4b0bc10011796bea9d7fc3e63d012baa1497d3 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 22:26:23 -0700 Subject: [PATCH 66/98] cleanup --- .../java/com/dfsek/terra/api/platform/world/World.java | 2 -- .../java/com/dfsek/terra/config/dummy/DummyWorld.java | 5 ----- .../java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java | 8 +++++--- .../bukkit/generator/BukkitChunkGeneratorWrapper.java | 2 +- .../com/dfsek/terra/bukkit/listeners/CommonListener.java | 2 +- .../com/dfsek/terra/bukkit/listeners/PaperListener.java | 2 +- .../com/dfsek/terra/bukkit/listeners/SpigotListener.java | 6 +++--- .../java/com/dfsek/terra/bukkit/world/BukkitWorld.java | 1 - .../com/dfsek/terra/fabric/world/handles/FabricWorld.java | 5 ----- .../world/handles/world/FabricSeededWorldAccess.java | 5 ----- .../fabric/world/handles/world/FabricWorldAccess.java | 5 ----- .../com/dfsek/terra/forge/world/handles/ForgeWorld.java | 5 ----- .../forge/world/handles/world/ForgeSeededWorldAccess.java | 5 ----- .../terra/forge/world/handles/world/ForgeWorldAccess.java | 5 ----- .../main/java/com/dfsek/terra/platform/DirectWorld.java | 5 ----- 15 files changed, 11 insertions(+), 52 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/World.java b/common/src/main/java/com/dfsek/terra/api/platform/world/World.java index 888d90fb4..45d13ab4d 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/World.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/World.java @@ -19,8 +19,6 @@ public interface World extends Handle { ChunkGenerator getGenerator(); - String getName(); - Chunk getChunkAt(int x, int z); default Chunk getChunkAt(Location location) { diff --git a/common/src/main/java/com/dfsek/terra/config/dummy/DummyWorld.java b/common/src/main/java/com/dfsek/terra/config/dummy/DummyWorld.java index 087748a9f..26082be6a 100644 --- a/common/src/main/java/com/dfsek/terra/config/dummy/DummyWorld.java +++ b/common/src/main/java/com/dfsek/terra/config/dummy/DummyWorld.java @@ -30,11 +30,6 @@ public class DummyWorld implements World { return () -> (GeneratorWrapper) () -> null; } - @Override - public String getName() { - return "DUMMY"; - } - @Override public Chunk getChunkAt(int x, int z) { throw new UnsupportedOperationException("Cannot get chunk in DummyWorld"); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index e65a918fc..a2388d121 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -34,6 +34,7 @@ import com.dfsek.terra.bukkit.listeners.SpigotListener; import com.dfsek.terra.bukkit.listeners.TerraListener; import com.dfsek.terra.bukkit.util.PaperUtil; import com.dfsek.terra.bukkit.world.BukkitBiome; +import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.commands.CommandUtil; import com.dfsek.terra.config.GenericLoaders; import com.dfsek.terra.config.PluginConfig; @@ -268,14 +269,15 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { return checkedRegistry; } - public TerraWorld getWorld(World w) { - if(!TerraWorld.isTerraWorld(w)) + public TerraWorld getWorld(World world) { + BukkitWorld w = (BukkitWorld) world; + if(!w.isTerraWorld()) throw new IllegalArgumentException("Not a Terra world! " + w.getGenerator()); if(!worlds.containsKey(w.getName())) { getLogger().warning("Unexpected world load detected: \"" + w.getName() + "\""); return new TerraWorld(w, ((TerraChunkGenerator) w.getGenerator().getHandle()).getConfigPack(), this); } - return worldMap.computeIfAbsent(w, world -> new TerraWorld(w, worlds.get(w.getName()), this)); + return worldMap.computeIfAbsent(w, w2 -> new TerraWorld(w, worlds.get(w.getName()), this)); } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java index cae7325db..67b7148e6 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -52,7 +52,7 @@ public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements Gener } public static synchronized void fixChunk(Chunk c) { - if(!TerraWorld.isTerraWorld(c.getWorld())) throw new IllegalArgumentException(); + if(!c.getWorld().isTerraWorld()) throw new IllegalArgumentException(); popMap.get(c.getWorld()).checkNeighbors(c.getX(), c.getZ(), c.getWorld()); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java index 5c6d31183..ac0fd6356 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/CommonListener.java @@ -44,7 +44,7 @@ public class CommonListener implements Listener { public void onSaplingGrow(StructureGrowEvent e) { if(e.isCancelled()) return; World bukkit = BukkitAdapter.adapt(e.getWorld()); - if(!TerraWorld.isTerraWorld(bukkit)) return; + if(!bukkit.isTerraWorld()) return; TerraWorld tw = main.getWorld(bukkit); WorldConfig c = tw.getConfig(); if(c.getTemplate().isDisableSaplings()) return; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java index 3945451f4..5423ea7dc 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java @@ -18,7 +18,7 @@ public class PaperListener implements Listener { @EventHandler public void onStructureLocate(StructureLocateEvent e) { - if(!TerraWorld.isTerraWorld(BukkitAdapter.adapt(e.getWorld()))) return; + if(!BukkitAdapter.adapt(e.getWorld()).isTerraWorld()) return; e.setResult(null); // Assume no result. String name = "minecraft:" + e.getType().getName(); main.getDebugLogger().info("Overriding structure location for \"" + name + "\""); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java index fe4681e61..5034c4863 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java @@ -34,7 +34,7 @@ public class SpigotListener implements Listener { Entity entity = e.getEntity(); if(e.getEntityType().equals(EntityType.ENDER_SIGNAL)) { main.getDebugLogger().info("Detected Ender Signal..."); - if(!TerraWorld.isTerraWorld(BukkitAdapter.adapt(e.getEntity().getWorld()))) return; + if(!BukkitAdapter.adapt(e.getEntity().getWorld()).isTerraWorld()) return; TerraWorld tw = main.getWorld(BukkitAdapter.adapt(e.getEntity().getWorld())); EnderSignal signal = (EnderSignal) entity; TerraStructure config = tw.getConfig().getStructureRegistry().get(tw.getConfig().getTemplate().getLocatable().get("STRONGHOLD")); @@ -53,7 +53,7 @@ public class SpigotListener implements Listener { @EventHandler public void onCartographerChange(VillagerAcquireTradeEvent e) { - if(!TerraWorld.isTerraWorld(BukkitAdapter.adapt(e.getEntity().getWorld()))) return; + if(!BukkitAdapter.adapt(e.getEntity().getWorld()).isTerraWorld()) return; if(!(e.getEntity() instanceof Villager)) return; if(((Villager) e.getEntity()).getProfession().equals(Villager.Profession.CARTOGRAPHER)) { main.logger().severe("Prevented server crash by stopping Cartographer villager from spawning."); @@ -65,7 +65,7 @@ public class SpigotListener implements Listener { @EventHandler public void onCartographerLevel(VillagerCareerChangeEvent e) { - if(!TerraWorld.isTerraWorld(BukkitAdapter.adapt(e.getEntity().getWorld()))) return; + if(!BukkitAdapter.adapt(e.getEntity().getWorld()).isTerraWorld()) return; if(e.getProfession().equals(Villager.Profession.CARTOGRAPHER)) { main.logger().severe("Prevented server crash by stopping Cartographer villager from spawning."); main.logger().severe("Please upgrade to Paper, which has a StructureLocateEvent that fixes this issue"); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java index 6ef00484f..48f3b7863 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java @@ -37,7 +37,6 @@ public class BukkitWorld implements World { return new BukkitChunkGenerator(delegate.getGenerator()); } - @Override public String getName() { return delegate.getName(); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java index bf33c7d11..63feccd00 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java @@ -40,11 +40,6 @@ public class FabricWorld implements World, FabricWorldHandle { return delegate.generator; } - @Override - public String getName() { - return delegate.world.worldProperties.getLevelName(); - } - @Override public Chunk getChunkAt(int x, int z) { return (Chunk) delegate.world.getChunk(x, z); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java index 5983db7d8..1bb41d34b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java @@ -39,11 +39,6 @@ public class FabricSeededWorldAccess implements World, FabricWorldHandle { return (ChunkGenerator) handle.getGenerator(); } - @Override - public String getName() { - return handle.toString(); // TODO: implementation - } - @Override public Chunk getChunkAt(int x, int z) { return null; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java index b79c320a6..da4be9090 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java @@ -38,11 +38,6 @@ public class FabricWorldAccess implements World, FabricWorldHandle { return (ChunkGenerator) ((ServerWorldAccess) delegate).toServerWorld().getChunkManager().getChunkGenerator(); } - @Override - public String getName() { - return ((ServerWorldAccess) delegate).toServerWorld().worldProperties.getLevelName(); - } - @Override public Chunk getChunkAt(int x, int z) { return null; diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/ForgeWorld.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/ForgeWorld.java index 9da1051f2..a4bfa54e2 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/ForgeWorld.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/ForgeWorld.java @@ -39,11 +39,6 @@ public class ForgeWorld implements World, ForgeWorldHandle { return delegate.generator; } - @Override - public String getName() { - return delegate.world.toString(); - } - @Override public Chunk getChunkAt(int x, int z) { return new ForgeChunk(delegate.world.getChunk(x, z)); diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeSeededWorldAccess.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeSeededWorldAccess.java index f2158ad04..bbc5aa411 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeSeededWorldAccess.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeSeededWorldAccess.java @@ -39,11 +39,6 @@ public class ForgeSeededWorldAccess implements World, ForgeWorldHandle { return new ForgeChunkGenerator(handle.getGenerator()); } - @Override - public String getName() { - return handle.toString(); // TODO: implementation - } - @Override public Chunk getChunkAt(int x, int z) { return null; diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeWorldAccess.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeWorldAccess.java index 968a979c0..8a061d49b 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeWorldAccess.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/world/handles/world/ForgeWorldAccess.java @@ -38,11 +38,6 @@ public class ForgeWorldAccess implements World, ForgeWorldHandle { return new ForgeChunkGenerator(((IServerWorld) delegate).getLevel().getChunkSource().getGenerator()); } - @Override - public String getName() { - return ((IServerWorld) delegate).getLevel().toString(); - } - @Override public Chunk getChunkAt(int x, int z) { return null; diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java index ab997a6b1..84b90b7d8 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java @@ -45,11 +45,6 @@ public class DirectWorld implements World { return generator; } - @Override - public String getName() { - return null; - } - @Override public Chunk getChunkAt(int x, int z) { MCAFile file = compute(x, z); From 146f71f704282fb11004aceb6a6918e688c18548 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 22:45:34 -0700 Subject: [PATCH 67/98] finish World mixins --- .../fabric/mixin/entity/EntityMixin.java | 9 +- .../fabric/mixin/world/ChunkRegionMixin.java | 4 +- .../mixin/world/ChunkRegionWorldMixin.java | 59 +++++++++ .../fabric/mixin/world/ServerWorldMixin.java | 61 +++++++++ .../fabric/mixin/world/WorldChunkMixin.java | 5 +- .../terra/fabric/world/FabricAdapter.java | 8 -- .../dfsek/terra/fabric/world/FabricTree.java | 7 +- .../terra/fabric/world/block/FabricBlock.java | 4 +- .../world/block/state/FabricBlockState.java | 3 +- .../world/features/PopulatorFeature.java | 5 +- .../FabricChunkGeneratorWrapper.java | 5 +- .../fabric/world/handles/FabricWorld.java | 115 ----------------- .../world/FabricSeededWorldAccess.java | 120 ------------------ .../handles/world/FabricWorldAccess.java | 95 -------------- .../handles/world/FabricWorldHandle.java | 7 - .../src/main/resources/terra.mixins.json | 2 + 16 files changed, 137 insertions(+), 372 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ServerWorldMixin.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldHandle.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java index abeb13bf8..524e69cef 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java @@ -3,14 +3,11 @@ package com.dfsek.terra.fabric.mixin.entity; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.fabric.world.FabricAdapter; -import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; -import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle; import net.minecraft.entity.Entity; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; @@ -43,16 +40,16 @@ public abstract class EntityMixin { } public Location vw$getLocation() { - return new Location(new FabricWorldAccess(world), FabricAdapter.adapt(blockPos)); + return new Location((World) world, FabricAdapter.adapt(blockPos)); } public void vw$setLocation(Location location) { teleport(location.getX(), location.getY(), location.getZ()); - moveToWorld((ServerWorld) ((FabricWorldHandle) location).getWorld()); + moveToWorld((ServerWorld) location.getWorld()); } public World getWorld() { - return new FabricWorldAccess(world); + return (World) world; } public void vw$sendMessage(String message) { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java index b34bbb397..d440bdc52 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java @@ -6,8 +6,6 @@ import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.block.FabricBlockData; -import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; -import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ChunkRegion; import org.jetbrains.annotations.NotNull; @@ -37,7 +35,7 @@ public abstract class ChunkRegionMixin { } public World vw$getWorld() { - return new FabricWorldAccess((ChunkRegion) (Object) this); + return (World) this; } public Block vw$getBlock(int x, int y, int z) { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java new file mode 100644 index 000000000..849125cff --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java @@ -0,0 +1,59 @@ +package com.dfsek.terra.fabric.mixin.world; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.entity.Entity; +import com.dfsek.terra.api.platform.entity.EntityType; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; +import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; +import com.dfsek.terra.api.world.generation.TerraChunkGenerator; +import com.dfsek.terra.fabric.world.block.FabricBlock; +import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ChunkRegion; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(ChunkRegion.class) +@Implements(@Interface(iface = World.class, prefix = "vw$")) +public abstract class ChunkRegionWorldMixin { + public int vw$getMaxHeight() { + return ((ChunkRegion) (Object) this).getDimensionHeight(); + } + + public ChunkGenerator vw$getGenerator() { + return (ChunkGenerator) ((ChunkRegion) (Object) this).toServerWorld().getChunkManager().getChunkGenerator(); + } + + public Chunk vw$getChunkAt(int x, int z) { + return (Chunk) ((ChunkRegion) (Object) this).getChunk(x, z); + } + + public Block vw$getBlockAt(int x, int y, int z) { + return new FabricBlock(new BlockPos(x, y, z), ((ChunkRegion) (Object) this)); + } + + public Entity vw$spawnEntity(Location location, EntityType entityType) { + throw new UnsupportedOperationException(); + } + + public int vw$getMinHeight() { + return 0; + } + + public Object vw$getHandle() { + return this; + } + + public boolean vw$isTerraWorld() { + return vw$getGenerator() instanceof GeneratorWrapper; + } + + public TerraChunkGenerator vw$getTerraGenerator() { + return ((FabricChunkGeneratorWrapper) vw$getGenerator()).getHandle(); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ServerWorldMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ServerWorldMixin.java new file mode 100644 index 000000000..e6f74ddf9 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ServerWorldMixin.java @@ -0,0 +1,61 @@ +package com.dfsek.terra.fabric.mixin.world; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.entity.Entity; +import com.dfsek.terra.api.platform.entity.EntityType; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; +import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; +import com.dfsek.terra.api.world.generation.TerraChunkGenerator; +import com.dfsek.terra.fabric.world.block.FabricBlock; +import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(ServerWorld.class) +@Implements(@Interface(iface = World.class, prefix = "vw$")) +public abstract class ServerWorldMixin { + public int vw$getMaxHeight() { + return ((ServerWorld) (Object) this).getDimensionHeight(); + } + + public ChunkGenerator vw$getGenerator() { + return (ChunkGenerator) ((ServerWorld) (Object) this).getChunkManager().getChunkGenerator(); + } + + public Chunk vw$getChunkAt(int x, int z) { + return (Chunk) ((ServerWorld) (Object) this).getChunk(x, z); + } + + public Block vw$getBlockAt(int x, int y, int z) { + return new FabricBlock(new BlockPos(x, y, z), ((ServerWorld) (Object) this)); + } + + public Entity vw$spawnEntity(Location location, EntityType entityType) { + net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create(((ServerWorld) (Object) this)); + entity.setPos(location.getX(), location.getY(), location.getZ()); + ((ServerWorld) (Object) this).spawnEntity(entity); + return (Entity) entity; + } + + public int vw$getMinHeight() { + return 0; + } + + public Object vw$getHandle() { + return this; + } + + public boolean vw$isTerraWorld() { + return vw$getGenerator() instanceof GeneratorWrapper; + } + + public TerraChunkGenerator vw$getTerraGenerator() { + return ((FabricChunkGeneratorWrapper) vw$getGenerator()).getHandle(); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java index 5b0f38c1b..8bbfd54b4 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java @@ -4,11 +4,8 @@ import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.block.FabricBlockData; -import com.dfsek.terra.fabric.world.handles.FabricWorld; -import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.world.chunk.WorldChunk; import org.jetbrains.annotations.NotNull; @@ -34,7 +31,7 @@ public abstract class WorldChunkMixin { } public World vw$getWorld() { - return new FabricWorld((ServerWorld) world, (ChunkGenerator) ((ServerWorld) world).getChunkManager().getChunkGenerator()); + return (World) world; } public Block vw$getBlock(int x, int y, int z) { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java index eb0595b6d..ba2acf1aa 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java @@ -3,7 +3,6 @@ package com.dfsek.terra.fabric.world; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.BlockType; -import com.dfsek.terra.api.platform.entity.EntityType; import com.dfsek.terra.fabric.world.block.FabricBlockData; import com.dfsek.terra.fabric.world.block.FabricBlockType; import com.dfsek.terra.fabric.world.block.data.FabricDirectional; @@ -13,14 +12,11 @@ import com.dfsek.terra.fabric.world.block.data.FabricRotatable; import com.dfsek.terra.fabric.world.block.data.FabricSlab; import com.dfsek.terra.fabric.world.block.data.FabricStairs; import com.dfsek.terra.fabric.world.block.data.FabricWaterlogged; -import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; import net.minecraft.state.property.Properties; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; -import net.minecraft.world.WorldAccess; import java.util.Arrays; @@ -75,8 +71,4 @@ public final class FabricAdapter { public static BlockType adapt(Block block) { return new FabricBlockType(block); } - - public WorldAccess adapt(FabricWorldHandle worldHandle) { - return worldHandle.getWorld(); - } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java index 02bcb0a24..2e3b08955 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java @@ -4,7 +4,6 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.util.collections.MaterialSet; import com.dfsek.terra.fabric.TerraFabricPlugin; -import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; import com.dfsek.terra.profiler.ProfileFrame; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; @@ -27,9 +26,9 @@ public class FabricTree implements Tree { @SuppressWarnings("try") public boolean plant(Location l, Random r) { try(ProfileFrame ignore = TerraFabricPlugin.getInstance().getProfiler().profile("fabric_tree:" + id.toLowerCase(Locale.ROOT))) { - FabricWorldAccess fabricWorldAccess = ((FabricWorldAccess) l.getWorld()); - ChunkGenerator generatorWrapper = (ChunkGenerator) fabricWorldAccess.getGenerator(); - return delegate.generate((StructureWorldAccess) fabricWorldAccess.getHandle(), generatorWrapper, r, new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ())); + StructureWorldAccess fabricWorldAccess = ((StructureWorldAccess) l.getWorld()); + ChunkGenerator generatorWrapper = (ChunkGenerator) l.getWorld().getGenerator(); + return delegate.generate(fabricWorldAccess, generatorWrapper, r, new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ())); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java index 9e0b440ac..0db2e8daf 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java @@ -6,9 +6,9 @@ import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.BlockType; import com.dfsek.terra.api.platform.block.state.BlockState; +import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.fabric.world.FabricAdapter; import com.dfsek.terra.fabric.world.block.state.FabricBlockState; -import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; import net.minecraft.block.FluidBlock; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldAccess; @@ -51,7 +51,7 @@ public class FabricBlock implements Block { @Override public Location getLocation() { - return FabricAdapter.adapt(delegate.position).toLocation(new FabricWorldAccess(delegate.worldAccess)); + return FabricAdapter.adapt(delegate.position).toLocation((World) delegate.worldAccess); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java index d0dbf5bf4..1aacb1073 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java @@ -5,7 +5,6 @@ import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.state.BlockState; import com.dfsek.terra.fabric.world.FabricAdapter; import com.dfsek.terra.fabric.world.block.FabricBlock; -import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.LootableContainerBlockEntity; import net.minecraft.block.entity.MobSpawnerBlockEntity; @@ -22,7 +21,7 @@ public class FabricBlockState implements BlockState { } public static FabricBlockState newInstance(Block block) { - WorldAccess worldAccess = ((FabricWorldHandle) block.getLocation().getWorld()).getWorld(); + WorldAccess worldAccess = (WorldAccess) block.getLocation().getWorld(); BlockEntity entity = worldAccess.getBlockEntity(FabricAdapter.adapt(block.getLocation().toVector())); if(entity instanceof SignBlockEntity) { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java index 18b327682..4e7fbce77 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java @@ -1,8 +1,8 @@ package com.dfsek.terra.fabric.world.features; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; -import com.dfsek.terra.fabric.world.handles.FabricWorld; import com.mojang.serialization.Codec; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; @@ -23,8 +23,7 @@ public class PopulatorFeature extends Feature { @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { FabricChunkGeneratorWrapper gen = (FabricChunkGeneratorWrapper) chunkGenerator; - FabricWorld world1 = new FabricWorld(world.toServerWorld(), (com.dfsek.terra.api.platform.world.generator.ChunkGenerator) chunkGenerator); - gen.getHandle().getPopulators().forEach(populator -> populator.populate(world1, (Chunk) world)); + gen.getHandle().getPopulators().forEach(populator -> populator.populate((World) world, (Chunk) world)); return true; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index 5f3a68a73..c9be1158b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -1,5 +1,6 @@ package com.dfsek.terra.fabric.world.generator; +import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.generator.ChunkData; import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; import com.dfsek.terra.api.util.FastRandom; @@ -7,7 +8,6 @@ import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.world.TerraBiomeSource; -import com.dfsek.terra.fabric.world.handles.world.FabricSeededWorldAccess; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.generation.generators.DefaultChunkGenerator3D; import com.dfsek.terra.world.generation.math.samplers.Sampler; @@ -83,8 +83,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener @Override public void populateNoise(WorldAccess world, StructureAccessor accessor, Chunk chunk) { - FabricSeededWorldAccess worldAccess = new FabricSeededWorldAccess(world, seed, this); - delegate.generateChunkData(worldAccess, new FastRandom(), chunk.getPos().x, chunk.getPos().z, (ChunkData) chunk); + delegate.generateChunkData((World) world, new FastRandom(), chunk.getPos().x, chunk.getPos().z, (ChunkData) chunk); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java deleted file mode 100644 index 63feccd00..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.dfsek.terra.fabric.world.handles; - -import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.block.Block; -import com.dfsek.terra.api.platform.entity.Entity; -import com.dfsek.terra.api.platform.entity.EntityType; -import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; -import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; -import com.dfsek.terra.api.world.generation.TerraChunkGenerator; -import com.dfsek.terra.fabric.world.block.FabricBlock; -import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; -import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.ServerWorldAccess; -import net.minecraft.world.WorldAccess; - -public class FabricWorld implements World, FabricWorldHandle { - - private final Handle delegate; - - public FabricWorld(ServerWorld world, ChunkGenerator generator) { - this.delegate = new Handle(world, generator); - } - - @Override - public long getSeed() { - return delegate.world.getSeed(); - } - - @Override - public int getMaxHeight() { - return delegate.world.getHeight(); - } - - @Override - public ChunkGenerator getGenerator() { - return delegate.generator; - } - - @Override - public Chunk getChunkAt(int x, int z) { - return (Chunk) delegate.world.getChunk(x, z); - } - - @Override - public Block getBlockAt(int x, int y, int z) { - BlockPos pos = new BlockPos(x, y, z); - return new FabricBlock(pos, delegate.world); - } - - @Override - public int hashCode() { - return ((ServerWorldAccess) delegate.world).toServerWorld().hashCode(); - } - - @Override - public boolean equals(Object obj) { - if(!(obj instanceof FabricWorld)) return false; - return ((ServerWorldAccess) ((FabricWorld) obj).delegate.world).toServerWorld().equals(((ServerWorldAccess) delegate.world).toServerWorld()); - } - - @Override - public Entity spawnEntity(Location location, EntityType entityType) { - net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create(delegate.world); - entity.setPos(location.getX(), location.getY(), location.getZ()); - delegate.world.spawnEntity(entity); - return (Entity) entity; - } - - @Override - public int getMinHeight() { - return 0; - } - - @Override - public Handle getHandle() { - return null; - } - - @Override - public WorldAccess getWorld() { - return delegate.getWorld(); - } - - public static final class Handle { - private final ServerWorld world; - private final ChunkGenerator generator; - - private Handle(ServerWorld world, ChunkGenerator generator) { - this.world = world; - this.generator = generator; - } - - public ChunkGenerator getGenerator() { - return generator; - } - - public ServerWorld getWorld() { - return world; - } - } - - @Override - public boolean isTerraWorld() { - return delegate.generator instanceof GeneratorWrapper; - } - - @Override - public TerraChunkGenerator getTerraGenerator() { - return ((FabricChunkGeneratorWrapper) delegate.generator).getHandle(); - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java deleted file mode 100644 index 1bb41d34b..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.dfsek.terra.fabric.world.handles.world; - -import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.block.Block; -import com.dfsek.terra.api.platform.entity.Entity; -import com.dfsek.terra.api.platform.entity.EntityType; -import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; -import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; -import com.dfsek.terra.api.world.generation.TerraChunkGenerator; -import com.dfsek.terra.fabric.world.block.FabricBlock; -import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.ServerWorldAccess; -import net.minecraft.world.WorldAccess; - -public class FabricSeededWorldAccess implements World, FabricWorldHandle { - - private final Handle handle; - - public FabricSeededWorldAccess(WorldAccess access, long seed, net.minecraft.world.gen.chunk.ChunkGenerator generator) { - this.handle = new Handle(access, seed, generator); - } - - @Override - public long getSeed() { - return handle.getSeed(); - } - - @Override - public int getMaxHeight() { - return handle.getWorldAccess().getDimensionHeight(); - } - - @Override - public ChunkGenerator getGenerator() { - return (ChunkGenerator) handle.getGenerator(); - } - - @Override - public Chunk getChunkAt(int x, int z) { - return null; - } - - @Override - public Block getBlockAt(int x, int y, int z) { - BlockPos pos = new BlockPos(x, y, z); - return new FabricBlock(pos, handle.worldAccess); - } - - @Override - public Entity spawnEntity(Location location, EntityType entityType) { - net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create((ServerWorld) handle.worldAccess); - entity.setPos(location.getX(), location.getY(), location.getZ()); - handle.worldAccess.spawnEntity(entity); - return (Entity) entity; - } - - @Override - public int getMinHeight() { - return 0; - } - - @Override - public int hashCode() { - return ((ServerWorldAccess) handle.worldAccess).toServerWorld().hashCode(); - } - - @Override - public boolean equals(Object obj) { - if(!(obj instanceof FabricSeededWorldAccess)) return false; - return ((ServerWorldAccess) ((FabricSeededWorldAccess) obj).handle.worldAccess).toServerWorld().equals(((ServerWorldAccess) handle.worldAccess).toServerWorld()); - } - - @Override - public Handle getHandle() { - return handle; - } - - @Override - public WorldAccess getWorld() { - return handle.worldAccess; - } - - public static class Handle { - private final WorldAccess worldAccess; - private final long seed; - private final net.minecraft.world.gen.chunk.ChunkGenerator generator; - - public Handle(WorldAccess worldAccess, long seed, net.minecraft.world.gen.chunk.ChunkGenerator generator) { - this.worldAccess = worldAccess; - this.seed = seed; - this.generator = generator; - } - - public net.minecraft.world.gen.chunk.ChunkGenerator getGenerator() { - return generator; - } - - public long getSeed() { - return seed; - } - - public WorldAccess getWorldAccess() { - return worldAccess; - } - } - - @Override - public boolean isTerraWorld() { - return handle.generator instanceof GeneratorWrapper; - } - - @Override - public TerraChunkGenerator getTerraGenerator() { - return ((FabricChunkGeneratorWrapper) handle.generator).getHandle(); - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java deleted file mode 100644 index da4be9090..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.dfsek.terra.fabric.world.handles.world; - -import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.block.Block; -import com.dfsek.terra.api.platform.entity.Entity; -import com.dfsek.terra.api.platform.entity.EntityType; -import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; -import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; -import com.dfsek.terra.api.world.generation.TerraChunkGenerator; -import com.dfsek.terra.fabric.world.block.FabricBlock; -import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.ServerWorldAccess; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.WorldAccess; - -public class FabricWorldAccess implements World, FabricWorldHandle { - private final WorldAccess delegate; - - public FabricWorldAccess(WorldAccess delegate) { - this.delegate = delegate; - } - - @Override - public long getSeed() { - return ((StructureWorldAccess) delegate).getSeed(); - } - - @Override - public int getMaxHeight() { - return delegate.getDimensionHeight(); - } - - @Override - public ChunkGenerator getGenerator() { - return (ChunkGenerator) ((ServerWorldAccess) delegate).toServerWorld().getChunkManager().getChunkGenerator(); - } - - @Override - public Chunk getChunkAt(int x, int z) { - return null; - } - - @Override - public Block getBlockAt(int x, int y, int z) { - BlockPos pos = new BlockPos(x, y, z); - return new FabricBlock(pos, delegate); - } - - @Override - public Entity spawnEntity(Location location, EntityType entityType) { - net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create(((ServerWorldAccess) delegate).toServerWorld()); - entity.setPos(location.getX(), location.getY(), location.getZ()); - delegate.spawnEntity(entity); - return (Entity) entity; - } - - @Override - public int getMinHeight() { - return 0; - } - - @Override - public WorldAccess getHandle() { - return delegate; - } - - @Override - public WorldAccess getWorld() { - return delegate; - } - - @Override - public int hashCode() { - return ((ServerWorldAccess) delegate).toServerWorld().hashCode(); - } - - @Override - public boolean equals(Object obj) { - if(!(obj instanceof FabricWorldAccess)) return false; - return ((ServerWorldAccess) ((FabricWorldAccess) obj).delegate).toServerWorld().equals(((ServerWorldAccess) delegate).toServerWorld()); - } - - @Override - public boolean isTerraWorld() { - return getGenerator() instanceof GeneratorWrapper; - } - - @Override - public TerraChunkGenerator getTerraGenerator() { - return ((FabricChunkGeneratorWrapper) getGenerator()).getHandle(); - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldHandle.java deleted file mode 100644 index 7565201aa..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldHandle.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.dfsek.terra.fabric.world.handles.world; - -import net.minecraft.world.WorldAccess; - -public interface FabricWorldHandle { - WorldAccess getWorld(); -} diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index b0e7a8a2b..454d012b1 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -16,7 +16,9 @@ "inventory.ItemStackMixin", "world.ChunkGeneratorMixin", "world.ChunkRegionMixin", + "world.ChunkRegionWorldMixin", "world.ProtoChunkMixin", + "world.ServerWorldMixin", "world.WorldChunkMixin" ], "client": [ From 20a5762d2eb6194fb7973f1fec814c5386beb25b Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 22:48:21 -0700 Subject: [PATCH 68/98] refactor mixins --- .../fabric/mixin/entity/EntityMixin.java | 10 ++++---- .../fabric/mixin/entity/EntityTypeMixin.java | 4 +-- .../mixin/entity/PlayerEntityMixin.java | 2 +- .../entity/ServerCommandSourceMixin.java | 6 ++--- .../mixin/inventory/EnchantmentMixin.java | 11 ++++---- .../fabric/mixin/inventory/ItemMixin.java | 8 +++--- .../inventory/ItemStackDamageableMixin.java | 4 +-- .../mixin/inventory/ItemStackMetaMixin.java | 9 +++---- .../mixin/inventory/ItemStackMixin.java | 12 ++++----- .../terra/fabric/mixin/world/BiomeMixin.java | 12 +++++++++ .../mixin/world/ChunkGeneratorMixin.java | 4 +-- .../fabric/mixin/world/ChunkRegionMixin.java | 18 ++++++------- .../mixin/world/ChunkRegionWorldMixin.java | 25 +++++++++---------- .../fabric/mixin/world/ProtoChunkMixin.java | 10 ++++---- .../fabric/mixin/world/ServerWorldMixin.java | 24 +++++++++--------- .../fabric/mixin/world/WorldChunkMixin.java | 20 +++++++-------- .../src/main/resources/terra.mixins.json | 1 + 17 files changed, 95 insertions(+), 85 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/BiomeMixin.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java index 524e69cef..10f36cdb2 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.Shadow; import java.util.UUID; @Mixin(Entity.class) -@Implements(@Interface(iface = com.dfsek.terra.api.platform.entity.Entity.class, prefix = "vw$")) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.entity.Entity.class, prefix = "terra$")) public abstract class EntityMixin { @Shadow public net.minecraft.world.World world; @@ -35,15 +35,15 @@ public abstract class EntityMixin { @Shadow public abstract void sendSystemMessage(Text message, UUID senderUuid); - public Object vw$getHandle() { + public Object terra$getHandle() { return this; } - public Location vw$getLocation() { + public Location terra$getLocation() { return new Location((World) world, FabricAdapter.adapt(blockPos)); } - public void vw$setLocation(Location location) { + public void terra$setLocation(Location location) { teleport(location.getX(), location.getY(), location.getZ()); moveToWorld((ServerWorld) location.getWorld()); } @@ -52,7 +52,7 @@ public abstract class EntityMixin { return (World) world; } - public void vw$sendMessage(String message) { + public void terra$sendMessage(String message) { sendSystemMessage(new LiteralText(message), UUID.randomUUID()); // TODO: look into how this actually works and make it less jank } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityTypeMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityTypeMixin.java index f2e102b44..4237775da 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityTypeMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityTypeMixin.java @@ -6,9 +6,9 @@ import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @Mixin(EntityType.class) -@Implements(@Interface(iface = com.dfsek.terra.api.platform.entity.EntityType.class, prefix = "vw$")) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.entity.EntityType.class, prefix = "terra$")) public abstract class EntityTypeMixin { - public Object vw$getHandle() { + public Object terra$getHandle() { return this; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/PlayerEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/PlayerEntityMixin.java index e86f9c05e..18b5b8b17 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/PlayerEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/PlayerEntityMixin.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @Mixin(PlayerEntity.class) -@Implements(@Interface(iface = Player.class, prefix = "vw$")) +@Implements(@Interface(iface = Player.class, prefix = "terra$")) public abstract class PlayerEntityMixin extends EntityMixin { } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/ServerCommandSourceMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/ServerCommandSourceMixin.java index 48cc1c8ba..a8132f3c5 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/ServerCommandSourceMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/ServerCommandSourceMixin.java @@ -10,16 +10,16 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(ServerCommandSource.class) -@Implements(@Interface(iface = CommandSender.class, prefix = "vw$")) +@Implements(@Interface(iface = CommandSender.class, prefix = "terra$")) public abstract class ServerCommandSourceMixin { @Shadow public abstract void sendFeedback(Text message, boolean broadcastToOps); - public void vw$sendMessage(String message) { + public void terra$sendMessage(String message) { sendFeedback(new LiteralText(message), true); } - public Object vw$getHandle() { + public Object terra$getHandle() { return this; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/EnchantmentMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/EnchantmentMixin.java index e83164184..6d7f3c90d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/EnchantmentMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/EnchantmentMixin.java @@ -1,7 +1,6 @@ package com.dfsek.terra.fabric.mixin.inventory; import com.dfsek.terra.api.platform.inventory.ItemStack; -import com.dfsek.terra.fabric.world.FabricAdapter; import net.minecraft.enchantment.Enchantment; import net.minecraft.util.registry.Registry; import org.spongepowered.asm.mixin.Implements; @@ -12,7 +11,7 @@ import org.spongepowered.asm.mixin.Shadow; import java.util.Objects; @Mixin(Enchantment.class) -@Implements(@Interface(iface = com.dfsek.terra.api.platform.inventory.item.Enchantment.class, prefix = "vw$")) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.inventory.item.Enchantment.class, prefix = "terra$")) public abstract class EnchantmentMixin { @Shadow public abstract boolean isAcceptableItem(net.minecraft.item.ItemStack stack); @@ -20,20 +19,20 @@ public abstract class EnchantmentMixin { @Shadow public abstract boolean canCombine(Enchantment other); - public Object vw$getHandle() { + public Object terra$getHandle() { return this; } @SuppressWarnings("ConstantConditions") - public boolean vw$canEnchantItem(ItemStack itemStack) { + public boolean terra$canEnchantItem(ItemStack itemStack) { return isAcceptableItem((net.minecraft.item.ItemStack) (Object) itemStack); } - public String vw$getID() { + public String terra$getID() { return Objects.requireNonNull(Registry.ENCHANTMENT.getId((Enchantment) (Object) this)).toString(); } - public boolean vw$conflictsWith(com.dfsek.terra.api.platform.inventory.item.Enchantment other) { + public boolean terra$conflictsWith(com.dfsek.terra.api.platform.inventory.item.Enchantment other) { return !canCombine((Enchantment) other); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemMixin.java index 6aadadda9..03000102b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemMixin.java @@ -8,21 +8,21 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(Item.class) -@Implements(@Interface(iface = com.dfsek.terra.api.platform.inventory.Item.class, prefix = "vw$")) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.inventory.Item.class, prefix = "terra$")) public abstract class ItemMixin { @Shadow public abstract int getMaxDamage(); - public Object vw$getHandle() { + public Object terra$getHandle() { return this; } @SuppressWarnings("ConstantConditions") - public ItemStack vw$newItemStack(int amount) { + public ItemStack terra$newItemStack(int amount) { return (ItemStack) (Object) new net.minecraft.item.ItemStack((Item) (Object) this, amount); } - public double vw$getMaxDurability() { + public double terra$getMaxDurability() { return getMaxDamage(); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackDamageableMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackDamageableMixin.java index c815b6535..3ee8a8b77 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackDamageableMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackDamageableMixin.java @@ -8,12 +8,12 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(ItemStack.class) -@Implements(@Interface(iface = Damageable.class, prefix = "vw$")) +@Implements(@Interface(iface = Damageable.class, prefix = "terra$")) public abstract class ItemStackDamageableMixin { @Shadow public abstract boolean isDamaged(); - public boolean vw$hasDamage() { + public boolean terra$hasDamage() { return isDamaged(); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMetaMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMetaMixin.java index a68484ba3..df061ff89 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMetaMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMetaMixin.java @@ -2,7 +2,6 @@ package com.dfsek.terra.fabric.mixin.inventory; import com.dfsek.terra.api.platform.inventory.item.Enchantment; import com.dfsek.terra.api.platform.inventory.item.ItemMeta; -import com.dfsek.terra.fabric.world.FabricAdapter; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -17,7 +16,7 @@ import java.util.HashMap; import java.util.Map; @Mixin(ItemStack.class) -@Implements(@Interface(iface = ItemMeta.class, prefix = "vw$")) +@Implements(@Interface(iface = ItemMeta.class, prefix = "terra$")) public abstract class ItemStackMetaMixin { @Shadow public abstract boolean hasEnchantments(); @@ -28,11 +27,11 @@ public abstract class ItemStackMetaMixin { @Shadow public abstract void addEnchantment(net.minecraft.enchantment.Enchantment enchantment, int level); - public Object vw$getHandle() { + public Object terra$getHandle() { return this; } - public Map vw$getEnchantments() { + public Map terra$getEnchantments() { if(!hasEnchantments()) return Collections.emptyMap(); Map map = new HashMap<>(); @@ -43,7 +42,7 @@ public abstract class ItemStackMetaMixin { return map; } - public void vw$addEnchantment(Enchantment enchantment, int level) { + public void terra$addEnchantment(Enchantment enchantment, int level) { addEnchantment((net.minecraft.enchantment.Enchantment) enchantment, level); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMixin.java index 453795b11..8b94e29ca 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMixin.java @@ -9,7 +9,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(ItemStack.class) -@Implements(@Interface(iface = com.dfsek.terra.api.platform.inventory.ItemStack.class, prefix = "vw$")) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.inventory.ItemStack.class, prefix = "terra$")) public abstract class ItemStackMixin { @Shadow public abstract int getCount(); @@ -26,11 +26,11 @@ public abstract class ItemStackMixin { @Shadow public abstract ItemStack copy(); - public int vw$getAmount() { + public int terra$getAmount() { return getCount(); } - public void vw$setAmount(int i) { + public void terra$setAmount(int i) { setCount(i); } @@ -38,15 +38,15 @@ public abstract class ItemStackMixin { return (Item) getItem(); } - public ItemMeta vw$getItemMeta() { + public ItemMeta terra$getItemMeta() { return (ItemMeta) this; } - public void vw$setItemMeta(ItemMeta meta) { + public void terra$setItemMeta(ItemMeta meta) { } - public Object vw$getHandle() { + public Object terra$getHandle() { return this; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/BiomeMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/BiomeMixin.java new file mode 100644 index 000000000..bdf1b53a4 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/BiomeMixin.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.fabric.mixin.world; + +import net.minecraft.world.biome.Biome; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(Biome.class) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.world.Biome.class, prefix = "terra$")) +public class BiomeMixin { + +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkGeneratorMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkGeneratorMixin.java index dccaf2344..58566510c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkGeneratorMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkGeneratorMixin.java @@ -6,9 +6,9 @@ import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @Mixin(ChunkGenerator.class) -@Implements(@Interface(iface = com.dfsek.terra.api.platform.world.generator.ChunkGenerator.class, prefix = "vw$")) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.world.generator.ChunkGenerator.class, prefix = "terra$")) public abstract class ChunkGeneratorMixin { - public Object vw$getHandle() { + public Object terra$getHandle() { return this; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java index d440bdc52..3bc12d612 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(ChunkRegion.class) -@Implements(@Interface(iface = Chunk.class, prefix = "vw$")) +@Implements(@Interface(iface = Chunk.class, prefix = "terra$")) public abstract class ChunkRegionMixin { @Final @Shadow @@ -26,32 +26,32 @@ public abstract class ChunkRegionMixin { @Shadow private int centerChunkZ; - public int vw$getX() { + public int terra$getX() { return centerChunkX; } - public int vw$getZ() { + public int terra$getZ() { return centerChunkZ; } - public World vw$getWorld() { + public World terra$getWorld() { return (World) this; } - public Block vw$getBlock(int x, int y, int z) { + public Block terra$getBlock(int x, int y, int z) { BlockPos pos = new BlockPos(x + (centerChunkX << 4), y, z + (centerChunkZ << 4)); return new FabricBlock(pos, (ChunkRegion) (Object) this); } - public @NotNull BlockData vw$getBlockData(int x, int y, int z) { - return vw$getBlock(x, y, z).getBlockData(); + public @NotNull BlockData terra$getBlockData(int x, int y, int z) { + return terra$getBlock(x, y, z).getBlockData(); } - public void vw$setBlock(int x, int y, int z, @NotNull BlockData blockData) { + public void terra$setBlock(int x, int y, int z, @NotNull BlockData blockData) { ((ChunkRegion) (Object) this).setBlockState(new BlockPos(x + (centerChunkX << 4), y, z + (centerChunkZ << 4)), ((FabricBlockData) blockData).getHandle(), 0); } - public Object vw$getHandle() { + public Object terra$getHandle() { return this; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java index 849125cff..e80913edb 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java @@ -11,7 +11,6 @@ import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; -import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ChunkRegion; import org.spongepowered.asm.mixin.Implements; @@ -19,41 +18,41 @@ import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @Mixin(ChunkRegion.class) -@Implements(@Interface(iface = World.class, prefix = "vw$")) +@Implements(@Interface(iface = World.class, prefix = "terra$")) public abstract class ChunkRegionWorldMixin { - public int vw$getMaxHeight() { + public int terra$getMaxHeight() { return ((ChunkRegion) (Object) this).getDimensionHeight(); } - public ChunkGenerator vw$getGenerator() { + public ChunkGenerator terra$getGenerator() { return (ChunkGenerator) ((ChunkRegion) (Object) this).toServerWorld().getChunkManager().getChunkGenerator(); } - public Chunk vw$getChunkAt(int x, int z) { + public Chunk terra$getChunkAt(int x, int z) { return (Chunk) ((ChunkRegion) (Object) this).getChunk(x, z); } - public Block vw$getBlockAt(int x, int y, int z) { + public Block terra$getBlockAt(int x, int y, int z) { return new FabricBlock(new BlockPos(x, y, z), ((ChunkRegion) (Object) this)); } - public Entity vw$spawnEntity(Location location, EntityType entityType) { + public Entity terra$spawnEntity(Location location, EntityType entityType) { throw new UnsupportedOperationException(); } - public int vw$getMinHeight() { + public int terra$getMinHeight() { return 0; } - public Object vw$getHandle() { + public Object terra$getHandle() { return this; } - public boolean vw$isTerraWorld() { - return vw$getGenerator() instanceof GeneratorWrapper; + public boolean terra$isTerraWorld() { + return terra$getGenerator() instanceof GeneratorWrapper; } - public TerraChunkGenerator vw$getTerraGenerator() { - return ((FabricChunkGeneratorWrapper) vw$getGenerator()).getHandle(); + public TerraChunkGenerator terra$getTerraGenerator() { + return ((FabricChunkGeneratorWrapper) terra$getGenerator()).getHandle(); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ProtoChunkMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ProtoChunkMixin.java index 1a2cf1593..9fb5d5f87 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ProtoChunkMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ProtoChunkMixin.java @@ -13,24 +13,24 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(ProtoChunk.class) -@Implements(@Interface(iface = ChunkData.class, prefix = "vw$")) +@Implements(@Interface(iface = ChunkData.class, prefix = "terra$")) public abstract class ProtoChunkMixin { @Shadow public abstract BlockState getBlockState(BlockPos pos); - public @NotNull BlockData vw$getBlockData(int x, int y, int z) { + public @NotNull BlockData terra$getBlockData(int x, int y, int z) { return new FabricBlockData(getBlockState(new BlockPos(x, y, z))); } - public void vw$setBlock(int x, int y, int z, @NotNull BlockData blockData) { + public void terra$setBlock(int x, int y, int z, @NotNull BlockData blockData) { ((net.minecraft.world.chunk.Chunk) this).setBlockState(new BlockPos(x, y, z), ((FabricBlockData) blockData).getHandle(), false); } - public Object vw$getHandle() { + public Object terra$getHandle() { return this; } - public int vw$getMaxHeight() { + public int terra$getMaxHeight() { return 255; // TODO: 1.17 - Implement dynamic height. } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ServerWorldMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ServerWorldMixin.java index e6f74ddf9..ddb1eb56d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ServerWorldMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ServerWorldMixin.java @@ -18,44 +18,44 @@ import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @Mixin(ServerWorld.class) -@Implements(@Interface(iface = World.class, prefix = "vw$")) +@Implements(@Interface(iface = World.class, prefix = "terra$")) public abstract class ServerWorldMixin { - public int vw$getMaxHeight() { + public int terra$getMaxHeight() { return ((ServerWorld) (Object) this).getDimensionHeight(); } - public ChunkGenerator vw$getGenerator() { + public ChunkGenerator terra$getGenerator() { return (ChunkGenerator) ((ServerWorld) (Object) this).getChunkManager().getChunkGenerator(); } - public Chunk vw$getChunkAt(int x, int z) { + public Chunk terra$getChunkAt(int x, int z) { return (Chunk) ((ServerWorld) (Object) this).getChunk(x, z); } - public Block vw$getBlockAt(int x, int y, int z) { + public Block terra$getBlockAt(int x, int y, int z) { return new FabricBlock(new BlockPos(x, y, z), ((ServerWorld) (Object) this)); } - public Entity vw$spawnEntity(Location location, EntityType entityType) { + public Entity terra$spawnEntity(Location location, EntityType entityType) { net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create(((ServerWorld) (Object) this)); entity.setPos(location.getX(), location.getY(), location.getZ()); ((ServerWorld) (Object) this).spawnEntity(entity); return (Entity) entity; } - public int vw$getMinHeight() { + public int terra$getMinHeight() { return 0; } - public Object vw$getHandle() { + public Object terra$getHandle() { return this; } - public boolean vw$isTerraWorld() { - return vw$getGenerator() instanceof GeneratorWrapper; + public boolean terra$isTerraWorld() { + return terra$getGenerator() instanceof GeneratorWrapper; } - public TerraChunkGenerator vw$getTerraGenerator() { - return ((FabricChunkGeneratorWrapper) vw$getGenerator()).getHandle(); + public TerraChunkGenerator terra$getTerraGenerator() { + return ((FabricChunkGeneratorWrapper) terra$getGenerator()).getHandle(); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java index 8bbfd54b4..79ce700cf 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java @@ -16,38 +16,38 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(WorldChunk.class) -@Implements(@Interface(iface = Chunk.class, prefix = "vw$")) +@Implements(@Interface(iface = Chunk.class, prefix = "terra$")) public abstract class WorldChunkMixin { @Final @Shadow private net.minecraft.world.World world; - public int vw$getX() { + public int terra$getX() { return ((net.minecraft.world.chunk.Chunk) this).getPos().x; } - public int vw$getZ() { + public int terra$getZ() { return ((net.minecraft.world.chunk.Chunk) this).getPos().z; } - public World vw$getWorld() { + public World terra$getWorld() { return (World) world; } - public Block vw$getBlock(int x, int y, int z) { - BlockPos pos = new BlockPos(x + (vw$getX() << 4), y, z + (vw$getZ() << 4)); + public Block terra$getBlock(int x, int y, int z) { + BlockPos pos = new BlockPos(x + (terra$getX() << 4), y, z + (terra$getZ() << 4)); return new FabricBlock(pos, world); } - public @NotNull BlockData vw$getBlockData(int x, int y, int z) { - return vw$getBlock(x, y, z).getBlockData(); + public @NotNull BlockData terra$getBlockData(int x, int y, int z) { + return terra$getBlock(x, y, z).getBlockData(); } - public void vw$setBlock(int x, int y, int z, @NotNull BlockData blockData) { + public void terra$setBlock(int x, int y, int z, @NotNull BlockData blockData) { ((net.minecraft.world.chunk.Chunk) this).setBlockState(new BlockPos(x, y, z), ((FabricBlockData) blockData).getHandle(), false); } - public Object vw$getHandle() { + public Object terra$getHandle() { return this; } } diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 454d012b1..3e8942b76 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -14,6 +14,7 @@ "inventory.ItemStackDamageableMixin", "inventory.ItemStackMetaMixin", "inventory.ItemStackMixin", + "world.BiomeMixin", "world.ChunkGeneratorMixin", "world.ChunkRegionMixin", "world.ChunkRegionWorldMixin", From 2d27e07441f1855aab4895da55892d3f560e3ee4 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 22:49:57 -0700 Subject: [PATCH 69/98] implement BiomeMixin --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 9 ++++----- .../terra/fabric/mixin/world/BiomeMixin.java | 6 ++++-- .../dfsek/terra/fabric/world/FabricBiome.java | 17 ----------------- 3 files changed, 8 insertions(+), 24 deletions(-) delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiome.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 4f8654f68..6252e3b14 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -38,10 +38,9 @@ import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.fabric.handle.FabricItemHandle; -import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; -import com.dfsek.terra.fabric.world.FabricBiome; -import com.dfsek.terra.fabric.world.FabricTree; import com.dfsek.terra.fabric.handle.FabricWorldHandle; +import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; +import com.dfsek.terra.fabric.world.FabricTree; import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.features.PopulatorFeature; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; @@ -247,14 +246,14 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { genericLoaders.register(registry); registry .registerLoader(BlockData.class, (t, o, l) -> worldHandle.createBlockData((String) o)) - .registerLoader(com.dfsek.terra.api.platform.world.Biome.class, (t, o, l) -> new FabricBiome(biomeFixer.translate((String) o))); + .registerLoader(com.dfsek.terra.api.platform.world.Biome.class, (t, o, l) -> biomeFixer.translate((String) o)); } private Biome createBiome(BiomeBuilder biome) { BiomeTemplate template = biome.getTemplate(); Map colors = template.getColors(); - Biome vanilla = ((FabricBiome) new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0)).getHandle(); + Biome vanilla = (Biome) (new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0)).getHandle(); GenerationSettings.Builder generationSettings = new GenerationSettings.Builder(); generationSettings.surfaceBuilder(SurfaceBuilder.DEFAULT.withConfig(new TernarySurfaceConfig(Blocks.GRASS_BLOCK.getDefaultState(), Blocks.DIRT.getDefaultState(), Blocks.GRAVEL.getDefaultState()))); // It needs a surfacebuilder, even though we dont use it. diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/BiomeMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/BiomeMixin.java index bdf1b53a4..566169a87 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/BiomeMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/BiomeMixin.java @@ -7,6 +7,8 @@ import org.spongepowered.asm.mixin.Mixin; @Mixin(Biome.class) @Implements(@Interface(iface = com.dfsek.terra.api.platform.world.Biome.class, prefix = "terra$")) -public class BiomeMixin { - +public abstract class BiomeMixin { + public Object terra$getHandle() { + return this; + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiome.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiome.java deleted file mode 100644 index 99dab1c2c..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiome.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.dfsek.terra.fabric.world; - -import com.dfsek.terra.api.platform.world.Biome; - -public class FabricBiome implements Biome { - private final net.minecraft.world.biome.Biome delegate; - - public FabricBiome(net.minecraft.world.biome.Biome delegate) { - this.delegate = delegate; - } - - - @Override - public net.minecraft.world.biome.Biome getHandle() { - return delegate; - } -} From 3b9280b19c0b8ad25a6959297fe1628f2c95c9f3 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 23:00:21 -0700 Subject: [PATCH 70/98] start work on state mixins --- .../fabric/mixin/block/BlockEntityMixin.java | 57 +++++++++++++++++++ .../LootableContainerBlockEntityMixin.java | 21 +++++++ .../world/block/state/FabricBlockState.java | 5 +- .../world/block/state/FabricContainer.java | 18 ------ .../src/main/resources/terra.mixins.json | 2 + 5 files changed, 83 insertions(+), 20 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/BlockEntityMixin.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/LootableContainerBlockEntityMixin.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricContainer.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/BlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/BlockEntityMixin.java new file mode 100644 index 000000000..e44d4678a --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/BlockEntityMixin.java @@ -0,0 +1,57 @@ +package com.dfsek.terra.fabric.mixin.block; + +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.state.BlockState; +import com.dfsek.terra.fabric.world.FabricAdapter; +import com.dfsek.terra.fabric.world.block.FabricBlock; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(BlockEntity.class) +@Implements(@Interface(iface = BlockState.class, prefix = "terra$")) +public abstract class BlockEntityMixin { + @Shadow + protected BlockPos pos; + @Shadow + @Nullable + protected World world; + + @Shadow + public abstract net.minecraft.block.BlockState getCachedState(); + + public Object terra$getHandle() { + return this; + } + + public Block terra$getBlock() { + return new FabricBlock(pos, world); + } + + public int terra$getX() { + return pos.getX(); + } + + public int terra$getY() { + return pos.getY(); + } + + public int terra$getZ() { + return pos.getZ(); + } + + public BlockData terra$getBlockData() { + return FabricAdapter.adapt(getCachedState()); + } + + public boolean terra$update(boolean applyPhysics) { + world.getChunk(pos).setBlockEntity(pos, (BlockEntity) (Object) this); + return true; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/LootableContainerBlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/LootableContainerBlockEntityMixin.java new file mode 100644 index 000000000..527f908a8 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/LootableContainerBlockEntityMixin.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.fabric.mixin.block; + +import com.dfsek.terra.api.platform.block.state.Container; +import com.dfsek.terra.api.platform.inventory.Inventory; +import com.dfsek.terra.fabric.inventory.FabricInventory; +import net.minecraft.block.entity.LootableContainerBlockEntity; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(LootableContainerBlockEntity.class) +@Implements(@Interface(iface = Container.class, prefix = "terra$")) +public abstract class LootableContainerBlockEntityMixin extends BlockEntityMixin { + public Inventory terra$getInventory() { + return new FabricInventory(((LootableContainerBlockEntity) (Object) this)); + } + + public Object terra$getHandle() { + return this; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java index 1aacb1073..0814e602e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java @@ -3,6 +3,7 @@ package com.dfsek.terra.fabric.world.block.state; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.state.BlockState; +import com.dfsek.terra.api.platform.block.state.Container; import com.dfsek.terra.fabric.world.FabricAdapter; import com.dfsek.terra.fabric.world.block.FabricBlock; import net.minecraft.block.entity.BlockEntity; @@ -20,7 +21,7 @@ public class FabricBlockState implements BlockState { this.worldAccess = worldAccess; } - public static FabricBlockState newInstance(Block block) { + public static BlockState newInstance(Block block) { WorldAccess worldAccess = (WorldAccess) block.getLocation().getWorld(); BlockEntity entity = worldAccess.getBlockEntity(FabricAdapter.adapt(block.getLocation().toVector())); @@ -29,7 +30,7 @@ public class FabricBlockState implements BlockState { } else if(entity instanceof MobSpawnerBlockEntity) { return new FabricMobSpawner((MobSpawnerBlockEntity) entity, worldAccess); } else if(entity instanceof LootableContainerBlockEntity) { - return new FabricContainer((LootableContainerBlockEntity) entity, worldAccess); + return (Container) entity; } return null; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricContainer.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricContainer.java deleted file mode 100644 index 743c06d83..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricContainer.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dfsek.terra.fabric.world.block.state; - -import com.dfsek.terra.api.platform.block.state.Container; -import com.dfsek.terra.api.platform.inventory.Inventory; -import com.dfsek.terra.fabric.inventory.FabricInventory; -import net.minecraft.block.entity.LootableContainerBlockEntity; -import net.minecraft.world.WorldAccess; - -public class FabricContainer extends FabricBlockState implements Container { - public FabricContainer(LootableContainerBlockEntity blockEntity, WorldAccess worldAccess) { - super(blockEntity, worldAccess); - } - - @Override - public Inventory getInventory() { - return new FabricInventory(((LootableContainerBlockEntity) blockEntity)); - } -} diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 3e8942b76..f76365c71 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -5,6 +5,8 @@ "compatibilityLevel": "JAVA_8", "mixins": [ "MixinGeneratorOptions", + "block.BlockEntityMixin", + "block.LootableContainerBlockEntityMixin", "entity.EntityMixin", "entity.EntityTypeMixin", "entity.PlayerEntityMixin", From 4cd4720101b5e18cd0732a5db1cc9d2c56cea6ae Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 23:08:54 -0700 Subject: [PATCH 71/98] fix loot NPE --- .../structure/buffer/items/BufferedLootApplication.java | 2 +- .../structure/buffer/items/BufferedStateManipulator.java | 2 +- .../dfsek/terra/fabric/mixin/block/BlockEntityMixin.java | 5 ++++- .../com/dfsek/terra/fabric/mixin/entity/EntityMixin.java | 7 ------- .../terra/fabric/mixin/world/ChunkRegionWorldMixin.java | 5 ++++- 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java index b70b1e35d..89e534449 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java @@ -40,7 +40,7 @@ public class BufferedLootApplication implements BufferedItem { data.update(false); } catch(Exception e) { main.logger().warning("Could not apply loot at " + origin + ": " + e.getMessage()); - main.getDebugLogger().stack(e); + e.printStackTrace(); } } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedStateManipulator.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedStateManipulator.java index 703ca2695..158f1a951 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedStateManipulator.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedStateManipulator.java @@ -21,7 +21,7 @@ public class BufferedStateManipulator implements BufferedItem { state.update(false); } catch(Exception e) { main.logger().warning("Could not apply BlockState at " + origin + ": " + e.getMessage()); - main.getDebugLogger().stack(e); + e.printStackTrace(); } } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/BlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/BlockEntityMixin.java index e44d4678a..113c8612f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/BlockEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/BlockEntityMixin.java @@ -26,6 +26,9 @@ public abstract class BlockEntityMixin { @Shadow public abstract net.minecraft.block.BlockState getCachedState(); + @Shadow + public abstract boolean hasWorld(); + public Object terra$getHandle() { return this; } @@ -51,7 +54,7 @@ public abstract class BlockEntityMixin { } public boolean terra$update(boolean applyPhysics) { - world.getChunk(pos).setBlockEntity(pos, (BlockEntity) (Object) this); + if(hasWorld()) world.getChunk(pos).setBlockEntity(pos, (BlockEntity) (Object) this); return true; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java index 10f36cdb2..097e78022 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java @@ -4,11 +4,9 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.fabric.world.FabricAdapter; import net.minecraft.entity.Entity; -import net.minecraft.server.world.ServerWorld; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; -import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @@ -28,10 +26,6 @@ public abstract class EntityMixin { @Shadow public abstract void teleport(double destX, double destY, double destZ); - @Shadow - @Nullable - public abstract Entity moveToWorld(ServerWorld destination); - @Shadow public abstract void sendSystemMessage(Text message, UUID senderUuid); @@ -45,7 +39,6 @@ public abstract class EntityMixin { public void terra$setLocation(Location location) { teleport(location.getX(), location.getY(), location.getZ()); - moveToWorld((ServerWorld) location.getWorld()); } public World getWorld() { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java index e80913edb..01ebc66a4 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java @@ -37,7 +37,10 @@ public abstract class ChunkRegionWorldMixin { } public Entity terra$spawnEntity(Location location, EntityType entityType) { - throw new UnsupportedOperationException(); + net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create(((ChunkRegion) (Object) this).toServerWorld()); + entity.setPos(location.getX(), location.getY(), location.getZ()); + ((ChunkRegion) (Object) this).spawnEntity(entity); + return (Entity) entity; } public int terra$getMinHeight() { From a8c88915ea5305751763ac8388a773559a1c34d1 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 23:39:40 -0700 Subject: [PATCH 72/98] override chunkregion hashcode --- .../mixin/world/ChunkRegionWorldMixin.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java index 01ebc66a4..ca86bf600 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java @@ -11,15 +11,22 @@ import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; +import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ChunkRegion; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; @Mixin(ChunkRegion.class) @Implements(@Interface(iface = World.class, prefix = "terra$")) public abstract class ChunkRegionWorldMixin { + @Shadow + @Final + private ServerWorld world; + public int terra$getMaxHeight() { return ((ChunkRegion) (Object) this).getDimensionHeight(); } @@ -58,4 +65,19 @@ public abstract class ChunkRegionWorldMixin { public TerraChunkGenerator terra$getTerraGenerator() { return ((FabricChunkGeneratorWrapper) terra$getGenerator()).getHandle(); } + + /** + * We need regions delegating to the same world + * to have the same hashcode. This + * minimizes cache misses. + *

+ * This is sort of jank, but shouldn't(tm) + * break any other mods, unless they're doing + * something they really shouldn't, since + * ChunkRegions are not supposed to persist. + */ + @Override + public int hashCode() { + return world.hashCode(); + } } From 03091230ed8f999b144ec4cb57efc01afaa65be7 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 10:09:21 -0700 Subject: [PATCH 73/98] refactor mixins --- ...ptions.java => GeneratorOptionsMixin.java} | 2 +- .../BiomeMixin.java | 2 +- .../ChunkGeneratorMixin.java | 2 +- .../block/BlockEntityMixin.java | 2 +- .../LootableContainerBlockEntityMixin.java | 3 +- .../chunk}/ChunkRegionMixin.java | 2 +- .../chunk}/WorldChunkMixin.java | 2 +- .../chunk/data}/ProtoChunkMixin.java | 2 +- .../entity/EntityMixin.java | 2 +- .../entity/EntityTypeMixin.java | 2 +- .../entity/PlayerEntityMixin.java | 2 +- .../entity/ServerCommandSourceMixin.java | 2 +- .../inventory/item}/ItemMixin.java | 2 +- .../inventory/item}/ItemStackMixin.java | 2 +- .../inventory/meta}/EnchantmentMixin.java | 2 +- .../meta}/ItemStackDamageableMixin.java | 2 +- .../inventory/meta}/ItemStackMetaMixin.java | 2 +- .../world/ChunkRegionMixin.java} | 4 +- .../world/ServerWorldMixin.java | 2 +- .../src/main/resources/terra.mixins.json | 38 +++++++++---------- 20 files changed, 40 insertions(+), 39 deletions(-) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{MixinGeneratorOptions.java => GeneratorOptionsMixin.java} (98%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{world => implementations}/BiomeMixin.java (88%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{world => implementations}/ChunkGeneratorMixin.java (89%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{ => implementations}/block/BlockEntityMixin.java (96%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{block => implementations/block/state}/LootableContainerBlockEntityMixin.java (84%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{world => implementations/chunk}/ChunkRegionMixin.java (96%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{world => implementations/chunk}/WorldChunkMixin.java (96%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{world => implementations/chunk/data}/ProtoChunkMixin.java (95%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{ => implementations}/entity/EntityMixin.java (96%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{ => implementations}/entity/EntityTypeMixin.java (87%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{ => implementations}/entity/PlayerEntityMixin.java (86%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{ => implementations}/entity/ServerCommandSourceMixin.java (92%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{inventory => implementations/inventory/item}/ItemMixin.java (92%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{inventory => implementations/inventory/item}/ItemStackMixin.java (94%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{inventory => implementations/inventory/meta}/EnchantmentMixin.java (94%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{inventory => implementations/inventory/meta}/ItemStackDamageableMixin.java (88%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{inventory => implementations/inventory/meta}/ItemStackMetaMixin.java (95%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{world/ChunkRegionWorldMixin.java => implementations/world/ChunkRegionMixin.java} (96%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{ => implementations}/world/ServerWorldMixin.java (97%) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/MixinGeneratorOptions.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorOptionsMixin.java similarity index 98% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/MixinGeneratorOptions.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorOptionsMixin.java index badfc176f..bf3ec6db7 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/MixinGeneratorOptions.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorOptionsMixin.java @@ -22,7 +22,7 @@ import java.util.Properties; import java.util.Random; @Mixin(GeneratorOptions.class) -public class MixinGeneratorOptions { +public abstract class GeneratorOptionsMixin { @Inject(method = "fromProperties(Lnet/minecraft/util/registry/DynamicRegistryManager;Ljava/util/Properties;)Lnet/minecraft/world/gen/GeneratorOptions;", at = @At("HEAD"), cancellable = true) private static void fromProperties(DynamicRegistryManager dynamicRegistryManager, Properties properties, CallbackInfoReturnable cir) { if(properties.get("level-type") == null) { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/BiomeMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/BiomeMixin.java similarity index 88% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/BiomeMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/BiomeMixin.java index 566169a87..930218f22 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/BiomeMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/BiomeMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.world; +package com.dfsek.terra.fabric.mixin.implementations; import net.minecraft.world.biome.Biome; import org.spongepowered.asm.mixin.Implements; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkGeneratorMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ChunkGeneratorMixin.java similarity index 89% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkGeneratorMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ChunkGeneratorMixin.java index 58566510c..3da7abab0 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkGeneratorMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ChunkGeneratorMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.world; +package com.dfsek.terra.fabric.mixin.implementations; import net.minecraft.world.gen.chunk.ChunkGenerator; import org.spongepowered.asm.mixin.Implements; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/BlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockEntityMixin.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/BlockEntityMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockEntityMixin.java index 113c8612f..12cf7cb58 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/BlockEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockEntityMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.block; +package com.dfsek.terra.fabric.mixin.implementations.block; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/LootableContainerBlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/LootableContainerBlockEntityMixin.java similarity index 84% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/LootableContainerBlockEntityMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/LootableContainerBlockEntityMixin.java index 527f908a8..5bfc47011 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/LootableContainerBlockEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/LootableContainerBlockEntityMixin.java @@ -1,8 +1,9 @@ -package com.dfsek.terra.fabric.mixin.block; +package com.dfsek.terra.fabric.mixin.implementations.block.state; import com.dfsek.terra.api.platform.block.state.Container; import com.dfsek.terra.api.platform.inventory.Inventory; import com.dfsek.terra.fabric.inventory.FabricInventory; +import com.dfsek.terra.fabric.mixin.implementations.block.BlockEntityMixin; import net.minecraft.block.entity.LootableContainerBlockEntity; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/ChunkRegionMixin.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/ChunkRegionMixin.java index 3bc12d612..6f1170a70 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/ChunkRegionMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.world; +package com.dfsek.terra.fabric.mixin.implementations.chunk; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/WorldChunkMixin.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/WorldChunkMixin.java index 79ce700cf..ba63d19a1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/WorldChunkMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.world; +package com.dfsek.terra.fabric.mixin.implementations.chunk; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ProtoChunkMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java similarity index 95% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ProtoChunkMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java index 9fb5d5f87..a6d626d8b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ProtoChunkMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.world; +package com.dfsek.terra.fabric.mixin.implementations.chunk.data; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.generator.ChunkData; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java index 097e78022..e495c4f1b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.entity; +package com.dfsek.terra.fabric.mixin.implementations.entity; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.World; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityTypeMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityTypeMixin.java similarity index 87% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityTypeMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityTypeMixin.java index 4237775da..fa4079e5f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/EntityTypeMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityTypeMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.entity; +package com.dfsek.terra.fabric.mixin.implementations.entity; import net.minecraft.entity.EntityType; import org.spongepowered.asm.mixin.Implements; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/PlayerEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/PlayerEntityMixin.java similarity index 86% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/PlayerEntityMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/PlayerEntityMixin.java index 18b5b8b17..808e98d6e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/PlayerEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/PlayerEntityMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.entity; +package com.dfsek.terra.fabric.mixin.implementations.entity; import com.dfsek.terra.api.platform.entity.Player; import net.minecraft.entity.player.PlayerEntity; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/ServerCommandSourceMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/ServerCommandSourceMixin.java similarity index 92% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/ServerCommandSourceMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/ServerCommandSourceMixin.java index a8132f3c5..b07771315 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/entity/ServerCommandSourceMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/ServerCommandSourceMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.entity; +package com.dfsek.terra.fabric.mixin.implementations.entity; import com.dfsek.terra.api.platform.CommandSender; import net.minecraft.server.command.ServerCommandSource; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemMixin.java similarity index 92% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemMixin.java index 03000102b..a5318e539 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.inventory; +package com.dfsek.terra.fabric.mixin.implementations.inventory.item; import com.dfsek.terra.api.platform.inventory.ItemStack; import net.minecraft.item.Item; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java similarity index 94% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java index 8b94e29ca..4eb544857 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.inventory; +package com.dfsek.terra.fabric.mixin.implementations.inventory.item; import com.dfsek.terra.api.platform.inventory.Item; import com.dfsek.terra.api.platform.inventory.item.ItemMeta; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/EnchantmentMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/EnchantmentMixin.java similarity index 94% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/EnchantmentMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/EnchantmentMixin.java index 6d7f3c90d..09c24172d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/EnchantmentMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/EnchantmentMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.inventory; +package com.dfsek.terra.fabric.mixin.implementations.inventory.meta; import com.dfsek.terra.api.platform.inventory.ItemStack; import net.minecraft.enchantment.Enchantment; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackDamageableMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackDamageableMixin.java similarity index 88% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackDamageableMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackDamageableMixin.java index 3ee8a8b77..67b41da7c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackDamageableMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackDamageableMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.inventory; +package com.dfsek.terra.fabric.mixin.implementations.inventory.meta; import com.dfsek.terra.api.platform.inventory.item.Damageable; import net.minecraft.item.ItemStack; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMetaMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackMetaMixin.java similarity index 95% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMetaMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackMetaMixin.java index df061ff89..fc0cb3e9f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/inventory/ItemStackMetaMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackMetaMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.inventory; +package com.dfsek.terra.fabric.mixin.implementations.inventory.meta; import com.dfsek.terra.api.platform.inventory.item.Enchantment; import com.dfsek.terra.api.platform.inventory.item.ItemMeta; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java index ca86bf600..904f941b4 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionWorldMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.world; +package com.dfsek.terra.fabric.mixin.implementations.world; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.block.Block; @@ -22,7 +22,7 @@ import org.spongepowered.asm.mixin.Shadow; @Mixin(ChunkRegion.class) @Implements(@Interface(iface = World.class, prefix = "terra$")) -public abstract class ChunkRegionWorldMixin { +public abstract class ChunkRegionMixin { @Shadow @Final private ServerWorld world; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ServerWorldMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java similarity index 97% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ServerWorldMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java index ddb1eb56d..2211bc90b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ServerWorldMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin.world; +package com.dfsek.terra.fabric.mixin.implementations.world; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.block.Block; diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index f76365c71..d7e32e3a9 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -4,25 +4,25 @@ "package": "com.dfsek.terra.fabric.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ - "MixinGeneratorOptions", - "block.BlockEntityMixin", - "block.LootableContainerBlockEntityMixin", - "entity.EntityMixin", - "entity.EntityTypeMixin", - "entity.PlayerEntityMixin", - "entity.ServerCommandSourceMixin", - "inventory.EnchantmentMixin", - "inventory.ItemMixin", - "inventory.ItemStackDamageableMixin", - "inventory.ItemStackMetaMixin", - "inventory.ItemStackMixin", - "world.BiomeMixin", - "world.ChunkGeneratorMixin", - "world.ChunkRegionMixin", - "world.ChunkRegionWorldMixin", - "world.ProtoChunkMixin", - "world.ServerWorldMixin", - "world.WorldChunkMixin" + "GeneratorOptionsMixin", + "implementations.block.BlockEntityMixin", + "implementations.block.state.LootableContainerBlockEntityMixin", + "implementations.entity.EntityMixin", + "implementations.entity.EntityTypeMixin", + "implementations.entity.PlayerEntityMixin", + "implementations.entity.ServerCommandSourceMixin", + "implementations.inventory.meta.EnchantmentMixin", + "implementations.inventory.item.ItemMixin", + "implementations.inventory.meta.ItemStackDamageableMixin", + "implementations.inventory.meta.ItemStackMetaMixin", + "implementations.inventory.item.ItemStackMixin", + "implementations.BiomeMixin", + "implementations.ChunkGeneratorMixin", + "implementations.chunk.ChunkRegionMixin", + "implementations.world.ChunkRegionMixin", + "implementations.chunk.data.ProtoChunkMixin", + "implementations.world.ServerWorldMixin", + "implementations.chunk.WorldChunkMixin" ], "client": [ "GeneratorTypeAccessor" From de41b92d5d921365e5d622362cc4a03b8188f72d Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 10:27:40 -0700 Subject: [PATCH 74/98] add SignBlockEntityMixin --- .../block/state/SignBlockEntityMixin.java | 46 +++++++++++++++++++ .../world/block/state/FabricBlockState.java | 3 +- .../fabric/world/block/state/FabricSign.java | 44 ------------------ .../src/main/resources/terra.mixins.json | 17 +++---- 4 files changed, 57 insertions(+), 53 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/SignBlockEntityMixin.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricSign.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/SignBlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/SignBlockEntityMixin.java new file mode 100644 index 000000000..086ebe19d --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/SignBlockEntityMixin.java @@ -0,0 +1,46 @@ +package com.dfsek.terra.fabric.mixin.implementations.block.state; + +import com.dfsek.terra.api.platform.block.state.SerialState; +import com.dfsek.terra.api.platform.block.state.Sign; +import net.minecraft.block.entity.SignBlockEntity; +import net.minecraft.text.LiteralText; +import net.minecraft.text.Text; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(SignBlockEntity.class) +@Implements(@Interface(iface = Sign.class, prefix = "terra$")) +public abstract class SignBlockEntityMixin { + @Shadow + public abstract void setTextOnRow(int row, Text text); + + @Shadow + public abstract Text getTextOnRow(int row); + + public @NotNull String[] terra$getLines() { + return new String[] { + getTextOnRow(0).asString(), + getTextOnRow(1).asString(), + getTextOnRow(2).asString(), + getTextOnRow(3).asString() + }; + } + + public @NotNull String terra$getLine(int index) throws IndexOutOfBoundsException { + return getTextOnRow(index).asString(); + } + + public void terra$setLine(int index, @NotNull String line) throws IndexOutOfBoundsException { + setTextOnRow(index, new LiteralText(line)); + } + + public void terra$applyState(String state) { + SerialState.parse(state).forEach((k, v) -> { + if(!k.startsWith("text")) throw new IllegalArgumentException("Invalid property: " + k); + terra$setLine(Integer.parseInt(k.substring(4)), v); + }); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java index 0814e602e..c82342fc0 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.state.BlockState; import com.dfsek.terra.api.platform.block.state.Container; +import com.dfsek.terra.api.platform.block.state.Sign; import com.dfsek.terra.fabric.world.FabricAdapter; import com.dfsek.terra.fabric.world.block.FabricBlock; import net.minecraft.block.entity.BlockEntity; @@ -26,7 +27,7 @@ public class FabricBlockState implements BlockState { BlockEntity entity = worldAccess.getBlockEntity(FabricAdapter.adapt(block.getLocation().toVector())); if(entity instanceof SignBlockEntity) { - return new FabricSign((SignBlockEntity) entity, worldAccess); + return (Sign) entity; } else if(entity instanceof MobSpawnerBlockEntity) { return new FabricMobSpawner((MobSpawnerBlockEntity) entity, worldAccess); } else if(entity instanceof LootableContainerBlockEntity) { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricSign.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricSign.java deleted file mode 100644 index 382e05387..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricSign.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.dfsek.terra.fabric.world.block.state; - -import com.dfsek.terra.api.platform.block.state.SerialState; -import com.dfsek.terra.api.platform.block.state.Sign; -import net.minecraft.block.entity.SignBlockEntity; -import net.minecraft.text.LiteralText; -import net.minecraft.world.WorldAccess; -import org.jetbrains.annotations.NotNull; - -public class FabricSign extends FabricBlockState implements Sign { - public FabricSign(SignBlockEntity blockEntity, WorldAccess worldAccess) { - super(blockEntity, worldAccess); - } - - @Override - public @NotNull String[] getLines() { - SignBlockEntity sign = (SignBlockEntity) blockEntity; - - return new String[] { - sign.getTextOnRow(0).asString(), - sign.getTextOnRow(1).asString(), - sign.getTextOnRow(2).asString(), - sign.getTextOnRow(3).asString() - }; - } - - @Override - public @NotNull String getLine(int index) throws IndexOutOfBoundsException { - return ((SignBlockEntity) blockEntity).getTextOnRow(index).asString(); - } - - @Override - public void setLine(int index, @NotNull String line) throws IndexOutOfBoundsException { - ((SignBlockEntity) blockEntity).setTextOnRow(index, new LiteralText(line)); - } - - @Override - public void applyState(String state) { - SerialState.parse(state).forEach((k, v) -> { - if(!k.startsWith("text")) throw new IllegalArgumentException("Invalid property: " + k); - setLine(Integer.parseInt(k.substring(4)), v); - }); - } -} diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index d7e32e3a9..6f6743ddc 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -5,24 +5,25 @@ "compatibilityLevel": "JAVA_8", "mixins": [ "GeneratorOptionsMixin", + "implementations.BiomeMixin", + "implementations.ChunkGeneratorMixin", "implementations.block.BlockEntityMixin", "implementations.block.state.LootableContainerBlockEntityMixin", + "implementations.block.state.SignBlockEntityMixin", + "implementations.chunk.ChunkRegionMixin", + "implementations.chunk.WorldChunkMixin", + "implementations.chunk.data.ProtoChunkMixin", "implementations.entity.EntityMixin", "implementations.entity.EntityTypeMixin", "implementations.entity.PlayerEntityMixin", "implementations.entity.ServerCommandSourceMixin", - "implementations.inventory.meta.EnchantmentMixin", "implementations.inventory.item.ItemMixin", + "implementations.inventory.item.ItemStackMixin", + "implementations.inventory.meta.EnchantmentMixin", "implementations.inventory.meta.ItemStackDamageableMixin", "implementations.inventory.meta.ItemStackMetaMixin", - "implementations.inventory.item.ItemStackMixin", - "implementations.BiomeMixin", - "implementations.ChunkGeneratorMixin", - "implementations.chunk.ChunkRegionMixin", "implementations.world.ChunkRegionMixin", - "implementations.chunk.data.ProtoChunkMixin", - "implementations.world.ServerWorldMixin", - "implementations.chunk.WorldChunkMixin" + "implementations.world.ServerWorldMixin" ], "client": [ "GeneratorTypeAccessor" From c43a872c23dd19402ade10239c98c4a0b373540b Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 11:27:36 -0700 Subject: [PATCH 75/98] finish blockstate mixins --- .../state/MobSpawnerBlockEntityMixin.java | 118 ++++++++++++++++ .../terra/fabric/world/FabricAdapter.java | 22 +++ .../terra/fabric/world/block/FabricBlock.java | 3 +- .../world/block/state/FabricBlockState.java | 74 ---------- .../world/block/state/FabricMobSpawner.java | 133 ------------------ .../src/main/resources/terra.mixins.json | 1 + 6 files changed, 142 insertions(+), 209 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/MobSpawnerBlockEntityMixin.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricMobSpawner.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/MobSpawnerBlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/MobSpawnerBlockEntityMixin.java new file mode 100644 index 000000000..886fc80b0 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/MobSpawnerBlockEntityMixin.java @@ -0,0 +1,118 @@ +package com.dfsek.terra.fabric.mixin.implementations.block.state; + +import com.dfsek.terra.api.platform.block.state.MobSpawner; +import com.dfsek.terra.api.platform.block.state.SerialState; +import com.dfsek.terra.api.platform.entity.EntityType; +import com.dfsek.terra.fabric.TerraFabricPlugin; +import net.minecraft.block.entity.MobSpawnerBlockEntity; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.MobSpawnerLogic; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(MobSpawnerBlockEntity.class) +@Implements(@Interface(iface = MobSpawner.class, prefix = "terra$")) +public abstract class MobSpawnerBlockEntityMixin { + @Shadow + public abstract MobSpawnerLogic getLogic(); + + public EntityType terra$getSpawnedType() { + return (EntityType) Registry.ENTITY_TYPE.get(getLogic().getEntityId()); + } + + public void terra$setSpawnedType(@NotNull EntityType creatureType) { + getLogic().setEntityId((net.minecraft.entity.EntityType) creatureType); + } + + public int terra$getDelay() { + return 0; + } + + public void terra$setDelay(int delay) { + + } + + public int terra$getMinSpawnDelay() { + return 0; + } + + public void terra$setMinSpawnDelay(int delay) { + + } + + public int terra$getMaxSpawnDelay() { + return 0; + } + + public void terra$setMaxSpawnDelay(int delay) { + + } + + public int terra$getSpawnCount() { + return 0; + } + + public void terra$setSpawnCount(int spawnCount) { + + } + + public int terra$getMaxNearbyEntities() { + return 0; + } + + public void terra$setMaxNearbyEntities(int maxNearbyEntities) { + + } + + public int terra$getRequiredPlayerRange() { + return 0; + } + + public void terra$setRequiredPlayerRange(int requiredPlayerRange) { + + } + + public int terra$getSpawnRange() { + return 0; + } + + public void terra$setSpawnRange(int spawnRange) { + + } + + public void terra$applyState(String state) { + SerialState.parse(state).forEach((k, v) -> { + switch(k) { + case "type": + terra$setSpawnedType(TerraFabricPlugin.getInstance().getWorldHandle().getEntity(v)); + return; + case "delay": + terra$setDelay(Integer.parseInt(v)); + return; + case "min_delay": + terra$setMinSpawnDelay(Integer.parseInt(v)); + return; + case "max_delay": + terra$setMaxSpawnDelay(Integer.parseInt(v)); + return; + case "spawn_count": + terra$setSpawnCount(Integer.parseInt(v)); + return; + case "spawn_range": + terra$setSpawnRange(Integer.parseInt(v)); + return; + case "max_nearby": + terra$setMaxNearbyEntities(Integer.parseInt(v)); + return; + case "required_player_range": + terra$setRequiredPlayerRange(Integer.parseInt(v)); + return; + default: + throw new IllegalArgumentException("Invalid property: " + k); + } + }); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java index ba2acf1aa..60d1138a3 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java @@ -3,6 +3,9 @@ package com.dfsek.terra.fabric.world; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.BlockType; +import com.dfsek.terra.api.platform.block.state.Container; +import com.dfsek.terra.api.platform.block.state.MobSpawner; +import com.dfsek.terra.api.platform.block.state.Sign; import com.dfsek.terra.fabric.world.block.FabricBlockData; import com.dfsek.terra.fabric.world.block.FabricBlockType; import com.dfsek.terra.fabric.world.block.data.FabricDirectional; @@ -14,9 +17,14 @@ import com.dfsek.terra.fabric.world.block.data.FabricStairs; import com.dfsek.terra.fabric.world.block.data.FabricWaterlogged; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.LootableContainerBlockEntity; +import net.minecraft.block.entity.MobSpawnerBlockEntity; +import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.state.property.Properties; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; +import net.minecraft.world.WorldAccess; import java.util.Arrays; @@ -71,4 +79,18 @@ public final class FabricAdapter { public static BlockType adapt(Block block) { return new FabricBlockType(block); } + + public static com.dfsek.terra.api.platform.block.state.BlockState adapt(com.dfsek.terra.api.platform.block.Block block) { + WorldAccess worldAccess = (WorldAccess) block.getLocation().getWorld(); + + BlockEntity entity = worldAccess.getBlockEntity(adapt(block.getLocation().toVector())); + if(entity instanceof SignBlockEntity) { + return (Sign) entity; + } else if(entity instanceof MobSpawnerBlockEntity) { + return (MobSpawner) entity; + } else if(entity instanceof LootableContainerBlockEntity) { + return (Container) entity; + } + return null; + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java index 0db2e8daf..f17e80d5c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java @@ -8,7 +8,6 @@ import com.dfsek.terra.api.platform.block.BlockType; import com.dfsek.terra.api.platform.block.state.BlockState; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.fabric.world.FabricAdapter; -import com.dfsek.terra.fabric.world.block.state.FabricBlockState; import net.minecraft.block.FluidBlock; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldAccess; @@ -35,7 +34,7 @@ public class FabricBlock implements Block { @Override public BlockState getState() { - return FabricBlockState.newInstance(this); + return FabricAdapter.adapt(this); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java deleted file mode 100644 index c82342fc0..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.dfsek.terra.fabric.world.block.state; - -import com.dfsek.terra.api.platform.block.Block; -import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.api.platform.block.state.BlockState; -import com.dfsek.terra.api.platform.block.state.Container; -import com.dfsek.terra.api.platform.block.state.Sign; -import com.dfsek.terra.fabric.world.FabricAdapter; -import com.dfsek.terra.fabric.world.block.FabricBlock; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.LootableContainerBlockEntity; -import net.minecraft.block.entity.MobSpawnerBlockEntity; -import net.minecraft.block.entity.SignBlockEntity; -import net.minecraft.world.WorldAccess; - -public class FabricBlockState implements BlockState { - protected final BlockEntity blockEntity; - private final WorldAccess worldAccess; - - public FabricBlockState(BlockEntity blockEntity, WorldAccess worldAccess) { - this.blockEntity = blockEntity; - this.worldAccess = worldAccess; - } - - public static BlockState newInstance(Block block) { - WorldAccess worldAccess = (WorldAccess) block.getLocation().getWorld(); - - BlockEntity entity = worldAccess.getBlockEntity(FabricAdapter.adapt(block.getLocation().toVector())); - if(entity instanceof SignBlockEntity) { - return (Sign) entity; - } else if(entity instanceof MobSpawnerBlockEntity) { - return new FabricMobSpawner((MobSpawnerBlockEntity) entity, worldAccess); - } else if(entity instanceof LootableContainerBlockEntity) { - return (Container) entity; - } - return null; - } - - @Override - public BlockEntity getHandle() { - return blockEntity; - } - - @Override - public Block getBlock() { - return new FabricBlock(blockEntity.getPos(), blockEntity.getWorld()); - } - - @Override - public int getX() { - return blockEntity.getPos().getX(); - } - - @Override - public int getY() { - return blockEntity.getPos().getY(); - } - - @Override - public int getZ() { - return blockEntity.getPos().getZ(); - } - - @Override - public BlockData getBlockData() { - return FabricAdapter.adapt(blockEntity.getCachedState()); - } - - @Override - public boolean update(boolean applyPhysics) { - worldAccess.getChunk(blockEntity.getPos()).setBlockEntity(blockEntity.getPos(), blockEntity); - return true; - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricMobSpawner.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricMobSpawner.java deleted file mode 100644 index 9ce0b3ba0..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricMobSpawner.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.dfsek.terra.fabric.world.block.state; - -import com.dfsek.terra.api.platform.block.state.MobSpawner; -import com.dfsek.terra.api.platform.block.state.SerialState; -import com.dfsek.terra.api.platform.entity.EntityType; -import com.dfsek.terra.fabric.TerraFabricPlugin; -import com.dfsek.terra.fabric.world.FabricAdapter; -import net.minecraft.block.entity.MobSpawnerBlockEntity; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.WorldAccess; -import org.jetbrains.annotations.NotNull; - -public class FabricMobSpawner extends FabricBlockState implements MobSpawner { // TODO: finish implementation / refactor API because bukkit doesnt expose most of the stuff spawners can do - - - public FabricMobSpawner(MobSpawnerBlockEntity blockEntity, WorldAccess worldAccess) { - super(blockEntity, worldAccess); - } - - @Override - public EntityType getSpawnedType() { - return (EntityType) Registry.ENTITY_TYPE.get(((MobSpawnerBlockEntity) blockEntity).getLogic().getEntityId()); - } - - @Override - public void setSpawnedType(@NotNull EntityType creatureType) { - ((MobSpawnerBlockEntity) blockEntity).getLogic().setEntityId((net.minecraft.entity.EntityType) creatureType); - } - - @Override - public int getDelay() { - return 0; - } - - @Override - public void setDelay(int delay) { - - } - - @Override - public int getMinSpawnDelay() { - return 0; - } - - @Override - public void setMinSpawnDelay(int delay) { - - } - - @Override - public int getMaxSpawnDelay() { - return 0; - } - - @Override - public void setMaxSpawnDelay(int delay) { - - } - - @Override - public int getSpawnCount() { - return 0; - } - - @Override - public void setSpawnCount(int spawnCount) { - - } - - @Override - public int getMaxNearbyEntities() { - return 0; - } - - @Override - public void setMaxNearbyEntities(int maxNearbyEntities) { - - } - - @Override - public int getRequiredPlayerRange() { - return 0; - } - - @Override - public void setRequiredPlayerRange(int requiredPlayerRange) { - - } - - @Override - public int getSpawnRange() { - return 0; - } - - @Override - public void setSpawnRange(int spawnRange) { - - } - - @Override - public void applyState(String state) { - SerialState.parse(state).forEach((k, v) -> { - switch(k) { - case "type": - setSpawnedType(TerraFabricPlugin.getInstance().getWorldHandle().getEntity(v)); - return; - case "delay": - setDelay(Integer.parseInt(v)); - return; - case "min_delay": - setMinSpawnDelay(Integer.parseInt(v)); - return; - case "max_delay": - setMaxSpawnDelay(Integer.parseInt(v)); - return; - case "spawn_count": - setSpawnCount(Integer.parseInt(v)); - return; - case "spawn_range": - setSpawnRange(Integer.parseInt(v)); - return; - case "max_nearby": - setMaxNearbyEntities(Integer.parseInt(v)); - return; - case "required_player_range": - setRequiredPlayerRange(Integer.parseInt(v)); - return; - default: - throw new IllegalArgumentException("Invalid property: " + k); - } - }); - } -} diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 6f6743ddc..59bac2ea4 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -9,6 +9,7 @@ "implementations.ChunkGeneratorMixin", "implementations.block.BlockEntityMixin", "implementations.block.state.LootableContainerBlockEntityMixin", + "implementations.block.state.MobSpawnerBlockEntityMixin", "implementations.block.state.SignBlockEntityMixin", "implementations.chunk.ChunkRegionMixin", "implementations.chunk.WorldChunkMixin", From 955558bc21a132da363dc4eeb0e5bc53eb007bc1 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 11:37:54 -0700 Subject: [PATCH 76/98] implement BlockMixin --- .../implementations/block/BlockMixin.java | 36 +++++++++++++++ .../terra/fabric/world/FabricAdapter.java | 6 --- .../fabric/world/block/FabricBlockData.java | 2 +- .../fabric/world/block/FabricBlockType.java | 46 ------------------- .../src/main/resources/terra.mixins.json | 1 + 5 files changed, 38 insertions(+), 53 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockMixin.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockType.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockMixin.java new file mode 100644 index 000000000..560092078 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockMixin.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.fabric.mixin.implementations.block; + +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockType; +import com.dfsek.terra.fabric.world.FabricAdapter; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(Block.class) +@Implements(@Interface(iface = BlockType.class, prefix = "terra$")) +public abstract class BlockMixin { + @Shadow + private BlockState defaultState; + + public Object terra$getHandle() { + return this; + } + + public BlockData terra$getDefaultData() { + return FabricAdapter.adapt(defaultState); + } + + public boolean terra$isSolid() { + return defaultState.isOpaque(); + } + + @SuppressWarnings("ConstantConditions") + public boolean terra$isWater() { + return ((Object) this) == Blocks.WATER; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java index 60d1138a3..f7258132c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java @@ -2,12 +2,10 @@ package com.dfsek.terra.fabric.world; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.block.BlockFace; -import com.dfsek.terra.api.platform.block.BlockType; import com.dfsek.terra.api.platform.block.state.Container; import com.dfsek.terra.api.platform.block.state.MobSpawner; import com.dfsek.terra.api.platform.block.state.Sign; import com.dfsek.terra.fabric.world.block.FabricBlockData; -import com.dfsek.terra.fabric.world.block.FabricBlockType; import com.dfsek.terra.fabric.world.block.data.FabricDirectional; import com.dfsek.terra.fabric.world.block.data.FabricMultipleFacing; import com.dfsek.terra.fabric.world.block.data.FabricOrientable; @@ -15,7 +13,6 @@ import com.dfsek.terra.fabric.world.block.data.FabricRotatable; import com.dfsek.terra.fabric.world.block.data.FabricSlab; import com.dfsek.terra.fabric.world.block.data.FabricStairs; import com.dfsek.terra.fabric.world.block.data.FabricWaterlogged; -import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.LootableContainerBlockEntity; @@ -76,9 +73,6 @@ public final class FabricAdapter { } } - public static BlockType adapt(Block block) { - return new FabricBlockType(block); - } public static com.dfsek.terra.api.platform.block.state.BlockState adapt(com.dfsek.terra.api.platform.block.Block block) { WorldAccess worldAccess = (WorldAccess) block.getLocation().getWorld(); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java index 2467e992a..aaa1b231d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java @@ -19,7 +19,7 @@ public class FabricBlockData implements BlockData { @Override public BlockType getBlockType() { - return FabricAdapter.adapt(delegate.getBlock()); + return (BlockType) delegate.getBlock(); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockType.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockType.java deleted file mode 100644 index 26427bb2f..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockType.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.dfsek.terra.fabric.world.block; - -import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.api.platform.block.BlockType; -import com.dfsek.terra.fabric.world.FabricAdapter; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; - -public class FabricBlockType implements BlockType { - private final Block delegate; - - public FabricBlockType(Block delegate) { - this.delegate = delegate; - } - - @Override - public Block getHandle() { - return delegate; - } - - @Override - public BlockData getDefaultData() { - return FabricAdapter.adapt(delegate.getDefaultState()); - } - - @Override - public boolean isSolid() { - return delegate.getDefaultState().isOpaque(); - } - - @Override - public boolean isWater() { - return delegate == Blocks.WATER; - } - - @Override - public int hashCode() { - return delegate.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if(!(obj instanceof FabricBlockType)) return false; - return ((FabricBlockType) obj).delegate == delegate; - } -} diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 59bac2ea4..4aba80fd7 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -8,6 +8,7 @@ "implementations.BiomeMixin", "implementations.ChunkGeneratorMixin", "implementations.block.BlockEntityMixin", + "implementations.block.BlockMixin", "implementations.block.state.LootableContainerBlockEntityMixin", "implementations.block.state.MobSpawnerBlockEntityMixin", "implementations.block.state.SignBlockEntityMixin", From 5ee32cc3bac62d502cd6874233b514bd2983d8b9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 17:35:43 -0700 Subject: [PATCH 77/98] add ConfiguredFeatureMixin --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 3 +- .../ConfiguredFeatureMixin.java} | 33 ++++++++++--------- .../src/main/resources/terra.mixins.json | 1 + 3 files changed, 20 insertions(+), 17 deletions(-) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{world/FabricTree.java => mixin/implementations/ConfiguredFeatureMixin.java} (52%) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 6252e3b14..05625ac53 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -40,7 +40,6 @@ import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.fabric.handle.FabricItemHandle; import com.dfsek.terra.fabric.handle.FabricWorldHandle; import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; -import com.dfsek.terra.fabric.world.FabricTree; import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.features.PopulatorFeature; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; @@ -451,7 +450,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private void injectTree(CheckedRegistry registry, String id, ConfiguredFeature tree) { try { - registry.add(id, new FabricTree(tree, id)); + registry.add(id, (Tree) tree); } catch(DuplicateEntryException ignore) { } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ConfiguredFeatureMixin.java similarity index 52% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ConfiguredFeatureMixin.java index 2e3b08955..e1b96c2c2 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ConfiguredFeatureMixin.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.world; +package com.dfsek.terra.fabric.mixin.implementations; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Tree; @@ -6,34 +6,37 @@ import com.dfsek.terra.api.util.collections.MaterialSet; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.profiler.ProfileFrame; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.FeatureConfig; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import java.util.Locale; import java.util.Random; -public class FabricTree implements Tree { - private final ConfiguredFeature delegate; - private final String id; +@Mixin(ConfiguredFeature.class) +@Implements(@Interface(iface = Tree.class, prefix = "terra$")) +public abstract class ConfiguredFeatureMixin { + @Shadow + public abstract boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos); - public FabricTree(ConfiguredFeature delegate, String id) { - this.delegate = delegate; - this.id = id; - } - - @Override - @SuppressWarnings("try") - public boolean plant(Location l, Random r) { + @SuppressWarnings("ConstantConditions") + public boolean terra$plant(Location l, Random r) { + String id = BuiltinRegistries.CONFIGURED_FEATURE.getId((ConfiguredFeature) (Object) this).toString(); try(ProfileFrame ignore = TerraFabricPlugin.getInstance().getProfiler().profile("fabric_tree:" + id.toLowerCase(Locale.ROOT))) { StructureWorldAccess fabricWorldAccess = ((StructureWorldAccess) l.getWorld()); ChunkGenerator generatorWrapper = (ChunkGenerator) l.getWorld().getGenerator(); - return delegate.generate(fabricWorldAccess, generatorWrapper, r, new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ())); + return generate(fabricWorldAccess, generatorWrapper, r, new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ())); } } - @Override - public MaterialSet getSpawnable() { + public MaterialSet terra$getSpawnable() { return MaterialSet.get(TerraFabricPlugin.getInstance().getWorldHandle().createBlockData("minecraft:grass_block"), TerraFabricPlugin.getInstance().getWorldHandle().createBlockData("minecraft:podzol"), TerraFabricPlugin.getInstance().getWorldHandle().createBlockData("minecraft:mycelium")); diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 4aba80fd7..278934625 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -7,6 +7,7 @@ "GeneratorOptionsMixin", "implementations.BiomeMixin", "implementations.ChunkGeneratorMixin", + "implementations.ConfiguredFeatureMixin", "implementations.block.BlockEntityMixin", "implementations.block.BlockMixin", "implementations.block.state.LootableContainerBlockEntityMixin", From 756f04a0b37fad6b4b19772175daced792fa09ef Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 18:38:40 -0700 Subject: [PATCH 78/98] implement LockableContainerBlockEntityMixin --- .../fabric/inventory/FabricInventory.java | 37 ------------------- .../LootableContainerBlockEntityMixin.java | 3 +- .../LockableContainerBlockEntityMixin.java | 32 ++++++++++++++++ .../src/main/resources/terra.mixins.json | 1 + 4 files changed, 34 insertions(+), 39 deletions(-) delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricInventory.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/LockableContainerBlockEntityMixin.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricInventory.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricInventory.java deleted file mode 100644 index 78141d27d..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricInventory.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.dfsek.terra.fabric.inventory; - -import com.dfsek.terra.api.platform.inventory.Inventory; -import com.dfsek.terra.api.platform.inventory.ItemStack; -import com.dfsek.terra.fabric.world.FabricAdapter; -import net.minecraft.item.Items; - -public class FabricInventory implements Inventory { - private final net.minecraft.inventory.Inventory delegate; - - public FabricInventory(net.minecraft.inventory.Inventory delegate) { - this.delegate = delegate; - } - - @Override - public net.minecraft.inventory.Inventory getHandle() { - return delegate; - } - - @Override - public int getSize() { - return delegate.size(); - } - - @SuppressWarnings("ConstantConditions") - @Override - public ItemStack getItem(int slot) { - net.minecraft.item.ItemStack itemStack = delegate.getStack(slot); - return itemStack.getItem() == Items.AIR ? null : (ItemStack) (Object) itemStack; - } - - @SuppressWarnings("ConstantConditions") - @Override - public void setItem(int slot, ItemStack newStack) { - delegate.setStack(slot, (net.minecraft.item.ItemStack) (Object) newStack); - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/LootableContainerBlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/LootableContainerBlockEntityMixin.java index 5bfc47011..b9f561c1c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/LootableContainerBlockEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/LootableContainerBlockEntityMixin.java @@ -2,7 +2,6 @@ package com.dfsek.terra.fabric.mixin.implementations.block.state; import com.dfsek.terra.api.platform.block.state.Container; import com.dfsek.terra.api.platform.inventory.Inventory; -import com.dfsek.terra.fabric.inventory.FabricInventory; import com.dfsek.terra.fabric.mixin.implementations.block.BlockEntityMixin; import net.minecraft.block.entity.LootableContainerBlockEntity; import org.spongepowered.asm.mixin.Implements; @@ -13,7 +12,7 @@ import org.spongepowered.asm.mixin.Mixin; @Implements(@Interface(iface = Container.class, prefix = "terra$")) public abstract class LootableContainerBlockEntityMixin extends BlockEntityMixin { public Inventory terra$getInventory() { - return new FabricInventory(((LootableContainerBlockEntity) (Object) this)); + return (Inventory) this; } public Object terra$getHandle() { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/LockableContainerBlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/LockableContainerBlockEntityMixin.java new file mode 100644 index 000000000..b316a5f01 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/LockableContainerBlockEntityMixin.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.fabric.mixin.implementations.inventory; + +import com.dfsek.terra.api.platform.inventory.Inventory; +import com.dfsek.terra.api.platform.inventory.ItemStack; +import net.minecraft.block.entity.LockableContainerBlockEntity; +import net.minecraft.item.Items; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(LockableContainerBlockEntity.class) +@Implements(@Interface(iface = Inventory.class, prefix = "terra$")) +public class LockableContainerBlockEntityMixin { + public Object terra$getHandle() { + return this; + } + + public int terra$getSize() { + return ((LockableContainerBlockEntity) (Object) this).size(); + } + + @SuppressWarnings("ConstantConditions") + public ItemStack terra$getItem(int slot) { + net.minecraft.item.ItemStack itemStack = ((LockableContainerBlockEntity) (Object) this).getStack(slot); + return itemStack.getItem() == Items.AIR ? null : (ItemStack) (Object) itemStack; + } + + @SuppressWarnings("ConstantConditions") + public void terra$setItem(int slot, ItemStack newStack) { + ((LockableContainerBlockEntity) (Object) this).setStack(slot, (net.minecraft.item.ItemStack) (Object) newStack); + } +} diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 278934625..929db7600 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -20,6 +20,7 @@ "implementations.entity.EntityTypeMixin", "implementations.entity.PlayerEntityMixin", "implementations.entity.ServerCommandSourceMixin", + "implementations.inventory.LockableContainerBlockEntityMixin", "implementations.inventory.item.ItemMixin", "implementations.inventory.item.ItemStackMixin", "implementations.inventory.meta.EnchantmentMixin", From 457729b832a2d8c974a1302a5b6c64356918dca6 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 19:33:57 -0700 Subject: [PATCH 79/98] replace most access wideners with mixins --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 21 +++++++------ .../mixin/access/BiomeEffectsAccessor.java | 31 +++++++++++++++++++ .../{ => access}/GeneratorTypeAccessor.java | 8 ++--- .../mixin/access/MobSpawnerLogicAccessor.java | 12 +++++++ .../fabric/mixin/access/StateAccessor.java | 17 ++++++++++ .../state/MobSpawnerBlockEntityMixin.java | 3 +- .../fabric/world/block/FabricBlockData.java | 5 ++- .../src/main/resources/terra.accesswidener | 18 +---------- .../src/main/resources/terra.mixins.json | 5 ++- 9 files changed, 84 insertions(+), 36 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/BiomeEffectsAccessor.java rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{ => access}/GeneratorTypeAccessor.java (74%) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/MobSpawnerLogicAccessor.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/StateAccessor.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 05625ac53..43c7af43f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -39,7 +39,8 @@ import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.fabric.handle.FabricItemHandle; import com.dfsek.terra.fabric.handle.FabricWorldHandle; -import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; +import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor; +import com.dfsek.terra.fabric.mixin.access.GeneratorTypeAccessor; import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.features.PopulatorFeature; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; @@ -259,23 +260,23 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { generationSettings.feature(GenerationStep.Feature.VEGETAL_DECORATION, POPULATOR_CONFIGURED_FEATURE); + BiomeEffectsAccessor accessor = (BiomeEffectsAccessor) vanilla.getEffects(); BiomeEffects.Builder effects = new BiomeEffects.Builder() - .waterColor(colors.getOrDefault("water", vanilla.getEffects().waterColor)) - .waterFogColor(colors.getOrDefault("water-fog", vanilla.getEffects().waterFogColor)) - .fogColor(colors.getOrDefault("fog", vanilla.getEffects().fogColor)) - .skyColor(colors.getOrDefault("sky", vanilla.getEffects().skyColor)) - .grassColorModifier(vanilla.getEffects().grassColorModifier); + .waterColor(colors.getOrDefault("water", accessor.getWaterColor())) + .waterFogColor(colors.getOrDefault("water-fog", accessor.getWaterFogColor())) + .fogColor(colors.getOrDefault("fog", accessor.getFogColor())) + .skyColor(colors.getOrDefault("sky", accessor.getSkyColor())) + .grassColorModifier(accessor.getGrassColorModifier()); if(colors.containsKey("grass")) { effects.grassColor(colors.get("grass")); } else { - vanilla.getEffects().grassColor.ifPresent(effects::grassColor); + accessor.getGrassColor().ifPresent(effects::grassColor); } - vanilla.getEffects().foliageColor.ifPresent(effects::foliageColor); if(colors.containsKey("foliage")) { effects.foliageColor(colors.get("foliage")); } else { - vanilla.getEffects().foliageColor.ifPresent(effects::foliageColor); + accessor.getFoliageColor().ifPresent(effects::foliageColor); } return new Biome.Builder() @@ -328,7 +329,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { }; //noinspection ConstantConditions ((GeneratorTypeAccessor) generatorType).setTranslationKey(new LiteralText("Terra:" + pack.getTemplate().getID())); - GeneratorTypeAccessor.getVALUES().add(generatorType); + GeneratorTypeAccessor.getValues().add(generatorType); }); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/BiomeEffectsAccessor.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/BiomeEffectsAccessor.java new file mode 100644 index 000000000..2fe2391dc --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/BiomeEffectsAccessor.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.fabric.mixin.access; + +import net.minecraft.world.biome.BiomeEffects; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Optional; + +@Mixin(BiomeEffects.class) +public interface BiomeEffectsAccessor { + @Accessor("fogColor") + int getFogColor(); + + @Accessor("waterColor") + int getWaterColor(); + + @Accessor("waterFogColor") + int getWaterFogColor(); + + @Accessor("skyColor") + int getSkyColor(); + + @Accessor("foliageColor") + Optional getFoliageColor(); + + @Accessor("grassColor") + Optional getGrassColor(); + + @Accessor("grassColorModifier") + BiomeEffects.GrassColorModifier getGrassColorModifier(); +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/GeneratorTypeAccessor.java similarity index 74% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/GeneratorTypeAccessor.java index 07449ae3a..bd315cc54 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/GeneratorTypeAccessor.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.mixin; +package com.dfsek.terra.fabric.mixin.access; import net.minecraft.client.world.GeneratorType; import net.minecraft.text.Text; @@ -10,12 +10,12 @@ import java.util.List; @Mixin(GeneratorType.class) public interface GeneratorTypeAccessor { - @Accessor - static List getVALUES() { + @Accessor("VALUES") + static List getValues() { throw new UnsupportedOperationException(); } @Mutable - @Accessor + @Accessor("translationKey") void setTranslationKey(Text translationKey); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/MobSpawnerLogicAccessor.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/MobSpawnerLogicAccessor.java new file mode 100644 index 000000000..4b7eb1f4f --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/MobSpawnerLogicAccessor.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.fabric.mixin.access; + +import net.minecraft.util.Identifier; +import net.minecraft.world.MobSpawnerLogic; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(MobSpawnerLogic.class) +public interface MobSpawnerLogicAccessor { + @Invoker("getEntityId") + Identifier callGetEntityId(); +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/StateAccessor.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/StateAccessor.java new file mode 100644 index 000000000..8518443af --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/StateAccessor.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.fabric.mixin.access; + +import net.minecraft.state.State; +import net.minecraft.state.property.Property; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Map; +import java.util.function.Function; + +@Mixin(State.class) +public interface StateAccessor { + @Accessor("PROPERTY_MAP_PRINTER") + static Function, Comparable>, String> getPropertyMapPrinter() { + throw new UnsupportedOperationException(); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/MobSpawnerBlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/MobSpawnerBlockEntityMixin.java index 886fc80b0..14e716efa 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/MobSpawnerBlockEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/MobSpawnerBlockEntityMixin.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.platform.block.state.MobSpawner; import com.dfsek.terra.api.platform.block.state.SerialState; import com.dfsek.terra.api.platform.entity.EntityType; import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.mixin.access.MobSpawnerLogicAccessor; import net.minecraft.block.entity.MobSpawnerBlockEntity; import net.minecraft.util.registry.Registry; import net.minecraft.world.MobSpawnerLogic; @@ -20,7 +21,7 @@ public abstract class MobSpawnerBlockEntityMixin { public abstract MobSpawnerLogic getLogic(); public EntityType terra$getSpawnedType() { - return (EntityType) Registry.ENTITY_TYPE.get(getLogic().getEntityId()); + return (EntityType) Registry.ENTITY_TYPE.get(((MobSpawnerLogicAccessor) getLogic()).callGetEntityId()); } public void terra$setSpawnedType(@NotNull EntityType creatureType) { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java index aaa1b231d..31be11b07 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java @@ -2,10 +2,9 @@ package com.dfsek.terra.fabric.world.block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.BlockType; -import com.dfsek.terra.fabric.world.FabricAdapter; +import com.dfsek.terra.fabric.mixin.access.StateAccessor; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; -import net.minecraft.state.State; import net.minecraft.util.registry.Registry; import java.util.stream.Collectors; @@ -41,7 +40,7 @@ public class FabricBlockData implements BlockData { StringBuilder data = new StringBuilder(Registry.BLOCK.getId(delegate.getBlock()).toString()); if(!delegate.getEntries().isEmpty()) { data.append('['); - data.append(delegate.getEntries().entrySet().stream().map(State.PROPERTY_MAP_PRINTER).collect(Collectors.joining(","))); + data.append(delegate.getEntries().entrySet().stream().map(StateAccessor.getPropertyMapPrinter()).collect(Collectors.joining(","))); data.append(']'); } return data.toString(); diff --git a/platforms/fabric/src/main/resources/terra.accesswidener b/platforms/fabric/src/main/resources/terra.accesswidener index fcf59a730..f7a4eba9a 100644 --- a/platforms/fabric/src/main/resources/terra.accesswidener +++ b/platforms/fabric/src/main/resources/terra.accesswidener @@ -1,19 +1,3 @@ accessWidener v1 named -extendable method net/minecraft/client/world/GeneratorType (Ljava/lang/String;)V - -accessible field net/minecraft/server/world/ServerWorld worldProperties Lnet/minecraft/world/level/ServerWorldProperties; - -accessible method net/minecraft/world/MobSpawnerLogic getEntityId ()Lnet/minecraft/util/Identifier; - -accessible field net/minecraft/state/State PROPERTY_MAP_PRINTER Ljava/util/function/Function; - - -accessible field net/minecraft/world/biome/BiomeEffects fogColor I -accessible field net/minecraft/world/biome/BiomeEffects waterColor I -accessible field net/minecraft/world/biome/BiomeEffects waterFogColor I -accessible field net/minecraft/world/biome/BiomeEffects skyColor I - -accessible field net/minecraft/world/biome/BiomeEffects foliageColor Ljava/util/Optional; -accessible field net/minecraft/world/biome/BiomeEffects grassColor Ljava/util/Optional; -accessible field net/minecraft/world/biome/BiomeEffects grassColorModifier Lnet/minecraft/world/biome/BiomeEffects$GrassColorModifier; +extendable method net/minecraft/client/world/GeneratorType (Ljava/lang/String;)V \ No newline at end of file diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 929db7600..394dd3742 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -5,6 +5,9 @@ "compatibilityLevel": "JAVA_8", "mixins": [ "GeneratorOptionsMixin", + "access.BiomeEffectsAccessor", + "access.MobSpawnerLogicAccessor", + "access.StateAccessor", "implementations.BiomeMixin", "implementations.ChunkGeneratorMixin", "implementations.ConfiguredFeatureMixin", @@ -30,7 +33,7 @@ "implementations.world.ServerWorldMixin" ], "client": [ - "GeneratorTypeAccessor" + "access.GeneratorTypeAccessor" ], "server": [], "injectors": { From f21069ab2e50b36d65d137585fa850838404b6b9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 19:43:52 -0700 Subject: [PATCH 80/98] fix cache misses --- .../implementations/world/ChunkRegionMixin.java | 14 ++++++++++++++ .../implementations/world/ServerWorldMixin.java | 15 +++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java index 904f941b4..da87f4048 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java @@ -14,6 +14,7 @@ import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ChunkRegion; +import net.minecraft.world.ServerWorldAccess; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; @@ -80,4 +81,17 @@ public abstract class ChunkRegionMixin { public int hashCode() { return world.hashCode(); } + + /** + * Overridden in the same manner as {@link #hashCode()} + * + * @param other Another object + * @return Whether this world is the same as other. + * @see #hashCode() + */ + @Override + public boolean equals(Object other) { + if(!(other instanceof ServerWorldAccess)) return false; + return world.equals(((ServerWorldAccess) other).toServerWorld()); + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java index 2211bc90b..3569444c8 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java @@ -13,6 +13,7 @@ import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ServerWorldAccess; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @@ -58,4 +59,18 @@ public abstract class ServerWorldMixin { public TerraChunkGenerator terra$getTerraGenerator() { return ((FabricChunkGeneratorWrapper) terra$getGenerator()).getHandle(); } + + /** + * Overridden in the same manner as {@link ChunkRegionMixin#hashCode()} + * + * @param other Another object + * @return Whether this world is the same as other. + * @see ChunkRegionMixin#hashCode() + */ + @SuppressWarnings("ConstantConditions") + @Override + public boolean equals(Object other) { + if(!(other instanceof ServerWorldAccess)) return false; + return (ServerWorldAccess) this == (((ServerWorldAccess) other).toServerWorld()); + } } From 64c35a960935c745b3e6d8e6f8d29c108b399796 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 20:02:08 -0700 Subject: [PATCH 81/98] refactor Fabric project --- .../fabric/{world => }/FabricAdapter.java | 18 +++++++++--------- .../dfsek/terra/fabric/TerraFabricPlugin.java | 6 +++--- .../fabric/{world => }/block/FabricBlock.java | 4 ++-- .../{world => }/block/FabricBlockData.java | 2 +- .../block/data/FabricAnaloguePowerable.java | 4 ++-- .../block/data/FabricDirectional.java | 6 +++--- .../block/data/FabricEnumAdapter.java | 2 +- .../block/data/FabricMultipleFacing.java | 4 ++-- .../block/data/FabricOrientable.java | 4 ++-- .../block/data/FabricRotatable.java | 4 ++-- .../{world => }/block/data/FabricSlab.java | 2 +- .../{world => }/block/data/FabricStairs.java | 2 +- .../block/data/FabricWaterlogged.java | 4 ++-- .../FabricChunkGeneratorWrapper.java | 3 +-- .../PopulatorFeature.java | 4 ++-- .../TerraBiomeSource.java | 2 +- .../terra/fabric/handle/FabricItemHandle.java | 1 - .../terra/fabric/handle/FabricWorldHandle.java | 4 ++-- .../fabric/mixin/GeneratorOptionsMixin.java | 4 ++-- .../block/BlockEntityMixin.java | 4 ++-- .../implementations/block/BlockMixin.java | 2 +- .../chunk/ChunkRegionMixin.java | 4 ++-- .../implementations/chunk/WorldChunkMixin.java | 4 ++-- .../chunk/data/ProtoChunkMixin.java | 2 +- .../implementations/entity/EntityMixin.java | 2 +- .../world/ChunkRegionMixin.java | 4 ++-- .../world/ServerWorldMixin.java | 4 ++-- 27 files changed, 52 insertions(+), 54 deletions(-) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{world => }/FabricAdapter.java (86%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{world => }/block/FabricBlock.java (96%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{world => }/block/FabricBlockData.java (97%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{world => }/block/data/FabricAnaloguePowerable.java (84%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{world => }/block/data/FabricDirectional.java (88%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{world => }/block/data/FabricEnumAdapter.java (98%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{world => }/block/data/FabricMultipleFacing.java (95%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{world => }/block/data/FabricOrientable.java (90%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{world => }/block/data/FabricRotatable.java (97%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{world => }/block/data/FabricSlab.java (91%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{world => }/block/data/FabricStairs.java (96%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{world => }/block/data/FabricWaterlogged.java (84%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{world/generator => generation}/FabricChunkGeneratorWrapper.java (98%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{world/features => generation}/PopulatorFeature.java (89%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/{world => generation}/TerraBiomeSource.java (98%) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricAdapter.java similarity index 86% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricAdapter.java index f7258132c..3d006d637 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricAdapter.java @@ -1,18 +1,18 @@ -package com.dfsek.terra.fabric.world; +package com.dfsek.terra.fabric; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.state.Container; import com.dfsek.terra.api.platform.block.state.MobSpawner; import com.dfsek.terra.api.platform.block.state.Sign; -import com.dfsek.terra.fabric.world.block.FabricBlockData; -import com.dfsek.terra.fabric.world.block.data.FabricDirectional; -import com.dfsek.terra.fabric.world.block.data.FabricMultipleFacing; -import com.dfsek.terra.fabric.world.block.data.FabricOrientable; -import com.dfsek.terra.fabric.world.block.data.FabricRotatable; -import com.dfsek.terra.fabric.world.block.data.FabricSlab; -import com.dfsek.terra.fabric.world.block.data.FabricStairs; -import com.dfsek.terra.fabric.world.block.data.FabricWaterlogged; +import com.dfsek.terra.fabric.block.FabricBlockData; +import com.dfsek.terra.fabric.block.data.FabricDirectional; +import com.dfsek.terra.fabric.block.data.FabricMultipleFacing; +import com.dfsek.terra.fabric.block.data.FabricOrientable; +import com.dfsek.terra.fabric.block.data.FabricRotatable; +import com.dfsek.terra.fabric.block.data.FabricSlab; +import com.dfsek.terra.fabric.block.data.FabricStairs; +import com.dfsek.terra.fabric.block.data.FabricWaterlogged; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.LootableContainerBlockEntity; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 43c7af43f..ca1ab5347 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -41,9 +41,9 @@ import com.dfsek.terra.fabric.handle.FabricItemHandle; import com.dfsek.terra.fabric.handle.FabricWorldHandle; import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor; import com.dfsek.terra.fabric.mixin.access.GeneratorTypeAccessor; -import com.dfsek.terra.fabric.world.TerraBiomeSource; -import com.dfsek.terra.fabric.world.features.PopulatorFeature; -import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; +import com.dfsek.terra.fabric.generation.TerraBiomeSource; +import com.dfsek.terra.fabric.generation.PopulatorFeature; +import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.profiler.ProfilerImpl; import com.dfsek.terra.registry.exception.DuplicateEntryException; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/FabricBlock.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/FabricBlock.java index f17e80d5c..b53bff68f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/FabricBlock.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.world.block; +package com.dfsek.terra.fabric.block; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.block.Block; @@ -7,7 +7,7 @@ import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.BlockType; import com.dfsek.terra.api.platform.block.state.BlockState; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.fabric.world.FabricAdapter; +import com.dfsek.terra.fabric.FabricAdapter; import net.minecraft.block.FluidBlock; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldAccess; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/FabricBlockData.java similarity index 97% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/FabricBlockData.java index 31be11b07..6fd723bfb 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/FabricBlockData.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.world.block; +package com.dfsek.terra.fabric.block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.BlockType; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricAnaloguePowerable.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricAnaloguePowerable.java similarity index 84% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricAnaloguePowerable.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricAnaloguePowerable.java index 2e7a55347..b2fab164e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricAnaloguePowerable.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricAnaloguePowerable.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.fabric.world.block.data; +package com.dfsek.terra.fabric.block.data; import com.dfsek.terra.api.platform.block.data.AnaloguePowerable; -import com.dfsek.terra.fabric.world.block.FabricBlockData; +import com.dfsek.terra.fabric.block.FabricBlockData; import net.minecraft.block.BlockState; /** diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricDirectional.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricDirectional.java similarity index 88% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricDirectional.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricDirectional.java index 21584a8e8..4d15d1c16 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricDirectional.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricDirectional.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.fabric.world.block.data; +package com.dfsek.terra.fabric.block.data; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.Directional; -import com.dfsek.terra.fabric.world.FabricAdapter; -import com.dfsek.terra.fabric.world.block.FabricBlockData; +import com.dfsek.terra.fabric.FabricAdapter; +import com.dfsek.terra.fabric.block.FabricBlockData; import net.minecraft.block.BlockState; import net.minecraft.state.property.DirectionProperty; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricEnumAdapter.java similarity index 98% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricEnumAdapter.java index 98f883059..1fd1f173b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricEnumAdapter.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.world.block.data; +package com.dfsek.terra.fabric.block.data; import com.dfsek.terra.api.platform.block.Axis; import com.dfsek.terra.api.platform.block.BlockFace; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricMultipleFacing.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricMultipleFacing.java similarity index 95% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricMultipleFacing.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricMultipleFacing.java index c4c1bf40f..d1caae8e1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricMultipleFacing.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricMultipleFacing.java @@ -1,8 +1,8 @@ -package com.dfsek.terra.fabric.world.block.data; +package com.dfsek.terra.fabric.block.data; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.MultipleFacing; -import com.dfsek.terra.fabric.world.block.FabricBlockData; +import com.dfsek.terra.fabric.block.FabricBlockData; import net.minecraft.block.BlockState; import net.minecraft.state.property.Properties; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricOrientable.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricOrientable.java similarity index 90% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricOrientable.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricOrientable.java index 5c9e179d0..0cdc640e8 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricOrientable.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricOrientable.java @@ -1,8 +1,8 @@ -package com.dfsek.terra.fabric.world.block.data; +package com.dfsek.terra.fabric.block.data; import com.dfsek.terra.api.platform.block.Axis; import com.dfsek.terra.api.platform.block.data.Orientable; -import com.dfsek.terra.fabric.world.block.FabricBlockData; +import com.dfsek.terra.fabric.block.FabricBlockData; import net.minecraft.block.BlockState; import net.minecraft.state.property.EnumProperty; import net.minecraft.util.math.Direction; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricRotatable.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricRotatable.java similarity index 97% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricRotatable.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricRotatable.java index a238f21e1..4b7a971ea 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricRotatable.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricRotatable.java @@ -1,8 +1,8 @@ -package com.dfsek.terra.fabric.world.block.data; +package com.dfsek.terra.fabric.block.data; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.Rotatable; -import com.dfsek.terra.fabric.world.block.FabricBlockData; +import com.dfsek.terra.fabric.block.FabricBlockData; import net.minecraft.block.BlockState; import net.minecraft.state.property.Properties; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricSlab.java similarity index 91% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricSlab.java index a6ca5f5de..6b36a4794 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricSlab.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.world.block.data; +package com.dfsek.terra.fabric.block.data; import com.dfsek.terra.api.platform.block.data.Slab; import net.minecraft.block.BlockState; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricStairs.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricStairs.java index ec268f784..386314530 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricStairs.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.world.block.data; +package com.dfsek.terra.fabric.block.data; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.Stairs; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricWaterlogged.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricWaterlogged.java similarity index 84% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricWaterlogged.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricWaterlogged.java index 95960e295..7e3636bde 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricWaterlogged.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricWaterlogged.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.fabric.world.block.data; +package com.dfsek.terra.fabric.block.data; import com.dfsek.terra.api.platform.block.data.Waterlogged; -import com.dfsek.terra.fabric.world.block.FabricBlockData; +import com.dfsek.terra.fabric.block.FabricBlockData; import net.minecraft.block.BlockState; import net.minecraft.state.property.Properties; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java similarity index 98% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java index c9be1158b..2a78c36f8 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.world.generator; +package com.dfsek.terra.fabric.generation; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.generator.ChunkData; @@ -7,7 +7,6 @@ import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; -import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.generation.generators.DefaultChunkGenerator3D; import com.dfsek.terra.world.generation.math.samplers.Sampler; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/PopulatorFeature.java similarity index 89% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/PopulatorFeature.java index 4e7fbce77..c58fad225 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/PopulatorFeature.java @@ -1,8 +1,8 @@ -package com.dfsek.terra.fabric.world.features; +package com.dfsek.terra.fabric.generation; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; +import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; import com.mojang.serialization.Codec; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java similarity index 98% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java index 46b628eac..e2d821192 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.world; +package com.dfsek.terra.fabric.generation; import com.dfsek.terra.api.world.biome.UserDefinedBiome; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricItemHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricItemHandle.java index ab526753e..4ea99a542 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricItemHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricItemHandle.java @@ -3,7 +3,6 @@ package com.dfsek.terra.fabric.handle; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.inventory.Item; import com.dfsek.terra.api.platform.inventory.item.Enchantment; -import com.dfsek.terra.fabric.world.FabricAdapter; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.command.argument.ItemStackArgumentType; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricWorldHandle.java index f7545d5ce..219968106 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricWorldHandle.java @@ -2,8 +2,8 @@ package com.dfsek.terra.fabric.handle; import com.dfsek.terra.api.platform.entity.EntityType; import com.dfsek.terra.api.platform.handle.WorldHandle; -import com.dfsek.terra.fabric.world.FabricAdapter; -import com.dfsek.terra.fabric.world.block.FabricBlockData; +import com.dfsek.terra.fabric.FabricAdapter; +import com.dfsek.terra.fabric.block.FabricBlockData; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.block.BlockState; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorOptionsMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorOptionsMixin.java index bf3ec6db7..3eafe5469 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorOptionsMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorOptionsMixin.java @@ -2,8 +2,8 @@ package com.dfsek.terra.fabric.mixin; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; -import com.dfsek.terra.fabric.world.TerraBiomeSource; -import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; +import com.dfsek.terra.fabric.generation.TerraBiomeSource; +import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; import com.google.common.base.MoreObjects; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.util.registry.Registry; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockEntityMixin.java index 12cf7cb58..1cb97f632 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockEntityMixin.java @@ -3,8 +3,8 @@ package com.dfsek.terra.fabric.mixin.implementations.block; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.state.BlockState; -import com.dfsek.terra.fabric.world.FabricAdapter; -import com.dfsek.terra.fabric.world.block.FabricBlock; +import com.dfsek.terra.fabric.FabricAdapter; +import com.dfsek.terra.fabric.block.FabricBlock; import net.minecraft.block.entity.BlockEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockMixin.java index 560092078..fee950dc6 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockMixin.java @@ -2,7 +2,7 @@ package com.dfsek.terra.fabric.mixin.implementations.block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.BlockType; -import com.dfsek.terra.fabric.world.FabricAdapter; +import com.dfsek.terra.fabric.FabricAdapter; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/ChunkRegionMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/ChunkRegionMixin.java index 6f1170a70..e55ec8e30 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/ChunkRegionMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/ChunkRegionMixin.java @@ -4,8 +4,8 @@ import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.fabric.world.block.FabricBlock; -import com.dfsek.terra.fabric.world.block.FabricBlockData; +import com.dfsek.terra.fabric.block.FabricBlock; +import com.dfsek.terra.fabric.block.FabricBlockData; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ChunkRegion; import org.jetbrains.annotations.NotNull; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/WorldChunkMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/WorldChunkMixin.java index ba63d19a1..fa011869f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/WorldChunkMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/WorldChunkMixin.java @@ -4,8 +4,8 @@ import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.fabric.world.block.FabricBlock; -import com.dfsek.terra.fabric.world.block.FabricBlockData; +import com.dfsek.terra.fabric.block.FabricBlock; +import com.dfsek.terra.fabric.block.FabricBlockData; import net.minecraft.util.math.BlockPos; import net.minecraft.world.chunk.WorldChunk; import org.jetbrains.annotations.NotNull; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java index a6d626d8b..eecbc8ae1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java @@ -2,7 +2,7 @@ package com.dfsek.terra.fabric.mixin.implementations.chunk.data; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.generator.ChunkData; -import com.dfsek.terra.fabric.world.block.FabricBlockData; +import com.dfsek.terra.fabric.block.FabricBlockData; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.chunk.ProtoChunk; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java index e495c4f1b..438cbe5e9 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java @@ -2,7 +2,7 @@ package com.dfsek.terra.fabric.mixin.implementations.entity; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.fabric.world.FabricAdapter; +import com.dfsek.terra.fabric.FabricAdapter; import net.minecraft.entity.Entity; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java index da87f4048..38eb4554a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java @@ -9,8 +9,8 @@ import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; -import com.dfsek.terra.fabric.world.block.FabricBlock; -import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; +import com.dfsek.terra.fabric.block.FabricBlock; +import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ChunkRegion; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java index 3569444c8..b894aec79 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java @@ -9,8 +9,8 @@ import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; -import com.dfsek.terra.fabric.world.block.FabricBlock; -import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; +import com.dfsek.terra.fabric.block.FabricBlock; +import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ServerWorldAccess; From ddbb46289bd6dbc02c1c132bea30dd528d66938c Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 20:03:25 -0700 Subject: [PATCH 82/98] add package-info.java to implementation mixin package. --- .../terra/fabric/mixin/implementations/package-info.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/package-info.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/package-info.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/package-info.java new file mode 100644 index 000000000..ec0453641 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/package-info.java @@ -0,0 +1,5 @@ +/** + * Mixins in this package implement Terra + * interfaces in Minecraft classes. + */ +package com.dfsek.terra.fabric.mixin.implementations; \ No newline at end of file From a30859a3d4e96a9efb0ea4f477ce6379976a9a75 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 20:08:13 -0700 Subject: [PATCH 83/98] dont try to remap Terra interfaces --- .../dfsek/terra/fabric/mixin/implementations/BiomeMixin.java | 2 +- .../fabric/mixin/implementations/ChunkGeneratorMixin.java | 2 +- .../fabric/mixin/implementations/ConfiguredFeatureMixin.java | 4 +--- .../fabric/mixin/implementations/block/BlockEntityMixin.java | 2 +- .../terra/fabric/mixin/implementations/block/BlockMixin.java | 2 +- .../block/state/LootableContainerBlockEntityMixin.java | 2 +- .../block/state/MobSpawnerBlockEntityMixin.java | 2 +- .../implementations/block/state/SignBlockEntityMixin.java | 2 +- .../fabric/mixin/implementations/chunk/ChunkRegionMixin.java | 2 +- .../fabric/mixin/implementations/chunk/WorldChunkMixin.java | 2 +- .../mixin/implementations/chunk/data/ProtoChunkMixin.java | 2 +- .../fabric/mixin/implementations/entity/EntityMixin.java | 2 +- .../fabric/mixin/implementations/entity/EntityTypeMixin.java | 2 +- .../mixin/implementations/entity/PlayerEntityMixin.java | 2 +- .../implementations/entity/ServerCommandSourceMixin.java | 2 +- .../inventory/LockableContainerBlockEntityMixin.java | 2 +- .../mixin/implementations/inventory/item/ItemMixin.java | 2 +- .../mixin/implementations/inventory/item/ItemStackMixin.java | 2 +- .../implementations/inventory/meta/EnchantmentMixin.java | 2 +- .../inventory/meta/ItemStackDamageableMixin.java | 2 +- .../implementations/inventory/meta/ItemStackMetaMixin.java | 2 +- .../fabric/mixin/implementations/world/ChunkRegionMixin.java | 2 +- .../fabric/mixin/implementations/world/ServerWorldMixin.java | 2 +- 23 files changed, 23 insertions(+), 25 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/BiomeMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/BiomeMixin.java index 930218f22..ab3bff88a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/BiomeMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/BiomeMixin.java @@ -6,7 +6,7 @@ import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @Mixin(Biome.class) -@Implements(@Interface(iface = com.dfsek.terra.api.platform.world.Biome.class, prefix = "terra$")) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.world.Biome.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class BiomeMixin { public Object terra$getHandle() { return this; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ChunkGeneratorMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ChunkGeneratorMixin.java index 3da7abab0..b766f4692 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ChunkGeneratorMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ChunkGeneratorMixin.java @@ -6,7 +6,7 @@ import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @Mixin(ChunkGenerator.class) -@Implements(@Interface(iface = com.dfsek.terra.api.platform.world.generator.ChunkGenerator.class, prefix = "terra$")) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.world.generator.ChunkGenerator.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class ChunkGeneratorMixin { public Object terra$getHandle() { return this; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ConfiguredFeatureMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ConfiguredFeatureMixin.java index e1b96c2c2..7850f44b1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ConfiguredFeatureMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ConfiguredFeatureMixin.java @@ -10,8 +10,6 @@ import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.ConfiguredFeature; -import net.minecraft.world.gen.feature.FeatureConfig; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @@ -21,7 +19,7 @@ import java.util.Locale; import java.util.Random; @Mixin(ConfiguredFeature.class) -@Implements(@Interface(iface = Tree.class, prefix = "terra$")) +@Implements(@Interface(iface = Tree.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class ConfiguredFeatureMixin { @Shadow public abstract boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockEntityMixin.java index 1cb97f632..8672f444d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockEntityMixin.java @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(BlockEntity.class) -@Implements(@Interface(iface = BlockState.class, prefix = "terra$")) +@Implements(@Interface(iface = BlockState.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class BlockEntityMixin { @Shadow protected BlockPos pos; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockMixin.java index fee950dc6..0875cab40 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockMixin.java @@ -12,7 +12,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(Block.class) -@Implements(@Interface(iface = BlockType.class, prefix = "terra$")) +@Implements(@Interface(iface = BlockType.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class BlockMixin { @Shadow private BlockState defaultState; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/LootableContainerBlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/LootableContainerBlockEntityMixin.java index b9f561c1c..9bb319856 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/LootableContainerBlockEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/LootableContainerBlockEntityMixin.java @@ -9,7 +9,7 @@ import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @Mixin(LootableContainerBlockEntity.class) -@Implements(@Interface(iface = Container.class, prefix = "terra$")) +@Implements(@Interface(iface = Container.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class LootableContainerBlockEntityMixin extends BlockEntityMixin { public Inventory terra$getInventory() { return (Inventory) this; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/MobSpawnerBlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/MobSpawnerBlockEntityMixin.java index 14e716efa..8f664787e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/MobSpawnerBlockEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/MobSpawnerBlockEntityMixin.java @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(MobSpawnerBlockEntity.class) -@Implements(@Interface(iface = MobSpawner.class, prefix = "terra$")) +@Implements(@Interface(iface = MobSpawner.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class MobSpawnerBlockEntityMixin { @Shadow public abstract MobSpawnerLogic getLogic(); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/SignBlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/SignBlockEntityMixin.java index 086ebe19d..bc0aae598 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/SignBlockEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/SignBlockEntityMixin.java @@ -12,7 +12,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(SignBlockEntity.class) -@Implements(@Interface(iface = Sign.class, prefix = "terra$")) +@Implements(@Interface(iface = Sign.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class SignBlockEntityMixin { @Shadow public abstract void setTextOnRow(int row, Text text); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/ChunkRegionMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/ChunkRegionMixin.java index e55ec8e30..55ebe0576 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/ChunkRegionMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/ChunkRegionMixin.java @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(ChunkRegion.class) -@Implements(@Interface(iface = Chunk.class, prefix = "terra$")) +@Implements(@Interface(iface = Chunk.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class ChunkRegionMixin { @Final @Shadow diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/WorldChunkMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/WorldChunkMixin.java index fa011869f..c09e52dc3 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/WorldChunkMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/WorldChunkMixin.java @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(WorldChunk.class) -@Implements(@Interface(iface = Chunk.class, prefix = "terra$")) +@Implements(@Interface(iface = Chunk.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class WorldChunkMixin { @Final @Shadow diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java index eecbc8ae1..15a862bed 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(ProtoChunk.class) -@Implements(@Interface(iface = ChunkData.class, prefix = "terra$")) +@Implements(@Interface(iface = ChunkData.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class ProtoChunkMixin { @Shadow public abstract BlockState getBlockState(BlockPos pos); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java index 438cbe5e9..334b033a2 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.Shadow; import java.util.UUID; @Mixin(Entity.class) -@Implements(@Interface(iface = com.dfsek.terra.api.platform.entity.Entity.class, prefix = "terra$")) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.entity.Entity.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class EntityMixin { @Shadow public net.minecraft.world.World world; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityTypeMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityTypeMixin.java index fa4079e5f..ee0cbc0cf 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityTypeMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityTypeMixin.java @@ -6,7 +6,7 @@ import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @Mixin(EntityType.class) -@Implements(@Interface(iface = com.dfsek.terra.api.platform.entity.EntityType.class, prefix = "terra$")) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.entity.EntityType.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class EntityTypeMixin { public Object terra$getHandle() { return this; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/PlayerEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/PlayerEntityMixin.java index 808e98d6e..b4bf0d35e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/PlayerEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/PlayerEntityMixin.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @Mixin(PlayerEntity.class) -@Implements(@Interface(iface = Player.class, prefix = "terra$")) +@Implements(@Interface(iface = Player.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class PlayerEntityMixin extends EntityMixin { } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/ServerCommandSourceMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/ServerCommandSourceMixin.java index b07771315..caf9b91f1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/ServerCommandSourceMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/ServerCommandSourceMixin.java @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(ServerCommandSource.class) -@Implements(@Interface(iface = CommandSender.class, prefix = "terra$")) +@Implements(@Interface(iface = CommandSender.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class ServerCommandSourceMixin { @Shadow public abstract void sendFeedback(Text message, boolean broadcastToOps); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/LockableContainerBlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/LockableContainerBlockEntityMixin.java index b316a5f01..1c14e2ab5 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/LockableContainerBlockEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/LockableContainerBlockEntityMixin.java @@ -9,7 +9,7 @@ import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @Mixin(LockableContainerBlockEntity.class) -@Implements(@Interface(iface = Inventory.class, prefix = "terra$")) +@Implements(@Interface(iface = Inventory.class, prefix = "terra$", remap = Interface.Remap.NONE)) public class LockableContainerBlockEntityMixin { public Object terra$getHandle() { return this; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemMixin.java index a5318e539..b8f7a9be1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemMixin.java @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(Item.class) -@Implements(@Interface(iface = com.dfsek.terra.api.platform.inventory.Item.class, prefix = "terra$")) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.inventory.Item.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class ItemMixin { @Shadow public abstract int getMaxDamage(); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java index 4eb544857..a0526d119 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java @@ -9,7 +9,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(ItemStack.class) -@Implements(@Interface(iface = com.dfsek.terra.api.platform.inventory.ItemStack.class, prefix = "terra$")) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.inventory.ItemStack.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class ItemStackMixin { @Shadow public abstract int getCount(); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/EnchantmentMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/EnchantmentMixin.java index 09c24172d..5fd30638d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/EnchantmentMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/EnchantmentMixin.java @@ -11,7 +11,7 @@ import org.spongepowered.asm.mixin.Shadow; import java.util.Objects; @Mixin(Enchantment.class) -@Implements(@Interface(iface = com.dfsek.terra.api.platform.inventory.item.Enchantment.class, prefix = "terra$")) +@Implements(@Interface(iface = com.dfsek.terra.api.platform.inventory.item.Enchantment.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class EnchantmentMixin { @Shadow public abstract boolean isAcceptableItem(net.minecraft.item.ItemStack stack); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackDamageableMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackDamageableMixin.java index 67b41da7c..2ec0f3cd3 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackDamageableMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackDamageableMixin.java @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(ItemStack.class) -@Implements(@Interface(iface = Damageable.class, prefix = "terra$")) +@Implements(@Interface(iface = Damageable.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class ItemStackDamageableMixin { @Shadow public abstract boolean isDamaged(); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackMetaMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackMetaMixin.java index fc0cb3e9f..49f879e7f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackMetaMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackMetaMixin.java @@ -16,7 +16,7 @@ import java.util.HashMap; import java.util.Map; @Mixin(ItemStack.class) -@Implements(@Interface(iface = ItemMeta.class, prefix = "terra$")) +@Implements(@Interface(iface = ItemMeta.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class ItemStackMetaMixin { @Shadow public abstract boolean hasEnchantments(); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java index 38eb4554a..2bbf89d61 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java @@ -22,7 +22,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(ChunkRegion.class) -@Implements(@Interface(iface = World.class, prefix = "terra$")) +@Implements(@Interface(iface = World.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class ChunkRegionMixin { @Shadow @Final diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java index b894aec79..fc1e3b5b6 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java @@ -19,7 +19,7 @@ import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @Mixin(ServerWorld.class) -@Implements(@Interface(iface = World.class, prefix = "terra$")) +@Implements(@Interface(iface = World.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class ServerWorldMixin { public int terra$getMaxHeight() { return ((ServerWorld) (Object) this).getDimensionHeight(); From 6209b865603b2d16c033da03685af8df062ca0ed Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 20:12:48 -0700 Subject: [PATCH 84/98] mixin maintenance --- .../implementations/inventory/item/ItemStackMixin.java | 8 +------- .../inventory/meta/ItemStackMetaMixin.java | 2 ++ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java index a0526d119..b6b8c3aee 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java @@ -20,12 +20,6 @@ public abstract class ItemStackMixin { @Shadow public abstract net.minecraft.item.Item getItem(); - @Shadow - public abstract boolean isDamageable(); - - @Shadow - public abstract ItemStack copy(); - public int terra$getAmount() { return getCount(); } @@ -34,7 +28,7 @@ public abstract class ItemStackMixin { setCount(i); } - public Item getType() { + public Item terra$getType() { return (Item) getItem(); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackMetaMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackMetaMixin.java index 49f879e7f..56efedc53 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackMetaMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackMetaMixin.java @@ -8,6 +8,7 @@ import net.minecraft.nbt.ListTag; import net.minecraft.util.registry.Registry; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Intrinsic; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -31,6 +32,7 @@ public abstract class ItemStackMetaMixin { return this; } + @Intrinsic(displace = true) public Map terra$getEnchantments() { if(!hasEnchantments()) return Collections.emptyMap(); Map map = new HashMap<>(); From 6614d198458cecd57848a0be22638e567880704e Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 20:14:06 -0700 Subject: [PATCH 85/98] suppress warnings --- .../fabric/mixin/implementations/ConfiguredFeatureMixin.java | 2 +- .../fabric/mixin/implementations/world/ChunkRegionMixin.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ConfiguredFeatureMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ConfiguredFeatureMixin.java index 7850f44b1..0398a2d4c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ConfiguredFeatureMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ConfiguredFeatureMixin.java @@ -24,7 +24,7 @@ public abstract class ConfiguredFeatureMixin { @Shadow public abstract boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos); - @SuppressWarnings("ConstantConditions") + @SuppressWarnings({"ConstantConditions", "try"}) public boolean terra$plant(Location l, Random r) { String id = BuiltinRegistries.CONFIGURED_FEATURE.getId((ConfiguredFeature) (Object) this).toString(); try(ProfileFrame ignore = TerraFabricPlugin.getInstance().getProfiler().profile("fabric_tree:" + id.toLowerCase(Locale.ROOT))) { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java index 2bbf89d61..984ec19b6 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java @@ -32,6 +32,7 @@ public abstract class ChunkRegionMixin { return ((ChunkRegion) (Object) this).getDimensionHeight(); } + @SuppressWarnings("deprecation") public ChunkGenerator terra$getGenerator() { return (ChunkGenerator) ((ChunkRegion) (Object) this).toServerWorld().getChunkManager().getChunkGenerator(); } @@ -44,6 +45,7 @@ public abstract class ChunkRegionMixin { return new FabricBlock(new BlockPos(x, y, z), ((ChunkRegion) (Object) this)); } + @SuppressWarnings("deprecation") public Entity terra$spawnEntity(Location location, EntityType entityType) { net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create(((ChunkRegion) (Object) this).toServerWorld()); entity.setPos(location.getX(), location.getY(), location.getZ()); From 7595896831b3bee63957f8f98f5fc8bb826b504a Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 20:40:56 -0700 Subject: [PATCH 86/98] fix refmap issues --- platforms/fabric/build.gradle.kts | 2 +- .../implementations/entity/EntityMixin.java | 2 +- .../inventory/item/ItemStackMixin.java | 9 +++++++++ .../meta/ItemStackDamageableMixin.java | 17 +++++++++++++++++ .../implementations/world/ChunkRegionMixin.java | 10 ++++++++++ .../implementations/world/ServerWorldMixin.java | 10 ++++++++++ platforms/forge/build.gradle.kts | 2 +- .../forge/src/main/resources/terra.mixins.json | 2 +- 8 files changed, 50 insertions(+), 4 deletions(-) diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index c414cee4e..38aafb791 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -33,7 +33,7 @@ dependencies { configure { accessWidener("src/main/resources/terra.accesswidener") - refmapName = "terra.refmap.json" + refmapName = "terra-refmap.json" } val remapped = tasks.register("remapShadedJar") { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java index 334b033a2..88d6bfbb6 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java @@ -41,7 +41,7 @@ public abstract class EntityMixin { teleport(location.getX(), location.getY(), location.getZ()); } - public World getWorld() { + public World terra$getWorld() { return (World) world; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java index b6b8c3aee..db569bf3f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.platform.inventory.item.ItemMeta; import net.minecraft.item.ItemStack; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Intrinsic; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -20,6 +21,9 @@ public abstract class ItemStackMixin { @Shadow public abstract net.minecraft.item.Item getItem(); + @Shadow + public abstract boolean isDamageable(); + public int terra$getAmount() { return getCount(); } @@ -43,4 +47,9 @@ public abstract class ItemStackMixin { public Object terra$getHandle() { return this; } + + @Intrinsic + public boolean terra$isDamageable() { + return isDamageable(); + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackDamageableMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackDamageableMixin.java index 2ec0f3cd3..0d3a2fd06 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackDamageableMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackDamageableMixin.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.platform.inventory.item.Damageable; import net.minecraft.item.ItemStack; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Intrinsic; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -13,7 +14,23 @@ public abstract class ItemStackDamageableMixin { @Shadow public abstract boolean isDamaged(); + @Shadow + public abstract int getDamage(); + + @Shadow + public abstract void setDamage(int damage); + public boolean terra$hasDamage() { return isDamaged(); } + + @Intrinsic + public void terra$setDamage(int damage) { + setDamage(damage); + } + + @Intrinsic + public int terra$getDamage() { + return getDamage(); + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java index 984ec19b6..d87799f57 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java @@ -18,6 +18,7 @@ import net.minecraft.world.ServerWorldAccess; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Intrinsic; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -28,6 +29,10 @@ public abstract class ChunkRegionMixin { @Final private ServerWorld world; + @Shadow + @Final + private long seed; + public int terra$getMaxHeight() { return ((ChunkRegion) (Object) this).getDimensionHeight(); } @@ -53,6 +58,11 @@ public abstract class ChunkRegionMixin { return (Entity) entity; } + @Intrinsic + public long terra$getSeed() { + return seed; + } + public int terra$getMinHeight() { return 0; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java index fc1e3b5b6..15a5c8138 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java @@ -16,11 +16,16 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.ServerWorldAccess; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Intrinsic; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; @Mixin(ServerWorld.class) @Implements(@Interface(iface = World.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class ServerWorldMixin { + @Shadow + public abstract long getSeed(); + public int terra$getMaxHeight() { return ((ServerWorld) (Object) this).getDimensionHeight(); } @@ -44,6 +49,11 @@ public abstract class ServerWorldMixin { return (Entity) entity; } + @Intrinsic + public long terra$getSeed() { + return getSeed(); + } + public int terra$getMinHeight() { return 0; } diff --git a/platforms/forge/build.gradle.kts b/platforms/forge/build.gradle.kts index 1179ccd85..2bfb7ad0e 100644 --- a/platforms/forge/build.gradle.kts +++ b/platforms/forge/build.gradle.kts @@ -20,7 +20,7 @@ apply(plugin = "net.minecraftforge.gradle") apply(plugin = "org.spongepowered.mixin") configure { - add(sourceSets.main.get(), "terra.refmap.json") + add(sourceSets.main.get(), "terra-refmap.json") } plugins { diff --git a/platforms/forge/src/main/resources/terra.mixins.json b/platforms/forge/src/main/resources/terra.mixins.json index c363067da..c18783888 100644 --- a/platforms/forge/src/main/resources/terra.mixins.json +++ b/platforms/forge/src/main/resources/terra.mixins.json @@ -2,7 +2,7 @@ "required": true, "package": "com.dfsek.terra.forge.mixin", "compatibilityLevel": "JAVA_8", - "refmap": "terra.refmap.json", + "refmap": "terra-refmap.json", "mixins": [ ], "client": [ From f7bda835f989a92758de1a2217cd7a9c310f685a Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 20:52:03 -0700 Subject: [PATCH 87/98] fix itemmeta application --- .../implementations/inventory/item/ItemStackMixin.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java index db569bf3f..55fe05f26 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java @@ -3,6 +3,8 @@ package com.dfsek.terra.fabric.mixin.implementations.inventory.item; import com.dfsek.terra.api.platform.inventory.Item; import com.dfsek.terra.api.platform.inventory.item.ItemMeta; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Intrinsic; @@ -24,6 +26,9 @@ public abstract class ItemStackMixin { @Shadow public abstract boolean isDamageable(); + @Shadow + public abstract void setTag(@Nullable CompoundTag tag); + public int terra$getAmount() { return getCount(); } @@ -40,8 +45,9 @@ public abstract class ItemStackMixin { return (ItemMeta) this; } + @SuppressWarnings("ConstantConditions") public void terra$setItemMeta(ItemMeta meta) { - + setTag(((ItemStack) (Object) meta).getTag()); } public Object terra$getHandle() { From a1359da374d37019ca439a081d981e2b798c0a12 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 22:13:32 -0700 Subject: [PATCH 88/98] terrascript trig functions --- .../dfsek/terra/api/structures/script/StructureScript.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 65e6d9923..673381d13 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -89,6 +89,12 @@ public class StructureScript { .registerFunction("ceil", new UnaryNumberFunctionBuilder(number -> FastMath.ceil(number.doubleValue()))) .registerFunction("log", new UnaryNumberFunctionBuilder(number -> FastMath.log(number.doubleValue()))) .registerFunction("round", new UnaryNumberFunctionBuilder(number -> FastMath.round(number.doubleValue()))) + .registerFunction("sin", new UnaryNumberFunctionBuilder(number -> FastMath.sin(number.doubleValue()))) + .registerFunction("cos", new UnaryNumberFunctionBuilder(number -> FastMath.cos(number.doubleValue()))) + .registerFunction("tan", new UnaryNumberFunctionBuilder(number -> FastMath.tan(number.doubleValue()))) + .registerFunction("asin", new UnaryNumberFunctionBuilder(number -> FastMath.asin(number.doubleValue()))) + .registerFunction("acos", new UnaryNumberFunctionBuilder(number -> FastMath.acos(number.doubleValue()))) + .registerFunction("atan", new UnaryNumberFunctionBuilder(number -> FastMath.atan(number.doubleValue()))) .registerFunction("max", new BinaryNumberFunctionBuilder((number, number2) -> FastMath.max(number.doubleValue(), number2.doubleValue()))) .registerFunction("min", new BinaryNumberFunctionBuilder((number, number2) -> FastMath.min(number.doubleValue(), number2.doubleValue()))); From 2d18aab70972551cde605ebdbae4a46070674296 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 22:13:42 -0700 Subject: [PATCH 89/98] fix funky yaml formatting --- .editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index 8fbad9dcd..1c53c29c2 100644 --- a/.editorconfig +++ b/.editorconfig @@ -342,6 +342,6 @@ ij_json_wrap_long_lines = false indent_size = 2 ij_yaml_keep_indents_on_empty_lines = true ij_yaml_keep_line_breaks = true -ij_yaml_space_before_colon = true +ij_yaml_space_before_colon = false ij_yaml_spaces_within_braces = true ij_yaml_spaces_within_brackets = true From bf93a9239ca4166d664c4dcd2469dfd075aaf42a Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 22:28:01 -0700 Subject: [PATCH 90/98] bump version --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 6a1e1cecf..3f6b6d2e0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ import com.dfsek.terra.getGitHash -val versionObj = Version("5", "2", "1", true) +val versionObj = Version("5", "3", "0", true) allprojects { version = versionObj From 13e08578822bebc0f22d3e60c728d5e70677bc14 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 3 May 2021 22:49:21 -0700 Subject: [PATCH 91/98] merge FabricEnumAdapter into FabricAdapter --- .../com/dfsek/terra/fabric/FabricAdapter.java | 134 +++++++++++++++ .../fabric/block/data/FabricEnumAdapter.java | 159 ------------------ .../fabric/block/data/FabricOrientable.java | 5 +- .../terra/fabric/block/data/FabricSlab.java | 5 +- .../terra/fabric/block/data/FabricStairs.java | 13 +- 5 files changed, 147 insertions(+), 169 deletions(-) delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricEnumAdapter.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricAdapter.java index 3d006d637..62037173c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricAdapter.java @@ -1,7 +1,11 @@ package com.dfsek.terra.fabric; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.platform.block.Axis; import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.Bisected; +import com.dfsek.terra.api.platform.block.data.Slab; +import com.dfsek.terra.api.platform.block.data.Stairs; import com.dfsek.terra.api.platform.block.state.Container; import com.dfsek.terra.api.platform.block.state.MobSpawner; import com.dfsek.terra.api.platform.block.state.Sign; @@ -18,6 +22,9 @@ import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.LootableContainerBlockEntity; import net.minecraft.block.entity.MobSpawnerBlockEntity; import net.minecraft.block.entity.SignBlockEntity; +import net.minecraft.block.enums.BlockHalf; +import net.minecraft.block.enums.SlabType; +import net.minecraft.block.enums.StairShape; import net.minecraft.state.property.Properties; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; @@ -87,4 +94,131 @@ public final class FabricAdapter { } return null; } + + public static Stairs.Shape adapt(StairShape shape) { + switch(shape) { + case OUTER_RIGHT: + return Stairs.Shape.OUTER_RIGHT; + case INNER_RIGHT: + return Stairs.Shape.INNER_RIGHT; + case OUTER_LEFT: + return Stairs.Shape.OUTER_LEFT; + case INNER_LEFT: + return Stairs.Shape.INNER_LEFT; + case STRAIGHT: + return Stairs.Shape.STRAIGHT; + default: + throw new IllegalStateException(); + } + } + + public static Bisected.Half adapt(BlockHalf half) { + switch(half) { + case BOTTOM: + return Bisected.Half.BOTTOM; + case TOP: + return Bisected.Half.TOP; + default: + throw new IllegalStateException(); + } + } + + public static BlockFace adapt(Direction direction) { + switch(direction) { + case DOWN: + return BlockFace.DOWN; + case UP: + return BlockFace.UP; + case WEST: + return BlockFace.WEST; + case EAST: + return BlockFace.EAST; + case NORTH: + return BlockFace.NORTH; + case SOUTH: + return BlockFace.SOUTH; + default: + throw new IllegalStateException(); + } + } + + public static Slab.Type adapt(SlabType type) { + switch(type) { + case BOTTOM: + return Slab.Type.BOTTOM; + case TOP: + return Slab.Type.TOP; + case DOUBLE: + return Slab.Type.DOUBLE; + default: + throw new IllegalStateException(); + } + } + + public static StairShape adapt(Stairs.Shape shape) { + switch(shape) { + case STRAIGHT: + return StairShape.STRAIGHT; + case INNER_LEFT: + return StairShape.INNER_LEFT; + case OUTER_LEFT: + return StairShape.OUTER_LEFT; + case INNER_RIGHT: + return StairShape.INNER_RIGHT; + case OUTER_RIGHT: + return StairShape.OUTER_RIGHT; + default: + throw new IllegalStateException(); + } + } + + public static BlockHalf adapt(Bisected.Half half) { + switch(half) { + case TOP: + return BlockHalf.TOP; + case BOTTOM: + return BlockHalf.BOTTOM; + default: + throw new IllegalStateException(); + } + } + + public static SlabType adapt(Slab.Type type) { + switch(type) { + case DOUBLE: + return SlabType.DOUBLE; + case TOP: + return SlabType.TOP; + case BOTTOM: + return SlabType.BOTTOM; + default: + throw new IllegalStateException(); + } + } + + public static Axis adapt(Direction.Axis axis) { + switch(axis) { + case X: + return Axis.X; + case Y: + return Axis.Y; + case Z: + return Axis.Z; + default: + throw new IllegalStateException(); + } + } + + public static Direction.Axis adapt(Axis axis) { + switch(axis) { + case Z: + return Direction.Axis.Z; + case Y: + return Direction.Axis.Y; + case X: + return Direction.Axis.X; + default: + throw new IllegalStateException(); + } + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricEnumAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricEnumAdapter.java deleted file mode 100644 index 1fd1f173b..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricEnumAdapter.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.dfsek.terra.fabric.block.data; - -import com.dfsek.terra.api.platform.block.Axis; -import com.dfsek.terra.api.platform.block.BlockFace; -import com.dfsek.terra.api.platform.block.data.Bisected; -import com.dfsek.terra.api.platform.block.data.Slab; -import com.dfsek.terra.api.platform.block.data.Stairs; -import net.minecraft.block.enums.BlockHalf; -import net.minecraft.block.enums.SlabType; -import net.minecraft.block.enums.StairShape; -import net.minecraft.util.math.Direction; - -public final class FabricEnumAdapter { - public static Stairs.Shape adapt(StairShape shape) { - switch(shape) { - case OUTER_RIGHT: - return Stairs.Shape.OUTER_RIGHT; - case INNER_RIGHT: - return Stairs.Shape.INNER_RIGHT; - case OUTER_LEFT: - return Stairs.Shape.OUTER_LEFT; - case INNER_LEFT: - return Stairs.Shape.INNER_LEFT; - case STRAIGHT: - return Stairs.Shape.STRAIGHT; - default: - throw new IllegalStateException(); - } - } - - public static Bisected.Half adapt(BlockHalf half) { - switch(half) { - case BOTTOM: - return Bisected.Half.BOTTOM; - case TOP: - return Bisected.Half.TOP; - default: - throw new IllegalStateException(); - } - } - - public static BlockFace adapt(Direction direction) { - switch(direction) { - case DOWN: - return BlockFace.DOWN; - case UP: - return BlockFace.UP; - case WEST: - return BlockFace.WEST; - case EAST: - return BlockFace.EAST; - case NORTH: - return BlockFace.NORTH; - case SOUTH: - return BlockFace.SOUTH; - default: - throw new IllegalStateException(); - } - } - - public static Slab.Type adapt(SlabType type) { - switch(type) { - case BOTTOM: - return Slab.Type.BOTTOM; - case TOP: - return Slab.Type.TOP; - case DOUBLE: - return Slab.Type.DOUBLE; - default: - throw new IllegalStateException(); - } - } - - public static StairShape adapt(Stairs.Shape shape) { - switch(shape) { - case STRAIGHT: - return StairShape.STRAIGHT; - case INNER_LEFT: - return StairShape.INNER_LEFT; - case OUTER_LEFT: - return StairShape.OUTER_LEFT; - case INNER_RIGHT: - return StairShape.INNER_RIGHT; - case OUTER_RIGHT: - return StairShape.OUTER_RIGHT; - default: - throw new IllegalStateException(); - } - } - - public static BlockHalf adapt(Bisected.Half half) { - switch(half) { - case TOP: - return BlockHalf.TOP; - case BOTTOM: - return BlockHalf.BOTTOM; - default: - throw new IllegalStateException(); - } - } - - public static Direction adapt(BlockFace face) { - switch(face) { - case SOUTH: - return Direction.SOUTH; - case NORTH: - return Direction.NORTH; - case EAST: - return Direction.EAST; - case WEST: - return Direction.WEST; - case UP: - return Direction.UP; - case DOWN: - return Direction.DOWN; - default: - throw new IllegalArgumentException(); - } - } - - public static SlabType adapt(Slab.Type type) { - switch(type) { - case DOUBLE: - return SlabType.DOUBLE; - case TOP: - return SlabType.TOP; - case BOTTOM: - return SlabType.BOTTOM; - default: - throw new IllegalStateException(); - } - } - - public static Axis adapt(Direction.Axis axis) { - switch(axis) { - case X: - return Axis.X; - case Y: - return Axis.Y; - case Z: - return Axis.Z; - default: - throw new IllegalStateException(); - } - } - - public static Direction.Axis adapt(Axis axis) { - switch(axis) { - case Z: - return Direction.Axis.Z; - case Y: - return Direction.Axis.Y; - case X: - return Direction.Axis.X; - default: - throw new IllegalStateException(); - } - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricOrientable.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricOrientable.java index 0cdc640e8..1633df9ab 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricOrientable.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricOrientable.java @@ -2,6 +2,7 @@ package com.dfsek.terra.fabric.block.data; import com.dfsek.terra.api.platform.block.Axis; import com.dfsek.terra.api.platform.block.data.Orientable; +import com.dfsek.terra.fabric.FabricAdapter; import com.dfsek.terra.fabric.block.FabricBlockData; import net.minecraft.block.BlockState; import net.minecraft.state.property.EnumProperty; @@ -26,11 +27,11 @@ public class FabricOrientable extends FabricBlockData implements Orientable { @Override public Axis getAxis() { - return FabricEnumAdapter.adapt(getHandle().get(property)); + return FabricAdapter.adapt(getHandle().get(property)); } @Override public void setAxis(Axis axis) { - delegate = delegate.with(property, FabricEnumAdapter.adapt(axis)); + delegate = delegate.with(property, FabricAdapter.adapt(axis)); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricSlab.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricSlab.java index 6b36a4794..390702582 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricSlab.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricSlab.java @@ -1,6 +1,7 @@ package com.dfsek.terra.fabric.block.data; import com.dfsek.terra.api.platform.block.data.Slab; +import com.dfsek.terra.fabric.FabricAdapter; import net.minecraft.block.BlockState; import net.minecraft.state.property.Properties; @@ -11,11 +12,11 @@ public class FabricSlab extends FabricWaterlogged implements Slab { @Override public Type getType() { - return FabricEnumAdapter.adapt(delegate.get(Properties.SLAB_TYPE)); + return FabricAdapter.adapt(delegate.get(Properties.SLAB_TYPE)); } @Override public void setType(Type type) { - delegate = delegate.with(Properties.SLAB_TYPE, FabricEnumAdapter.adapt(type)); + delegate = delegate.with(Properties.SLAB_TYPE, FabricAdapter.adapt(type)); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricStairs.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricStairs.java index 386314530..098cd75d6 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricStairs.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricStairs.java @@ -2,6 +2,7 @@ package com.dfsek.terra.fabric.block.data; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.Stairs; +import com.dfsek.terra.fabric.FabricAdapter; import net.minecraft.block.BlockState; import net.minecraft.state.property.Properties; @@ -12,31 +13,31 @@ public class FabricStairs extends FabricWaterlogged implements Stairs { @Override public Shape getShape() { - return FabricEnumAdapter.adapt(getHandle().get(Properties.STAIR_SHAPE)); + return FabricAdapter.adapt(getHandle().get(Properties.STAIR_SHAPE)); } @Override public void setShape(Shape shape) { - super.delegate = getHandle().with(Properties.STAIR_SHAPE, FabricEnumAdapter.adapt(shape)); + super.delegate = getHandle().with(Properties.STAIR_SHAPE, FabricAdapter.adapt(shape)); } @Override public Half getHalf() { - return FabricEnumAdapter.adapt(getHandle().get(Properties.BLOCK_HALF)); + return FabricAdapter.adapt(getHandle().get(Properties.BLOCK_HALF)); } @Override public void setHalf(Half half) { - super.delegate = getHandle().with(Properties.BLOCK_HALF, FabricEnumAdapter.adapt(half)); + super.delegate = getHandle().with(Properties.BLOCK_HALF, FabricAdapter.adapt(half)); } @Override public BlockFace getFacing() { - return FabricEnumAdapter.adapt(getHandle().get(Properties.HORIZONTAL_FACING)); + return FabricAdapter.adapt(getHandle().get(Properties.HORIZONTAL_FACING)); } @Override public void setFacing(BlockFace facing) { - super.delegate = getHandle().with(Properties.HORIZONTAL_FACING, FabricEnumAdapter.adapt(facing)); + super.delegate = getHandle().with(Properties.HORIZONTAL_FACING, FabricAdapter.adapt(facing)); } } From 86dcb476f18a376e02ecbda7e0ab8bf0fca46db1 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 4 May 2021 09:21:12 -0700 Subject: [PATCH 92/98] update README with modern build instructions and Forge download links --- README.md | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 45629f0eb..b8737a6ff 100644 --- a/README.md +++ b/README.md @@ -7,20 +7,39 @@ to your specifications, with no knowledge of Java required. * Paper+ servers (Paper, Tuinity, Purpur, etc): [SpigotMC](https://www.spigotmc.org/resources/85151/) * Fabric: [Modrinth](https://modrinth.com/mod/terra) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/terra-world-generator) +* Forge: [Modrinth](https://modrinth.com/mod/terra) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/terra-world-generator) -## Building and running Terra +## Building and Running Terra -To build, simply run `./gradlew build` (`gradlew.bat build` on Windows). This will produce a jar in `build/libs` -called `Terra-[CURRENT VERSION].jar`. You can put this right into your plugins dir, along with the correct Gaea version. +To build, simply run `./gradlew build` (`gradlew.bat build` on Windows). This will build all platforms, and +produce JARs in `platforms//build/libs` -If you would like to test it with a default server config, just run `./gradlew setupServer` or -`./gradlew.bat setupServer` to set up the server, then `./gradlew testWithPaper` or `gradlew.bat testWithPaper` to run the server. If you -want a clean installation of the server, re-run the `setupServer` task. This will download a default server config -from [here](https://github.com/PolyhedralDev/WorldGenTestServer) -and install the server in the `target/server` directory, along with all the needed plugins. +### Production JARs: +* Bukkit: `Terra--shaded.jar` +* Fabric: `Terra--shaded-mapped.jar` +* Forge: `Terra--shaded.jar` -**Note: You will need to adjust the `NAME` variable `bukkit.yml` of the test server if you are not using the default Terra config.** +### Building a Specific Platform +To build a specific platform, use the following Gradle tasks: +* Bukkit: `:platforms:bukkit:shadowJar` +* Fabric: `:platforms:fabric:remapShadedJar` +* Forge: `:platforms:forge:reobfShadowJar` +These tasks all produce JARs in `platforms//build/libs`. + +### Running Minecraft in the IDE +To run Minecraft with Terra in the IDE (for testing) use the following tasks: +* Bukkit + * `installPaper` - Install a [Paper](https://github.com/PaperMC/Paper) test server. (Only needs to be run once). + * `installPurpur` - Install a [Purpur](https://github.com/pl3xgaming/Purpur) test server. (Only needs to be run once). + * `runPaper` - Run the Paper test server with Terra (`installPaper` must have been run previously). + * `runPurpur` - Run the Purpur test server with Terra (`installPurpur` must have been run previously). +* Fabric + * `runClient` - Run a Minecraft client with Terra installed. + * `runServer` - Run a Minecraft server with Terra installed. +* Forge + * `runClient` - Run a Minecraft client with Terra installed. + * `runServer` - Run a Minecraft server with Terra installed. ## Contributing Contributions are welcome! If you want to see a feature in Terra, please, open an issue, or implement it yourself and submit a PR! From 4c77419dcdaa03e19a94c64ed4117f54d0de9a63 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 4 May 2021 15:04:53 -0700 Subject: [PATCH 93/98] fix sign getText on server --- .../block/state/SignBlockEntityMixin.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/SignBlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/SignBlockEntityMixin.java index bc0aae598..1b7e4b29e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/SignBlockEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/SignBlockEntityMixin.java @@ -6,6 +6,7 @@ import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Mixin; @@ -18,19 +19,20 @@ public abstract class SignBlockEntityMixin { public abstract void setTextOnRow(int row, Text text); @Shadow - public abstract Text getTextOnRow(int row); + @Final + private Text[] text; public @NotNull String[] terra$getLines() { return new String[] { - getTextOnRow(0).asString(), - getTextOnRow(1).asString(), - getTextOnRow(2).asString(), - getTextOnRow(3).asString() + terra$getLine(0), + terra$getLine(1), + terra$getLine(2), + terra$getLine(3) }; } public @NotNull String terra$getLine(int index) throws IndexOutOfBoundsException { - return getTextOnRow(index).asString(); + return text[index].asString(); } public void terra$setLine(int index, @NotNull String line) throws IndexOutOfBoundsException { From 68660848729c9384627bca493f20fccf7f99d508 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 4 May 2021 16:10:37 -0700 Subject: [PATCH 94/98] SignBlockEntityMixin cleanup --- .../block/state/SignBlockEntityMixin.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/SignBlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/SignBlockEntityMixin.java index 1b7e4b29e..f8ab0ee3f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/SignBlockEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/SignBlockEntityMixin.java @@ -23,12 +23,11 @@ public abstract class SignBlockEntityMixin { private Text[] text; public @NotNull String[] terra$getLines() { - return new String[] { - terra$getLine(0), - terra$getLine(1), - terra$getLine(2), - terra$getLine(3) - }; + String[] lines = new String[text.length]; + for(int i = 0; i < text.length; i++) { + lines[i] = text[i].asString(); + } + return lines; } public @NotNull String terra$getLine(int index) throws IndexOutOfBoundsException { From ed942bb9976fbdb1f8926323903500d59ea599aa Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 4 May 2021 16:13:05 -0700 Subject: [PATCH 95/98] update README.md --- README.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b8737a6ff..8986ce6b7 100644 --- a/README.md +++ b/README.md @@ -20,12 +20,9 @@ produce JARs in `platforms//build/libs` * Forge: `Terra--shaded.jar` ### Building a Specific Platform -To build a specific platform, use the following Gradle tasks: -* Bukkit: `:platforms:bukkit:shadowJar` -* Fabric: `:platforms:fabric:remapShadedJar` -* Forge: `:platforms:forge:reobfShadowJar` +To build a specific platform, run `gradlew :platforms::build`. -These tasks all produce JARs in `platforms//build/libs`. +JARs are produced in `platforms//build/libs`. ### Running Minecraft in the IDE To run Minecraft with Terra in the IDE (for testing) use the following tasks: From 77a4c95c4a4f1f2f13bcfab75bee6d50403222dd Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 4 May 2021 16:44:43 -0700 Subject: [PATCH 96/98] override structure location on Fabric --- .../FabricChunkGeneratorWrapper.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java index 2a78c36f8..efac7ee53 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java @@ -5,19 +5,25 @@ import com.dfsek.terra.api.platform.world.generator.ChunkData; import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; +import com.dfsek.terra.api.world.locate.AsyncStructureFinder; import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.fabric.FabricAdapter; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.generation.generators.DefaultChunkGenerator3D; import com.dfsek.terra.world.generation.math.samplers.Sampler; +import com.dfsek.terra.world.population.items.TerraStructure; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.jafama.FastMath; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.server.world.ServerWorld; import net.minecraft.structure.StructureManager; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.util.registry.DynamicRegistryManager; +import net.minecraft.util.registry.Registry; import net.minecraft.world.BlockView; import net.minecraft.world.ChunkRegion; import net.minecraft.world.Heightmap; @@ -29,6 +35,12 @@ import net.minecraft.world.gen.StructureAccessor; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.StructuresConfig; import net.minecraft.world.gen.chunk.VerticalBlockSample; +import net.minecraft.world.gen.feature.StructureFeature; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; public class FabricChunkGeneratorWrapper extends ChunkGenerator implements GeneratorWrapper { private final long seed; @@ -75,6 +87,28 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener } + @Nullable + @Override + public BlockPos locateStructure(ServerWorld world, StructureFeature feature, BlockPos center, int radius, boolean skipExistingChunks) { + String name = Objects.requireNonNull(Registry.STRUCTURE_FEATURE.getId(feature)).toString(); + TerraWorld terraWorld = TerraFabricPlugin.getInstance().getWorld((World) world); + TerraStructure located = pack.getStructure(pack.getTemplate().getLocatable().get(name)); + if(located != null) { + CompletableFuture result = new CompletableFuture<>(); + AsyncStructureFinder finder = new AsyncStructureFinder(terraWorld.getBiomeProvider(), located, FabricAdapter.adapt(center).toLocation((World) world), 0, 500, location -> { + result.complete(FabricAdapter.adapt(location)); + }, TerraFabricPlugin.getInstance()); + finder.run(); // Do this synchronously. + try { + return result.get(); + } catch(InterruptedException | ExecutionException e) { + throw new RuntimeException(e); + } + } + TerraFabricPlugin.getInstance().logger().warning("No overrides are defined for \"" + name + "\""); + return null; + } + @Override public void generateFeatures(ChunkRegion region, StructureAccessor accessor) { super.generateFeatures(region, accessor); From 97aa9d9a91632a7636c4c334954831b5d756f0ee Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 9 May 2021 22:28:52 -0700 Subject: [PATCH 97/98] resolve merge conflicts --- gradle.properties | 2 +- .../dfsek/terra/fabric/TerraFabricPlugin.java | 19 +++---------------- .../FabricChunkGeneratorWrapper.java | 2 +- .../dfsek/terra/forge/TerraForgePlugin.java | 4 ++-- 4 files changed, 7 insertions(+), 20 deletions(-) diff --git a/gradle.properties b/gradle.properties index 1fca82ba1..94dc0b5ce 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,4 +7,4 @@ org.gradle.parallel=true org.gradle.caching=true org.gradle.warning.mode=all #org.gradle.logging.level=info -org.gradle.configureondemand=true +#org.gradle.configureondemand=true diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index d8a673511..e53cd4df0 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -37,25 +37,13 @@ import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.fabric.inventory.FabricItemHandle; -import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; -import com.dfsek.terra.fabric.world.FabricAdapter; -import com.dfsek.terra.fabric.world.FabricBiome; -import com.dfsek.terra.fabric.world.FabricTree; -import com.dfsek.terra.fabric.world.FabricWorldHandle; -import com.dfsek.terra.fabric.world.TerraBiomeSource; -import com.dfsek.terra.fabric.world.features.PopulatorFeature; -import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; -import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; -import com.dfsek.terra.profiler.Profiler; -import com.dfsek.terra.profiler.ProfilerImpl; +import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; +import com.dfsek.terra.fabric.generation.PopulatorFeature; +import com.dfsek.terra.fabric.generation.TerraBiomeSource; import com.dfsek.terra.fabric.handle.FabricItemHandle; import com.dfsek.terra.fabric.handle.FabricWorldHandle; import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor; import com.dfsek.terra.fabric.mixin.access.GeneratorTypeAccessor; -import com.dfsek.terra.fabric.generation.TerraBiomeSource; -import com.dfsek.terra.fabric.generation.PopulatorFeature; -import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.profiler.ProfilerImpl; import com.dfsek.terra.registry.exception.DuplicateEntryException; @@ -80,7 +68,6 @@ import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeEffects; import net.minecraft.world.biome.GenerationSettings; -import net.minecraft.world.biome.SpawnSettings; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java index efac7ee53..39a4f9fd5 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java @@ -92,7 +92,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener public BlockPos locateStructure(ServerWorld world, StructureFeature feature, BlockPos center, int radius, boolean skipExistingChunks) { String name = Objects.requireNonNull(Registry.STRUCTURE_FEATURE.getId(feature)).toString(); TerraWorld terraWorld = TerraFabricPlugin.getInstance().getWorld((World) world); - TerraStructure located = pack.getStructure(pack.getTemplate().getLocatable().get(name)); + TerraStructure located = pack.getRegistry(TerraStructure.class).get(pack.getTemplate().getLocatable().get(name)); if(located != null) { CompletableFuture result = new CompletableFuture<>(); AsyncStructureFinder finder = new AsyncStructureFinder(terraWorld.getBiomeProvider(), located, FabricAdapter.adapt(center).toLocation((World) world), 0, 500, location -> { diff --git a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java index b7cab9f61..fe0d33cf1 100644 --- a/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java +++ b/platforms/forge/src/main/java/com/dfsek/terra/forge/TerraForgePlugin.java @@ -201,7 +201,7 @@ public class TerraForgePlugin implements TerraPlugin { @SubscribeEvent public static void register(RegistryEvent.Register event) { INSTANCE.setup(); // Setup now because we need the biomes, and this event happens after blocks n stuff - INSTANCE.getConfigRegistry().forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> event.getRegistry().register(INSTANCE.createBiome(biome)))); // Register all Terra biomes. + INSTANCE.getConfigRegistry().forEach(pack -> pack.getRegistry(BiomeBuilder.class).forEach((id, biome) -> event.getRegistry().register(INSTANCE.createBiome(biome)))); // Register all Terra biomes. } @SubscribeEvent @@ -448,7 +448,7 @@ public class TerraForgePlugin implements TerraPlugin { @Priority(Priority.LOWEST) @Global public void injectTrees(ConfigPackPreLoadEvent event) { - CheckedRegistry treeRegistry = event.getPack().getTreeRegistry(); + CheckedRegistry treeRegistry = event.getPack().getRegistry(Tree.class); injectTree(treeRegistry, "BROWN_MUSHROOM", Features.HUGE_BROWN_MUSHROOM); injectTree(treeRegistry, "RED_MUSHROOM", Features.HUGE_RED_MUSHROOM); injectTree(treeRegistry, "JUNGLE", Features.MEGA_JUNGLE_TREE); From 77bb04e91fc21ebf04994c42be21579f7dedb7d2 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 9 May 2021 22:34:44 -0700 Subject: [PATCH 98/98] fix structure completer --- .../src/main/java/com/dfsek/terra/config/pack/ConfigPack.java | 4 ++++ .../main/java/com/dfsek/terra/config/pack/WorldConfig.java | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java index 07ea5b52a..f8d2775fc 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPack.java @@ -193,6 +193,10 @@ public class ConfigPack implements LoaderRegistrar { registryMap.forEach((clazz, pair) -> pair.getLeft().getDeadEntries().forEach((id, value) -> main.getDebugLogger().warn("Dead entry in '" + clazz + "' registry: '" + id + "'"))); } + protected Map, ImmutablePair, CheckedRegistry>> getRegistryMap() { + return registryMap; + } + @SuppressWarnings({"unchecked", "rawtypes"}) private void load(long start, TerraPlugin main) throws ConfigException { main.getEventManager().callEvent(new ConfigPackPreLoadEvent(this)); diff --git a/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java b/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java index 11f473efd..c3be03456 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/WorldConfig.java @@ -31,8 +31,7 @@ public class WorldConfig { this.pack = pack; this.samplerCache = new SamplerCache(main, world); - pack.getConfigTypeRegistry().forEach(configType -> registryMap.put(configType.getTypeClass(), new LockedRegistry<>(pack.getRegistry(configType.getTypeClass())))); - + pack.getRegistryMap().forEach((clazz, pair) -> registryMap.put(clazz, new LockedRegistry<>(pair.getLeft()))); OpenRegistry biomeOpenRegistry = new OpenRegistry<>(); pack.getRegistry(BiomeBuilder.class).forEach((id, biome) -> biomeOpenRegistry.add(id, biome.apply(world.getWorld().getSeed())));