You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nlpcraft.apache.org by se...@apache.org on 2021/04/28 09:00:51 UTC

[incubator-nlpcraft] branch NLPCRAFT-310 created (now 5136f5c)

This is an automated email from the ASF dual-hosted git repository.

sergeykamov pushed a change to branch NLPCRAFT-310
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git.


      at 5136f5c  Minecraft example cleaned up.

This branch includes the following new commits:

     new 5136f5c  Minecraft example cleaned up.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[incubator-nlpcraft] 01/01: Minecraft example cleaned up.

Posted by se...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sergeykamov pushed a commit to branch NLPCRAFT-310
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git

commit 5136f5c0062421dcdb87170d89aa959f4123f3fd
Author: Sergey Kamov <sk...@gmail.com>
AuthorDate: Wed Apr 28 12:00:38 2021 +0300

    Minecraft example cleaned up.
---
 nlpcraft-examples/lightswitch/pom.xml              |   5 +
 .../example/minecraft/NCMinecraftExampleMod.java   |  12 +-
 .../minecraft/utils/NCMinecraftFilesDump.java      | 136 +++++++++++++++++++++
 .../minecraft/utils/NCMinecraftFilesDump.java      |  88 -------------
 nlpcraft-examples/minecraft/pom.xml                |   5 +
 ...Processor.kt => MinecraftFillMatchProcessor.kt} |   3 +-
 .../nlpcraft/example/minecraft/MinecraftModel.kt   |   6 +-
 .../example/minecraft/MinecraftValueLoader.kt      |   5 +-
 .../minecraft/src/main/resources/block.json        |  15 ++-
 .../minecraft/src/main/resources/item.json         |  15 ++-
 .../example/minecraft/NCMinecraftModelSpec.kt      |   1 +
 11 files changed, 178 insertions(+), 113 deletions(-)

diff --git a/nlpcraft-examples/lightswitch/pom.xml b/nlpcraft-examples/lightswitch/pom.xml
index 470a86d..0557ecf 100644
--- a/nlpcraft-examples/lightswitch/pom.xml
+++ b/nlpcraft-examples/lightswitch/pom.xml
@@ -53,6 +53,11 @@
             <version>${kotlin.ver}</version>
         </dependency>
         <dependency>
+            <groupId>org.jetbrains.kotlin</groupId>
+            <artifactId>kotlin-reflect</artifactId>
+            <version>${kotlin.ver}</version>
+        </dependency>
+        <dependency>
             <groupId>org.codehaus.groovy</groupId>
             <artifactId>groovy</artifactId>
             <version>${groovy.ver}</version>
diff --git a/nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nplcraft/example/minecraft/NCMinecraftExampleMod.java b/nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nlpcraft/example/minecraft/NCMinecraftExampleMod.java
similarity index 95%
rename from nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nplcraft/example/minecraft/NCMinecraftExampleMod.java
rename to nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nlpcraft/example/minecraft/NCMinecraftExampleMod.java
index 1adb1c9..280c9d2 100644
--- a/nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nplcraft/example/minecraft/NCMinecraftExampleMod.java
+++ b/nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nlpcraft/example/minecraft/NCMinecraftExampleMod.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.nplcraft.example.minecraft;
+package org.apache.nlpcraft.example.minecraft;
 
 import com.google.gson.Gson;
 import net.minecraft.server.MinecraftServer;
@@ -38,8 +38,8 @@ import java.net.URL;
 import java.nio.file.Files;
 import java.nio.file.NoSuchFileException;
 import java.nio.file.Paths;
-import java.util.HashSet;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * Minecraft example mod for the Minecraft Forge server.
@@ -57,7 +57,7 @@ public class NCMinecraftExampleMod {
     private static final String MODEL_ID = "nlpcraft.minecraft.ex";
     private static final Gson GSON = new Gson();
 
-    private final Set<String> convCmds = new HashSet<>();
+    private final Set<String> convCmds = ConcurrentHashMap.newKeySet();
 
     private NCSignIn creds;
     private String baseUrl;
@@ -277,12 +277,12 @@ public class NCMinecraftExampleMod {
                     FileUtil.resolveResourcePath(Paths.get("config"), "nlpcraft-settings", ".json")
                 )
         ) {
-            NCSettings settings = GSON.fromJson(reader, NCSettings.class);
+            NCSettings setts = GSON.fromJson(reader, NCSettings.class);
 
             LOGGER.info("Credentials file loaded.");
 
-            this.creds = mkSignin(settings.email, settings.passwd);
-            this.baseUrl = "http://" + settings.host + ":" + settings.port + "/api/v1/";
+            this.creds = mkSignin(setts.email, setts.passwd);
+            this.baseUrl = "http://" + setts.host + ":" + setts.port + "/api/v1/";
 
             return;
         }
diff --git a/nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nlpcraft/example/minecraft/utils/NCMinecraftFilesDump.java b/nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nlpcraft/example/minecraft/utils/NCMinecraftFilesDump.java
new file mode 100644
index 0000000..98d35d3
--- /dev/null
+++ b/nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nlpcraft/example/minecraft/utils/NCMinecraftFilesDump.java
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.nlpcraft.example.minecraft.utils;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.mojang.serialization.Lifecycle;
+import net.minecraft.block.Block;
+import net.minecraft.util.RegistryKey;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.registry.DefaultedRegistry;
+import net.minecraft.util.registry.Registry;
+import net.minecraftforge.registries.ForgeRegistryEntry;
+import net.minecraftforge.registries.GameData;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Date;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * Utility for getting data from minecraft.
+ * These values are used for preparing synonyms for user defined elements.
+ */
+public class NCMinecraftFilesDump {
+    private final static Gson GSON = new GsonBuilder().setPrettyPrinting().create();
+
+    private static class Json {
+        private String version;
+        private Map<String, String> data;
+    }
+
+    private static <T extends ForgeRegistryEntry<?>> void write(String file, DefaultedRegistry<T> reg, String ver) throws IOException {
+        Json js = new Json();
+
+        js.version = ver;
+
+        // Regular name -> registry name.
+        js.data =
+            reg.stream().filter(x -> x.getRegistryName() != null).
+                collect(Collectors.toMap(
+                    x -> transformPath(x.getRegistryName().getPath()),
+                    x -> x.getRegistryName().toString())
+                );
+        // Add matching like grass -> grass_block.
+        js.data.putAll(reg.stream()
+            .filter(x -> x.getRegistryName() != null && x.getRegistryName().getPath().endsWith("_block"))
+            .collect(Collectors.toMap(
+                x -> transformPath(x.getRegistryName().getPath().replace("_block", "")),
+                x -> x.getRegistryName().toString())
+            )
+        );
+
+        File f = new File(file + ".json");
+
+        try (BufferedWriter wr = new BufferedWriter(new FileWriter(f))) {
+            write(wr, "/*");
+            write(wr, " *");
+            write(wr, " * Licensed to the Apache Software Foundation (ASF) under one or more");
+            write(wr, " * contributor license agreements.  See the NOTICE file distributed with");
+            write(wr, " * this work for additional information regarding copyright ownership.");
+            write(wr, " * The ASF licenses this file to You under the Apache License, Version 2.0");
+            write(wr, " * (the 'License'); you may not use this file except in compliance with");
+            write(wr, " * the License.  You may obtain a copy of the License at");
+            write(wr, " *");
+            write(wr, " *      http://www.apache.org/licenses/LICENSE-2.0");
+            write(wr, " *");
+            write(wr, " * Unless required by applicable law or agreed to in writing, software");
+            write(wr, " * distributed under the License is distributed on an 'AS IS' BASIS,");
+            write(wr, " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.");
+            write(wr, " * See the License for the specific language governing permissions and");
+            write(wr, " * limitations under the License.");
+            write(wr, " *");
+            write(wr, " * Auto-generated on: $" + new Date());
+            write(wr, " *");
+            write(wr, " * Dump file with minecraft item game objects. Was made for specified game version (see below)");
+            write(wr, " * Generated with dumpItems task in minecraft-mod module");
+            write(wr, " *");
+            write(wr, " */");
+
+            wr.newLine();
+
+            wr.write(GSON.toJson(js));
+        }
+
+        System.out.println("File prepared:" + f.getAbsolutePath());
+    }
+
+    private static void write(BufferedWriter wr, String line) throws IOException {
+        wr.write(line);
+        wr.newLine();
+    }
+
+    private static String transformPath(String path) {
+        return path.replaceAll("_", " ");
+    }
+
+    /**
+     * Application entry point. It requires 2 arguments: registry name (`block` and `item`) and version number.
+     *
+     * @param args Command line arguments.
+     */
+    public static void main(String[] args) throws IOException {
+        if (args.length != 2)
+            throw new IllegalStateException("Unexpected arguments count, 2 expected.");
+
+        String type = args[0];
+        String ver = args[1];
+
+        if (!type.equals("block") && !type.equals("item"))
+            throw new IllegalStateException("Unexpected type:" + type);
+
+        RegistryKey<Registry<Block>> key = RegistryKey.getOrCreateRootKey(new ResourceLocation(type));
+
+        write(type, GameData.getWrapper(key, Lifecycle.experimental(), "air"), ver);
+    }
+}
diff --git a/nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nplcraft/example/minecraft/utils/NCMinecraftFilesDump.java b/nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nplcraft/example/minecraft/utils/NCMinecraftFilesDump.java
deleted file mode 100644
index 8fdacdf..0000000
--- a/nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nplcraft/example/minecraft/utils/NCMinecraftFilesDump.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.nplcraft.example.minecraft.utils;
-
-import com.google.gson.Gson;
-import java.util.Map;
-import java.util.stream.Collectors;
-import net.minecraft.util.registry.DefaultedRegistry;
-import net.minecraft.util.registry.Registry;
-import net.minecraftforge.registries.ForgeRegistries;
-import net.minecraftforge.registries.ForgeRegistry;
-import net.minecraftforge.registries.ForgeRegistryEntry;
-
-/**
- * Utility for getting data from minecraft. These values are used for preparing synonyms for user defined elements.
- */
-public class NCMinecraftFilesDump {
-    private final static Gson GSON = new Gson();
-
-    private static class Dump {
-        private String version;
-        private Map<String, String> data;
-    }
-
-    private static <T extends ForgeRegistryEntry<?>> void dumpRegistry(DefaultedRegistry<T> registry, String version) {
-        Dump dump = new Dump();
-
-        dump.version = version;
-
-        // Regular name -> registry name.
-        dump.data =
-            registry.stream().filter(x -> x.getRegistryName() != null).
-                collect(Collectors.toMap(
-                    x -> transformPath(x.getRegistryName().getPath()),
-                    x -> x.getRegistryName().toString())
-                );
-        // Add matching like grass -> grass_block.
-        dump.data.putAll(registry.stream()
-            .filter(x -> x.getRegistryName() != null && x.getRegistryName().getPath().endsWith("_block"))
-            .collect(Collectors.toMap(
-                x -> transformPath(x.getRegistryName().getPath().replace("_block", "")),
-                x -> x.getRegistryName().toString())
-            )
-        );
-
-        System.out.println(GSON.toJson(dump));
-    }
-
-    private static String transformPath(String path) {
-        return path.replaceAll("_", " ");
-    }
-
-    /**
-     * App entry point.
-     *
-     * @param args Command line arguments.
-     */
-    public static void main(String[] args) {
-        String type = args[0];
-        String version = args[1];
-
-        if (type.equals("block")) {
-            dumpRegistry(Registry.BLOCK, version);
-        }
-        else if (type.equals("item")) {
-            dumpRegistry(Registry.ITEM, version);
-        }
-        else {
-            System.err.println("Unknown type");
-        }
-    }
-}
diff --git a/nlpcraft-examples/minecraft/pom.xml b/nlpcraft-examples/minecraft/pom.xml
index f4f7efd..bb955bb 100644
--- a/nlpcraft-examples/minecraft/pom.xml
+++ b/nlpcraft-examples/minecraft/pom.xml
@@ -54,6 +54,11 @@
             <artifactId>kotlin-stdlib</artifactId>
             <version>${kotlin.ver}</version>
         </dependency>
+        <dependency>
+            <groupId>org.jetbrains.kotlin</groupId>
+            <artifactId>kotlin-reflect</artifactId>
+            <version>${kotlin.ver}</version>
+        </dependency>
 
         <!-- Test dependencies. -->
         <dependency>
diff --git a/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/MinecraftFIllMatchProcessor.kt b/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/MinecraftFillMatchProcessor.kt
similarity index 98%
rename from nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/MinecraftFIllMatchProcessor.kt
rename to nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/MinecraftFillMatchProcessor.kt
index c1a4f27..f4dfdbe 100644
--- a/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/MinecraftFIllMatchProcessor.kt
+++ b/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/MinecraftFillMatchProcessor.kt
@@ -26,7 +26,7 @@ import java.util.*
  * Special processor for support 'fillIntent' intent processing.
  * Is is designed as separated class to simplify main model class.
  */
-class MinecraftFIllMatchProcessor {
+class MinecraftFillMatchProcessor {
     internal data class Coordinate(val x: Int = 0, val y: Int = 0, val z: Int = 0) {
         override fun toString(): String {
             return "$x $y $z"
@@ -43,7 +43,6 @@ class MinecraftFIllMatchProcessor {
 
     companion object {
         fun process(
-            ctx: NCIntentMatch,
             @NCIntentTerm("shape") shape: NCToken,
             @NCIntentTerm("block") blockToken: NCToken,
             @NCIntentTerm("len") length: Optional<NCToken>,
diff --git a/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/MinecraftModel.kt b/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/MinecraftModel.kt
index 5191776..ae41169 100644
--- a/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/MinecraftModel.kt
+++ b/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/MinecraftModel.kt
@@ -31,9 +31,8 @@ import java.util.*
  */
 class MinecraftModel : NCModelFileAdapter("minecraft.yaml") {
     private fun checkAmbiguous(ctx: NCIntentMatch) {
-        if (ctx.isAmbiguous) {
+        if (ctx.isAmbiguous)
             throw NCRejection("Ambiguous request")
-        }
     }
 
     /**
@@ -128,12 +127,11 @@ class MinecraftModel : NCModelFileAdapter("minecraft.yaml") {
         "make a box of sand with the size of 2 10 meters in front of me"
     )
     fun onFillMatch(
-        ctx: NCIntentMatch,
         @NCIntentTerm("shape") shape: NCToken,
         @NCIntentTerm("block") block: NCToken,
         @NCIntentTerm("len") length: Optional<NCToken>,
         @NCIntentTerm("position") position: NCToken,
     ): NCResult {
-        return MinecraftFIllMatchProcessor.process(ctx, shape, block, length, position)
+        return MinecraftFillMatchProcessor.process(shape, block, length, position)
     }
 }
diff --git a/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/MinecraftValueLoader.kt b/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/MinecraftValueLoader.kt
index 665a575..4fa6ffc 100644
--- a/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/MinecraftValueLoader.kt
+++ b/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/MinecraftValueLoader.kt
@@ -28,7 +28,7 @@ import org.apache.nlpcraft.model.NCValueLoader
 
 /**
  * Data loader from JSON data files.
- * These files which prepared via 'minectaft-mod' module org.apache.nplcraft.example.minecraft.utils.GameFilesDump
+ * These files which prepared via 'minecraft-mod' module, org.apache.nlpcraft.example.minecraft.utils.NCMinecraftFilesDump
  * for this supported `minecraft` server version.
  */
 class MinecraftValueLoader : NCValueLoader {
@@ -73,5 +73,4 @@ class MinecraftValueLoader : NCValueLoader {
 
         return dump.data.map { x -> NCMinecraftValue(x.key, x.value) }.toMutableSet()
     }
-}
-
+}
\ No newline at end of file
diff --git a/nlpcraft-examples/minecraft/src/main/resources/block.json b/nlpcraft-examples/minecraft/src/main/resources/block.json
index b8c392e..c9be25c 100644
--- a/nlpcraft-examples/minecraft/src/main/resources/block.json
+++ b/nlpcraft-examples/minecraft/src/main/resources/block.json
@@ -1,21 +1,26 @@
 /*
+ *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
  * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
+ * (the 'License'); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
  *
  *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
+ * distributed under the License is distributed on an 'AS IS' BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
+ *
+ * Auto-generated on: $Wed Apr 28 11:38:52 MSK 2021
+ *
+ * Dump file with minecraft item game objects. Was made for specified game version (see below)
+ * Generated with dumpItems task in minecraft-mod module
+ *
  */
-// Dump file with minecraft block game objects. Was made for specified game version (see below)
-// Generated with dumpBlocks task in minecraft-mod module
 
 {
   "version": "1.16.4",
@@ -808,4 +813,4 @@
     "pink shulker box": "minecraft:pink_shulker_box",
     "crimson button": "minecraft:crimson_button"
   }
-}
+}
\ No newline at end of file
diff --git a/nlpcraft-examples/minecraft/src/main/resources/item.json b/nlpcraft-examples/minecraft/src/main/resources/item.json
index 1856f3c..c656457 100644
--- a/nlpcraft-examples/minecraft/src/main/resources/item.json
+++ b/nlpcraft-examples/minecraft/src/main/resources/item.json
@@ -1,21 +1,26 @@
 /*
+ *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
  * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
+ * (the 'License'); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
  *
  *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
+ * distributed under the License is distributed on an 'AS IS' BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
+ *
+ * Auto-generated on: $Wed Apr 28 11:37:09 MSK 2021
+ *
+ * Dump file with minecraft item game objects. Was made for specified game version (see below)
+ * Generated with dumpItems task in minecraft-mod module
+ *
  */
-// Dump file with minecraft item game objects. Was made for specified game version (see below)
-// Generated with dumpItems task in minecraft-mod module
 
 {
   "version": "1.16.4",
@@ -1013,4 +1018,4 @@
     "lapis lazuli": "minecraft:lapis_lazuli",
     "carrot": "minecraft:carrot"
   }
-}
+}
\ No newline at end of file
diff --git a/nlpcraft-examples/minecraft/src/test/kotlin/org/apache/nlpcraft/example/minecraft/NCMinecraftModelSpec.kt b/nlpcraft-examples/minecraft/src/test/kotlin/org/apache/nlpcraft/example/minecraft/NCMinecraftModelSpec.kt
index 811df6b..9d065d3 100644
--- a/nlpcraft-examples/minecraft/src/test/kotlin/org/apache/nlpcraft/example/minecraft/NCMinecraftModelSpec.kt
+++ b/nlpcraft-examples/minecraft/src/test/kotlin/org/apache/nlpcraft/example/minecraft/NCMinecraftModelSpec.kt
@@ -31,6 +31,7 @@ class NCMinecraftModelSpec : NCTestContext() {
     @Test
     fun test() {
         val res = client.ask("make a box of sand with the size of 2 10 meters in front of me")
+
         assertEquals(
             "execute at @p positioned ~0 ~0 ~10 rotated 0 0 run fill ^-1 ^0 ^-1 ^0 ^0 ^0 minecraft:sand",
             res.result.get()