diff --git a/common/src/main/kotlin/com/cobblemon/mod/common/CobblemonCommands.kt b/common/src/main/kotlin/com/cobblemon/mod/common/CobblemonCommands.kt index f649dc0a2314f395d13622b0ca4185c498d24c4f..d1deadc0cf3134fac2fafc4bc77964ab3698f803 100644 --- a/common/src/main/kotlin/com/cobblemon/mod/common/CobblemonCommands.kt +++ b/common/src/main/kotlin/com/cobblemon/mod/common/CobblemonCommands.kt @@ -56,6 +56,7 @@ object CobblemonCommands { AbandonMultiTeam.register(dispatcher) FreezePokemonCommand.register(dispatcher) ApplyPlayerTextureCommand.register(dispatcher) + RunMolangScriptCommand.register(dispatcher) // Possibly lock down registration if and only if under dev environment or running in an environment // with a certain system environment variable set diff --git a/common/src/main/kotlin/com/cobblemon/mod/common/api/permission/CobblemonPermissions.kt b/common/src/main/kotlin/com/cobblemon/mod/common/api/permission/CobblemonPermissions.kt index 10dfe6f6370af13de5082157cb18940f26790f12..db538f8b008c9e8b70ca6b2be22a92c038520ef4 100644 --- a/common/src/main/kotlin/com/cobblemon/mod/common/api/permission/CobblemonPermissions.kt +++ b/common/src/main/kotlin/com/cobblemon/mod/common/api/permission/CobblemonPermissions.kt @@ -82,6 +82,8 @@ object CobblemonPermissions { val ABANDON_MULTITEAM = this.create("${COMMAND_PREFIX}abandonmultiteam", PermissionLevel.NONE) + val RUN_MOLANG_SCRIPT = this.create("${COMMAND_PREFIX}runmolangscript", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS) + fun all(): Iterable<Permission> = this.permissions private fun create(node: String, level: PermissionLevel): Permission { diff --git a/common/src/main/kotlin/com/cobblemon/mod/common/command/RunMolangScriptCommand.kt b/common/src/main/kotlin/com/cobblemon/mod/common/command/RunMolangScriptCommand.kt new file mode 100644 index 0000000000000000000000000000000000000000..cd30543179b718c10358777b6f2c2ffac4eda896 --- /dev/null +++ b/common/src/main/kotlin/com/cobblemon/mod/common/command/RunMolangScriptCommand.kt @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2023 Cobblemon Contributors + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package com.cobblemon.mod.common.command + +import com.bedrockk.molang.runtime.MoLangRuntime +import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue +import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup +import com.cobblemon.mod.common.api.permission.CobblemonPermissions +import com.cobblemon.mod.common.api.scripting.CobblemonScripts +import com.cobblemon.mod.common.entity.npc.NPCEntity +import com.cobblemon.mod.common.util.permission +import com.cobblemon.mod.common.util.player +import com.cobblemon.mod.common.util.resourceLocation +import com.cobblemon.mod.common.util.uuid +import com.cobblemon.mod.common.util.withQueryValue +import com.mojang.brigadier.Command +import com.mojang.brigadier.CommandDispatcher +import com.mojang.brigadier.arguments.StringArgumentType +import com.mojang.brigadier.context.CommandContext +import java.util.UUID +import net.minecraft.commands.CommandSourceStack +import net.minecraft.commands.Commands.argument +import net.minecraft.commands.Commands.literal +import net.minecraft.commands.arguments.EntityArgument +import net.minecraft.commands.arguments.ResourceLocationArgument +import net.minecraft.resources.ResourceLocation +import net.minecraft.server.level.ServerPlayer + +object RunMolangScriptCommand { + private const val NAME = "runmolangscript" + private const val SCRIPT = "script" + private const val PLAYER = "player" + private const val NPC = "npc" + private const val POKEMON = "pokemon" + + fun register(dispatcher : CommandDispatcher<CommandSourceStack>) { + dispatcher.register(literal(NAME) + .permission(CobblemonPermissions.RUN_MOLANG_SCRIPT) + .then( + argument(SCRIPT, ResourceLocationArgument.id()) + .executes { execute(it, it.resourceLocation(SCRIPT), null, null, null) } + .then(argument(PLAYER, EntityArgument.player()) + .executes { execute(it, it.resourceLocation(SCRIPT), it.player(PLAYER), null, null) } + .then(argument(NPC, StringArgumentType.string()) + .executes { execute(it, it.resourceLocation(SCRIPT), it.player(PLAYER), it.uuid(NPC), null) } + .then(argument(POKEMON, StringArgumentType.string()) + .executes { execute(it, it.resourceLocation(SCRIPT), it.player(PLAYER), it.uuid(NPC), it.uuid(POKEMON)) } + ) + ) + .then(argument(POKEMON, StringArgumentType.string()) + .executes { execute(it, it.resourceLocation(SCRIPT), it.player(PLAYER), null, it.uuid(POKEMON)) } + ) + ) + .then(argument(NPC, StringArgumentType.string()) + .executes { execute(it, it.resourceLocation(SCRIPT), null, it.uuid(NPC), null) } + .then(argument(POKEMON, StringArgumentType.string()) + .executes { execute(it, it.resourceLocation(SCRIPT), null, it.uuid(NPC), it.uuid(POKEMON)) } + ) + ) + .then(argument(POKEMON, StringArgumentType.string()) + .executes { execute(it, it.resourceLocation(SCRIPT), null, null, it.uuid(POKEMON)) } + ) + ) + ) + } + + private fun execute(context: CommandContext<CommandSourceStack>, scriptId: ResourceLocation, player: ServerPlayer?, npcId: UUID?, pokemonId: UUID? = null): Int { + try { + val runtime = MoLangRuntime().setup() + val npc = npcId?.let { context.source.level.getEntity(it) as? NPCEntity } + val pokemon = pokemonId?.let { context.source.level.getEntity(it) as? NPCEntity } + + npc?.let { runtime.withQueryValue("npc", npc.struct) } + pokemon?.let { runtime.withQueryValue("pokemon", pokemon.struct) } + player?.let { runtime.withQueryValue("player", player.asMoLangValue()) } + + CobblemonScripts.run(scriptId, runtime) + } catch (e: Exception) { + e.printStackTrace() + } + return Command.SINGLE_SUCCESS + } +} \ No newline at end of file diff --git a/common/src/main/kotlin/com/cobblemon/mod/common/util/CommandContextExtensions.kt b/common/src/main/kotlin/com/cobblemon/mod/common/util/CommandContextExtensions.kt index 095a86efd413f66693b0cf35c88792fdede13a58..d60c9c59d15563cb0ee9622b4f2690b2e98bc332 100644 --- a/common/src/main/kotlin/com/cobblemon/mod/common/util/CommandContextExtensions.kt +++ b/common/src/main/kotlin/com/cobblemon/mod/common/util/CommandContextExtensions.kt @@ -11,5 +11,9 @@ package com.cobblemon.mod.common.util import com.mojang.brigadier.context.CommandContext import net.minecraft.commands.CommandSourceStack import net.minecraft.commands.arguments.EntityArgument +import net.minecraft.commands.arguments.ResourceLocationArgument -fun CommandContext<CommandSourceStack>.player(argumentName: String = "player") = EntityArgument.getPlayer(this, argumentName) \ No newline at end of file +fun CommandContext<CommandSourceStack>.player(argumentName: String = "player") = EntityArgument.getPlayer(this, argumentName) +fun CommandContext<CommandSourceStack>.string(argumentName: String) = this.getArgument(argumentName, String::class.java) +fun CommandContext<CommandSourceStack>.uuid(argumentName: String) = this.getArgument(argumentName, String::class.java).asUUID +fun CommandContext<CommandSourceStack>.resourceLocation(argumentName: String) = ResourceLocationArgument.getId(this, argumentName) \ No newline at end of file diff --git a/deps/local/com/bedrockk/molang/1.1.18/molang-1.1.18.jar b/deps/local/com/bedrockk/molang/1.1.18/molang-1.1.18.jar new file mode 100644 index 0000000000000000000000000000000000000000..1968153bfb6f368e83bcd7aa19a90cba5d0483ef Binary files /dev/null and b/deps/local/com/bedrockk/molang/1.1.18/molang-1.1.18.jar differ diff --git a/deps/local/com/bedrockk/molang/1.1.18/molang-1.1.18.pom b/deps/local/com/bedrockk/molang/1.1.18/molang-1.1.18.pom new file mode 100644 index 0000000000000000000000000000000000000000..985acad6d839184a9e4739d47fa5c3e9bbe00213 --- /dev/null +++ b/deps/local/com/bedrockk/molang/1.1.18/molang-1.1.18.pom @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <modelVersion>4.0.0</modelVersion> + <groupId>local.com.bedrockk</groupId> + <artifactId>molang</artifactId> + <version>1.1.18</version> +</project> \ No newline at end of file diff --git a/deps/local/com/bedrockk/molang/maven-metadata-local.xml b/deps/local/com/bedrockk/molang/maven-metadata-local.xml index 23ff70989bc751241eee9f0f44f38144b896d23b..f2d6ba7ef5c8d7c2103e20d91f76827f4ff8d366 100644 --- a/deps/local/com/bedrockk/molang/maven-metadata-local.xml +++ b/deps/local/com/bedrockk/molang/maven-metadata-local.xml @@ -3,10 +3,10 @@ <groupId>local.com.bedrockk</groupId> <artifactId>molang</artifactId> <versioning> - <release>1.1.16</release> + <release>1.1.18</release> <versions> - <version>1.1.16</version> + <version>1.1.18</version> </versions> - <lastUpdated>20231949390002</lastUpdated> + <lastUpdated>20231949390005</lastUpdated> </versioning> </metadata> diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index af8f82bf986030f8ce0ac80f6077fea94676a5eb..9db3a3b37c0cae3b1fea71ee4bfe887a8c534715 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,7 +13,7 @@ loom = "1.7-SNAPSHOT" architectury-plugin = "3.4-SNAPSHOT" # Common -molang = "1.1.16" +molang = "1.1.18" graal = "22.3.0" icu4j = "71.1" jei-api = "19.8.2.99"