mirror of
https://codeberg.org/moonleay/Gimbal.git
synced 2024-11-25 22:22:10 +00:00
feat: added basic groundwork for modes and modifier, added Replace Mode
This commit is contained in:
parent
a81900c6e8
commit
05db012b85
21 changed files with 579 additions and 0 deletions
|
@ -0,0 +1,78 @@
|
||||||
|
package net.moonleay.mods.gimble.client.editor
|
||||||
|
|
||||||
|
import net.minecraft.client.MinecraftClient
|
||||||
|
import net.moonleay.mods.gimble.client.util.ChatUtil
|
||||||
|
import net.moonleay.mods.gimble.client.editor.modes.Mode
|
||||||
|
import net.moonleay.mods.gimble.client.editor.modes.ModeModifier
|
||||||
|
|
||||||
|
object Editor {
|
||||||
|
var CURRENT_MODE = Mode.NORMAL
|
||||||
|
val CURRENT_MODE_MODIFIER = mutableListOf<ModeModifier>()
|
||||||
|
private val TEMP_DISABLED_MODIFIERS = mutableListOf<ModeModifier>()
|
||||||
|
|
||||||
|
|
||||||
|
fun toggleModifier(mod: ModeModifier) {
|
||||||
|
if (CURRENT_MODE.incompatibleModifiers.contains(mod)){
|
||||||
|
if (TEMP_DISABLED_MODIFIERS.contains(mod))
|
||||||
|
TEMP_DISABLED_MODIFIERS.remove(mod)
|
||||||
|
else
|
||||||
|
TEMP_DISABLED_MODIFIERS.add(mod)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (CURRENT_MODE_MODIFIER.contains(mod))
|
||||||
|
CURRENT_MODE_MODIFIER.remove(mod)
|
||||||
|
else
|
||||||
|
CURRENT_MODE_MODIFIER.add(mod)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.onModifiersUpdated()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun onModifiersUpdated() {
|
||||||
|
CURRENT_MODE_MODIFIER.sort()
|
||||||
|
this.checkForIncompatibleModeModifiers()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun checkForIncompatibleModeModifiers() {
|
||||||
|
if (TEMP_DISABLED_MODIFIERS.size > 0) {
|
||||||
|
CURRENT_MODE_MODIFIER.addAll(TEMP_DISABLED_MODIFIERS)
|
||||||
|
TEMP_DISABLED_MODIFIERS.clear()
|
||||||
|
}
|
||||||
|
|
||||||
|
val incompatibleModeModifiers = CURRENT_MODE.incompatibleModifiers
|
||||||
|
for (mod in CURRENT_MODE_MODIFIER) {
|
||||||
|
if (incompatibleModeModifiers.contains(mod)) {
|
||||||
|
TEMP_DISABLED_MODIFIERS.add(mod)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (mod in TEMP_DISABLED_MODIFIERS) {
|
||||||
|
if (CURRENT_MODE_MODIFIER.contains(mod)) { // This check is probably useless.
|
||||||
|
CURRENT_MODE_MODIFIER.remove(mod)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(TEMP_DISABLED_MODIFIERS.isNotEmpty()) {
|
||||||
|
ChatUtil.addToChatHistory("The following modifiers are not supported by this editor mode and are therefore currently disabled: " +
|
||||||
|
this.getListAsString(TEMP_DISABLED_MODIFIERS), MinecraftClient.getInstance())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getListAsString(list: List<ModeModifier>): String{
|
||||||
|
if(list.isEmpty())
|
||||||
|
return "Empty list"
|
||||||
|
val sb = StringBuilder()
|
||||||
|
for (mod in list) {
|
||||||
|
sb.append(mod.displayName)
|
||||||
|
sb.append(" ")
|
||||||
|
}
|
||||||
|
return sb.toString().dropLast(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getCurrentMode(): Mode {
|
||||||
|
return CURRENT_MODE
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getCurrentModifier(): List<ModeModifier> {
|
||||||
|
return CURRENT_MODE_MODIFIER
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
package net.moonleay.mods.gimble.client.editor.modes
|
||||||
|
|
||||||
|
enum class Mode(val displayName: String, val color: Int, val incompatibleModifiers: List<ModeModifier>){
|
||||||
|
NORMAL("NORMAL", 0x90a959, listOf(ModeModifier.NO_UPDATES, ModeModifier.BULLDOZER, ModeModifier.FORCE_PLACE)), // Do nothing
|
||||||
|
INSERT("INSERT", 0xf4bf75, listOf()), // Place and break blocks
|
||||||
|
REPLACE("REPLACE", 0xac4242, listOf()), // Replace blocks
|
||||||
|
VISUAL("VISUAL", 0x6a9fb5, listOf(ModeModifier.BULLDOZER)), // Do fancy stuff with WE
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package net.moonleay.mods.gimble.client.editor.modes
|
||||||
|
|
||||||
|
enum class ModeModifier(val displayName: String) {
|
||||||
|
// NONE("None"), // No Modifiers - default behavior
|
||||||
|
NO_UPDATES("NO UPDATES"), // Do not update blocks when placing
|
||||||
|
BULLDOZER("BULLDOZER"), // Break blocks fast
|
||||||
|
FORCE_PLACE("FORCE"), // Ignore block placement restrictions
|
||||||
|
NO_CLIP("NO CLIP"), // Do not collide with blocks
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package net.moonleay.mods.gimble.client.keybindings
|
||||||
|
|
||||||
|
import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl
|
||||||
|
import net.minecraft.client.MinecraftClient
|
||||||
|
import net.minecraft.client.option.KeyBinding
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.GimbleShortcut
|
||||||
|
|
||||||
|
object KeybindingManager {
|
||||||
|
|
||||||
|
private val shortcuts = mutableListOf<GimbleShortcut>()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a shortcut. This will also register the keybinding.
|
||||||
|
* */
|
||||||
|
fun registerShortcut(shortcut: GimbleShortcut) {
|
||||||
|
shortcuts.add(shortcut)
|
||||||
|
KeyBindingRegistryImpl.registerKeyBinding(shortcut.keyBinding)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun onClientTick(client: MinecraftClient){
|
||||||
|
// Sadly, this cannot be done without iterating over all shortcuts :madge:
|
||||||
|
for (shortcut in shortcuts)
|
||||||
|
if (shortcut.keyBinding.wasPressed())
|
||||||
|
shortcut.onPressed(client)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,110 @@
|
||||||
|
package net.moonleay.mods.gimble.client.keybindings
|
||||||
|
|
||||||
|
import net.minecraft.client.option.KeyBinding
|
||||||
|
import net.minecraft.client.util.InputUtil
|
||||||
|
import net.moonleay.mods.gimble.build.BuildConstants
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.editormode.EnableInsertModeShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.editormode.EnableReplaceModeShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.editormode.EnableVisualModeShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.editormodemodifier.ToggleBulldozerModifierShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.editormodemodifier.ToggleForcePlaceModifierShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.editormodemodifier.ToggleNoClipModifierShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.editormodemodifier.ToggleNoUpdatesModifierShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.gamemode.CreativeModeShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.gamemode.SpectatorModeShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.gamemode.SurvivalModeShortcut
|
||||||
|
import org.apache.logging.log4j.LogManager
|
||||||
|
import org.lwjgl.glfw.GLFW
|
||||||
|
|
||||||
|
object KeybindingRegistrar {
|
||||||
|
|
||||||
|
private val LOGGER = LogManager.getLogger(BuildConstants.modName)
|
||||||
|
|
||||||
|
fun registerKeybindings() {
|
||||||
|
LOGGER.info("Registering keybindings...")
|
||||||
|
registerSetGameModeKeybindings()
|
||||||
|
registerSetEditorModeKeybindings()
|
||||||
|
registerSetEditorModeModifierKeybindings()
|
||||||
|
LOGGER.info("Keybindings have been registered.")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun registerSetEditorModeModifierKeybindings() {
|
||||||
|
val toggleBulldozerModifierShortcut = KeyBinding(
|
||||||
|
"gimble.key.editor.modifier.bulldozer",
|
||||||
|
InputUtil.Type.KEYSYM,
|
||||||
|
GLFW.GLFW_KEY_B,
|
||||||
|
"category.gimble.editormodifier"
|
||||||
|
)
|
||||||
|
val toggleForcePlaceModifierShortcut = KeyBinding(
|
||||||
|
"gimble.key.editor.modifier.forceplace",
|
||||||
|
InputUtil.Type.KEYSYM,
|
||||||
|
GLFW.GLFW_KEY_F,
|
||||||
|
"category.gimble.editormodifier"
|
||||||
|
)
|
||||||
|
val toggleNoUpdatesModifierShortcut = KeyBinding(
|
||||||
|
"gimble.key.editor.modifier.noupdates",
|
||||||
|
InputUtil.Type.KEYSYM,
|
||||||
|
GLFW.GLFW_KEY_N,
|
||||||
|
"category.gimble.editormodifier"
|
||||||
|
)
|
||||||
|
val toggleNoClipModifierShortcut = KeyBinding(
|
||||||
|
"gimble.key.editor.modifier.noclip",
|
||||||
|
InputUtil.Type.KEYSYM,
|
||||||
|
GLFW.GLFW_KEY_C,
|
||||||
|
"category.gimble.editormodifier"
|
||||||
|
)
|
||||||
|
|
||||||
|
KeybindingManager.registerShortcut(ToggleBulldozerModifierShortcut(toggleBulldozerModifierShortcut))
|
||||||
|
KeybindingManager.registerShortcut(ToggleForcePlaceModifierShortcut(toggleForcePlaceModifierShortcut))
|
||||||
|
KeybindingManager.registerShortcut(ToggleNoUpdatesModifierShortcut(toggleNoUpdatesModifierShortcut))
|
||||||
|
KeybindingManager.registerShortcut(ToggleNoClipModifierShortcut(toggleNoClipModifierShortcut))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun registerSetEditorModeKeybindings() {
|
||||||
|
val insertKeyBinding = KeyBinding(
|
||||||
|
"gimble.key.editor.mode.insert",
|
||||||
|
InputUtil.Type.KEYSYM,
|
||||||
|
GLFW.GLFW_KEY_I,
|
||||||
|
"category.gimble.editormode"
|
||||||
|
)
|
||||||
|
val replaceKeyBinding = KeyBinding(
|
||||||
|
"gimble.key.editor.mode.replace",
|
||||||
|
InputUtil.Type.KEYSYM,
|
||||||
|
GLFW.GLFW_KEY_R,
|
||||||
|
"category.gimble.editormode"
|
||||||
|
)
|
||||||
|
val visualKeyBinding = KeyBinding(
|
||||||
|
"gimble.key.editor.mode.visual",
|
||||||
|
InputUtil.Type.KEYSYM,
|
||||||
|
GLFW.GLFW_KEY_V,
|
||||||
|
"category.gimble.editormode"
|
||||||
|
)
|
||||||
|
KeybindingManager.registerShortcut(EnableInsertModeShortcut(insertKeyBinding))
|
||||||
|
KeybindingManager.registerShortcut(EnableReplaceModeShortcut(replaceKeyBinding))
|
||||||
|
KeybindingManager.registerShortcut(EnableVisualModeShortcut(visualKeyBinding))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun registerSetGameModeKeybindings() {
|
||||||
|
val survivalKeyBinding = KeyBinding(
|
||||||
|
"gimble.key.game.mode.survival",
|
||||||
|
InputUtil.Type.KEYSYM,
|
||||||
|
GLFW.GLFW_KEY_UNKNOWN,
|
||||||
|
"category.gimble.gamemode"
|
||||||
|
)
|
||||||
|
val creativeKeyBinding = KeyBinding(
|
||||||
|
"gimble.key.game.mode.creative",
|
||||||
|
InputUtil.Type.KEYSYM,
|
||||||
|
GLFW.GLFW_KEY_UNKNOWN,
|
||||||
|
"category.gimble.gamemode"
|
||||||
|
)
|
||||||
|
val spectatorKeyBinding = KeyBinding(
|
||||||
|
"gimble.key.game.mode.spectator",
|
||||||
|
InputUtil.Type.KEYSYM,
|
||||||
|
GLFW.GLFW_KEY_UNKNOWN,
|
||||||
|
"category.gimble.gamemode"
|
||||||
|
)
|
||||||
|
KeybindingManager.registerShortcut(SurvivalModeShortcut(survivalKeyBinding))
|
||||||
|
KeybindingManager.registerShortcut(CreativeModeShortcut(creativeKeyBinding))
|
||||||
|
KeybindingManager.registerShortcut(SpectatorModeShortcut(spectatorKeyBinding))
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package net.moonleay.mods.gimble.client.keybindings.impl
|
||||||
|
|
||||||
|
import net.minecraft.client.MinecraftClient
|
||||||
|
import net.minecraft.client.option.KeyBinding
|
||||||
|
|
||||||
|
abstract class GimbleShortcut(val keyBinding: KeyBinding) {
|
||||||
|
|
||||||
|
abstract fun onPressed(client: MinecraftClient)
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package net.moonleay.mods.gimble.client.keybindings.impl.editormode
|
||||||
|
|
||||||
|
import net.minecraft.client.MinecraftClient
|
||||||
|
import net.minecraft.client.option.KeyBinding
|
||||||
|
import net.moonleay.mods.gimble.client.editor.Editor
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.GimbleShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.editor.modes.Mode
|
||||||
|
|
||||||
|
|
||||||
|
class EnableInsertModeShortcut(key: KeyBinding): GimbleShortcut(key) {
|
||||||
|
override fun onPressed(client: MinecraftClient) {
|
||||||
|
Editor.CURRENT_MODE = Mode.INSERT
|
||||||
|
|
||||||
|
Editor.checkForIncompatibleModeModifiers()
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package net.moonleay.mods.gimble.client.keybindings.impl.editormode
|
||||||
|
|
||||||
|
import net.minecraft.client.MinecraftClient
|
||||||
|
import net.minecraft.client.option.KeyBinding
|
||||||
|
import net.moonleay.mods.gimble.client.editor.Editor
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.GimbleShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.editor.modes.Mode
|
||||||
|
|
||||||
|
|
||||||
|
class EnableReplaceModeShortcut(key: KeyBinding): GimbleShortcut(key) {
|
||||||
|
override fun onPressed(client: MinecraftClient) {
|
||||||
|
Editor.CURRENT_MODE = Mode.REPLACE
|
||||||
|
|
||||||
|
Editor.checkForIncompatibleModeModifiers()
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package net.moonleay.mods.gimble.client.keybindings.impl.editormode
|
||||||
|
|
||||||
|
import net.minecraft.client.MinecraftClient
|
||||||
|
import net.minecraft.client.option.KeyBinding
|
||||||
|
import net.moonleay.mods.gimble.client.editor.Editor
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.GimbleShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.editor.modes.Mode
|
||||||
|
|
||||||
|
|
||||||
|
class EnableVisualModeShortcut(key: KeyBinding): GimbleShortcut(key) {
|
||||||
|
override fun onPressed(client: MinecraftClient) {
|
||||||
|
Editor.CURRENT_MODE = Mode.VISUAL
|
||||||
|
|
||||||
|
Editor.checkForIncompatibleModeModifiers()
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package net.moonleay.mods.gimble.client.keybindings.impl.editormodemodifier
|
||||||
|
|
||||||
|
import net.minecraft.client.MinecraftClient
|
||||||
|
import net.minecraft.client.option.KeyBinding
|
||||||
|
import net.moonleay.mods.gimble.client.editor.Editor
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.GimbleShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.editor.modes.ModeModifier
|
||||||
|
|
||||||
|
class ToggleBulldozerModifierShortcut(key: KeyBinding): GimbleShortcut(key) {
|
||||||
|
override fun onPressed(client: MinecraftClient) {
|
||||||
|
Editor.toggleModifier(ModeModifier.BULLDOZER)
|
||||||
|
|
||||||
|
Editor.onModifiersUpdated()
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package net.moonleay.mods.gimble.client.keybindings.impl.editormodemodifier
|
||||||
|
|
||||||
|
import net.minecraft.client.MinecraftClient
|
||||||
|
import net.minecraft.client.option.KeyBinding
|
||||||
|
import net.moonleay.mods.gimble.client.editor.Editor
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.GimbleShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.editor.modes.ModeModifier
|
||||||
|
|
||||||
|
class ToggleForcePlaceModifierShortcut(key: KeyBinding): GimbleShortcut(key) {
|
||||||
|
override fun onPressed(client: MinecraftClient) {
|
||||||
|
Editor.toggleModifier(ModeModifier.FORCE_PLACE)
|
||||||
|
|
||||||
|
Editor.onModifiersUpdated()
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package net.moonleay.mods.gimble.client.keybindings.impl.editormodemodifier
|
||||||
|
|
||||||
|
import net.minecraft.client.MinecraftClient
|
||||||
|
import net.minecraft.client.option.KeyBinding
|
||||||
|
import net.moonleay.mods.gimble.client.editor.Editor
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.GimbleShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.editor.modes.ModeModifier
|
||||||
|
|
||||||
|
class ToggleNoClipModifierShortcut(key: KeyBinding): GimbleShortcut(key) {
|
||||||
|
override fun onPressed(client: MinecraftClient) {
|
||||||
|
Editor.toggleModifier(ModeModifier.NO_CLIP)
|
||||||
|
|
||||||
|
Editor.onModifiersUpdated()
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package net.moonleay.mods.gimble.client.keybindings.impl.editormodemodifier
|
||||||
|
|
||||||
|
import net.minecraft.client.MinecraftClient
|
||||||
|
import net.minecraft.client.option.KeyBinding
|
||||||
|
import net.moonleay.mods.gimble.client.editor.Editor
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.GimbleShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.editor.modes.ModeModifier
|
||||||
|
|
||||||
|
class ToggleNoUpdatesModifierShortcut(key: KeyBinding): GimbleShortcut(key) {
|
||||||
|
override fun onPressed(client: MinecraftClient) {
|
||||||
|
Editor.toggleModifier(ModeModifier.NO_UPDATES)
|
||||||
|
|
||||||
|
Editor.onModifiersUpdated()
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package net.moonleay.mods.gimble.client.keybindings.impl.gamemode
|
||||||
|
|
||||||
|
import net.minecraft.client.MinecraftClient
|
||||||
|
import net.minecraft.client.option.KeyBinding
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.GimbleShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.util.ChatUtil
|
||||||
|
|
||||||
|
class CreativeModeShortcut(key: KeyBinding): GimbleShortcut(key) {
|
||||||
|
override fun onPressed(client: MinecraftClient) {
|
||||||
|
ChatUtil.sendCommand("/gamemode creative", client, false)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package net.moonleay.mods.gimble.client.keybindings.impl.gamemode
|
||||||
|
|
||||||
|
import net.minecraft.client.MinecraftClient
|
||||||
|
import net.minecraft.client.option.KeyBinding
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.GimbleShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.util.ChatUtil
|
||||||
|
|
||||||
|
class SpectatorModeShortcut(key: KeyBinding): GimbleShortcut(key) {
|
||||||
|
override fun onPressed(client: MinecraftClient) {
|
||||||
|
ChatUtil.sendCommand("/gamemode spectator", client, false)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package net.moonleay.mods.gimble.client.keybindings.impl.gamemode
|
||||||
|
|
||||||
|
import net.minecraft.client.MinecraftClient
|
||||||
|
import net.minecraft.client.option.KeyBinding
|
||||||
|
import net.moonleay.mods.gimble.client.keybindings.impl.GimbleShortcut
|
||||||
|
import net.moonleay.mods.gimble.client.util.ChatUtil
|
||||||
|
|
||||||
|
|
||||||
|
class SurvivalModeShortcut(key: KeyBinding) : GimbleShortcut(key) {
|
||||||
|
|
||||||
|
override fun onPressed(client: MinecraftClient) {
|
||||||
|
ChatUtil.sendCommand("/gamemode survival", client, false)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
package net.moonleay.mods.gimble.client.util
|
||||||
|
|
||||||
|
import net.minecraft.client.MinecraftClient
|
||||||
|
import net.minecraft.text.Text
|
||||||
|
|
||||||
|
object ChatUtil {
|
||||||
|
/**
|
||||||
|
* Note: command arg should contain "/" at the beginning.
|
||||||
|
* */
|
||||||
|
fun sendCommand(command: String, client: MinecraftClient, addToHistory: Boolean = true): Boolean {
|
||||||
|
if (addToHistory) {
|
||||||
|
client.inGameHud.chatHud.addToMessageHistory(command)
|
||||||
|
}
|
||||||
|
return client.player?.sendCommand(command.substring(1))?: false
|
||||||
|
}
|
||||||
|
|
||||||
|
fun addToChatHistory(message: String, client: MinecraftClient) {
|
||||||
|
client.inGameHud.chatHud.addMessage(Text.of(message))
|
||||||
|
}
|
||||||
|
}
|
66
src/main/java/net/moonleay/mods/gimble/mixin/HudMixin.java
Normal file
66
src/main/java/net/moonleay/mods/gimble/mixin/HudMixin.java
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
package net.moonleay.mods.gimble.mixin;
|
||||||
|
|
||||||
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
import net.minecraft.client.font.TextRenderer;
|
||||||
|
import net.minecraft.client.gui.hud.InGameHud;
|
||||||
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.moonleay.mods.gimble.client.editor.Editor;
|
||||||
|
import net.moonleay.mods.gimble.client.editor.modes.Mode;
|
||||||
|
import net.moonleay.mods.gimble.client.editor.modes.ModeModifier;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.spongepowered.asm.mixin.Final;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Mixin(InGameHud.class)
|
||||||
|
public class HudMixin {
|
||||||
|
|
||||||
|
@Shadow @Final private MinecraftClient client;
|
||||||
|
|
||||||
|
@Inject(method = "renderStatusEffectOverlay", at = @At("HEAD"))
|
||||||
|
private void render(MatrixStack matrices, CallbackInfo ci) {
|
||||||
|
Mode currentMode = Editor.INSTANCE.getCurrentMode();
|
||||||
|
StringBuilder displayText = getStringBuilder(currentMode);
|
||||||
|
|
||||||
|
MinecraftClient mc = MinecraftClient.getInstance();
|
||||||
|
TextRenderer tr = mc.textRenderer;
|
||||||
|
// int screenWidth = mc.getWindow().getWidth();
|
||||||
|
// int screenHeight = mc.getWindow().getHeight();
|
||||||
|
// int scale = (mc.options.getGuiScale().getValue() == 0 ? 1 : mc.options.getGuiScale().getValue());
|
||||||
|
// int bottomY = screenHeight / scale - 4 - tr.fontHeight - 12;
|
||||||
|
|
||||||
|
tr.drawWithShadow(matrices,
|
||||||
|
Text.of(displayText.toString()),
|
||||||
|
4, 4,
|
||||||
|
currentMode.getColor());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Unique
|
||||||
|
private static @NotNull StringBuilder getStringBuilder(Mode currentMode) {
|
||||||
|
List<ModeModifier> currentModifier = Editor.INSTANCE.getCurrentModifier();
|
||||||
|
StringBuilder displayText = new StringBuilder(currentMode.getDisplayName());
|
||||||
|
if (!currentModifier.isEmpty()) {
|
||||||
|
displayText.append(" [");
|
||||||
|
for (int i = 0; i < currentModifier.size(); i++) {
|
||||||
|
displayText.append(currentModifier.get(i).getDisplayName());
|
||||||
|
if (i != currentModifier.size() - 1) {
|
||||||
|
displayText.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
displayText.append("]");
|
||||||
|
}
|
||||||
|
return displayText;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Unique
|
||||||
|
private int getXRight(String txt, int screenWidth) {
|
||||||
|
return screenWidth / (MinecraftClient.getInstance().options.getGuiScale().getValue() == 0 ? 1 : MinecraftClient.getInstance().options.getGuiScale().getValue()) - 4 - MinecraftClient.getInstance().textRenderer.getWidth(Text.of(txt));
|
||||||
|
}
|
||||||
|
}
|
16
src/main/java/net/moonleay/mods/gimble/mixin/KeyMixin.java
Normal file
16
src/main/java/net/moonleay/mods/gimble/mixin/KeyMixin.java
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
package net.moonleay.mods.gimble.mixin;
|
||||||
|
|
||||||
|
import net.minecraft.client.Keyboard;
|
||||||
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
@Mixin(Keyboard.class)
|
||||||
|
public class KeyMixin {
|
||||||
|
// This Mixin is not registered. This will be used to handle key events with static Buttons.
|
||||||
|
@Inject(method = "onKey", at = @At("TAIL"))
|
||||||
|
private void onKey(long window, int key, int scancode, int action, int modifiers, CallbackInfo ci) {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package net.moonleay.mods.gimble.mixin;
|
||||||
|
|
||||||
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
import net.moonleay.mods.gimble.client.editor.Editor;
|
||||||
|
import net.moonleay.mods.gimble.client.editor.modes.Mode;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
@Mixin(MinecraftClient.class)
|
||||||
|
public class NormalModeMixin {
|
||||||
|
|
||||||
|
@Inject(method = "openPauseMenu", at = @At("HEAD"), cancellable = true)
|
||||||
|
private void setNormalMode(boolean pause, CallbackInfo ci) {
|
||||||
|
if (Editor.INSTANCE.getCURRENT_MODE() != Mode.NORMAL){
|
||||||
|
// Set the editor mode to normal
|
||||||
|
Editor.INSTANCE.setCURRENT_MODE(Mode.NORMAL);
|
||||||
|
Editor.INSTANCE.checkForIncompatibleModeModifiers();
|
||||||
|
ci.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
package net.moonleay.mods.gimble.mixin;
|
||||||
|
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
import net.minecraft.client.network.ClientPlayerEntity;
|
||||||
|
import net.minecraft.client.network.ClientPlayerInteractionManager;
|
||||||
|
import net.minecraft.client.particle.ParticleManager;
|
||||||
|
import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket;
|
||||||
|
import net.minecraft.util.Hand;
|
||||||
|
import net.minecraft.util.hit.BlockHitResult;
|
||||||
|
import net.minecraft.util.hit.HitResult;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
|
import net.moonleay.mods.gimble.client.editor.Editor;
|
||||||
|
import net.moonleay.mods.gimble.client.editor.modes.Mode;
|
||||||
|
import net.moonleay.mods.gimble.client.util.ChatUtil;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.spongepowered.asm.mixin.Final;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
@Mixin(MinecraftClient.class)
|
||||||
|
public abstract class ReplaceModeMixin {
|
||||||
|
|
||||||
|
|
||||||
|
@Shadow protected abstract void handleBlockBreaking(boolean breaking);
|
||||||
|
|
||||||
|
@Shadow @Nullable public ClientPlayerInteractionManager interactionManager;
|
||||||
|
|
||||||
|
@Shadow @Final public ParticleManager particleManager;
|
||||||
|
|
||||||
|
@Shadow @Nullable public ClientPlayerEntity player;
|
||||||
|
|
||||||
|
@Shadow @Nullable public HitResult crosshairTarget;
|
||||||
|
|
||||||
|
@Inject(method = "doItemUse", at = @At("HEAD"))
|
||||||
|
private void replaceBlock(CallbackInfo ci) {
|
||||||
|
// Check if should run
|
||||||
|
if (!Editor.INSTANCE.getCURRENT_MODE().equals(Mode.REPLACE))
|
||||||
|
return; // Mode is not REPLACE, ignore
|
||||||
|
MinecraftClient client = MinecraftClient.getInstance();
|
||||||
|
assert this.interactionManager != null;
|
||||||
|
if (!this.interactionManager.getCurrentGameMode().isCreative())
|
||||||
|
return;
|
||||||
|
if (!(this.crosshairTarget instanceof BlockHitResult))
|
||||||
|
return;
|
||||||
|
BlockHitResult blockHitResult = (BlockHitResult)this.crosshairTarget;
|
||||||
|
if (blockHitResult == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Gather data
|
||||||
|
BlockPos pos = blockHitResult.getBlockPos();
|
||||||
|
Direction direction = blockHitResult.getSide();
|
||||||
|
BlockState blockState = client.world.getBlockState(pos);
|
||||||
|
|
||||||
|
// Start sending shit
|
||||||
|
client.getTutorialManager().onBlockBreaking(client.world, pos, blockState, 1.0F);
|
||||||
|
this.interactionManager.sendSequencedPacket(client.world, sequence -> {
|
||||||
|
this.interactionManager.breakBlock(pos);
|
||||||
|
return new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, pos, direction, sequence);
|
||||||
|
});
|
||||||
|
this.player.swingHand(Hand.MAIN_HAND);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue