forked from CCBlueX/LiquidBounce
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
An extension to the built-in JS ScriptAPI. This will make it much easier and longer lasting to use the client features via script. This means that anything we add to the API, we expect to support for as long as possible. - Import of commonly used Minecraft classes - Access to commonly used LiquidBounce features - Added script command - Improved error handling `api.utilName` features: - [x] Rotation Util - [x] Item Util - [x] Network Util - [x] Interaction Util - [x] Block Util - [x] Reflection Util - [x] Movement Util
- Loading branch information
Showing
19 changed files
with
589 additions
and
49 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
105 changes: 105 additions & 0 deletions
105
src/main/kotlin/net/ccbluex/liquidbounce/script/CommandScript.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
package net.ccbluex.liquidbounce.script | ||
|
||
import net.ccbluex.liquidbounce.features.command.Command | ||
import net.ccbluex.liquidbounce.features.command.builder.CommandBuilder | ||
import net.ccbluex.liquidbounce.features.command.builder.ParameterBuilder | ||
import net.ccbluex.liquidbounce.utils.client.chat | ||
import net.ccbluex.liquidbounce.utils.client.regular | ||
import net.ccbluex.liquidbounce.utils.client.variable | ||
import net.minecraft.util.Util | ||
|
||
object CommandScript { | ||
|
||
fun createCommand(): Command { | ||
return CommandBuilder.begin("script") | ||
.hub() | ||
.subcommand(CommandBuilder.begin("reload").handler { command, _ -> | ||
runCatching { | ||
ScriptManager.reloadScripts() | ||
}.onSuccess { | ||
chat(regular(command.result("reloaded"))) | ||
}.onFailure { | ||
chat(regular(command.result("reloadFailed", variable(it.message ?: "unknown")))) | ||
} | ||
}.build()) | ||
.subcommand(CommandBuilder.begin("load").parameter( | ||
ParameterBuilder.begin<String>("name").verifiedBy(ParameterBuilder.STRING_VALIDATOR).required() | ||
.build() | ||
).handler { command, args -> | ||
val name = args[0] as String | ||
val scriptFile = ScriptManager.scriptsRoot.resolve("$name.js") | ||
|
||
if (!scriptFile.exists()) { | ||
chat(regular(command.result("notFound", variable(name)))) | ||
return@handler | ||
} | ||
|
||
// Check if script is already loaded | ||
if (ScriptManager.loadedScripts.any { it.scriptFile == scriptFile }) { | ||
chat(regular(command.result("alreadyLoaded", variable(name)))) | ||
return@handler | ||
} | ||
|
||
runCatching { | ||
ScriptManager.loadScript(scriptFile) | ||
}.onSuccess { | ||
chat(regular(command.result("loaded", variable(name)))) | ||
}.onFailure { | ||
chat(regular(command.result("failedToLoad", variable(it.message ?: "unknown")))) | ||
} | ||
|
||
}.build()) | ||
.subcommand(CommandBuilder.begin("unload").parameter( | ||
ParameterBuilder.begin<String>("name").verifiedBy(ParameterBuilder.STRING_VALIDATOR).required() | ||
.build() | ||
).handler { command, args -> | ||
val name = args[0] as String | ||
|
||
val script = ScriptManager.loadedScripts.find { it.scriptName.equals(name, true) } | ||
|
||
if (script == null) { | ||
chat(regular(command.result("notFound", variable(name)))) | ||
return@handler | ||
} | ||
|
||
runCatching { | ||
ScriptManager.unloadScript(script) | ||
}.onSuccess { | ||
chat(regular(command.result("unloaded", variable(name)))) | ||
}.onFailure { | ||
chat(regular(command.result("failedToUnload", variable(it.message ?: "unknown")))) | ||
} | ||
}.build()) | ||
.subcommand(CommandBuilder.begin("list").handler { command, _ -> | ||
val scripts = ScriptManager.loadedScripts | ||
val scriptNames = scripts.map { it.scriptName } | ||
|
||
if (scriptNames.isEmpty()) { | ||
chat(regular(command.result("noScripts"))) | ||
return@handler | ||
} | ||
|
||
chat(regular(command.result("scripts", variable(scriptNames.joinToString(", "))))) | ||
}.build()) | ||
.subcommand(CommandBuilder.begin("directory").handler { command, _ -> | ||
Util.getOperatingSystem().open(ScriptManager.scriptsRoot) | ||
chat(regular(command.result("scriptsDirectory", variable(ScriptManager.scriptsRoot.absolutePath)))) | ||
}.build()) | ||
.subcommand(CommandBuilder.begin("edit").parameter( | ||
ParameterBuilder.begin<String>("name").verifiedBy(ParameterBuilder.STRING_VALIDATOR).required() | ||
.build() | ||
).handler { command, args -> | ||
val name = args[0] as String | ||
val scriptFile = ScriptManager.scriptsRoot.resolve("$name.js") | ||
|
||
if (!scriptFile.exists()) { | ||
chat(regular(command.result("notFound", variable(name)))) | ||
return@handler | ||
} | ||
|
||
Util.getOperatingSystem().open(scriptFile) | ||
chat(regular(command.result("opened", variable(name)))) | ||
}.build()) | ||
.build() | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
71 changes: 71 additions & 0 deletions
71
src/main/kotlin/net/ccbluex/liquidbounce/script/bindings/api/JsApiProvider.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
package net.ccbluex.liquidbounce.script.bindings.api | ||
|
||
import net.ccbluex.liquidbounce.features.command.builder.CommandBuilder | ||
import net.ccbluex.liquidbounce.features.command.builder.ParameterBuilder | ||
import net.ccbluex.liquidbounce.script.bindings.features.JsSetting | ||
import net.ccbluex.liquidbounce.script.bindings.globals.JsClient | ||
import net.ccbluex.liquidbounce.utils.client.mc | ||
import net.minecraft.util.Hand | ||
import net.minecraft.util.math.BlockPos | ||
import net.minecraft.util.math.Vec3i | ||
import org.graalvm.polyglot.Value | ||
|
||
/** | ||
* The main hub of the ScriptAPI that provides access to all kind of useful APIs. | ||
*/ | ||
object JsApiProvider { | ||
|
||
internal fun setupUsefulContext(context: Value) = context.apply { | ||
// Class bindings | ||
// -> Client API | ||
putMember("Setting", JsSetting) | ||
putMember("CommandBuilder", CommandBuilder) | ||
putMember("ParameterBuilder", ParameterBuilder) | ||
// -> Minecraft API | ||
// todo: test if this works | ||
putMember("Vec3i", Vec3i::class.java) | ||
putMember("BlockPos", BlockPos::class.java) | ||
putMember("Hand", Hand::class.java) | ||
|
||
// Variable bindings | ||
putMember("mc", mc) | ||
putMember("client", JsClient) | ||
putMember("api", JsApiProvider) | ||
} | ||
|
||
/** | ||
* A collection of useful rotation utilities for the ScriptAPI. | ||
* This SHOULD not be changed in a way that breaks backwards compatibility. | ||
* | ||
* This is a singleton object, so it can be accessed from the script API like this: | ||
* ```js | ||
* api.rotationUtil.newRaytracedRotationEntity(entity, 4.2, 0.0) | ||
* api.rotationUtil.newRotationEntity(entity) | ||
* api.rotationUtil.aimAtRotation(rotation, true) | ||
* ``` | ||
*/ | ||
@JvmField | ||
val rotationUtil = JsRotationUtil | ||
|
||
/** | ||
* Object used by the script API to provide an idiomatic way of creating module values. | ||
*/ | ||
@JvmField | ||
val itemUtil = JsItemUtil | ||
|
||
@JvmField | ||
val networkUtil = JsNetworkUtil | ||
|
||
@JvmField | ||
val interactionUtil = JsInteractionUtil | ||
|
||
@JvmField | ||
val blockUtil = JsBlockUtil | ||
|
||
@JvmField | ||
val reflectionUtil = JsReflectionUtil | ||
|
||
@JvmField | ||
val movementUtil = JsMovementUtil | ||
|
||
} |
24 changes: 24 additions & 0 deletions
24
src/main/kotlin/net/ccbluex/liquidbounce/script/bindings/api/JsBlockUtil.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
package net.ccbluex.liquidbounce.script.bindings.api | ||
|
||
import net.ccbluex.liquidbounce.utils.block.getBlock | ||
import net.ccbluex.liquidbounce.utils.block.getState | ||
import net.ccbluex.liquidbounce.utils.item.createItem | ||
import net.minecraft.block.BlockState | ||
import net.minecraft.item.ItemStack | ||
import net.minecraft.util.math.BlockPos | ||
|
||
/** | ||
* Object used by the script API to provide an | ||
*/ | ||
object JsBlockUtil { | ||
|
||
@JvmName("newBlockPos") | ||
fun newBlockPos(x: Int, y: Int, z: Int): BlockPos = BlockPos(x, y, z) | ||
|
||
@JvmName("toBlock") | ||
fun toBlock(blockPos: BlockPos) = blockPos.getBlock() | ||
|
||
@JvmName("toState") | ||
fun toState(blockPos: BlockPos): BlockState? = blockPos.getState() | ||
|
||
} |
Oops, something went wrong.