Compare commits

...

72 Commits

Author SHA1 Message Date
Astrash 2c8d3416ab Load parse options before registering metaconfig 2024-10-30 14:04:40 +11:00
Astrash 5e43f0afef Add support for Paralithic let expressions 2024-10-30 14:04:40 +11:00
Zoe Gidiere 02fdcee705 Fix fabric 2024-10-29 20:24:32 -06:00
Zoe Gidiere 4165224c51 Mark Cache Sampler Experimental 2024-10-29 16:04:55 -06:00
Zoe Gidiere 710bbc33c9 Refractor bukkit to v1_21_3 2024-10-29 15:53:48 -06:00
Zoë Gidiere 1929239015 Merge pull request #473 from PolyhedralDev/dev/biomes3
Some refractors and updates to platofrm biomes
2024-10-29 20:27:42 +00:00
Zoë Gidiere 4432ae4867 Merge pull request #476 from AllayMC/dev/support-world-unload
feat: support world unloading
2024-10-28 18:18:23 +00:00
daoge_cmd 16c951838b feat: support world unloading 2024-10-28 17:39:25 +08:00
Zoe Gidiere 144c932703 mixin tweak 2024-10-25 16:09:42 -06:00
Zoë Gidiere e56b8856fa Merge pull request #474 from AllayMC/allay
feat: add support for allay platform
2024-10-25 16:05:58 -06:00
Zoë Gidiere 04f6d18198 Merge pull request #470 from PolyhedralDev/dev/1.21.2
Dev/1.21.2
2024-10-25 14:09:16 -06:00
daoge 071f9d39af docs: fix a typo in README.md 2024-10-15 10:03:54 +08:00
daoge_cmd d2107fd258 fix: chunkGenerator should be overwritten after reloading 2024-10-14 22:37:09 +08:00
daoge_cmd df3e623530 feat: implement config pack reloading 2024-10-14 22:13:54 +08:00
daoge_cmd f0d03d4538 feat: fallback to FLAT generator if config pack name is missing 2024-10-14 21:34:23 +08:00
daoge_cmd 84fe8792d6 fix: fix entrance in plugin.json 2024-10-14 21:33:59 +08:00
daoge_cmd 67fc2ba4dc docs: remove useless TODOs 2024-10-14 21:21:54 +08:00
daoge_cmd 8d63c40e2f refactor: replace 'var' with explicit type 2024-10-14 21:13:00 +08:00
daoge_cmd b0bc37c34d refactor: remove version info in mapping files 2024-10-14 21:05:06 +08:00
daoge_cmd f2c5c15650 refactor: use com.dfsek as the new package name 2024-10-14 21:02:07 +08:00
daoge_cmd f5de88215c build: use fixed allay api version 2024-10-14 21:00:15 +08:00
daoge_cmd 8a6ad95947 refactor: delombok and move version info to Versions.kt 2024-10-14 20:55:11 +08:00
daoge_cmd cc14c716bf build: move repo declaration to DependencyConfig.kt 2024-10-14 20:36:40 +08:00
daoge_cmd ece5213a87 feat: use macro in plugin.json and update author list 2024-10-14 11:33:40 +08:00
daoge_cmd a01f700653 build: rollback github action file changes 2024-10-14 11:24:54 +08:00
daoge_cmd 0ca7171bae docs: add README.md to allay platform 2024-10-14 11:23:59 +08:00
daoge_cmd 6261f0849c feat: remove java version declaration in allay platform as all platforms are in java 21 now 2024-10-14 11:23:27 +08:00
daoge 4fc24f022f Merge branch 'PolyhedralDev:master' into allay 2024-10-14 11:07:34 +08:00
daoge_cmd 61ed302137 feat: adapting terra 6.5.1 (WIP) 2024-10-14 11:07:12 +08:00
daoge_cmd 1496f2c929 build: update jitpack repo link 2024-10-13 15:41:03 +08:00
daoge_cmd 6042f1c036 build: update build.gradle.kts 2024-09-21 00:57:18 +08:00
daoge_cmd af2ac64cd4 feat: using the new safe getter api 2024-09-20 19:47:49 +08:00
daoge_cmd 4bad8f702c docs: format javadoc 2024-09-18 13:02:16 +08:00
daoge_cmd 76f12e0cb8 build: prepare for merging 2024-09-18 12:59:30 +08:00
daoge_cmd ce9fb53df4 build: disable useless modules 2024-09-17 22:28:04 +08:00
daoge 1f01b99d29 ci: should check allay branch 2024-09-17 20:40:24 +08:00
daoge 18a24562ec ci: upload jar 2024-09-17 20:39:49 +08:00
daoge 2f2d43e1b8 build: disable mixin platform 2024-09-17 20:00:42 +08:00
daoge 6c8a7da254 build: disable mixin platform 2024-09-17 19:59:43 +08:00
daoge ca4461ba2a build: disable bukkit platform 2024-09-17 19:56:45 +08:00
daoge c6df3c302b build: disable fabric platform 2024-09-17 19:56:03 +08:00
daoge 328ebf5aa9 build: disable cli platform 2024-09-17 19:55:20 +08:00
daoge 2c476a25d9 build: fix build for allay platform 2024-09-17 19:45:26 +08:00
daoge b432a4e01d build: use jdk21 for allay platform 2024-09-17 19:39:01 +08:00
daoge f73eadda76 ci: use jdk 21 2024-09-17 19:18:08 +08:00
daoge 1acdad5c6b ci: run github action when pushing 2024-09-17 19:01:41 +08:00
daoge 732a894945 ci: trigger github action 2024-09-17 18:59:53 +08:00
daoge_cmd bbf0915bc9 build: use org.allaymc.allay as the group id 2024-09-07 19:47:19 +08:00
daoge_cmd 5f70ecb943 feat: use jitpack 2024-09-04 23:55:24 +08:00
daoge_cmd 2e709dace6 feat: sync allay 2024-08-27 19:15:42 +08:00
daoge_cmd c97f25cb95 feat: support 1.21.20 and newer versions 2024-08-23 20:18:45 +08:00
daoge_cmd 28c689d16f feat: fetch allay's changes 2024-08-19 01:36:32 +08:00
daoge_cmd a34946cece feat: return air if block type not found 2024-08-18 19:39:23 +08:00
daoge_cmd 4acd0de6fa feat: fetch allay's changes 2024-07-24 20:30:24 +08:00
daoge_cmd 2443fff0a4 feat: fetch allay's changes 2024-07-17 01:32:01 +08:00
daoge_cmd cd767a648c feat: fetch allay's changes 2024-07-17 01:27:56 +08:00
daoge_cmd d490324bfc feat: support waterlogged 2024-06-19 18:09:31 +08:00
daoge_cmd 5fa7007d45 fix: fix a typo 2024-06-19 17:19:17 +08:00
daoge_cmd 2d0e4a83b0 fix: OtherChunkAccessibleContext.get/setBlockState() should use level pos instead of chunk local pos 2024-06-19 01:05:37 +08:00
daoge_cmd e68f928e38 feat: use OtherChunkAccessibleContext directly 2024-06-18 14:59:42 +08:00
daoge_cmd 4a3678cea9 feat: update to 1.21 2024-06-18 03:41:17 +08:00
daoge_cmd 6ff0903d83 fix: fix an mistake 2024-06-17 01:21:14 +08:00
daoge_cmd 133df45968 feat: make it works! 2024-06-17 00:37:16 +08:00
daoge_cmd 1f937a2ae0 feat: fake entity 2024-06-16 15:55:28 +08:00
daoge_cmd d861d3e849 feat: more works 2024-06-16 15:48:18 +08:00
daoge_cmd 3d4aec4abb chores: improve imports 2024-06-16 15:03:19 +08:00
daoge_cmd 62e589870d feat: more works 2024-06-16 15:02:42 +08:00
daoge_cmd 2b125414c9 feat: more works 2024-06-16 06:01:38 +08:00
daoge_cmd 59d7632927 feat: add mapping files 2024-06-16 03:30:50 +08:00
daoge_cmd d81f886e8c feat: more works 2024-06-16 03:29:03 +08:00
daoge_cmd b29ba2db70 feat: more works 2024-06-16 01:33:46 +08:00
daoge_cmd 02a7363f01 feat: init work on allay 2024-06-16 00:07:52 +08:00
76 changed files with 4973 additions and 61 deletions
@@ -51,6 +51,15 @@ fun Project.configureDependencies() {
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") {
name = "Sonatype Snapshots"
}
maven("https://repo.opencollab.dev/maven-releases/") {
name = "OpenCollab Releases"
}
maven("https://repo.opencollab.dev/maven-snapshots/") {
name = "OpenCollab Snapshots"
}
maven("https://storehouse.okaeri.eu/repository/maven-public/") {
name = "Okaeri"
}
}
dependencies {
+5 -1
View File
@@ -5,7 +5,7 @@ object Versions {
object Libraries {
const val tectonic = "4.2.1"
const val paralithic = "0.7.1"
const val paralithic = "0.8.1"
const val strata = "1.3.2"
const val cloud = "2.0.0"
@@ -77,4 +77,8 @@ object Versions {
const val logback = "1.5.8"
const val picocli = "4.7.6"
}
object Allay {
const val api = "0114e0b290"
}
}
@@ -7,6 +7,7 @@
package com.dfsek.terra.addons.noise;
import com.dfsek.paralithic.eval.parser.Parser.ParseOptions;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.util.LinkedHashMap;
@@ -88,6 +89,8 @@ public class NoiseAddon implements AddonInitializer {
.getHandler(FunctionalEventHandler.class)
.register(addon, ConfigPackPreLoadEvent.class)
.then(event -> {
ParseOptions expressionParseOptions = event.getPack().getExpressionParseOptions();
CheckedRegistry<Supplier<ObjectTemplate<NoiseSampler>>> noiseRegistry = event.getPack().getOrCreateRegistry(
NOISE_SAMPLER_TOKEN);
event.getPack()
@@ -98,7 +101,7 @@ public class NoiseAddon implements AddonInitializer {
.applyLoader(DistanceSampler.DistanceFunction.class,
(type, o, loader, depthTracker) -> DistanceSampler.DistanceFunction.valueOf((String) o))
.applyLoader(DimensionApplicableNoiseSampler.class, DimensionApplicableNoiseSampler::new)
.applyLoader(FunctionTemplate.class, FunctionTemplate::new)
.applyLoader(FunctionTemplate.class, () -> new FunctionTemplate(expressionParseOptions))
.applyLoader(CubicSpline.Point.class, CubicSplinePointTemplate::new)
.applyLoader(DerivativeNoiseSampler.class, DerivativeNoiseSamplerTemplate::new);
@@ -156,9 +159,9 @@ public class NoiseAddon implements AddonInitializer {
Map<String, DimensionApplicableNoiseSampler> packSamplers = new LinkedHashMap<>();
Map<String, FunctionTemplate> packFunctions = new LinkedHashMap<>();
noiseRegistry.register(addon.key("EXPRESSION"), () -> new ExpressionFunctionTemplate(packSamplers, packFunctions));
noiseRegistry.register(addon.key("EXPRESSION"), () -> new ExpressionFunctionTemplate(packSamplers, packFunctions, expressionParseOptions));
noiseRegistry.register(addon.key("EXPRESSION_NORMALIZER"),
() -> new ExpressionNormalizerTemplate(packSamplers, packFunctions));
() -> new ExpressionNormalizerTemplate(packSamplers, packFunctions, expressionParseOptions));
NoiseConfigPackTemplate template = event.loadTemplate(new NoiseConfigPackTemplate());
packSamplers.putAll(template.getSamplers());
@@ -7,7 +7,10 @@ import com.dfsek.terra.addons.noise.samplers.CacheSampler;
import com.dfsek.terra.addons.noise.samplers.LinearHeightmapSampler;
import com.dfsek.terra.api.noise.NoiseSampler;
import org.jetbrains.annotations.ApiStatus.Experimental;
@Experimental
public class CacheSamplerTemplate extends SamplerTemplate<CacheSampler> {
@Value("sampler")
@Default
@@ -7,6 +7,7 @@
package com.dfsek.terra.addons.noise.config.templates;
import com.dfsek.paralithic.eval.parser.Parser.ParseOptions;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
@@ -20,6 +21,8 @@ import com.dfsek.terra.api.config.meta.Meta;
@SuppressWarnings("unused")
public class FunctionTemplate implements ObjectTemplate<FunctionTemplate> {
private final ParseOptions parseOptions;
@Value("arguments")
private List<String> args;
@@ -30,6 +33,10 @@ public class FunctionTemplate implements ObjectTemplate<FunctionTemplate> {
@Default
private @Meta LinkedHashMap<String, @Meta FunctionTemplate> functions = new LinkedHashMap<>();
public FunctionTemplate(ParseOptions parseOptions) {
this.parseOptions = parseOptions;
}
@Override
public FunctionTemplate get() {
return this;
@@ -47,6 +54,10 @@ public class FunctionTemplate implements ObjectTemplate<FunctionTemplate> {
return functions;
}
public ParseOptions getParseOptions() {
return parseOptions;
}
@Override
public boolean equals(Object o) {
if(this == o) return true;
@@ -7,6 +7,7 @@
package com.dfsek.terra.addons.noise.config.templates.noise;
import com.dfsek.paralithic.eval.parser.Parser.ParseOptions;
import com.dfsek.paralithic.eval.tokenizer.ParseException;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -29,6 +30,7 @@ import static com.dfsek.terra.addons.noise.paralithic.FunctionUtil.convertFuncti
public class ExpressionFunctionTemplate extends SamplerTemplate<ExpressionFunction> {
private final Map<String, DimensionApplicableNoiseSampler> globalSamplers;
private final Map<String, FunctionTemplate> globalFunctions;
private final ParseOptions parseOptions;
@Value("variables")
@Default
private @Meta Map<String, @Meta Double> vars = new HashMap<>();
@@ -42,9 +44,11 @@ public class ExpressionFunctionTemplate extends SamplerTemplate<ExpressionFuncti
private @Meta LinkedHashMap<String, @Meta FunctionTemplate> functions = new LinkedHashMap<>();
public ExpressionFunctionTemplate(Map<String, DimensionApplicableNoiseSampler> globalSamplers,
Map<String, FunctionTemplate> globalFunctions) {
Map<String, FunctionTemplate> globalFunctions,
ParseOptions parseOptions) {
this.globalSamplers = globalSamplers;
this.globalFunctions = globalFunctions;
this.parseOptions = parseOptions;
}
@Override
@@ -54,7 +58,7 @@ public class ExpressionFunctionTemplate extends SamplerTemplate<ExpressionFuncti
var mergedSamplers = new HashMap<>(globalSamplers);
mergedSamplers.putAll(samplers);
try {
return new ExpressionFunction(convertFunctionsAndSamplers(mergedFunctions, mergedSamplers), expression, vars);
return new ExpressionFunction(convertFunctionsAndSamplers(mergedFunctions, mergedSamplers), expression, vars, parseOptions);
} catch(ParseException e) {
throw new RuntimeException("Failed to parse expression.", e);
}
@@ -7,6 +7,7 @@
package com.dfsek.terra.addons.noise.config.templates.normalizer;
import com.dfsek.paralithic.eval.parser.Parser.ParseOptions;
import com.dfsek.paralithic.eval.tokenizer.ParseException;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -29,6 +30,7 @@ public class ExpressionNormalizerTemplate extends NormalizerTemplate<ExpressionN
private final Map<String, DimensionApplicableNoiseSampler> globalSamplers;
private final Map<String, FunctionTemplate> globalFunctions;
private final ParseOptions parseOptions;
@Value("expression")
private @Meta String expression;
@@ -46,9 +48,11 @@ public class ExpressionNormalizerTemplate extends NormalizerTemplate<ExpressionN
private @Meta LinkedHashMap<String, @Meta FunctionTemplate> functions = new LinkedHashMap<>();
public ExpressionNormalizerTemplate(Map<String, DimensionApplicableNoiseSampler> globalSamplers,
Map<String, FunctionTemplate> globalFunctions) {
Map<String, FunctionTemplate> globalFunctions,
ParseOptions parseOptions) {
this.globalSamplers = globalSamplers;
this.globalFunctions = globalFunctions;
this.parseOptions = parseOptions;
}
@Override
@@ -58,7 +62,7 @@ public class ExpressionNormalizerTemplate extends NormalizerTemplate<ExpressionN
var mergedSamplers = new HashMap<>(globalSamplers);
mergedSamplers.putAll(samplers);
try {
return new ExpressionNormalizer(function, convertFunctionsAndSamplers(mergedFunctions, mergedSamplers), expression, vars);
return new ExpressionNormalizer(function, convertFunctionsAndSamplers(mergedFunctions, mergedSamplers), expression, vars, parseOptions);
} catch(ParseException e) {
throw new RuntimeException("Failed to parse expression.", e);
}
@@ -2,10 +2,12 @@ package com.dfsek.terra.addons.noise.normalizer;
import com.dfsek.paralithic.Expression;
import com.dfsek.paralithic.eval.parser.Parser;
import com.dfsek.paralithic.eval.parser.Parser.ParseOptions;
import com.dfsek.paralithic.eval.parser.Scope;
import com.dfsek.paralithic.eval.tokenizer.ParseException;
import com.dfsek.paralithic.functions.Function;
import java.util.Arrays;
import java.util.Map;
import com.dfsek.terra.api.noise.NoiseSampler;
@@ -15,12 +17,24 @@ public class ExpressionNormalizer extends Normalizer {
private final Expression expression;
public ExpressionNormalizer(NoiseSampler sampler, Map<String, Function> functions, String eq, Map<String, Double> vars)
public ExpressionNormalizer(NoiseSampler sampler, Map<String, Function> functions, String eq, Map<String, Double> vars, ParseOptions parseOptions)
throws ParseException {
super(sampler);
Parser p = new Parser();
Parser p = new Parser(parseOptions);
Scope scope = new Scope();
scope.addInvocationVariable("in");
// 'in' was used as the invocation variable but conflicts with
// the new 'in' keyword in Paralithic used to denote the end of a let
// expression. To maintain backwards compatibility but also enable the use
// of let expressions, if they're enabled then use the longer 'input'
// invocation variable instead.
if (parseOptions.useLetExpressions()) {
scope.addInvocationVariable("input");
} else {
scope.addInvocationVariable("in");
}
vars.forEach(scope::create);
functions.forEach(p::registerFunction);
expression = p.parse(eq, scope);
@@ -35,7 +35,7 @@ public class UserDefinedFunction implements DynamicFunction {
public static UserDefinedFunction newInstance(FunctionTemplate template) throws ParseException {
UserDefinedFunction function = CACHE.get(template);
if(function == null) {
Parser parser = new Parser();
Parser parser = new Parser(template.getParseOptions());
Scope parent = new Scope();
Scope functionScope = new Scope().withParent(parent);
@@ -11,10 +11,12 @@ import com.dfsek.terra.api.util.generic.pair.Pair.Mutable;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
import com.github.benmanes.caffeine.cache.Scheduler;
import org.jetbrains.annotations.ApiStatus.Experimental;
import static com.dfsek.terra.api.util.cache.CacheUtils.CACHE_EXECUTOR;
@Experimental
public class CacheSampler implements NoiseSampler {
private final NoiseSampler sampler;
@@ -9,6 +9,7 @@ package com.dfsek.terra.addons.noise.samplers.noise;
import com.dfsek.paralithic.Expression;
import com.dfsek.paralithic.eval.parser.Parser;
import com.dfsek.paralithic.eval.parser.Parser.ParseOptions;
import com.dfsek.paralithic.eval.parser.Scope;
import com.dfsek.paralithic.eval.tokenizer.ParseException;
import com.dfsek.paralithic.functions.Function;
@@ -24,8 +25,8 @@ import com.dfsek.terra.addons.noise.paralithic.noise.SeedContext;
public class ExpressionFunction extends NoiseFunction {
private final Expression expression;
public ExpressionFunction(Map<String, Function> functions, String eq, Map<String, Double> vars) throws ParseException {
Parser p = new Parser();
public ExpressionFunction(Map<String, Function> functions, String eq, Map<String, Double> vars, ParseOptions parseOptions) throws ParseException {
Parser p = new Parser(parseOptions);
Scope scope = new Scope();
scope.addInvocationVariable("x");
@@ -2,6 +2,7 @@ package com.dfsek.terra.addons.numberpredicate;
import com.dfsek.paralithic.Expression;
import com.dfsek.paralithic.eval.parser.Parser;
import com.dfsek.paralithic.eval.parser.Parser.ParseOptions;
import com.dfsek.paralithic.eval.parser.Scope;
import com.dfsek.paralithic.eval.tokenizer.ParseException;
import com.dfsek.tectonic.api.depth.DepthTracker;
@@ -15,6 +16,13 @@ import java.util.function.DoublePredicate;
public class DoublePredicateLoader implements TypeLoader<DoublePredicate> {
private final ParseOptions parseOptions;
public DoublePredicateLoader(ParseOptions parseOptions) {
this.parseOptions = parseOptions;
}
@Override
public DoublePredicate load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader,
DepthTracker depthTracker) throws LoadException {
@@ -22,7 +30,7 @@ public class DoublePredicateLoader implements TypeLoader<DoublePredicate> {
Scope scope = new Scope();
scope.addInvocationVariable("value");
try {
Expression expression = new Parser().parse(expressionString, scope);
Expression expression = new Parser(parseOptions).parse(expressionString, scope);
return d -> expression.evaluate(d) != 0; // Paralithic expressions treat '!= 0' as true
} catch(ParseException e) {
throw new LoadException("Failed to parse double predicate expression", e, depthTracker);
@@ -30,7 +30,7 @@ public class NumberPredicateAddon implements AddonInitializer {
plugin.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(addon, ConfigPackPreLoadEvent.class)
.then(event -> event.getPack().applyLoader(DoublePredicate.class, new DoublePredicateLoader()))
.then(event -> event.getPack().applyLoader(DoublePredicate.class, new DoublePredicateLoader(event.getPack().getExpressionParseOptions())))
.priority(50)
.failThrough();
}
+1
View File
@@ -8,4 +8,5 @@ dependencies {
api("com.github.ben-manes.caffeine", "caffeine", Versions.Libraries.caffeine)
api("com.dfsek", "paralithic", Versions.Libraries.paralithic)
}
@@ -13,6 +13,8 @@ import ca.solostudios.strata.version.VersionRange;
import java.util.List;
import java.util.Map;
import com.dfsek.paralithic.eval.parser.Parser.ParseOptions;
import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.properties.PropertyHolder;
import com.dfsek.terra.api.registry.key.Keyed;
@@ -49,6 +51,8 @@ public interface ConfigPack extends LoaderRegistrar,
Version getVersion();
ParseOptions getExpressionParseOptions();
<T> ConfigPack registerShortcut(TypeKey<T> clazz, String shortcut, ShortcutLoader<T> loader);
default <T> ConfigPack registerShortcut(Class<T> clazz, String shortcut, ShortcutLoader<T> loader) {
@@ -19,6 +19,7 @@ package com.dfsek.terra.config;
import ca.solostudios.strata.version.Version;
import ca.solostudios.strata.version.VersionRange;
import com.dfsek.paralithic.eval.parser.Parser.ParseOptions;
import com.dfsek.tectonic.api.TypeRegistry;
import java.util.LinkedHashMap;
@@ -31,6 +32,7 @@ import com.dfsek.terra.api.tectonic.LoaderRegistrar;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.api.util.collection.MaterialSet;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.config.loaders.ExpressionParserOptionsTemplate;
import com.dfsek.terra.config.loaders.LinkedHashMapLoader;
import com.dfsek.terra.config.loaders.MaterialSetLoader;
import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader;
@@ -53,7 +55,8 @@ public class GenericLoaders implements LoaderRegistrar {
.registerLoader(Version.class, new VersionLoader())
.registerLoader(MaterialSet.class, new MaterialSetLoader())
.registerLoader(VersionRange.class, new VersionRangeLoader())
.registerLoader(LinkedHashMap.class, new LinkedHashMapLoader());
.registerLoader(LinkedHashMap.class, new LinkedHashMapLoader())
.registerLoader(ParseOptions.class, ExpressionParserOptionsTemplate::new);
if(platform != null) {
registry.registerLoader(BaseAddon.class, platform.getAddons())
@@ -0,0 +1,21 @@
package com.dfsek.terra.config.loaders;
import com.dfsek.paralithic.eval.parser.Parser.ParseOptions;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
public class ExpressionParserOptionsTemplate implements ObjectTemplate<ParseOptions> {
private static final ParseOptions DEFAULT_PARSE_OPTIONS = new ParseOptions();
@Value("use-let-expressions")
@Default
private boolean useLetExpressions = DEFAULT_PARSE_OPTIONS.useLetExpressions();
@Override
public ParseOptions get() {
return new ParseOptions(useLetExpressions);
}
}
@@ -0,0 +1,17 @@
package com.dfsek.terra.config.pack;
import com.dfsek.paralithic.eval.parser.Parser.ParseOptions;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
public class ConfigPackExpressionOptionsTemplate implements ConfigTemplate {
@Value("expressions.options")
@Default
private ParseOptions parseOptions = new ParseOptions();
public ParseOptions getParseOptions() {
return parseOptions;
}
}
@@ -19,6 +19,7 @@ package com.dfsek.terra.config.pack;
import ca.solostudios.strata.version.Version;
import ca.solostudios.strata.version.VersionRange;
import com.dfsek.paralithic.eval.parser.Parser.ParseOptions;
import com.dfsek.tectonic.api.TypeRegistry;
import com.dfsek.tectonic.api.config.Configuration;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
@@ -121,6 +122,8 @@ public class ConfigPackImpl implements ConfigPack {
private final RegistryKey key;
private final ParseOptions parseOptions;
public ConfigPackImpl(File folder, Platform platform) {
this(new FolderLoader(folder.toPath()), Construct.construct(() -> {
try {
@@ -168,6 +171,11 @@ public class ConfigPackImpl implements ConfigPack {
selfLoader.load(addonsTemplate, packManifest);
this.addons = addonsTemplate.getAddons();
ConfigPackExpressionOptionsTemplate expressionOptionsTemplate = new ConfigPackExpressionOptionsTemplate();
selfLoader.load(expressionOptionsTemplate, packManifest);
this.parseOptions = expressionOptionsTemplate.getParseOptions();
Map<String, Configuration> configurations = discoverConfigurations();
registerMeta(configurations);
@@ -261,7 +269,7 @@ public class ConfigPackImpl implements ConfigPack {
selfLoader.registerPreprocessor(Meta.class, valuePreprocessor);
abstractConfigLoader.registerPreprocessor(Meta.class, valuePreprocessor);
MetaNumberPreprocessor numberPreprocessor = new MetaNumberPreprocessor(configurations);
MetaNumberPreprocessor numberPreprocessor = new MetaNumberPreprocessor(configurations, parseOptions);
selfLoader.registerPreprocessor(Meta.class, numberPreprocessor);
abstractConfigLoader.registerPreprocessor(Meta.class, numberPreprocessor);
}
@@ -362,6 +370,11 @@ public class ConfigPackImpl implements ConfigPack {
return template.getVersion();
}
@Override
public ParseOptions getExpressionParseOptions() {
return parseOptions;
}
@SuppressWarnings("unchecked,rawtypes")
@Override
public <T> ConfigPack registerShortcut(TypeKey<T> clazz, String shortcut, ShortcutLoader<T> loader) {
@@ -18,6 +18,7 @@
package com.dfsek.terra.config.preprocessor;
import com.dfsek.paralithic.eval.parser.Parser;
import com.dfsek.paralithic.eval.parser.Parser.ParseOptions;
import com.dfsek.paralithic.eval.tokenizer.ParseException;
import com.dfsek.tectonic.api.config.Configuration;
import com.dfsek.tectonic.api.depth.DepthTracker;
@@ -37,9 +38,11 @@ import java.util.Map;
public class MetaNumberPreprocessor extends MetaPreprocessor<Meta> {
public static final TypeKey<String> META_STRING_KEY = new TypeKey<@Meta String>() {
};
private final ParseOptions parseOptions;
public MetaNumberPreprocessor(Map<String, Configuration> configs) {
public MetaNumberPreprocessor(Map<String, Configuration> configs, ParseOptions parseOptions) {
super(configs);
this.parseOptions = parseOptions;
}
private static boolean isNumber(Class<?> clazz) {
@@ -57,7 +60,7 @@ public class MetaNumberPreprocessor extends MetaPreprocessor<Meta> {
if(t.getType() instanceof Class && isNumber((Class<?>) t.getType()) && c instanceof String) {
String expression = (String) loader.loadType(META_STRING_KEY.getAnnotatedType(), c, depthTracker);
try {
return (Result<T>) Result.overwrite(new Parser().eval(expression), depthTracker);
return (Result<T>) Result.overwrite(new Parser(parseOptions).eval(expression), depthTracker);
} catch(ParseException e) {
throw new LoadException("Invalid expression: ", e, depthTracker);
}
@@ -1,3 +1,4 @@
import com.dfsek.paralithic.eval.parser.Parser.ParseOptions;
import com.dfsek.tectonic.api.config.Configuration;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -32,7 +33,7 @@ public class MetaTest {
loader.registerPreprocessor(Meta.class, new MetaStringPreprocessor(configurationMap));
loader.registerPreprocessor(Meta.class, new MetaListLikePreprocessor(configurationMap));
loader.registerPreprocessor(Meta.class, new MetaMapPreprocessor(configurationMap));
loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap));
loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap, new ParseOptions()));
loader.registerPreprocessor(Meta.class, new MetaValuePreprocessor(configurationMap));
@@ -53,7 +54,7 @@ public class MetaTest {
loader.registerPreprocessor(Meta.class, new MetaStringPreprocessor(configurationMap));
loader.registerPreprocessor(Meta.class, new MetaListLikePreprocessor(configurationMap));
loader.registerPreprocessor(Meta.class, new MetaMapPreprocessor(configurationMap));
loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap));
loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap, new ParseOptions()));
loader.registerPreprocessor(Meta.class, new MetaValuePreprocessor(configurationMap));
@@ -75,7 +76,7 @@ public class MetaTest {
loader.registerPreprocessor(Meta.class, new MetaStringPreprocessor(configurationMap));
loader.registerPreprocessor(Meta.class, new MetaListLikePreprocessor(configurationMap));
loader.registerPreprocessor(Meta.class, new MetaMapPreprocessor(configurationMap));
loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap));
loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap, new ParseOptions()));
loader.registerPreprocessor(Meta.class, new MetaValuePreprocessor(configurationMap));
@@ -96,7 +97,7 @@ public class MetaTest {
loader.registerPreprocessor(Meta.class, new MetaStringPreprocessor(configurationMap));
loader.registerPreprocessor(Meta.class, new MetaListLikePreprocessor(configurationMap));
loader.registerPreprocessor(Meta.class, new MetaMapPreprocessor(configurationMap));
loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap));
loader.registerPreprocessor(Meta.class, new MetaNumberPreprocessor(configurationMap, new ParseOptions()));
loader.registerPreprocessor(Meta.class, new MetaValuePreprocessor(configurationMap));
+10
View File
@@ -0,0 +1,10 @@
# Allay platform
## Resource files
Current mapping version: je 1.21 to be 1.21.30
- `mapping/biomes.json` obtain from GeyserMC/mappings.
- `mapping/items.json` obtain from GeyserMC/mappings.
- `mapping/blocks.json` generated by using GeyserMC/mappings-generator, and it's origin name is `generator_blocks.json`.
- `je_block_default_states.json` converted from https://zh.minecraft.wiki/w/Module:Block_state_values.
+5
View File
@@ -0,0 +1,5 @@
dependencies {
shadedApi(project(":common:implementation:base"))
compileOnly("org.allaymc.allay", "api", Versions.Allay.api)
}
@@ -0,0 +1,93 @@
package com.dfsek.terra.allay;
import com.dfsek.tectonic.api.TypeRegistry;
import com.dfsek.tectonic.api.depth.DepthTracker;
import com.dfsek.tectonic.api.exception.LoadException;
import org.allaymc.api.server.Server;
import org.allaymc.api.world.biome.BiomeId;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.util.HashSet;
import java.util.Set;
import com.dfsek.terra.AbstractPlatform;
import com.dfsek.terra.allay.delegate.AllayBiome;
import com.dfsek.terra.allay.generator.AllayGeneratorWrapper;
import com.dfsek.terra.allay.handle.AllayItemHandle;
import com.dfsek.terra.allay.handle.AllayWorldHandle;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.handle.ItemHandle;
import com.dfsek.terra.api.handle.WorldHandle;
import com.dfsek.terra.api.world.biome.PlatformBiome;
/**
* @author daoge_cmd
*/
public class AllayPlatform extends AbstractPlatform {
public static final Set<AllayGeneratorWrapper> GENERATOR_WRAPPERS = new HashSet<>();
protected static final AllayWorldHandle ALLAY_WORLD_HANDLE = new AllayWorldHandle();
protected static final AllayItemHandle ALLAY_ITEM_HANDLE = new AllayItemHandle();
public AllayPlatform() {
load();
}
@Override
public boolean reload() {
getTerraConfig().load(this);
getRawConfigRegistry().clear();
boolean succeed = getRawConfigRegistry().loadAll(this);
GENERATOR_WRAPPERS.forEach(wrapper -> {
getConfigRegistry().get(wrapper.getConfigPack().getRegistryKey()).ifPresent(pack -> {
wrapper.setConfigPack(pack);
var dimension = wrapper.getAllayWorldGenerator().getDimension();
TerraAllayPlugin.INSTANCE.getPluginLogger().info(
"Replaced pack in chunk generator for world {}",
dimension.getWorld().getWorldData().getName() + ":" + dimension.getDimensionInfo().dimensionId()
);
});
});
return succeed;
}
@Override
public @NotNull String platformName() {
return "Allay";
}
@Override
public @NotNull WorldHandle getWorldHandle() {
return ALLAY_WORLD_HANDLE;
}
@Override
public @NotNull ItemHandle getItemHandle() {
return ALLAY_ITEM_HANDLE;
}
@Override
public @NotNull File getDataFolder() {
return TerraAllayPlugin.INSTANCE.getPluginContainer().dataFolder().toFile();
}
@Override
public void runPossiblyUnsafeTask(@NotNull Runnable task) {
Server.getInstance().getScheduler().runLater(Server.getInstance(), task);
}
@Override
public void register(TypeRegistry registry) {
super.register(registry);
registry.registerLoader(BlockState.class, (type, o, loader, depthTracker) -> ALLAY_WORLD_HANDLE.createBlockState((String) o))
.registerLoader(PlatformBiome.class, (type, o, loader, depthTracker) -> parseBiome((String) o, depthTracker));
}
protected AllayBiome parseBiome(String id, DepthTracker depthTracker) throws LoadException {
if(!id.startsWith("minecraft:")) throw new LoadException("Invalid biome identifier " + id, depthTracker);
return new AllayBiome(BiomeId.fromId(Mapping.biomeIdJeToBe(id)));
}
}
@@ -0,0 +1,79 @@
package com.dfsek.terra.allay;
import org.allaymc.api.utils.HashUtils;
import java.util.Map;
import java.util.TreeMap;
/**
* @author daoge_cmd
*/
public class JeBlockState {
protected final String identifier;
protected final TreeMap<String, String> properties;
protected int hash = Integer.MAX_VALUE;
public static JeBlockState fromString(String data) {
return new JeBlockState(data);
}
public static JeBlockState create(String identifier, TreeMap<String, String> properties) {
return new JeBlockState(identifier, properties);
}
private JeBlockState(String data) {
String[] strings = data.replace("[", ",").replace("]", ",").replace(" ", "").split(",");
this.identifier = strings[0];
this.properties = new TreeMap<>();
if (strings.length > 1) {
for (int i = 1; i < strings.length; i++) {
final String tmp = strings[i];
final int index = tmp.indexOf("=");
properties.put(tmp.substring(0, index), tmp.substring(index + 1));
}
}
completeMissingProperties();
}
public String getPropertyValue(String key) {
return properties.get(key);
}
private void completeMissingProperties() {
Map<String, String> defaultProperties = Mapping.getJeBlockDefaultProperties(identifier);
if(properties.size() == defaultProperties.size()) {
return;
}
defaultProperties.entrySet().stream().filter(entry -> !properties.containsKey(entry.getKey())).forEach(
entry -> properties.put(entry.getKey(), entry.getValue()));
}
private JeBlockState(String identifier, TreeMap<String, String> properties) {
this.identifier = identifier;
this.properties = properties;
}
public String toString(boolean includeProperties) {
if(!includeProperties) return identifier;
StringBuilder builder = new StringBuilder(identifier).append(";");
properties.forEach((k, v) -> builder.append(k).append("=").append(v).append(";"));
String str = builder.toString();
if (hash == Integer.MAX_VALUE) {
hash = HashUtils.fnv1a_32(str.getBytes());
}
return str;
}
public int getHash() {
if (hash == Integer.MAX_VALUE) {
hash = HashUtils.fnv1a_32(toString(true).getBytes());
}
return hash;
}
@Override
public String toString() {
return toString(true);
}
}
@@ -0,0 +1,188 @@
package com.dfsek.terra.allay;
import com.google.gson.reflect.TypeToken;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import org.allaymc.api.block.type.BlockState;
import org.allaymc.api.block.type.BlockStateSafeGetter;
import org.allaymc.api.block.type.BlockStateSafeGetter.Getter;
import org.allaymc.api.block.type.BlockTypes;
import org.allaymc.api.item.type.ItemType;
import org.allaymc.api.item.type.ItemTypeSafeGetter;
import org.allaymc.api.utils.JSONUtils;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
/**
* @author daoge_cmd
*/
public final class Mapping {
private static final Map<String, Map<String, String>> JE_BLOCK_DEFAULT_PROPERTIES = new Object2ObjectOpenHashMap<>();
private static final Map<BlockState, JeBlockState> BLOCK_STATE_BE_TO_JE = new Object2ObjectOpenHashMap<>();
private static final Map<Integer, BlockState> BLOCK_STATE_JE_HASH_TO_BE = new Int2ObjectOpenHashMap<>();
private static final Map<String, ItemType<?>> ITEM_ID_JE_TO_BE = new Object2ObjectOpenHashMap<>();
private static final Map<String, Integer> BIOME_ID_JE_TO_BE = new Object2IntOpenHashMap<>();
private static final BlockState BE_AIR_STATE = BlockTypes.AIR.getDefaultState();
public static void init() {
if(!initBlockStateMapping()) error();
if(!initJeBlockDefaultProperties()) error();
if(!initItemMapping()) error();
if(!initBiomeMapping()) error();
}
public static JeBlockState blockStateBeToJe(BlockState beBlockState) {
return BLOCK_STATE_BE_TO_JE.get(beBlockState);
}
public static BlockState blockStateJeToBe(JeBlockState jeBlockState) {
BlockState result = BLOCK_STATE_JE_HASH_TO_BE.get(jeBlockState.getHash());
if(result == null) {
TerraAllayPlugin.INSTANCE.getPluginLogger().warn("Failed to find be block state for {}", jeBlockState);
return BE_AIR_STATE;
}
return result;
}
public static ItemType<?> itemIdJeToBe(String jeItemId) {
return ITEM_ID_JE_TO_BE.get(jeItemId);
}
// Enchantment identifiers are same in both versions
public static String enchantmentIdBeToJe(String beEnchantmentId) {
return beEnchantmentId;
}
public static String enchantmentIdJeToBe(String jeEnchantmentId) {
return jeEnchantmentId;
}
public static int biomeIdJeToBe(String jeBiomeId) {
return BIOME_ID_JE_TO_BE.get(jeBiomeId);
}
public static Map<String, String> getJeBlockDefaultProperties(String jeBlockIdentifier) {
Map<String, String> defaultProperties = JE_BLOCK_DEFAULT_PROPERTIES.get(jeBlockIdentifier);
if( defaultProperties == null) {
TerraAllayPlugin.INSTANCE.getPluginLogger().warn("Failed to find default properties for {}", jeBlockIdentifier);
return Map.of();
}
return defaultProperties;
}
private static void error() {
throw new RuntimeException("Mapping not initialized");
}
private static boolean initBiomeMapping() {
try (InputStream stream = Mapping.class.getClassLoader().getResourceAsStream("mapping/biomes.json")) {
if (stream == null) {
TerraAllayPlugin.INSTANCE.getPluginLogger().error("biomes mapping not found");
return false;
}
Set<Entry<String, Map<String, Integer>>> mappings = JSONUtils.from(stream, new TypeToken<Map<String, Map<String, Integer>>>(){}).entrySet();
mappings.forEach(mapping -> BIOME_ID_JE_TO_BE.put(mapping.getKey(), mapping.getValue().get("bedrock_id")));
} catch(IOException e) {
TerraAllayPlugin.INSTANCE.getPluginLogger().error("Failed to load biomes mapping", e);
return false;
}
return true;
}
private static boolean initItemMapping() {
try (InputStream stream = Mapping.class.getClassLoader().getResourceAsStream("mapping/items.json")) {
if (stream == null) {
TerraAllayPlugin.INSTANCE.getPluginLogger().error("items mapping not found");
return false;
}
Set<Entry<String, Map<String, Object>>> mappings = JSONUtils.from(stream, new TypeToken<Map<String, Map<String, Object>>>(){}).entrySet();
mappings.forEach(mapping -> {
ItemType<?> item = ItemTypeSafeGetter
.name((String) mapping.getValue().get("bedrock_identifier"))
// NOTICE: should be cast to double
.meta(((Double) mapping.getValue().get("bedrock_data")).intValue())
.itemType();
ITEM_ID_JE_TO_BE.put(mapping.getKey(), item);
});
} catch(IOException e) {
TerraAllayPlugin.INSTANCE.getPluginLogger().error("Failed to load items mapping", e);
}
return true;
}
private static boolean initBlockStateMapping() {
try (InputStream stream = Mapping.class.getClassLoader().getResourceAsStream("mapping/blocks.json")) {
if (stream == null) {
TerraAllayPlugin.INSTANCE.getPluginLogger().error("blocks mapping not found");
return false;
}
// noinspection unchecked
List<Map<String, Map<String, Object>>> mappings = (List<Map<String, Map<String, Object>>>) JSONUtils.from(stream, new TypeToken<Map<String, Object>>(){}).get("mappings");
mappings.forEach(mapping -> {
JeBlockState jeState = createJeBlockState(mapping.get("java_state"));
BlockState beState = createBeBlockState(mapping.get("bedrock_state"));
BLOCK_STATE_BE_TO_JE.put(beState, jeState);
BLOCK_STATE_JE_HASH_TO_BE.put(jeState.getHash(), beState);
});
} catch(IOException e) {
TerraAllayPlugin.INSTANCE.getPluginLogger().error("Failed to load blocks mapping", e);
}
return true;
}
private static boolean initJeBlockDefaultProperties() {
try (InputStream stream = Mapping.class.getClassLoader().getResourceAsStream("je_block_default_states.json")) {
if (stream == null) {
TerraAllayPlugin.INSTANCE.getPluginLogger().error("je_block_default_states.json not found");
return false;
}
Map<String, Map<String, String>> states = JSONUtils.from(stream, new TypeToken<Map<String, Map<String, String>>>(){});
for(Entry<String, Map<String, String>> entry : states.entrySet()) {
String identifier = entry.getKey();
Map<String, String> properties = entry.getValue();
JE_BLOCK_DEFAULT_PROPERTIES.put(identifier, properties);
}
} catch(IOException e) {
throw new RuntimeException(e);
}
return true;
}
private static BlockState createBeBlockState(Map<String, Object> data) {
Getter getter = BlockStateSafeGetter
.name("minecraft:" + data.get("bedrock_identifier"));
if (data.containsKey("state")) {
// noinspection unchecked
convertValueType((Map<String, Object>) data.get("state")).forEach(getter::property);
}
return getter.blockState();
}
private static Map<String, Object> convertValueType(Map<String, Object> data) {
TreeMap<String, Object> result = new TreeMap<>();
for (Entry<String, Object> entry : data.entrySet()) {
if (entry.getValue() instanceof Number number) {
// Convert double to int because the number in json is double
result.put(entry.getKey(), number.intValue());
} else {
result.put(entry.getKey(), entry.getValue());
}
}
return result;
}
private static JeBlockState createJeBlockState(Map<String, Object> data) {
// noinspection unchecked
return JeBlockState.create((String) data.get("Name"), new TreeMap<>((Map<String, String>) data.getOrDefault("Properties", Map.of())));
}
}
@@ -0,0 +1,76 @@
package com.dfsek.terra.allay;
import org.allaymc.api.eventbus.EventHandler;
import org.allaymc.api.eventbus.event.world.WorldUnloadEvent;
import org.allaymc.api.plugin.Plugin;
import org.allaymc.api.registry.Registries;
import org.allaymc.api.server.Server;
import com.dfsek.terra.allay.generator.AllayGeneratorWrapper;
import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent;
/**
* @author daoge_cmd
*/
public class TerraAllayPlugin extends Plugin {
public static TerraAllayPlugin INSTANCE;
public static AllayPlatform PLATFORM;
{
INSTANCE = this;
}
@Override
public void onLoad() {
pluginLogger.info("Starting Terra...");
pluginLogger.info("Loading mapping...");
Mapping.init();
pluginLogger.info("Initializing allay platform...");
PLATFORM = new AllayPlatform();
PLATFORM.getEventManager().callEvent(new PlatformInitializationEvent());
// TODO: adapt command manager
pluginLogger.info("Registering generator...");
Registries.WORLD_GENERATOR_FACTORIES.register("TERRA", preset -> {
try {
AllayGeneratorWrapper wrapper = new AllayGeneratorWrapper(preset);
AllayPlatform.GENERATOR_WRAPPERS.add(wrapper);
return wrapper.getAllayWorldGenerator();
} catch (IllegalArgumentException e) {
TerraAllayPlugin.INSTANCE.getPluginLogger().error("Fail to create world generator with preset: {}", preset);
TerraAllayPlugin.INSTANCE.getPluginLogger().error("Reason: {}", e.getMessage());
return Registries.WORLD_GENERATOR_FACTORIES.get("FLAT").apply("");
}
});
pluginLogger.info("Terra started");
}
@Override
public void onEnable() {
Server.getInstance().getEventBus().registerListener(this);
}
@Override
public boolean isReloadable() {
return true;
}
@Override
public void reload() {
if(PLATFORM.reload()) {
pluginLogger.info("Terra reloaded successfully.");
} else {
pluginLogger.error("Terra failed to reload.");
}
}
@EventHandler
private void onWorldUnload(WorldUnloadEvent event) {
AllayPlatform.GENERATOR_WRAPPERS.removeIf(wrapper -> wrapper.getAllayWorldGenerator().getDimension().getWorld() == event.getWorld());
}
}
@@ -0,0 +1,15 @@
package com.dfsek.terra.allay.delegate;
import org.allaymc.api.world.biome.BiomeType;
import com.dfsek.terra.api.world.biome.PlatformBiome;
/**
* @author daoge_cmd
*/
public record AllayBiome(BiomeType allayBiome) implements PlatformBiome {
@Override
public BiomeType getHandle() {
return allayBiome;
}
}
@@ -0,0 +1,74 @@
package com.dfsek.terra.allay.delegate;
import org.allaymc.api.block.type.BlockState;
import org.allaymc.api.block.type.BlockTypes;
import com.dfsek.terra.allay.JeBlockState;
import com.dfsek.terra.api.block.BlockType;
import com.dfsek.terra.api.block.state.properties.Property;
/**
* @author daoge_cmd
*/
public final class AllayBlockState implements com.dfsek.terra.api.block.state.BlockState {
public static final AllayBlockState AIR = new AllayBlockState(BlockTypes.AIR.getDefaultState(),
JeBlockState.fromString("minecraft:air"));
private final BlockState allayBlockState;
private final JeBlockState jeBlockState;
private final boolean containsWater;
public AllayBlockState(BlockState allayBlockState, JeBlockState jeBlockState) {
this.allayBlockState = allayBlockState;
this.jeBlockState = jeBlockState;
this.containsWater = "true".equals(jeBlockState.getPropertyValue("waterlogged"));
}
@Override
public boolean matches(com.dfsek.terra.api.block.state.BlockState o) {
AllayBlockState other = ((AllayBlockState) o);
return other.allayBlockState == this.allayBlockState && other.containsWater == this.containsWater;
}
@Override
public <T extends Comparable<T>> boolean has(Property<T> property) {
return false;
}
@Override
public <T extends Comparable<T>> T get(Property<T> property) {
return null;
}
@Override
public <T extends Comparable<T>> com.dfsek.terra.api.block.state.BlockState set(Property<T> property, T value) {
return null;
}
@Override
public BlockType getBlockType() {
return new AllayBlockType(allayBlockState.getBlockType());
}
@Override
public String getAsString(boolean properties) {
return jeBlockState.toString(properties);
}
@Override
public boolean isAir() {
return allayBlockState.getBlockType() == BlockTypes.AIR;
}
@Override
public BlockState getHandle() {
return allayBlockState;
}
public BlockState allayBlockState() { return allayBlockState; }
public boolean containsWater() { return containsWater; }
public JeBlockState jeBlockState() { return jeBlockState; }
}
@@ -0,0 +1,32 @@
package com.dfsek.terra.allay.delegate;
import org.allaymc.api.block.tag.BlockTags;
import org.allaymc.api.block.type.BlockType;
import com.dfsek.terra.allay.Mapping;
import com.dfsek.terra.api.block.state.BlockState;
/**
* @author daoge_cmd
*/
public record AllayBlockType(BlockType<?> allayBlockType) implements com.dfsek.terra.api.block.BlockType {
@Override
public BlockState getDefaultState() {
return new AllayBlockState(allayBlockType.getDefaultState(), Mapping.blockStateBeToJe(allayBlockType.getDefaultState()));
}
@Override
public boolean isSolid() {
return allayBlockType.getMaterial().isSolid();
}
@Override
public boolean isWater() {
return allayBlockType.hasBlockTag(BlockTags.WATER);
}
@Override
public BlockType<?> getHandle() {
return allayBlockType;
}
}
@@ -0,0 +1,55 @@
package com.dfsek.terra.allay.delegate;
import org.allaymc.api.block.property.type.BlockPropertyTypes;
import org.allaymc.api.block.tag.BlockTags;
import org.allaymc.api.block.type.BlockTypes;
import org.allaymc.api.world.chunk.Chunk;
import org.jetbrains.annotations.NotNull;
import com.dfsek.terra.allay.Mapping;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.world.ServerWorld;
/**
* @author daoge_cmd
*/
public record AllayChunk(ServerWorld world, Chunk allayChunk) implements com.dfsek.terra.api.world.chunk.Chunk {
private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER.ofState(BlockPropertyTypes.LIQUID_DEPTH.createValue(0));
@Override
public void setBlock(int x, int y, int z, BlockState data, boolean physics) {
AllayBlockState allayBlockState = (AllayBlockState) data;
allayChunk.setBlockState(x, y, z, allayBlockState.allayBlockState());
boolean containsWater = allayBlockState.containsWater() || allayChunk.getBlockState(x, y, z).getBlockType().hasBlockTag(BlockTags.WATER);
if (containsWater) {
allayChunk.setBlockState(x, y, z, WATER, 1);
}
}
@Override
public @NotNull BlockState getBlock(int x, int y, int z) {
org.allaymc.api.block.type.BlockState blockState = allayChunk.getBlockState(x, y, z);
return new AllayBlockState(blockState, Mapping.blockStateBeToJe(blockState));
}
@Override
public int getX() {
return allayChunk.getX();
}
@Override
public int getZ() {
return allayChunk.getZ();
}
@Override
public ServerWorld getWorld() {
return world;
}
@Override
public Chunk getHandle() {
return allayChunk;
}
}
@@ -0,0 +1,37 @@
package com.dfsek.terra.allay.delegate;
import org.allaymc.api.item.enchantment.EnchantmentType;
import com.dfsek.terra.allay.Mapping;
import com.dfsek.terra.api.inventory.ItemStack;
import com.dfsek.terra.api.inventory.item.Enchantment;
/**
* @author daoge_cmd
*/
public record AllayEnchantment(EnchantmentType allayEnchantment) implements Enchantment {
@Override
public boolean canEnchantItem(ItemStack itemStack) {
return ((AllayItemStack)itemStack).allayItemStack().checkEnchantmentCompatibility(allayEnchantment);
}
@Override
public boolean conflictsWith(Enchantment other) {
return ((AllayEnchantment)other).allayEnchantment.isIncompatibleWith(allayEnchantment);
}
@Override
public String getID() {
return Mapping.enchantmentIdBeToJe(allayEnchantment.getIdentifier().toString());
}
@Override
public int getMaxLevel() {
return allayEnchantment.getMaxLevel();
}
@Override
public EnchantmentType getHandle() {
return allayEnchantment;
}
}
@@ -0,0 +1,47 @@
package com.dfsek.terra.allay.delegate;
import com.dfsek.terra.api.entity.Entity;
import com.dfsek.terra.api.util.vector.Vector3;
import com.dfsek.terra.api.world.ServerWorld;
/**
* NOTICE: Entity is not supported currently, and this is a fake implementation.
*
* @author daoge_cmd
*/
public final class AllayFakeEntity implements Entity {
private final Object fakeHandle = new Object();
private Vector3 position;
private ServerWorld world;
public AllayFakeEntity(Vector3 position, ServerWorld world) {
this.position = position;
this.world = world;
}
@Override
public Vector3 position() {
return position;
}
@Override
public void position(Vector3 position) {
this.position = position;
}
@Override
public void world(ServerWorld world) {
this.world = world;
}
@Override
public ServerWorld world() {
return world;
}
@Override
public Object getHandle() {
return fakeHandle;
}
}
@@ -0,0 +1,36 @@
package com.dfsek.terra.allay.delegate;
import org.allaymc.api.item.ItemStack;
import org.allaymc.api.item.enchantment.EnchantmentInstance;
import org.allaymc.api.item.enchantment.EnchantmentType;
import java.util.HashMap;
import java.util.Map;
import com.dfsek.terra.api.inventory.item.Enchantment;
import com.dfsek.terra.api.inventory.item.ItemMeta;
/**
* @author daoge_cmd
*/
public record AllayItemMeta(ItemStack allayItemStack) implements ItemMeta {
@Override
public void addEnchantment(Enchantment enchantment, int level) {
EnchantmentType allayEnchantment = ((AllayEnchantment) enchantment).allayEnchantment();
allayItemStack.addEnchantment(allayEnchantment, (short) level);
}
@Override
public Map<Enchantment, Integer> getEnchantments() {
Map<Enchantment, Integer> results = new HashMap<>();
for (EnchantmentInstance allayEnchantmentInstance : allayItemStack.getEnchantments()) {
results.put(new AllayEnchantment(allayEnchantmentInstance.getType()), allayEnchantmentInstance.getLevel());
}
return results;
}
@Override
public ItemStack getHandle() {
return allayItemStack;
}
}
@@ -0,0 +1,50 @@
package com.dfsek.terra.allay.delegate;
import org.allaymc.api.item.ItemStack;
import org.allaymc.api.item.enchantment.EnchantmentInstance;
import com.dfsek.terra.api.inventory.Item;
import com.dfsek.terra.api.inventory.item.ItemMeta;
/**
* @author daoge_cmd
*/
public record AllayItemStack(ItemStack allayItemStack) implements com.dfsek.terra.api.inventory.ItemStack{
@Override
public int getAmount() {
return allayItemStack.getCount();
}
@Override
public void setAmount(int i) {
allayItemStack.setCount(i);
}
@Override
public Item getType() {
return new AllayItemType(allayItemStack.getItemType());
}
@Override
public ItemMeta getItemMeta() {
return new AllayItemMeta(allayItemStack);
}
@Override
public void setItemMeta(ItemMeta meta) {
ItemStack targetItem = ((AllayItemMeta) meta).allayItemStack();
allayItemStack.removeAllEnchantments();
for (EnchantmentInstance enchantment : targetItem.getEnchantments()) {
allayItemStack.addEnchantment(enchantment.getType(), enchantment.getLevel());
}
allayItemStack.setLore(targetItem.getLore());
allayItemStack.setDurability(targetItem.getDurability());
allayItemStack.setCustomName(targetItem.getCustomName());
allayItemStack.setMeta(targetItem.getMeta());
}
@Override
public ItemStack getHandle() {
return allayItemStack;
}
}
@@ -0,0 +1,36 @@
package com.dfsek.terra.allay.delegate;
import org.allaymc.api.item.data.ItemId;
import org.allaymc.api.item.type.ItemType;
import org.allaymc.api.registry.Registries;
import com.dfsek.terra.api.inventory.Item;
/**
* @author daoge_cmd
*/
public final class AllayItemType implements Item {
private final ItemType<?> allayItemType;
private final double maxDurability;
public AllayItemType(ItemType<?> allayItemType) {
this.allayItemType = allayItemType;
this.maxDurability = Registries.ITEM_DATA.get(ItemId.fromIdentifier(allayItemType.getIdentifier())).maxDamage();
}
@Override
public com.dfsek.terra.api.inventory.ItemStack newItemStack(int amount) {
return new AllayItemStack(allayItemType.createItemStack(amount));
}
@Override
public double getMaxDurability() {
return maxDurability;
}
@Override
public ItemType<?> getHandle() {
return allayItemType;
}
}
@@ -0,0 +1,45 @@
package com.dfsek.terra.allay.delegate;
import org.allaymc.api.block.property.type.BlockPropertyTypes;
import org.allaymc.api.block.tag.BlockTags;
import org.allaymc.api.block.type.BlockTypes;
import org.allaymc.api.world.chunk.UnsafeChunk;
import org.jetbrains.annotations.NotNull;
import com.dfsek.terra.allay.Mapping;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.world.chunk.generation.ProtoChunk;
/**
* @author daoge_cmd
*/
public record AllayProtoChunk(UnsafeChunk allayChunk) implements ProtoChunk {
private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER.ofState(BlockPropertyTypes.LIQUID_DEPTH.createValue(0));
@Override
public int getMaxHeight() {
return allayChunk.getDimensionInfo().maxHeight();
}
@Override
public void setBlock(int x, int y, int z, @NotNull BlockState blockState) {
AllayBlockState allayBlockState = (AllayBlockState) blockState;
allayChunk.setBlockState(x, y, z, allayBlockState.allayBlockState());
boolean containsWater = allayBlockState.containsWater() || allayChunk.getBlockState(x, y, z).getBlockType().hasBlockTag(BlockTags.WATER);
if (containsWater) {
allayChunk.setBlockState(x, y, z, WATER, 1);
}
}
@Override
public @NotNull BlockState getBlock(int x, int y, int z) {
org.allaymc.api.block.type.BlockState blockState = allayChunk.getBlockState(x, y, z);
return new AllayBlockState(blockState, Mapping.blockStateBeToJe(blockState));
}
@Override
public UnsafeChunk getHandle() {
return allayChunk;
}
}
@@ -0,0 +1,100 @@
package com.dfsek.terra.allay.delegate;
import org.allaymc.api.block.property.type.BlockPropertyTypes;
import org.allaymc.api.block.tag.BlockTags;
import org.allaymc.api.block.type.BlockTypes;
import org.allaymc.api.world.generator.context.OtherChunkAccessibleContext;
import com.dfsek.terra.allay.Mapping;
import com.dfsek.terra.api.block.entity.BlockEntity;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.entity.Entity;
import com.dfsek.terra.api.entity.EntityType;
import com.dfsek.terra.api.util.vector.Vector3;
import com.dfsek.terra.api.world.ServerWorld;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator;
import com.dfsek.terra.api.world.chunk.generation.ProtoWorld;
/**
* @author daoge_cmd
*/
public record AllayProtoWorld(AllayServerWorld allayServerWorld, OtherChunkAccessibleContext context) implements ProtoWorld {
private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER.ofState(BlockPropertyTypes.LIQUID_DEPTH.createValue(0));
@Override
public int centerChunkX() {
return context.getCurrentChunk().getX();
}
@Override
public int centerChunkZ() {
return context.getCurrentChunk().getZ();
}
@Override
public ServerWorld getWorld() {
return allayServerWorld;
}
@Override
public void setBlockState(int x, int y, int z, BlockState data, boolean physics) {
AllayBlockState allayBlockState = (AllayBlockState)data;
boolean containsWater = allayBlockState.containsWater() || context.getBlockState(x, y, z).getBlockType().hasBlockTag(BlockTags.WATER);
context.setBlockState(x, y, z, allayBlockState.allayBlockState());
if (containsWater) context.setBlockState(x, y, z, WATER, 1);
}
@Override
public BlockState getBlockState(int x, int y, int z) {
org.allaymc.api.block.type.BlockState blockState = context.getBlockState(x, y, z);
return new AllayBlockState(blockState, Mapping.blockStateBeToJe(blockState));
}
@Override
public Entity spawnEntity(double x, double y, double z, EntityType entityType) {
return new AllayFakeEntity(Vector3.of(x, y, z), allayServerWorld);
}
@Override
public BlockEntity getBlockEntity(int x, int y, int z) {
return null;
}
@Override
public ChunkGenerator getGenerator() {
return allayServerWorld.getGenerator();
}
@Override
public BiomeProvider getBiomeProvider() {
return allayServerWorld.getBiomeProvider();
}
@Override
public ConfigPack getPack() {
return allayServerWorld.getPack();
}
@Override
public long getSeed() {
return allayServerWorld.getSeed();
}
@Override
public int getMaxHeight() {
return allayServerWorld.getMaxHeight();
}
@Override
public int getMinHeight() {
return allayServerWorld.getMinHeight();
}
@Override
public AllayServerWorld getHandle() {
return allayServerWorld;
}
}
@@ -0,0 +1,88 @@
package com.dfsek.terra.allay.delegate;
import org.allaymc.api.block.property.type.BlockPropertyTypes;
import org.allaymc.api.block.type.BlockTypes;
import org.allaymc.api.world.Dimension;
import com.dfsek.terra.allay.Mapping;
import com.dfsek.terra.allay.generator.AllayGeneratorWrapper;
import com.dfsek.terra.api.block.entity.BlockEntity;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.entity.Entity;
import com.dfsek.terra.api.entity.EntityType;
import com.dfsek.terra.api.util.vector.Vector3;
import com.dfsek.terra.api.world.ServerWorld;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.chunk.Chunk;
import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator;
/**
* @author daoge_cmd
*/
public record AllayServerWorld(AllayGeneratorWrapper allayGeneratorWrapper, Dimension allayDimension) implements ServerWorld {
private static final org.allaymc.api.block.type.BlockState WATER = BlockTypes.WATER.ofState(BlockPropertyTypes.LIQUID_DEPTH.createValue(0));
@Override
public Chunk getChunkAt(int x, int z) {
return new AllayChunk(this, allayDimension.getChunkService().getChunk(x ,z));
}
@Override
public void setBlockState(int x, int y, int z, BlockState data, boolean physics) {
// In dimension#setBlockState() method, Water will be moved to layer 1 if it is placed at layer 0
allayDimension.setBlockState(x, y, z, ((AllayBlockState) data).allayBlockState());
}
@Override
public Entity spawnEntity(double x, double y, double z, EntityType entityType) {
return new AllayFakeEntity(Vector3.of(x, y, z), this);
}
@Override
public BlockState getBlockState(int x, int y, int z) {
org.allaymc.api.block.type.BlockState allayBlockState = allayDimension.getBlockState(x, y, z);
return new AllayBlockState(allayBlockState, Mapping.blockStateBeToJe(allayBlockState));
}
@Override
public BlockEntity getBlockEntity(int x, int y, int z) {
return null;
}
@Override
public ChunkGenerator getGenerator() {
return allayGeneratorWrapper.getHandle();
}
@Override
public BiomeProvider getBiomeProvider() {
return allayGeneratorWrapper.getBiomeProvider();
}
@Override
public ConfigPack getPack() {
return allayGeneratorWrapper.getConfigPack();
}
@Override
public long getSeed() {
return allayGeneratorWrapper.getSeed();
}
@Override
public int getMaxHeight() {
return allayDimension.getDimensionInfo().maxHeight();
}
@Override
public int getMinHeight() {
return allayDimension.getDimensionInfo().minHeight();
}
@Override
public Object getHandle() {
return allayDimension;
}
}
@@ -0,0 +1,180 @@
package com.dfsek.terra.allay.generator;
import org.allaymc.api.utils.AllayStringUtils;
import org.allaymc.api.world.biome.BiomeType;
import org.allaymc.api.world.chunk.UnsafeChunk;
import org.allaymc.api.world.generator.WorldGenerator;
import org.allaymc.api.world.generator.context.NoiseContext;
import org.allaymc.api.world.generator.context.PopulateContext;
import org.allaymc.api.world.generator.function.Noiser;
import org.allaymc.api.world.generator.function.Populator;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import com.dfsek.terra.allay.TerraAllayPlugin;
import com.dfsek.terra.allay.delegate.AllayProtoChunk;
import com.dfsek.terra.allay.delegate.AllayProtoWorld;
import com.dfsek.terra.allay.delegate.AllayServerWorld;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator;
import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage;
import com.dfsek.terra.api.world.chunk.generation.util.GeneratorWrapper;
import com.dfsek.terra.api.world.info.WorldProperties;
/**
* @author daoge_cmd
*/
public class AllayGeneratorWrapper implements GeneratorWrapper {
protected static final String OPTION_PACK_NAME = "pack";
protected static final String OPTION_SEED = "seed";
protected final BiomeProvider biomeProvider;
protected final long seed;
protected final WorldGenerator allayWorldGenerator;
protected ChunkGenerator chunkGenerator;
protected ConfigPack configPack;
protected WorldProperties worldProperties;
protected AllayServerWorld allayServerWorld;
public AllayGeneratorWrapper(String preset) {
Map<String, String> options = AllayStringUtils.parseOptions(preset);
String packName = options.get(OPTION_PACK_NAME);
if(packName == null) {
throw new IllegalArgumentException("Missing config pack name");
}
this.seed = Long.parseLong(options.getOrDefault(OPTION_SEED, "0"));
this.configPack = getConfigPack(packName);
this.chunkGenerator = createGenerator(this.configPack);
this.biomeProvider = this.configPack.getBiomeProvider();
this.allayWorldGenerator = WorldGenerator
.builder()
.name("TERRA")
.preset(preset)
.noisers(new AllayNoiser())
.populators(new AllayPopulator())
.onDimensionSet(dimension -> {
this.allayServerWorld = new AllayServerWorld(this, dimension);
this.worldProperties = new WorldProperties() {
private final Object fakeHandle = new Object();
@Override
public long getSeed() {
return seed;
}
@Override
public int getMaxHeight() {
return dimension.getDimensionInfo().maxHeight();
}
@Override
public int getMinHeight() {
return dimension.getDimensionInfo().minHeight();
}
@Override
public Object getHandle() {
return fakeHandle;
}
};
})
.build();
}
@Override
public ChunkGenerator getHandle() {
return chunkGenerator;
}
public BiomeProvider getBiomeProvider() {
return this.biomeProvider;
}
public ConfigPack getConfigPack() {
return this.configPack;
}
public void setConfigPack(ConfigPack configPack) {
this.configPack = configPack;
this.chunkGenerator = createGenerator(this.configPack);
}
public long getSeed() {
return this.seed;
}
public WorldGenerator getAllayWorldGenerator() {
return this.allayWorldGenerator;
}
protected class AllayNoiser implements Noiser {
@Override
public boolean apply(NoiseContext context) {
UnsafeChunk chunk = context.getCurrentChunk();
int chunkX = chunk.getX();
int chunkZ = chunk.getZ();
chunkGenerator.generateChunkData(
new AllayProtoChunk(chunk),
worldProperties, biomeProvider,
chunkX, chunkZ
);
int minHeight = context.getDimensionInfo().minHeight();
int maxHeight = context.getDimensionInfo().maxHeight();
for(int x = 0; x < 16; x++) {
for(int y = minHeight; y < maxHeight; y++) {
for(int z = 0; z < 16; z++) {
chunk.setBiome(
x, y, z,
(BiomeType) biomeProvider.getBiome(chunkX * 16 + x, y, chunkZ * 16 + z, seed).getPlatformBiome().getHandle()
);
}
}
}
return true;
}
@Override
public String getName() {
return "TERRA_NOISER";
}
}
protected class AllayPopulator implements Populator {
@Override
public boolean apply(PopulateContext context) {
AllayProtoWorld tmp = new AllayProtoWorld(allayServerWorld, context);
try {
for(GenerationStage generationStage : configPack.getStages()) {
generationStage.populate(tmp);
}
} catch(Exception e) {
TerraAllayPlugin.INSTANCE.getPluginLogger().error("Error while populating chunk", e);
}
return true;
}
@Override
public String getName() {
return "TERRA_POPULATOR";
}
}
protected static ConfigPack getConfigPack(String packName) {
Optional<ConfigPack> byId = TerraAllayPlugin.PLATFORM.getConfigRegistry().getByID(packName);
return byId.orElseGet(
() -> TerraAllayPlugin.PLATFORM.getConfigRegistry().getByID(packName.toUpperCase(Locale.ENGLISH))
.orElseThrow(() -> new IllegalArgumentException("Cant find terra config pack named " + packName))
);
}
protected static ChunkGenerator createGenerator(ConfigPack configPack) {
return configPack.getGeneratorProvider().newInstance(configPack);
}
}
@@ -0,0 +1,36 @@
package com.dfsek.terra.allay.handle;
import org.allaymc.api.registry.Registries;
import org.allaymc.api.utils.Identifier;
import java.util.Set;
import java.util.stream.Collectors;
import com.dfsek.terra.allay.Mapping;
import com.dfsek.terra.allay.delegate.AllayEnchantment;
import com.dfsek.terra.allay.delegate.AllayItemType;
import com.dfsek.terra.api.handle.ItemHandle;
import com.dfsek.terra.api.inventory.Item;
import com.dfsek.terra.api.inventory.item.Enchantment;
/**
* @author daoge_cmd
*/
public class AllayItemHandle implements ItemHandle {
@Override
public Item createItem(String data) {
return new AllayItemType(Mapping.itemIdJeToBe(data));
}
@Override
public Enchantment getEnchantment(String id) {
return new AllayEnchantment(Registries.ENCHANTMENTS.getByK2(new Identifier(Mapping.enchantmentIdJeToBe(id))));
}
@Override
public Set<Enchantment> getEnchantments() {
return Registries.ENCHANTMENTS.getContent().m1().values().stream()
.map(AllayEnchantment::new)
.collect(Collectors.toSet());
}
}
@@ -0,0 +1,38 @@
package com.dfsek.terra.allay.handle;
import org.jetbrains.annotations.NotNull;
import com.dfsek.terra.allay.JeBlockState;
import com.dfsek.terra.allay.Mapping;
import com.dfsek.terra.allay.delegate.AllayBlockState;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.entity.EntityType;
import com.dfsek.terra.api.handle.WorldHandle;
/**
* @author daoge_cmd
*/
public class AllayWorldHandle implements WorldHandle {
@Override
public @NotNull BlockState createBlockState(@NotNull String data) {
JeBlockState jeBlockState = JeBlockState.fromString(data);
return new AllayBlockState(Mapping.blockStateJeToBe(jeBlockState), jeBlockState);
}
@Override
public @NotNull BlockState air() {
return AllayBlockState.AIR;
}
@Override
public @NotNull EntityType getEntity(@NotNull String id) {
return new EntityType() {
private final Object fakeEntityType = new Object();
@Override
public Object getHandle() {
return fakeEntityType;
}
};
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1 @@
{ "minecraft:badlands": { "bedrock_id": 37 }, "minecraft:bamboo_jungle": { "bedrock_id": 48 }, "minecraft:basalt_deltas": { "bedrock_id": 181 }, "minecraft:beach": { "bedrock_id": 16 }, "minecraft:birch_forest": { "bedrock_id": 27 }, "minecraft:cherry_grove": { "bedrock_id": 192 }, "minecraft:cold_ocean": { "bedrock_id": 44 }, "minecraft:crimson_forest": { "bedrock_id": 179 }, "minecraft:dark_forest": { "bedrock_id": 29 }, "minecraft:deep_cold_ocean": { "bedrock_id": 45 }, "minecraft:deep_dark": { "bedrock_id": 190 }, "minecraft:deep_frozen_ocean": { "bedrock_id": 47 }, "minecraft:deep_lukewarm_ocean": { "bedrock_id": 43 }, "minecraft:deep_ocean": { "bedrock_id": 24 }, "minecraft:desert": { "bedrock_id": 2 }, "minecraft:dripstone_caves": { "bedrock_id": 188 }, "minecraft:end_barrens": { "bedrock_id": 9 }, "minecraft:end_highlands": { "bedrock_id": 9 }, "minecraft:end_midlands": { "bedrock_id": 9 }, "minecraft:eroded_badlands": { "bedrock_id": 165 }, "minecraft:flower_forest": { "bedrock_id": 132 }, "minecraft:forest": { "bedrock_id": 4 }, "minecraft:frozen_ocean": { "bedrock_id": 46 }, "minecraft:frozen_peaks": { "bedrock_id": 183 }, "minecraft:frozen_river": { "bedrock_id": 11 }, "minecraft:grove": { "bedrock_id": 185 }, "minecraft:ice_spikes": { "bedrock_id": 140 }, "minecraft:jagged_peaks": { "bedrock_id": 182 }, "minecraft:jungle": { "bedrock_id": 21 }, "minecraft:lukewarm_ocean": { "bedrock_id": 42 }, "minecraft:lush_caves": { "bedrock_id": 187 }, "minecraft:mangrove_swamp": { "bedrock_id": 191 }, "minecraft:meadow": { "bedrock_id": 186 }, "minecraft:mushroom_fields": { "bedrock_id": 14 }, "minecraft:nether_wastes": { "bedrock_id": 8 }, "minecraft:ocean": { "bedrock_id": 0 }, "minecraft:old_growth_birch_forest": { "bedrock_id": 155 }, "minecraft:old_growth_pine_taiga": { "bedrock_id": 32 }, "minecraft:old_growth_spruce_taiga": { "bedrock_id": 160 }, "minecraft:plains": { "bedrock_id": 1 }, "minecraft:river": { "bedrock_id": 7 }, "minecraft:savanna": { "bedrock_id": 35 }, "minecraft:savanna_plateau": { "bedrock_id": 36 }, "minecraft:small_end_islands": { "bedrock_id": 9 }, "minecraft:snowy_beach": { "bedrock_id": 26 }, "minecraft:snowy_plains": { "bedrock_id": 12 }, "minecraft:snowy_slopes": { "bedrock_id": 184 }, "minecraft:snowy_taiga": { "bedrock_id": 30 }, "minecraft:soul_sand_valley": { "bedrock_id": 178 }, "minecraft:sparse_jungle": { "bedrock_id": 23 }, "minecraft:stony_peaks": { "bedrock_id": 189 }, "minecraft:stony_shore": { "bedrock_id": 25 }, "minecraft:sunflower_plains": { "bedrock_id": 129 }, "minecraft:swamp": { "bedrock_id": 6 }, "minecraft:taiga": { "bedrock_id": 5 }, "minecraft:the_end": { "bedrock_id": 9 }, "minecraft:the_void": { "bedrock_id": 7 }, "minecraft:warm_ocean": { "bedrock_id": 40 }, "minecraft:warped_forest": { "bedrock_id": 180 }, "minecraft:windswept_forest": { "bedrock_id": 34 }, "minecraft:windswept_gravelly_hills": { "bedrock_id": 131 }, "minecraft:windswept_hills": { "bedrock_id": 3 }, "minecraft:windswept_savanna": { "bedrock_id": 163 }, "minecraft:wooded_badlands": { "bedrock_id": 38 } }
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
{
"entrance": "com.dfsek.terra.allay.TerraAllayPlugin",
"name": "Terra",
"authors": ["daoge_cmd", "dfsek", "duplexsystem", "Astrash", "solonovamax", "Sancires", "Aureus", "RogueShade"],
"version": "@VERSION@",
"description": "@DESCRIPTION@",
"website": "@WIKI@"
}
+1 -1
View File
@@ -4,7 +4,7 @@ plugins {
dependencies {
shaded(project(":platforms:bukkit:common"))
shaded(project(":platforms:bukkit:nms:v1_21", configuration = "reobf"))
shaded(project(":platforms:bukkit:nms:v1_21_3", configuration = "reobf"))
shaded("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper)
}
@@ -194,7 +194,7 @@ public class TerraBukkitPlugin extends JavaPlugin {
@Override
public @Nullable
ChunkGenerator getDefaultWorldGenerator(@NotNull String worldName, String id) {
if(id == null || id.trim().equals("")) { return null; }
if(id == null || id.trim().isEmpty()) { return null; }
return new BukkitChunkGeneratorWrapper(generatorMap.computeIfAbsent(worldName, name -> {
ConfigPack pack = platform.getConfigRegistry().getByID(id).orElseThrow(
() -> new IllegalArgumentException("No such config pack \"" + id + "\""));
@@ -54,9 +54,6 @@ public interface Initializer {
private static Initializer constructInitializer() {
try {
String packageVersion = NMS;
if(NMS.equals("v1_21_3")) {
packageVersion = "v1_21"; // TODO: Refactor nms package to v1_21_3
}
Class<?> initializerClass = Class.forName(TERRA_PACKAGE + "." + packageVersion + ".NMSInitializer");
try {
@@ -1,6 +1,6 @@
package com.dfsek.terra.bukkit.nms.v1_21;
package com.dfsek.terra.bukkit.nms.v1_21_3;
import com.dfsek.terra.bukkit.nms.v1_21.config.VanillaBiomeProperties;
import com.dfsek.terra.bukkit.nms.v1_21_3.config.VanillaBiomeProperties;
import com.google.common.collect.ImmutableMap;
import net.minecraft.core.Holder;
@@ -1,11 +1,11 @@
package com.dfsek.terra.bukkit.nms.v1_21;
package com.dfsek.terra.bukkit.nms.v1_21_3;
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.bukkit.BukkitAddon;
import com.dfsek.terra.bukkit.PlatformImpl;
import com.dfsek.terra.bukkit.nms.v1_21.config.VanillaBiomeProperties;
import com.dfsek.terra.bukkit.nms.v1_21_3.config.VanillaBiomeProperties;
public class NMSAddon extends BukkitAddon {
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21;
package com.dfsek.terra.bukkit.nms.v1_21_3;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.biome.Biome;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21;
package com.dfsek.terra.bukkit.nms.v1_21_3;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
@@ -11,7 +11,7 @@ import java.util.Objects;
import java.util.Optional;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.bukkit.nms.v1_21.config.VanillaBiomeProperties;
import com.dfsek.terra.bukkit.nms.v1_21_3.config.VanillaBiomeProperties;
public class NMSBiomeInjector {
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21;
package com.dfsek.terra.bukkit.nms.v1_21_3;
import com.mojang.serialization.MapCodec;
import net.minecraft.core.Holder;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21;
package com.dfsek.terra.bukkit.nms.v1_21_3;
import com.mojang.serialization.MapCodec;
import net.minecraft.core.BlockPos;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21;
package com.dfsek.terra.bukkit.nms.v1_21_3;
import com.dfsek.terra.bukkit.BukkitAddon;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21;
package com.dfsek.terra.bukkit.nms.v1_21_3;
import net.minecraft.server.level.ChunkMap;
import net.minecraft.server.level.ServerLevel;
@@ -17,7 +17,6 @@ import java.util.Set;
import java.util.concurrent.locks.ReentrantLock;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.util.reflection.ReflectionUtil;
import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21;
package com.dfsek.terra.bukkit.nms.v1_21_3;
import net.minecraft.world.level.LevelHeightAccessor;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21;
package com.dfsek.terra.bukkit.nms.v1_21_3;
import net.minecraft.core.Holder;
import net.minecraft.core.Holder.Reference;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21;
package com.dfsek.terra.bukkit.nms.v1_21_3;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.Registries;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21.config;
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21.config;
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21.config;
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -1,9 +1,8 @@
package com.dfsek.terra.bukkit.nms.v1_21.config;
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.EntityType;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21.config;
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21.config;
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21.config;
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21.config;
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21.config;
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21.config;
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21.config;
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Default;
@@ -1,12 +1,9 @@
package com.dfsek.terra.bukkit.nms.v1_21.config;
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import net.minecraft.core.Registry;
import net.minecraft.core.RegistryCodecs;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.npc.VillagerType;
@@ -33,7 +33,7 @@ import com.dfsek.terra.mod.util.MinecraftAdapter;
@Implements(@Interface(iface = com.dfsek.terra.api.entity.Entity.class, prefix = "terra$"))
public abstract class EntityMixin {
@Shadow
public net.minecraft.world.World world;
private net.minecraft.world.World world;
@Shadow
private BlockPos blockPos;
@@ -36,6 +36,7 @@
"implementations.terra.inventory.meta.ItemStackMetaMixin",
"implementations.terra.world.ChunkRegionMixin",
"implementations.terra.world.ServerWorldMixin",
"invoke.BiomeInvoker",
"invoke.FluidBlockInvoker",
"lifecycle.DataPackContentsMixin"
],