feat: added "basic" functionality
This commit is contained in:
parent
09cdba403a
commit
7664589f56
36 changed files with 1391 additions and 0 deletions
55
src/main/java/net/moonleay/etaorion/client/ClientMain.kt
Normal file
55
src/main/java/net/moonleay/etaorion/client/ClientMain.kt
Normal file
|
@ -0,0 +1,55 @@
|
|||
package net.moonleay.etaorion.client
|
||||
|
||||
import net.fabricmc.api.ClientModInitializer
|
||||
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents
|
||||
import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl
|
||||
import net.minecraft.client.MinecraftClient
|
||||
import net.minecraft.client.option.KeyBinding
|
||||
import net.minecraft.client.util.InputUtil
|
||||
import net.moonleay.etaorion.build.BuildConstants
|
||||
import net.moonleay.etaorion.client.autotext.AutoTextManager
|
||||
import net.moonleay.etaorion.client.autotext.EOKeyBinding
|
||||
import net.moonleay.etaorion.client.autotext.KeyBindingManager
|
||||
import net.moonleay.etaorion.client.modules.component.ModuleManager
|
||||
import net.moonleay.etaorion.client.modules.component.listener.EndTickListener
|
||||
import net.moonleay.etaorion.config.AutoTextConfig
|
||||
import org.apache.logging.log4j.LogManager
|
||||
import org.lwjgl.glfw.GLFW
|
||||
|
||||
internal object ClientMain : ClientModInitializer {
|
||||
private val lgr = LogManager.getLogger(BuildConstants.modName)
|
||||
|
||||
override fun onInitializeClient() {
|
||||
lgr.info("Starting Eta Orion")
|
||||
lgr.info("Registering Modules")
|
||||
ModuleManager.registerModules()
|
||||
|
||||
ClientTickEvents.END_CLIENT_TICK.register(EndTickListener())
|
||||
lgr.info("Registered EndTickListener #1/2")
|
||||
ClientTickEvents.END_CLIENT_TICK.register(ClientTickEvents.EndTick { client: MinecraftClient? ->
|
||||
AutoTextManager.onClientTick(client!!)
|
||||
})
|
||||
lgr.info("Registered EndTickListener #2/2")
|
||||
|
||||
for(i in 0 .. 9){
|
||||
val keyBinding: KeyBinding = KeyBinding(
|
||||
"etaorion.key_binding_$i",
|
||||
InputUtil.Type.KEYSYM,
|
||||
GLFW.GLFW_KEY_UNKNOWN,
|
||||
"category.etaorion.autotext"
|
||||
)
|
||||
KeyBindingManager.add(EOKeyBinding(keyBinding, i, false))
|
||||
KeyBindingRegistryImpl.registerKeyBinding(keyBinding)
|
||||
val autoText = AutoTextConfig.load(i)
|
||||
if(autoText == null){
|
||||
lgr.info("AutoText with index $i is null.")
|
||||
continue
|
||||
}
|
||||
AutoTextManager.registerNewAutoTxtObject(autoText)
|
||||
}
|
||||
|
||||
lgr.info("Registerd all keys")
|
||||
lgr.info("EtaOrionFabric has been initialized")
|
||||
lgr.info("Eta Orion Ver.${BuildConstants.modVersion}.")
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package net.moonleay.etaorion.client.autotext
|
||||
|
||||
import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl
|
||||
import net.minecraft.client.MinecraftClient
|
||||
import net.minecraft.client.option.KeyBinding
|
||||
import net.minecraft.client.util.InputUtil
|
||||
import net.minecraft.text.Text
|
||||
import net.moonleay.etaorion.mixin.KeyBindingRegistryImplAccessor
|
||||
import net.moonleay.etaorion.util.KeyBindingManagement
|
||||
import org.lwjgl.glfw.GLFW
|
||||
|
||||
class AutoText(val textToSend: String, val eoKeyBinding: EOKeyBinding) {
|
||||
//Text.translatable("etaorion.key_binding_1", textToSend)
|
||||
|
||||
fun sendMessage(client: MinecraftClient, addToHistory: Boolean){
|
||||
if (addToHistory) {
|
||||
client.inGameHud.chatHud.addToMessageHistory(textToSend)
|
||||
}
|
||||
if (textToSend.startsWith("/")) {
|
||||
client.player?.networkHandler?.sendChatCommand(textToSend.substring(1))
|
||||
} else {
|
||||
client.player?.networkHandler?.sendChatMessage(textToSend)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
package net.moonleay.etaorion.client.autotext
|
||||
|
||||
import net.minecraft.client.MinecraftClient
|
||||
import net.moonleay.etaorion.config.AutoTextConfig
|
||||
|
||||
object AutoTextManager {
|
||||
val autoTextObjects: MutableList<AutoText> = mutableListOf()
|
||||
|
||||
fun registerNewAutoTxtObject(autoText: AutoText): Boolean {
|
||||
if(autoTextObjects.size >= 10){
|
||||
return false
|
||||
}
|
||||
autoTextObjects.add(autoText)
|
||||
return true
|
||||
}
|
||||
|
||||
fun unregisterAutoTextObject(index: Int){
|
||||
AutoTextConfig.delete(index)
|
||||
KeyBindingManager.cancelKeyBinding(autoTextObjects[index].eoKeyBinding)
|
||||
autoTextObjects.removeAt(index)
|
||||
}
|
||||
|
||||
fun unregisterAutoTextObject(autoText: AutoText){
|
||||
KeyBindingManager.cancelKeyBinding(autoText.eoKeyBinding)
|
||||
autoTextObjects.remove(autoText)
|
||||
}
|
||||
|
||||
fun onClientTick(client: MinecraftClient){
|
||||
for(o in autoTextObjects){
|
||||
while(o.eoKeyBinding.keyBinding.wasPressed()){
|
||||
o.sendMessage(client, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
package net.moonleay.etaorion.client.autotext
|
||||
|
||||
import net.minecraft.client.option.KeyBinding
|
||||
|
||||
data class EOKeyBinding (var keyBinding: KeyBinding,
|
||||
var index: Int,
|
||||
var isInUse: Boolean = false,
|
||||
)
|
|
@ -0,0 +1,53 @@
|
|||
package net.moonleay.etaorion.client.autotext
|
||||
|
||||
import org.apache.logging.log4j.LogManager
|
||||
import org.apache.logging.log4j.Logger
|
||||
|
||||
object KeyBindingManager {
|
||||
private val lgr: Logger = LogManager.getLogger(KeyBindingManager::class.java)
|
||||
|
||||
private var keyBindings: MutableList<EOKeyBinding> = mutableListOf()
|
||||
|
||||
fun add(keyBinding: EOKeyBinding) {
|
||||
if(keyBindings.size >= 10){
|
||||
lgr.info("Too many key bindings!")
|
||||
return
|
||||
}
|
||||
keyBindings += keyBinding
|
||||
}
|
||||
|
||||
fun bookWithIndex(index: Int): EOKeyBinding?{
|
||||
for(keyBinding in keyBindings){
|
||||
if(keyBinding.index == index){
|
||||
if(keyBinding.isInUse)
|
||||
return null
|
||||
keyBinding.isInUse = true
|
||||
return keyBinding
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
private fun getFree(): EOKeyBinding? {
|
||||
for(keyBinding in keyBindings){
|
||||
if(!keyBinding.isInUse){
|
||||
lgr.info("Found free keybinding with index ${keyBinding.index}")
|
||||
return keyBinding
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
fun bookKeyBinding(): EOKeyBinding?{
|
||||
val eoKeyBinding = getFree()?: return null
|
||||
eoKeyBinding.isInUse = true
|
||||
lgr.info("Booked KeyBinding with index ${eoKeyBinding.index}")
|
||||
return eoKeyBinding
|
||||
}
|
||||
|
||||
fun cancelKeyBinding(binding: EOKeyBinding){
|
||||
lgr.info("Cancelled KeyBinding with index ${binding.index}")
|
||||
binding.isInUse = false
|
||||
binding.keyBinding.setBoundKey(binding.keyBinding.defaultKey)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
package net.moonleay.etaorion.client.modules.component
|
||||
|
||||
enum class Category(val Name: String) {
|
||||
MOVEMENT("Movement"),
|
||||
HUD("HUD"),
|
||||
FEEL("Feel"),
|
||||
SYSTEM("System");
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
package net.moonleay.etaorion.client.modules.component
|
||||
|
||||
import net.minecraft.client.MinecraftClient
|
||||
|
||||
|
||||
open class Module(val name: String, val category: Category) {
|
||||
protected val mc = MinecraftClient.getInstance()
|
||||
open var enabled = false
|
||||
open var listIndex = 0
|
||||
|
||||
open fun onTick() {}
|
||||
|
||||
open fun onClientShutdown() {}
|
||||
|
||||
open fun onLoad(enabled: Boolean) {
|
||||
this.enabled = enabled
|
||||
ModuleManager.toggleModule(this, enabled)
|
||||
onToggleEnabled(enabled)
|
||||
}
|
||||
|
||||
open fun updateEnabled(enabled: Boolean) {
|
||||
this.enabled = enabled
|
||||
onToggleEnabled(enabled)
|
||||
}
|
||||
|
||||
open fun onToggleEnabled(enabled: Boolean) {}
|
||||
|
||||
open fun onEventPre() {}
|
||||
}
|
|
@ -0,0 +1,85 @@
|
|||
package net.moonleay.etaorion.client.modules.component
|
||||
|
||||
import net.moonleay.etaorion.client.modules.component.system.AntiFatFinger
|
||||
import net.moonleay.etaorion.client.modules.feel.NoBob
|
||||
import net.moonleay.etaorion.client.modules.hud.*
|
||||
import net.moonleay.etaorion.config.ModuleConfig
|
||||
import org.apache.logging.log4j.LogManager
|
||||
|
||||
object ModuleManager {
|
||||
val lgr = LogManager.getLogger(ModuleManager::class.java)
|
||||
lateinit var modules: ArrayList<Module>
|
||||
var enabledModules = arrayListOf<Module>()
|
||||
var enabledGfxModules = mutableMapOf<Position, ArrayList<MovableModule>>()
|
||||
|
||||
fun registerModules() {
|
||||
modules = arrayListOf<Module>(
|
||||
NoBob(),
|
||||
FPS(),
|
||||
XYZ(),
|
||||
Direction(),
|
||||
AntiFatFinger(),
|
||||
DurabilityMainHand(),
|
||||
DurabilityOffHand(),
|
||||
)
|
||||
lgr.info("Registered ${modules.size} Modules!")
|
||||
|
||||
for (p in Position.values())
|
||||
enabledGfxModules[p] = arrayListOf()
|
||||
|
||||
ModuleConfig.load(modules)
|
||||
lgr.info("Loaded config files")
|
||||
}
|
||||
|
||||
fun toggleModule(module: Module, enabled: Boolean) {
|
||||
if (module is MovableModule) {
|
||||
if (enabled) {
|
||||
val mapOfPosition = enabledGfxModules[module.position] ?: arrayListOf()
|
||||
mapOfPosition.add(module)
|
||||
enabledGfxModules[module.position] = mapOfPosition
|
||||
} else {
|
||||
val mapOfPosition = enabledGfxModules[module.position] ?: return
|
||||
mapOfPosition.remove(module)
|
||||
enabledGfxModules[module.position] = mapOfPosition
|
||||
}
|
||||
} else {
|
||||
if (enabled) {
|
||||
enabledModules.add(module)
|
||||
} else {
|
||||
enabledModules.remove(module)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun updatePositionOfModule(module: MovableModule, oldPosition: Position, targetPosition: Position) {
|
||||
var mapOfPosition = enabledGfxModules[oldPosition] ?: return
|
||||
mapOfPosition.remove(module)
|
||||
enabledGfxModules[oldPosition] = mapOfPosition
|
||||
|
||||
mapOfPosition = enabledGfxModules[targetPosition] ?: arrayListOf()
|
||||
mapOfPosition.add(module)
|
||||
enabledGfxModules[targetPosition] = mapOfPosition
|
||||
}
|
||||
|
||||
fun saveAllModules() {
|
||||
ModuleConfig.save(modules)
|
||||
}
|
||||
|
||||
fun getPositionFromname(name: String): Position {
|
||||
for (p in Position.values()) {
|
||||
if (p.Name == name)
|
||||
return p
|
||||
}
|
||||
return Position.OFF
|
||||
}
|
||||
|
||||
fun getPositionNumberInt(position: Position): Int {
|
||||
var i = 0
|
||||
for (p in Position.values()) {
|
||||
if (p == position)
|
||||
return i
|
||||
++i
|
||||
}
|
||||
return -1
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
package net.moonleay.etaorion.client.modules.component
|
||||
|
||||
object ModuleStorage {
|
||||
var noBobEnabled = false
|
||||
var antiFatFingerEnabled = false
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
package net.moonleay.etaorion.client.modules.component
|
||||
|
||||
import net.minecraft.client.font.TextRenderer
|
||||
import net.minecraft.client.util.math.MatrixStack
|
||||
|
||||
open class MovableModule(
|
||||
name: String,
|
||||
category: Category
|
||||
) : Module(
|
||||
name,
|
||||
category
|
||||
) {
|
||||
var position = Position.OFF
|
||||
|
||||
open fun onRender(matrices: MatrixStack, tr: TextRenderer) {
|
||||
|
||||
}
|
||||
|
||||
open fun onLoadGfx(enabled: Boolean, position: Position) {
|
||||
this.position = position
|
||||
super.onLoad(enabled)
|
||||
}
|
||||
|
||||
open fun updatePosition(newPosition: Position) {
|
||||
if (this.position == Position.OFF && newPosition != Position.OFF)
|
||||
super.updateEnabled(true)
|
||||
this.position = newPosition
|
||||
if (newPosition == Position.OFF)
|
||||
super.updateEnabled(false)
|
||||
|
||||
}
|
||||
|
||||
open fun getText4Render(): String {
|
||||
return "Not set"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package net.moonleay.etaorion.client.modules.component
|
||||
|
||||
enum class Position(val Name: String) {
|
||||
OFF("off"),
|
||||
TOPLEFT("top left"),
|
||||
TOPCENTER("top centered"),
|
||||
TOPRIGHT("top right"),
|
||||
RIGHTCENTER("right centered"),
|
||||
BOTTOMRIGHT("bottom right"),
|
||||
BOTTOMCENTER("bottom center"),
|
||||
BOTTOMLEFT("bottom left"),
|
||||
LEFTCENTER("left centered");
|
||||
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package net.moonleay.etaorion.client.modules.component.listener
|
||||
|
||||
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents
|
||||
import net.minecraft.client.MinecraftClient
|
||||
import net.moonleay.etaorion.client.modules.component.ModuleStorage
|
||||
import java.util.*
|
||||
|
||||
class EndTickListener : ClientTickEvents.EndTick {
|
||||
override fun onEndTick(client: MinecraftClient?) {
|
||||
if (Objects.nonNull(MinecraftClient.getInstance().player) && ModuleStorage.noBobEnabled) {
|
||||
MinecraftClient.getInstance().player!!.horizontalSpeed = 0.0F
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package net.moonleay.etaorion.client.modules.component.system
|
||||
|
||||
import net.moonleay.etaorion.client.modules.component.Category
|
||||
import net.moonleay.etaorion.client.modules.component.Module
|
||||
import net.moonleay.etaorion.client.modules.component.ModuleStorage
|
||||
|
||||
class AntiFatFinger : Module("Anti-Fat-Finger", Category.SYSTEM) {
|
||||
override fun onLoad(enabled: Boolean) {
|
||||
super.onLoad(enabled)
|
||||
ModuleStorage.antiFatFingerEnabled = enabled
|
||||
}
|
||||
|
||||
override fun onToggleEnabled(enabled: Boolean) {
|
||||
ModuleStorage.antiFatFingerEnabled = enabled
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
package net.moonleay.etaorion.client.modules.feel
|
||||
|
||||
import net.moonleay.etaorion.client.modules.component.Category
|
||||
import net.moonleay.etaorion.client.modules.component.Module
|
||||
import net.moonleay.etaorion.client.modules.component.ModuleStorage
|
||||
|
||||
class NoBob : Module("No Bob", Category.FEEL) {
|
||||
|
||||
override fun onLoad(enabled: Boolean) {
|
||||
super.onLoad(enabled)
|
||||
ModuleStorage.noBobEnabled = enabled
|
||||
}
|
||||
|
||||
override fun onToggleEnabled(enabled: Boolean) {
|
||||
ModuleStorage.noBobEnabled = enabled
|
||||
}
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package net.moonleay.etaorion.client.modules.hud
|
||||
|
||||
import net.minecraft.client.MinecraftClient
|
||||
import net.minecraft.entity.Entity
|
||||
import net.minecraft.util.math.Direction
|
||||
import net.moonleay.etaorion.client.modules.component.Category
|
||||
import net.moonleay.etaorion.client.modules.component.MovableModule
|
||||
|
||||
class Direction: MovableModule("Direction", Category.HUD){
|
||||
override fun getText4Render(): String {
|
||||
val entity: Entity = MinecraftClient.getInstance().getCameraEntity()!!
|
||||
val direction = entity.horizontalFacing
|
||||
val string2 = when (direction) {
|
||||
Direction.NORTH -> "north (-z)"
|
||||
Direction.SOUTH -> "south (+z)"
|
||||
Direction.WEST -> "west (-x)"
|
||||
Direction.EAST -> "east (+x)"
|
||||
else -> "Invalid"
|
||||
}
|
||||
return string2
|
||||
}
|
||||
|
||||
private fun Float.format(digits: Int) = "%.${digits}f".format(this)
|
||||
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
package net.moonleay.etaorion.client.modules.hud
|
||||
|
||||
import net.minecraft.client.MinecraftClient
|
||||
import net.minecraft.text.Text
|
||||
import net.minecraft.util.Hand
|
||||
import net.moonleay.etaorion.client.modules.component.Category
|
||||
import net.moonleay.etaorion.client.modules.component.MovableModule
|
||||
|
||||
class DurabilityMainHand: MovableModule("Durability (Main Hand)", Category.HUD) {
|
||||
override fun getText4Render(): String {
|
||||
val playerEntity = MinecraftClient.getInstance().player!!
|
||||
val stack = playerEntity.getStackInHand(Hand.MAIN_HAND)
|
||||
val itemName = if (stack.item.name.string == "Air") "Empty" else stack.item.name.string
|
||||
if(stack.maxDamage == 0) return itemName
|
||||
return "${itemName} ${stack.maxDamage - stack.damage}/${stack.maxDamage}"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package net.moonleay.etaorion.client.modules.hud
|
||||
|
||||
import net.minecraft.client.MinecraftClient
|
||||
import net.minecraft.util.Hand
|
||||
import net.moonleay.etaorion.client.modules.component.Category
|
||||
import net.moonleay.etaorion.client.modules.component.MovableModule
|
||||
|
||||
class DurabilityOffHand: MovableModule("Durability (Off Hand)", Category.HUD) {
|
||||
override fun getText4Render(): String {
|
||||
val playerEntity = MinecraftClient.getInstance().player!!
|
||||
val stack = playerEntity.getStackInHand(Hand.OFF_HAND)
|
||||
val itemName = if (stack.item.name.string == "Air") "Empty" else stack.item.name.string
|
||||
if(stack.maxDamage == 0) return itemName
|
||||
return "${itemName} ${stack.maxDamage - stack.damage}/${stack.maxDamage}"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package net.moonleay.etaorion.client.modules.hud
|
||||
|
||||
import net.moonleay.etaorion.client.modules.component.Category
|
||||
import net.moonleay.etaorion.client.modules.component.MovableModule
|
||||
|
||||
class FPS : MovableModule("FPS Display", Category.HUD) {
|
||||
|
||||
val fps = mutableListOf<Long>()
|
||||
fun getFPS(): Int {
|
||||
val time = System.currentTimeMillis()
|
||||
fps.removeIf { aLong -> aLong + 1000L < time }
|
||||
return fps.size
|
||||
}
|
||||
|
||||
override fun getText4Render(): String {
|
||||
fps.add(System.currentTimeMillis())
|
||||
return "${getFPS()}FPS"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
package net.moonleay.etaorion.client.modules.hud
|
||||
|
||||
import net.minecraft.client.MinecraftClient
|
||||
import net.moonleay.etaorion.client.modules.component.Category
|
||||
import net.moonleay.etaorion.client.modules.component.MovableModule
|
||||
|
||||
class XYZ : MovableModule("XYZ Display", Category.HUD) {
|
||||
|
||||
override fun getText4Render(): String {
|
||||
val playerEntity = MinecraftClient.getInstance().player!!
|
||||
return "${playerEntity.x.format(2)}x ${playerEntity.y.format(2)}y ${playerEntity.z.format(2)}z"
|
||||
}
|
||||
|
||||
private fun Double.format(digits: Int) = "%.${digits}f".format(this)
|
||||
}
|
|
@ -0,0 +1,102 @@
|
|||
package net.moonleay.etaorion.client.screen
|
||||
|
||||
import net.minecraft.client.MinecraftClient
|
||||
import net.minecraft.client.gui.DrawContext
|
||||
import net.minecraft.client.gui.screen.Screen
|
||||
import net.minecraft.client.gui.widget.ButtonWidget
|
||||
import net.minecraft.client.gui.widget.TextFieldWidget
|
||||
import net.minecraft.screen.ScreenTexts
|
||||
import net.minecraft.text.Text
|
||||
import net.moonleay.etaorion.client.autotext.AutoText
|
||||
import net.moonleay.etaorion.client.autotext.AutoTextManager
|
||||
import net.moonleay.etaorion.client.autotext.KeyBindingManager
|
||||
import net.moonleay.etaorion.client.modules.component.ModuleManager
|
||||
import net.moonleay.etaorion.config.AutoTextConfig
|
||||
import org.lwjgl.glfw.GLFW
|
||||
|
||||
|
||||
class AutoTextScreen(val parent: Screen) : Screen(Text.of("AutoText Manager")) {
|
||||
private var optionList: AutoTextWidget? = null
|
||||
private var addressField:TextFieldWidget? = null
|
||||
|
||||
|
||||
override fun init() {
|
||||
optionList = AutoTextWidget(this, client!!)
|
||||
addSelectableChild(optionList)
|
||||
addressField =
|
||||
TextFieldWidget(textRenderer, 4, height - 25, 200, 20, Text.of("Add new AutoText"))
|
||||
addressField!!.setMaxLength(300)
|
||||
addSelectableChild(addressField)
|
||||
addDrawableChild(
|
||||
ButtonWidget.builder(
|
||||
Text.of("Add")
|
||||
) { addText() }
|
||||
.dimensions(210, height - 25, 40, 20).build())
|
||||
|
||||
addDrawableChild(
|
||||
ButtonWidget.builder(
|
||||
ScreenTexts.DONE
|
||||
) { onClose() }
|
||||
.dimensions(250, height - 25, 40, 20).build())
|
||||
}
|
||||
|
||||
private fun addText(){
|
||||
val keyBinding = KeyBindingManager.bookKeyBinding()?: return
|
||||
val response = AutoTextManager.registerNewAutoTxtObject(AutoText(addressField!!.text, keyBinding))
|
||||
if(response){
|
||||
addressField!!.setText("")
|
||||
this.client?.setScreen(this)
|
||||
}
|
||||
}
|
||||
|
||||
override fun close() {
|
||||
onClose()
|
||||
super.close()
|
||||
}
|
||||
|
||||
override fun shouldCloseOnEsc(): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
fun onClose() {
|
||||
for(at in AutoTextManager.autoTextObjects){
|
||||
AutoTextConfig.save(at)
|
||||
}
|
||||
client!!.setScreen(parent)
|
||||
MinecraftClient.getInstance().setScreen(parent)
|
||||
}
|
||||
|
||||
|
||||
override fun tick() {
|
||||
addressField!!.tick()
|
||||
}
|
||||
|
||||
override fun keyPressed(keyCode: Int, scanCode: Int, modifiers: Int): Boolean {
|
||||
if (this.addressField!!.active && focused === addressField && (keyCode == GLFW.GLFW_KEY_ENTER || keyCode == GLFW.GLFW_KEY_KP_ENTER)) {
|
||||
return true
|
||||
}
|
||||
return super.keyPressed(keyCode, scanCode, modifiers)
|
||||
}
|
||||
|
||||
override fun resize(client: MinecraftClient?, width: Int, height: Int) {
|
||||
val string = addressField!!.text
|
||||
this.init(client, width, height)
|
||||
addressField!!.setText(string)
|
||||
}
|
||||
|
||||
|
||||
override fun render(context: DrawContext?, mouseX: Int, mouseY: Int, delta: Float) {
|
||||
// this.renderBackground(context)
|
||||
optionList!!.render(context, mouseX, mouseY, delta)
|
||||
context?.drawCenteredTextWithShadow(
|
||||
textRenderer,
|
||||
title,
|
||||
width / 2,
|
||||
8,
|
||||
0xFFFFFF
|
||||
)
|
||||
addressField!!.render(context, mouseX, mouseY, delta)
|
||||
super.render(context, mouseX, mouseY, delta)
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,96 @@
|
|||
package net.moonleay.etaorion.client.screen
|
||||
import com.google.common.collect.ImmutableList
|
||||
import net.moonleay.etaorion.client.modules.component.*
|
||||
import net.fabricmc.api.EnvType
|
||||
import net.fabricmc.api.Environment
|
||||
import net.minecraft.client.MinecraftClient
|
||||
import net.minecraft.client.gui.DrawContext
|
||||
import net.minecraft.client.gui.Element
|
||||
import net.minecraft.client.gui.Selectable
|
||||
import net.minecraft.client.gui.screen.Screen
|
||||
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder
|
||||
import net.minecraft.client.gui.screen.narration.NarrationPart
|
||||
import net.minecraft.client.gui.widget.ButtonWidget
|
||||
import net.minecraft.client.gui.widget.ElementListWidget
|
||||
import net.minecraft.client.gui.widget.EntryListWidget
|
||||
import net.minecraft.text.Text
|
||||
import net.moonleay.etaorion.client.autotext.AutoText
|
||||
import net.moonleay.etaorion.client.autotext.AutoTextManager
|
||||
|
||||
|
||||
class AutoTextWidget(parent: Screen, client: MinecraftClient) :
|
||||
EntryListWidget<AutoTextWidget.Entry>(client, parent.width + 45, parent.height, 20, parent.height - 32, 20) {
|
||||
|
||||
init {
|
||||
for (o in AutoTextManager.autoTextObjects) {
|
||||
if(o != null)
|
||||
addEntry(ToggleButtonEntry(o, client))
|
||||
}
|
||||
}
|
||||
|
||||
override fun getScrollbarPositionX(): Int {
|
||||
return super.getScrollbarPositionX() + 15
|
||||
}
|
||||
|
||||
override fun getRowWidth(): Int {
|
||||
return super.getRowWidth() + 32
|
||||
}
|
||||
|
||||
override fun appendNarrations(builder: NarrationMessageBuilder?) {}
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
class ToggleButtonEntry internal constructor(autoText: AutoText, client: MinecraftClient) : Entry() {
|
||||
private val optionName: Text = Text.of(autoText.textToSend + " (Text ${autoText.eoKeyBinding.index})")
|
||||
private val toggleButton: ButtonWidget
|
||||
|
||||
init {
|
||||
toggleButton = ButtonWidget.builder(
|
||||
Text.of("Remove")
|
||||
) { onButtonClick(autoText, client) }
|
||||
.dimensions(0, 0, 75, 20).build()
|
||||
}
|
||||
|
||||
private fun onButtonClick(autoText: AutoText, client: MinecraftClient) {
|
||||
AutoTextManager.unregisterAutoTextObject(autoText.eoKeyBinding.index)
|
||||
client.setScreen(client.currentScreen)
|
||||
}
|
||||
|
||||
override fun render(
|
||||
context: DrawContext?,
|
||||
index: Int,
|
||||
y: Int,
|
||||
x: Int,
|
||||
entryWidth: Int,
|
||||
entryHeight: Int,
|
||||
mouseX: Int,
|
||||
mouseY: Int,
|
||||
hovered: Boolean,
|
||||
tickDelta: Float
|
||||
) {
|
||||
context?.drawTextWithShadow(MinecraftClient.getInstance().textRenderer,
|
||||
optionName,
|
||||
(x - 60F).toInt(),
|
||||
(y + entryHeight / 2 - MinecraftClient.getInstance().textRenderer.fontHeight / 2F).toInt(),
|
||||
0xFFFFFF)
|
||||
toggleButton.x = x + 150
|
||||
toggleButton.y = y
|
||||
toggleButton.message = Text.of("Remove")
|
||||
toggleButton.render(context, mouseX, mouseY, tickDelta)
|
||||
}
|
||||
|
||||
override fun children(): List<Element?> {
|
||||
return ImmutableList.of(toggleButton)
|
||||
}
|
||||
|
||||
override fun selectableChildren(): List<Selectable?> {
|
||||
return ImmutableList.of(toggleButton)
|
||||
}
|
||||
|
||||
override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
|
||||
return toggleButton.mouseClicked(mouseX, mouseY, button)
|
||||
}
|
||||
}
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
abstract class Entry : ElementListWidget.Entry<Entry?>()
|
||||
}
|
|
@ -0,0 +1,167 @@
|
|||
package net.moonleay.etaorion.client.screen
|
||||
import com.google.common.collect.ImmutableList
|
||||
import net.moonleay.etaorion.client.modules.component.*
|
||||
import net.fabricmc.api.EnvType
|
||||
import net.fabricmc.api.Environment
|
||||
import net.minecraft.client.MinecraftClient
|
||||
import net.minecraft.client.gui.DrawContext
|
||||
import net.minecraft.client.gui.Element
|
||||
import net.minecraft.client.gui.Selectable
|
||||
import net.minecraft.client.gui.screen.Screen
|
||||
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder
|
||||
import net.minecraft.client.gui.screen.narration.NarrationPart
|
||||
import net.minecraft.client.gui.widget.ButtonWidget
|
||||
import net.minecraft.client.gui.widget.ElementListWidget
|
||||
import net.minecraft.client.gui.widget.EntryListWidget
|
||||
import net.minecraft.text.Text
|
||||
|
||||
|
||||
class ModuleOptionWidget(parent: Screen, client: MinecraftClient) :
|
||||
EntryListWidget<ModuleOptionWidget.Entry>(client, parent.width + 45, parent.height, 20, parent.height - 32, 20) {
|
||||
|
||||
init {
|
||||
for (type in Category.values()) {
|
||||
this.addEntry(CategoryEntry(Text.of(type.Name)))
|
||||
for (o in ModuleManager.modules) {
|
||||
if (o.category != type)
|
||||
continue
|
||||
addEntry(ToggleButtonEntry(o))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getScrollbarPositionX(): Int {
|
||||
return super.getScrollbarPositionX() + 15
|
||||
}
|
||||
|
||||
override fun getRowWidth(): Int {
|
||||
return super.getRowWidth() + 32
|
||||
}
|
||||
|
||||
override fun appendNarrations(builder: NarrationMessageBuilder?) {}
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
class ToggleButtonEntry internal constructor(val module: Module) : Entry() {
|
||||
private val optionName: Text = Text.of(module.name)
|
||||
private val toggleButton: ButtonWidget
|
||||
|
||||
init {
|
||||
if (module is MovableModule) {
|
||||
val mm: MovableModule = module
|
||||
toggleButton = ButtonWidget.builder(
|
||||
Text.of(" " + mm.position.Name)
|
||||
) { onButtonClick(module) }
|
||||
.dimensions(0, 0, 100, 20).build()
|
||||
} else {
|
||||
toggleButton = ButtonWidget.builder(
|
||||
Text.of(if (module.enabled) " on" else " off")
|
||||
) { onButtonClick(module) }
|
||||
.dimensions(0, 0, 100, 20).build()
|
||||
}
|
||||
}
|
||||
|
||||
fun onButtonClick(module: Module) {
|
||||
if (module is MovableModule) {
|
||||
val mm: MovableModule = module
|
||||
var intOfCurrentPos = ModuleManager.getPositionNumberInt(mm.position)
|
||||
val oldPos = mm.position
|
||||
if (intOfCurrentPos + 1 == Position.values().size)
|
||||
intOfCurrentPos = -1
|
||||
mm.updatePosition(Position.values()[intOfCurrentPos + 1])
|
||||
ModuleManager.updatePositionOfModule(mm, oldPos, Position.values()[intOfCurrentPos + 1])
|
||||
return
|
||||
}
|
||||
module.updateEnabled(!module.enabled)
|
||||
}
|
||||
|
||||
override fun render(
|
||||
context: DrawContext?,
|
||||
index: Int,
|
||||
y: Int,
|
||||
x: Int,
|
||||
entryWidth: Int,
|
||||
entryHeight: Int,
|
||||
mouseX: Int,
|
||||
mouseY: Int,
|
||||
hovered: Boolean,
|
||||
tickDelta: Float
|
||||
) {
|
||||
context?.drawTextWithShadow(MinecraftClient.getInstance().textRenderer,
|
||||
optionName,
|
||||
(x - 60F).toInt(),
|
||||
(y + entryHeight / 2 - MinecraftClient.getInstance().textRenderer.fontHeight / 2F).toInt(),
|
||||
0xFFFFFF)
|
||||
toggleButton.x = x + 150
|
||||
toggleButton.y = y
|
||||
if (module is MovableModule) {
|
||||
val mm: MovableModule = module
|
||||
toggleButton.message = Text.of(mm.position.Name)
|
||||
} else {
|
||||
toggleButton.message = Text.of(if (module.enabled) "on" else "off")
|
||||
}
|
||||
toggleButton.render(context, mouseX, mouseY, tickDelta)
|
||||
}
|
||||
|
||||
override fun children(): List<Element?> {
|
||||
return ImmutableList.of(toggleButton)
|
||||
}
|
||||
|
||||
override fun selectableChildren(): List<Selectable?> {
|
||||
return ImmutableList.of(toggleButton)
|
||||
}
|
||||
|
||||
override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
|
||||
return toggleButton.mouseClicked(mouseX, mouseY, button)
|
||||
}
|
||||
}
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
abstract class Entry : ElementListWidget.Entry<Entry?>()
|
||||
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
class CategoryEntry(text: Text) : Entry() {
|
||||
private val text: Text
|
||||
private val textWidth: Int
|
||||
|
||||
init {
|
||||
this.text = text
|
||||
textWidth = MinecraftClient.getInstance().textRenderer.getWidth(this.text)
|
||||
}
|
||||
|
||||
override fun render(
|
||||
context: DrawContext?,
|
||||
index: Int,
|
||||
y: Int,
|
||||
x: Int,
|
||||
entryWidth: Int,
|
||||
entryHeight: Int,
|
||||
mouseX: Int,
|
||||
mouseY: Int,
|
||||
hovered: Boolean,
|
||||
tickDelta: Float
|
||||
) {
|
||||
context?.drawTextWithShadow(MinecraftClient.getInstance().textRenderer, text,
|
||||
(MinecraftClient.getInstance().currentScreen!!.width / 2 - textWidth / 2F).toInt(),
|
||||
(y + entryHeight - MinecraftClient.getInstance().textRenderer.fontHeight - 1F).toInt(),
|
||||
0xFFFFFF)
|
||||
}
|
||||
|
||||
override fun children(): List<Element?> {
|
||||
return emptyList()
|
||||
}
|
||||
|
||||
override fun selectableChildren(): List<Selectable?> {
|
||||
return ImmutableList.of(object : Selectable {
|
||||
override fun getType(): Selectable.SelectionType {
|
||||
return Selectable.SelectionType.HOVERED
|
||||
}
|
||||
|
||||
override fun appendNarrations(builder: NarrationMessageBuilder) {
|
||||
builder.put(NarrationPart.TITLE, text)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
package net.moonleay.etaorion.client.screen
|
||||
|
||||
import net.moonleay.etaorion.client.modules.component.ModuleManager
|
||||
import net.minecraft.client.MinecraftClient
|
||||
import net.minecraft.client.gui.DrawContext
|
||||
import net.minecraft.client.gui.screen.Screen
|
||||
import net.minecraft.client.gui.widget.ButtonWidget
|
||||
import net.minecraft.screen.ScreenTexts
|
||||
import net.minecraft.text.Text
|
||||
|
||||
|
||||
class OptionScreen(val parent: Screen) : Screen(Text.of("EtaOrion Fabric Options")) {
|
||||
private var optionList: ModuleOptionWidget? = null
|
||||
|
||||
|
||||
override fun init() {
|
||||
optionList = ModuleOptionWidget(this, client!!)
|
||||
addSelectableChild(optionList)
|
||||
addDrawableChild(
|
||||
ButtonWidget.builder(
|
||||
ScreenTexts.DONE
|
||||
) { onClose() }
|
||||
.dimensions(width / 2 - 100, height - 25, 200, 20).build())
|
||||
}
|
||||
|
||||
override fun close() {
|
||||
onClose()
|
||||
super.close()
|
||||
}
|
||||
|
||||
override fun shouldCloseOnEsc(): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
private fun onClose() {
|
||||
client!!.setScreen(parent)
|
||||
ModuleManager.saveAllModules()
|
||||
MinecraftClient.getInstance().setScreen(parent)
|
||||
}
|
||||
|
||||
override fun render(context: DrawContext?, mouseX: Int, mouseY: Int, delta: Float) {
|
||||
this.renderBackground(context)
|
||||
//drawCenteredText(matrices, this.textRenderer, this.title, this.width / 2, 15, 0xFFFFFF);
|
||||
optionList!!.render(context, mouseX, mouseY, delta)
|
||||
context?.drawCenteredTextWithShadow(
|
||||
textRenderer,
|
||||
title,
|
||||
width / 2,
|
||||
8,
|
||||
0xFFFFFF
|
||||
)
|
||||
super.render(context, mouseX, mouseY, delta)
|
||||
}
|
||||
|
||||
}
|
97
src/main/java/net/moonleay/etaorion/config/AutoTextConfig.kt
Normal file
97
src/main/java/net/moonleay/etaorion/config/AutoTextConfig.kt
Normal file
|
@ -0,0 +1,97 @@
|
|||
package net.moonleay.etaorion.config
|
||||
|
||||
import net.moonleay.etaorion.client.autotext.AutoText
|
||||
import net.moonleay.etaorion.client.autotext.KeyBindingManager
|
||||
import net.moonleay.etaorion.client.modules.component.MovableModule
|
||||
import org.apache.logging.log4j.LogManager
|
||||
import java.io.*
|
||||
import java.util.*
|
||||
|
||||
object AutoTextConfig {
|
||||
|
||||
private val lgr = LogManager.getLogger(AutoTextConfig::class.java)
|
||||
private const val basePath = "./config/EtaOrionFabric/AutoTexts/"
|
||||
|
||||
fun delete(index: Int){
|
||||
val baseDir = File(basePath)
|
||||
if (!baseDir.exists()) {
|
||||
lgr.info("No AT folder found.")
|
||||
return
|
||||
}
|
||||
var textFile: File
|
||||
textFile = File(baseDir, "${index}.EOF")
|
||||
if(!textFile.exists()){
|
||||
lgr.info("No AT # ${index} found. No need to delete.")
|
||||
return
|
||||
}
|
||||
textFile.delete()
|
||||
}
|
||||
|
||||
fun load(index: Int): AutoText? {
|
||||
val baseDir = File(basePath)
|
||||
if (!baseDir.exists()) {
|
||||
lgr.info("No AT folder found.")
|
||||
return null
|
||||
}
|
||||
var textFile: File
|
||||
var input: InputStream?
|
||||
var prop: Properties
|
||||
textFile = File(baseDir, "${index}.EOF")
|
||||
if (!textFile.exists()) {
|
||||
lgr.info("No AT # ${index} found. No need to load.")
|
||||
return null
|
||||
}
|
||||
lgr.info("Loading AT # ${index}, file: ${textFile.path}")
|
||||
try {
|
||||
input = FileInputStream(textFile)
|
||||
prop = Properties()
|
||||
prop.load(input)
|
||||
val keyBinding = KeyBindingManager.bookWithIndex(index)?: KeyBindingManager.bookKeyBinding()
|
||||
if(keyBinding == null){
|
||||
lgr.info("Shit. No free keybinding found for AT # ${index}")
|
||||
return null
|
||||
}
|
||||
// Resort to a new keybinding if the old one is in use, return null if there is no free keybinding
|
||||
lgr.info("Loaded AutoText #${index}")
|
||||
return AutoText(prop.getProperty("text"), keyBinding)
|
||||
} catch (e: IOException) {
|
||||
throw RuntimeException(e)
|
||||
}
|
||||
}
|
||||
|
||||
fun save(at: AutoText) {
|
||||
val baseDir = File(basePath)
|
||||
if (!baseDir.exists()) this.createFolder()
|
||||
var textFile: File
|
||||
var output: OutputStream?
|
||||
var prop: Properties
|
||||
textFile = File(baseDir, at.eoKeyBinding.index.toString() + ".EOF")
|
||||
if (!textFile.exists()) {
|
||||
try {
|
||||
textFile.createNewFile()
|
||||
} catch (e: IOException) {
|
||||
throw RuntimeException(e)
|
||||
}
|
||||
}
|
||||
lgr.info("Saving AT # ${at.eoKeyBinding.index}, File: " + textFile)
|
||||
try {
|
||||
output = FileOutputStream(textFile)
|
||||
prop = Properties()
|
||||
prop.setProperty("text", at.textToSend)
|
||||
prop.store(output, null)
|
||||
lgr.info("Saved Module Settings")
|
||||
} catch (e: IOException) {
|
||||
throw RuntimeException(e)
|
||||
}
|
||||
}
|
||||
|
||||
private fun createFolder(){
|
||||
val baseDir = File(basePath)
|
||||
if (!baseDir.exists()) baseDir.mkdirs()
|
||||
}
|
||||
|
||||
|
||||
fun saveTemplate(int: Int){
|
||||
|
||||
}
|
||||
}
|
81
src/main/java/net/moonleay/etaorion/config/ModuleConfig.kt
Normal file
81
src/main/java/net/moonleay/etaorion/config/ModuleConfig.kt
Normal file
|
@ -0,0 +1,81 @@
|
|||
package net.moonleay.etaorion.config
|
||||
|
||||
import net.moonleay.etaorion.client.modules.component.ModuleManager
|
||||
import net.moonleay.etaorion.client.modules.component.MovableModule
|
||||
import net.moonleay.etaorion.client.modules.component.Module
|
||||
import java.io.*
|
||||
import java.util.*
|
||||
|
||||
object ModuleConfig {
|
||||
private val lgr = org.apache.logging.log4j.LogManager.getLogger(ModuleConfig::class.java)
|
||||
private const val basePath = "./config/EtaOrionFabric/"
|
||||
|
||||
fun load(modules: List<Module>) {
|
||||
val baseDir = File(basePath)
|
||||
if (!baseDir.exists()) {
|
||||
save(modules)
|
||||
return
|
||||
}
|
||||
var moduleFile: File
|
||||
var input: InputStream?
|
||||
var prop: Properties
|
||||
for (m in modules) {
|
||||
moduleFile = File(baseDir, m.name + ".EOF")
|
||||
if (!moduleFile.exists()) {
|
||||
save(modules)
|
||||
return
|
||||
}
|
||||
lgr.info("Loading " + m.name + ", File: " + moduleFile)
|
||||
try {
|
||||
input = FileInputStream(moduleFile)
|
||||
prop = Properties()
|
||||
prop.load(input)
|
||||
if (m is MovableModule) {
|
||||
val mm: MovableModule = m
|
||||
mm.onLoadGfx(
|
||||
prop.getProperty("enabled").equals("true"),
|
||||
ModuleManager.getPositionFromname(prop.getProperty("position"))
|
||||
)
|
||||
} else {
|
||||
m.onLoad(
|
||||
prop.getProperty("enabled").equals("true")
|
||||
)
|
||||
}
|
||||
} catch (e: IOException) {
|
||||
throw RuntimeException(e)
|
||||
}
|
||||
}
|
||||
lgr.info("Loaded Module Settings")
|
||||
}
|
||||
|
||||
fun save(modules: List<Module>) {
|
||||
val baseDir = File(basePath)
|
||||
if (!baseDir.exists()) baseDir.mkdirs()
|
||||
var moduleFile: File
|
||||
var output: OutputStream?
|
||||
var prop: Properties
|
||||
for (m in modules) {
|
||||
moduleFile = File(baseDir, m.name + ".EOF")
|
||||
if (!moduleFile.exists()) {
|
||||
try {
|
||||
moduleFile.createNewFile()
|
||||
} catch (e: IOException) {
|
||||
throw RuntimeException(e)
|
||||
}
|
||||
}
|
||||
lgr.info("Saving " + m.name + ", File: " + moduleFile)
|
||||
try {
|
||||
output = FileOutputStream(moduleFile)
|
||||
prop = Properties()
|
||||
prop.setProperty("enabled", if (m.enabled) "true" else "false")
|
||||
if (m is MovableModule) {
|
||||
prop.setProperty("position", m.position.Name)
|
||||
}
|
||||
prop.store(output, null)
|
||||
} catch (e: IOException) {
|
||||
throw RuntimeException(e)
|
||||
}
|
||||
}
|
||||
lgr.info("Saved Module Settings")
|
||||
}
|
||||
}
|
11
src/main/java/net/moonleay/etaorion/datagen/DataGenerator.kt
Normal file
11
src/main/java/net/moonleay/etaorion/datagen/DataGenerator.kt
Normal file
|
@ -0,0 +1,11 @@
|
|||
package net.moonleay.etaorion.datagen
|
||||
|
||||
import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint
|
||||
import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator
|
||||
|
||||
internal class DataGenerator : DataGeneratorEntrypoint {
|
||||
override fun onInitializeDataGenerator(fabricDataGenerator: FabricDataGenerator) {
|
||||
val pack = fabricDataGenerator.createPack()
|
||||
pack.addProvider(::LanguageProvider)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
package net.moonleay.etaorion.datagen
|
||||
|
||||
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput
|
||||
import net.fabricmc.fabric.api.datagen.v1.provider.FabricLanguageProvider
|
||||
|
||||
class LanguageProvider(dataOutput: FabricDataOutput) : FabricLanguageProvider(dataOutput, "en_us") {
|
||||
override fun generateTranslations(translationBuilder: TranslationBuilder) {
|
||||
translationBuilder.add("category.etaorion.autotext", "EtaOrion AutoText")
|
||||
translationBuilder.add("etaorion.key_binding_0", "Text 0")
|
||||
translationBuilder.add("etaorion.key_binding_1", "Text 1")
|
||||
translationBuilder.add("etaorion.key_binding_2", "Text 2")
|
||||
translationBuilder.add("etaorion.key_binding_3", "Text 3")
|
||||
translationBuilder.add("etaorion.key_binding_4", "Text 4")
|
||||
translationBuilder.add("etaorion.key_binding_5", "Text 5")
|
||||
translationBuilder.add("etaorion.key_binding_6", "Text 6")
|
||||
translationBuilder.add("etaorion.key_binding_7", "Text 7")
|
||||
translationBuilder.add("etaorion.key_binding_8", "Text 8")
|
||||
translationBuilder.add("etaorion.key_binding_9", "Text 9")
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package net.moonleay.etaorion.mixin;
|
||||
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.gui.screen.ChatScreen;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.client.gui.screen.option.KeybindsScreen;
|
||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||
import net.minecraft.text.Text;
|
||||
import net.moonleay.etaorion.client.screen.AutoTextScreen;
|
||||
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(ChatScreen.class)
|
||||
public class AddAutoTextScreenButton extends Screen {
|
||||
protected AddAutoTextScreenButton(Text title) {
|
||||
super(title);
|
||||
}
|
||||
|
||||
@Inject(method = "init", at = @At("HEAD"), cancellable = true)
|
||||
public void addButtons(CallbackInfo ci) {
|
||||
this.addDrawableChild(ButtonWidget.builder(Text.of("AutoText"), button -> this.client.setScreen(new AutoTextScreen(this))).dimensions(4, 4, 75, 20).build());
|
||||
this.addDrawableChild(ButtonWidget.builder(Text.of("Key Binds"), button -> this.client.setScreen(new KeybindsScreen(this, MinecraftClient.getInstance().options))).dimensions(4, 25, 75, 20).build());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package net.moonleay.etaorion.mixin;
|
||||
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.client.gui.screen.option.OptionsScreen;
|
||||
import net.minecraft.client.gui.widget.ButtonWidget;
|
||||
import net.minecraft.text.Text;
|
||||
import net.moonleay.etaorion.client.screen.OptionScreen;
|
||||
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(OptionsScreen.class)
|
||||
public class AddEtaOrionConfigButton extends Screen {
|
||||
|
||||
|
||||
protected AddEtaOrionConfigButton(Text title) {
|
||||
super(title);
|
||||
}
|
||||
|
||||
@Inject(at = @At("HEAD"), method = "init")
|
||||
private void addButton(CallbackInfo ci) {
|
||||
this.addDrawableChild(ButtonWidget.builder(Text.of("EtaOrion Settings"), button -> this.client.setScreen(new OptionScreen(this))).dimensions(4, 4, 200, 20).build());
|
||||
}
|
||||
}
|
||||
|
27
src/main/java/net/moonleay/etaorion/mixin/ChatMixin.java
Normal file
27
src/main/java/net/moonleay/etaorion/mixin/ChatMixin.java
Normal file
|
@ -0,0 +1,27 @@
|
|||
package net.moonleay.etaorion.mixin;
|
||||
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.gui.screen.ChatScreen;
|
||||
import net.minecraft.text.Text;
|
||||
import net.moonleay.etaorion.client.modules.component.ModuleStorage;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
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.CallbackInfoReturnable;
|
||||
|
||||
@Mixin(ChatScreen.class)
|
||||
public abstract class ChatMixin {
|
||||
private Logger lgr = LogManager.getLogger(ChatMixin.class);
|
||||
|
||||
@Inject(method = "sendMessage", at = @At("HEAD"), cancellable = true)
|
||||
public void checkForFatFinger(String chatText, boolean addToHistory, CallbackInfoReturnable<Boolean> cir) {
|
||||
if(ModuleStorage.INSTANCE.getAntiFatFingerEnabled() && (chatText.startsWith(".") || chatText.startsWith("7")) && !chatText.startsWith("./")){
|
||||
cir.setReturnValue(false);
|
||||
cir.cancel();
|
||||
MinecraftClient.getInstance().player.sendMessage(Text.of("§cMessage cancelled, was fat-fingered."), false);
|
||||
lgr.info("Message cancelled, was fat-fingered.");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
package net.moonleay.etaorion.mixin;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl;
|
||||
import net.minecraft.client.option.GameOptions;
|
||||
import net.minecraft.client.option.KeyBinding;
|
||||
import net.moonleay.etaorion.util.KeyBindingManagement;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Mutable;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
@Mixin(GameOptions.class)
|
||||
public class GameOptionsMixin implements KeyBindingManagement {
|
||||
@Mutable
|
||||
@Shadow @Final public KeyBinding[] allKeys;
|
||||
|
||||
public void refreshKeyBindings() {
|
||||
this.allKeys = KeyBindingRegistryImpl.process(this.allKeys);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package net.moonleay.etaorion.mixin;
|
||||
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl;
|
||||
import net.minecraft.client.option.KeyBinding;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
@Mixin(KeyBindingRegistryImpl.class)
|
||||
public interface KeyBindingRegistryImplAccessor {
|
||||
@Accessor("MODDED_KEY_BINDINGS")
|
||||
static List<KeyBinding> getKeyBindings() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
25
src/main/java/net/moonleay/etaorion/mixin/LazyDFUMixin.java
Normal file
25
src/main/java/net/moonleay/etaorion/mixin/LazyDFUMixin.java
Normal file
|
@ -0,0 +1,25 @@
|
|||
package net.moonleay.etaorion.mixin;
|
||||
|
||||
import net.minecraft.SharedConstants;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
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(SharedConstants.class)
|
||||
public class LazyDFUMixin {
|
||||
/**
|
||||
* author: Andrew Steinborn
|
||||
* reason: Disables any possibility of enabling DFU "optimizations"
|
||||
* (This was edited)
|
||||
*/
|
||||
private static final Logger lgr = LogManager.getLogger("LazyDFUMixin");
|
||||
@Inject(method = "enableDataFixerOptimization", at = @At("HEAD"), cancellable = true)
|
||||
private static void enableDataFixerOptimizations(CallbackInfo ci) {
|
||||
lgr.info("LazyDFU: skipping DFU");
|
||||
ci.cancel();
|
||||
// Turn this method into a no-op.
|
||||
}
|
||||
}
|
|
@ -0,0 +1,94 @@
|
|||
package net.moonleay.etaorion.mixin;
|
||||
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.client.font.TextRenderer;
|
||||
import net.minecraft.client.gui.DrawContext;
|
||||
import net.minecraft.client.gui.hud.InGameHud;
|
||||
import net.minecraft.text.Text;
|
||||
import net.moonleay.etaorion.client.modules.component.ModuleManager;
|
||||
import net.moonleay.etaorion.client.modules.component.MovableModule;
|
||||
import net.moonleay.etaorion.client.modules.component.Position;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
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;
|
||||
|
||||
@Mixin(InGameHud.class)
|
||||
public abstract class ModuleRenderer {
|
||||
private Logger lgr = LogManager.getLogger(ModuleRenderer.class);
|
||||
|
||||
@Shadow
|
||||
public abstract TextRenderer getTextRenderer();
|
||||
|
||||
@Inject(at = @At("HEAD"), method = "renderStatusEffectOverlay")
|
||||
private void renderModules(DrawContext context, CallbackInfo ci) {
|
||||
MinecraftClient mc = MinecraftClient.getInstance();
|
||||
TextRenderer tr = mc.textRenderer;
|
||||
int scale = (mc.options.getGuiScale().getValue() == 0 ? 1 : mc.options.getGuiScale().getValue());
|
||||
int screenWidth = mc.getWindow().getWidth();
|
||||
int screenHeight = mc.getWindow().getHeight();
|
||||
int baseYtop = 4;
|
||||
int baseYcenter = screenHeight / 2 / scale;
|
||||
int offset = 12;
|
||||
int index = 0;
|
||||
int xCentered = screenWidth / 2 / scale;
|
||||
int bottomY = screenHeight / scale - 4 - tr.fontHeight - (offset * index);
|
||||
for (MovableModule m : ModuleManager.INSTANCE.getEnabledGfxModules().get(Position.TOPLEFT)) {
|
||||
context.drawTextWithShadow(tr, Text.of(m.getText4Render()), 4, baseYtop + (offset * index), -1);
|
||||
++index;
|
||||
}
|
||||
|
||||
index = 0;
|
||||
for (MovableModule m : ModuleManager.INSTANCE.getEnabledGfxModules().get(Position.TOPCENTER)) {
|
||||
context.drawCenteredTextWithShadow(tr, Text.of(m.getText4Render()), xCentered, baseYtop + (offset * index), -1);
|
||||
++index;
|
||||
}
|
||||
|
||||
index = 0;
|
||||
for (MovableModule m : ModuleManager.INSTANCE.getEnabledGfxModules().get(Position.TOPRIGHT)) {
|
||||
context.drawTextWithShadow(tr, Text.of(m.getText4Render()), getXRight(m.getText4Render(), screenWidth), baseYtop + (offset * index), -1);
|
||||
++index;
|
||||
}
|
||||
|
||||
index = 0;
|
||||
int yBaseCentered = baseYcenter - ((ModuleManager.INSTANCE.getEnabledGfxModules().get(Position.RIGHTCENTER).size() / 2) * 12);
|
||||
for (MovableModule m : ModuleManager.INSTANCE.getEnabledGfxModules().get(Position.RIGHTCENTER)) {
|
||||
context.drawTextWithShadow(tr, Text.of(m.getText4Render()), getXRight(m.getText4Render(), screenWidth), yBaseCentered + (offset * index), -1);
|
||||
++index;
|
||||
}
|
||||
|
||||
index = 0;
|
||||
for (MovableModule m : ModuleManager.INSTANCE.getEnabledGfxModules().get(Position.BOTTOMRIGHT)) {
|
||||
context.drawTextWithShadow(tr, Text.of(m.getText4Render()), getXRight(m.getText4Render(), screenWidth), bottomY - (offset * index), -1);
|
||||
++index;
|
||||
}
|
||||
|
||||
index = 0;
|
||||
for (MovableModule m : ModuleManager.INSTANCE.getEnabledGfxModules().get(Position.BOTTOMCENTER)) {
|
||||
context.drawCenteredTextWithShadow(tr, Text.of(m.getText4Render()), xCentered, screenHeight / scale - 4 - 60 - tr.fontHeight - (offset * index), -1);
|
||||
++index;
|
||||
}
|
||||
|
||||
index = 0;
|
||||
for (MovableModule m : ModuleManager.INSTANCE.getEnabledGfxModules().get(Position.BOTTOMLEFT)) {
|
||||
context.drawTextWithShadow(tr, Text.of(m.getText4Render()), 4, bottomY - (offset * index), -1);
|
||||
++index;
|
||||
}
|
||||
|
||||
index = 0;
|
||||
yBaseCentered = baseYcenter - ((ModuleManager.INSTANCE.getEnabledGfxModules().get(Position.LEFTCENTER).size() / 2) * 12);
|
||||
for (MovableModule m : ModuleManager.INSTANCE.getEnabledGfxModules().get(Position.LEFTCENTER)) {
|
||||
context.drawTextWithShadow(tr, Text.of(m.getText4Render()), 4, yBaseCentered + (offset * index), -1);
|
||||
++index;
|
||||
}
|
||||
}
|
||||
|
||||
@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));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
package net.moonleay.etaorion.mixin;
|
||||
|
||||
|
||||
import net.minecraft.SharedConstants;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.moonleay.etaorion.build.BuildConstants;
|
||||
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.CallbackInfoReturnable;
|
||||
|
||||
@Mixin(MinecraftClient.class)
|
||||
public class WindowTitleMixin {
|
||||
@Inject(method = "getWindowTitle", at = @At("HEAD"), cancellable = true)
|
||||
public void getWindowTitle(CallbackInfoReturnable<String> cir) {
|
||||
cir.cancel();
|
||||
String strb = "Eta Orion ver." +
|
||||
BuildConstants.modVersion + //HCM VER
|
||||
" for Minecraft " + //MC
|
||||
SharedConstants.getGameVersion().getName(); //MC VER
|
||||
cir.setReturnValue(strb);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
package net.moonleay.etaorion.util
|
||||
|
||||
interface KeyBindingManagement {
|
||||
fun refreshKeyBindings()
|
||||
}
|
Loading…
Reference in a new issue