Keybinding HUD rework

This commit is contained in:
MachineMuse 2015-09-08 02:31:34 -06:00
parent 784dde9caa
commit b5fe074b3d
11 changed files with 251 additions and 147 deletions

View file

@ -143,6 +143,7 @@ gui.pressKey=Press Key
gui.keybindInstructions1=Use 'new' to bind new keys.
gui.keybindInstructions2=Drag and drop modules to bind them to keys.
gui.keybindInstructions3=Drop keys on 'trash' to unbind them.
gui.keybindInstructions4=Right-click keybinds to add them to the HUD.
gui.keybindTaken=Taken!
gui.tab.tinker=Tinker

View file

@ -95,4 +95,6 @@ public class ClickableButton extends Clickable {
return this;
}
public String getLabel() { return label; }
}

View file

@ -1,139 +0,0 @@
package net.machinemuse.general.gui.clickable;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.relauncher.Side;
import net.machinemuse.numina.geometry.Colour;
import net.machinemuse.numina.geometry.MusePoint2D;
import net.machinemuse.numina.network.PacketSender;
import net.machinemuse.powersuits.network.packets.MusePacketToggleRequest;
import net.machinemuse.utils.MuseItemUtils;
import net.machinemuse.utils.render.MuseRenderer;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityClientPlayerMP;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.util.ChatComponentText;
import org.lwjgl.input.Keyboard;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ClickableKeybinding extends ClickableButton {
protected List<ClickableModule> boundModules;
protected KeyBinding keybind;
protected boolean toggleval;
protected boolean toggled;
protected boolean free;
public ClickableKeybinding(KeyBinding keybind, MusePoint2D position, boolean free) {
super(parseName(keybind), position, true);
this.keybind = keybind;
this.position = position;
this.boundModules = new ArrayList<ClickableModule>();
this.enabled = free;
}
public boolean isToggled() {
return toggled;
}
public void doToggleTick() {
doToggleIf(keybind.getIsKeyPressed());
}
public void doToggleIf(boolean value) {
if (value && !toggled) {
toggleModules();
}
toggled = value;
}
public void toggleModules() {
EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer;
if (player == null) {
return;
}
for (ClickableModule module : boundModules) {
String valstring = toggleval ? " on" : " off";
if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) {
player.addChatMessage(new ChatComponentText("Toggled " + module.getModule().getDataName() + valstring));
}
MuseItemUtils.toggleModuleForPlayer(player, module.getModule().getDataName(), toggleval);
MusePacketToggleRequest toggleRequest = new MusePacketToggleRequest(player, module.getModule().getDataName(), toggleval);
PacketSender.sendToServer(toggleRequest);
}
toggleval = !toggleval;
}
public static String parseName(KeyBinding keybind) {
if (keybind.getKeyCode() < 0) {
return "Mouse" + (keybind.getKeyCode() + 100);
} else {
return Keyboard.getKeyName(keybind.getKeyCode());
}
}
@Override
public void draw() {
super.draw();
for (ClickableModule module : boundModules) {
MuseRenderer.drawLineBetween(this, module, Colour.LIGHTBLUE);
}
}
public KeyBinding getKeyBinding() {
return keybind;
}
public List<ClickableModule> getBoundModules() {
return boundModules;
}
public void bindModule(ClickableModule module) {
if (!boundModules.contains(module)) {
boundModules.add(module);
}
}
public void unbindModule(ClickableModule module) {
boundModules.remove(module);
}
public void unbindFarModules() {
Iterator<ClickableModule> iterator = boundModules.iterator();
ClickableModule module;
while (iterator.hasNext()) {
module = iterator.next();
int maxDistance = getTargetDistance() * 2;
double distanceSq = module.getPosition().distanceSq(this.getPosition());
if (distanceSq > maxDistance * maxDistance) {
iterator.remove();
}
}
}
public int getTargetDistance() {
int targetDistance = 16;
if (boundModules.size() > 6) {
targetDistance += (boundModules.size() - 6) * 3;
}
return targetDistance;
}
public void attractBoundModules(IClickable exception) {
for (ClickableModule module : boundModules) {
if (module != exception) {
MusePoint2D euclideanDistance = module.getPosition().minus(this.getPosition());
MusePoint2D directionVector = euclideanDistance.normalize();
MusePoint2D tangentTarget = directionVector.times(getTargetDistance()).plus(this.getPosition());
MusePoint2D midpointTangent = module.getPosition().midpoint(tangentTarget);
module.move(midpointTangent.x(), midpointTangent.y());
}
}
}
public boolean equals(ClickableKeybinding other) {
return other.keybind.getKeyCode() == this.keybind.getKeyCode();
}
}

View file

@ -0,0 +1,146 @@
package net.machinemuse.general.gui.clickable
import cpw.mods.fml.common.FMLCommonHandler
import cpw.mods.fml.relauncher.Side
import net.machinemuse.numina.geometry.Colour
import net.machinemuse.numina.geometry.MusePoint2D
import net.machinemuse.numina.network.PacketSender
import net.machinemuse.powersuits.common.Config
import net.machinemuse.powersuits.control.KeybindManager
import net.machinemuse.powersuits.network.packets.MusePacketToggleRequest
import net.machinemuse.utils.{MuseStringUtils, MuseItemUtils}
import net.machinemuse.utils.MuseStringUtils.FormatCodes
import net.machinemuse.utils.render.{GuiIcons, MuseRenderer}
import net.minecraft.client.Minecraft
import net.minecraft.client.entity.EntityClientPlayerMP
import net.minecraft.client.settings.KeyBinding
import net.minecraft.util.ChatComponentText
import org.lwjgl.input.Keyboard
import java.util.ArrayList
import java.util.Iterator
import java.util.List
import org.lwjgl.opengl.GL11
object ClickableKeybinding {
def parseName(keybind: KeyBinding): String = {
if (keybind.getKeyCode < 0) {
return "Mouse" + (keybind.getKeyCode + 100)
}
else {
return Keyboard.getKeyName(keybind.getKeyCode)
}
}
}
class ClickableKeybinding(val keybind: KeyBinding, position: MusePoint2D, val free: Boolean, var displayOnHUD: Boolean = false) extends ClickableButton(ClickableKeybinding.parseName(keybind), position, true) {
protected var boundModules: List[ClickableModule] = new ArrayList[ClickableModule]
var toggleval: Boolean = false
var toggled: Boolean = false
def doToggleTick {
doToggleIf(keybind.getIsKeyPressed)
}
def doToggleIf(value: Boolean) {
if (value && !toggled) {
toggleModules()
KeybindManager.writeOutKeybinds()
}
toggled = value
}
def toggleModules() {
val player: EntityClientPlayerMP = Minecraft.getMinecraft.thePlayer
if (player == null) {
return
}
import scala.collection.JavaConversions._
for (module <- boundModules) {
val valstring: String = if (toggleval) " on" else " off"
if ((FMLCommonHandler.instance.getEffectiveSide eq Side.CLIENT) && Config.toggleModuleSpam) {
player.addChatMessage(new ChatComponentText("Toggled " + module.getModule.getDataName + valstring))
}
MuseItemUtils.toggleModuleForPlayer(player, module.getModule.getDataName, toggleval)
val toggleRequest: MusePacketToggleRequest = new MusePacketToggleRequest(player, module.getModule.getDataName, toggleval)
PacketSender.sendToServer(toggleRequest)
}
toggleval = !toggleval
}
override def draw() {
super.draw()
import scala.collection.JavaConversions._
for (module <- boundModules) {
MuseRenderer.drawLineBetween(this, module, Colour.LIGHTBLUE)
GL11.glPushMatrix()
GL11.glScaled(0.5, 0.5, 0.5)
if (displayOnHUD) {
MuseRenderer.drawString(MuseStringUtils.wrapFormatTags("HUD", FormatCodes.BrightGreen), this.position.x*2 + 6,this.position.y*2 + 6)
} else {
MuseRenderer.drawString(MuseStringUtils.wrapFormatTags("x", FormatCodes.Red), this.position.x*2 + 6,this.position.y*2 + 6)
}
GL11.glPopMatrix()
}
}
def getKeyBinding: KeyBinding = {
return keybind
}
def getBoundModules: List[ClickableModule] = {
return boundModules
}
def bindModule(module: ClickableModule) {
if (!boundModules.contains(module)) {
boundModules.add(module)
}
}
def unbindModule(module: ClickableModule) {
boundModules.remove(module)
}
def unbindFarModules {
val iterator: Iterator[ClickableModule] = boundModules.iterator
var module: ClickableModule = null
while (iterator.hasNext) {
module = iterator.next
val maxDistance: Int = getTargetDistance * 2
val distanceSq: Double = module.getPosition.distanceSq(this.getPosition)
if (distanceSq > maxDistance * maxDistance) {
iterator.remove
}
}
}
def getTargetDistance: Int = {
if (boundModules.size > 6) {
16 + (boundModules.size - 6) * 3
} else {
16
}
}
def attractBoundModules(exception: IClickable) {
import scala.collection.JavaConversions._
for (module <- boundModules) {
if (module ne exception) {
val euclideanDistance: MusePoint2D = module.getPosition.minus(this.getPosition)
val directionVector: MusePoint2D = euclideanDistance.normalize
val tangentTarget: MusePoint2D = directionVector.times(getTargetDistance).plus(this.getPosition)
val midpointTangent: MusePoint2D = module.getPosition.midpoint(tangentTarget)
module.move(midpointTangent.x, midpointTangent.y)
}
}
}
def equals(other: ClickableKeybinding): Boolean = {
return other.keybind.getKeyCode == this.keybind.getKeyCode
}
def toggleHUDState {
displayOnHUD = !displayOnHUD
}
}

View file

@ -76,8 +76,14 @@ public class KeybindConfigFrame implements IGuiFrame {
if (newKeybindButton.hitBox(x, y)) {
selecting = true;
}
}
if (button > 2) {
} else if(button == 1) {
for (ClickableKeybinding keybind : KeybindManager.getKeybindings()) {
if (keybind.hitBox(x, y)) {
keybind.toggleHUDState();
return;
}
}
} else if (button > 2) {
int key = button - 100;
if (KeyBinding.hash.containsItem(key)) {
takenTime = System.currentTimeMillis();
@ -228,6 +234,7 @@ public class KeybindConfigFrame implements IGuiFrame {
MuseRenderer.drawCenteredString(StatCollector.translateToLocal("gui.keybindInstructions1"), center.x(), center.y() + 40);
MuseRenderer.drawCenteredString(StatCollector.translateToLocal("gui.keybindInstructions2"), center.x(), center.y() + 50);
MuseRenderer.drawCenteredString(StatCollector.translateToLocal("gui.keybindInstructions3"), center.x(), center.y() + 60);
MuseRenderer.drawCenteredString(StatCollector.translateToLocal("gui.keybindInstructions4"), center.x(), center.y() + 70);
if (takenTime + 1000 > System.currentTimeMillis()) {
MusePoint2D pos = newKeybindButton.getPosition().plus(new MusePoint2D(0, -20));
MuseRenderer.drawCenteredString(StatCollector.translateToLocal("gui.keybindTaken"), pos.x(), pos.y());
@ -283,7 +290,7 @@ public class KeybindConfigFrame implements IGuiFrame {
name = "???";
}
KeyBinding keybind = new KeyBinding(name, key, KeybindKeyHandler.mps);
ClickableKeybinding clickie = new ClickableKeybinding(keybind, newKeybindButton.getPosition().plus(new MusePoint2D(0, -20)), free);
ClickableKeybinding clickie = new ClickableKeybinding(keybind, newKeybindButton.getPosition().plus(new MusePoint2D(0, -20)), free, false);
KeybindManager.getKeybindings().add(clickie);
}

View file

@ -11,6 +11,7 @@ import net.machinemuse.api.IPowerModule
import net.machinemuse.api.ModuleManager
import net.machinemuse.numina.basemod.Numina
import net.machinemuse.numina.general.MuseLogger
import net.machinemuse.numina.geometry.MusePoint2D
import net.machinemuse.powersuits.item.ItemComponent
import net.machinemuse.powersuits.powermodule.armor.BasicPlatingModule
import net.machinemuse.powersuits.powermodule.armor.DiamondPlatingModule
@ -47,6 +48,11 @@ import scala.io.Source
* @author MachineMuse
*/
object Config {
def keybindHUDon: Boolean = config.get("HUD", "Display HUD", true).getBoolean()
def keybindHUDx: Double = config.get("HUD", "x position", 8.0).getDouble()
def keybindHUDy: Double = config.get("HUD", "y position", 32.0).getDouble()
def toggleModuleSpam: Boolean = config.get("HUD", "Chat message when toggling modules", false).getBoolean()
def getWeightCapacity(): Double = config.get(Configuration.CATEGORY_GENERAL, "Weight Limit (grams)", 25000.0).getDouble()
/**

View file

@ -51,6 +51,9 @@ object ModularPowersuits {
Config.glowMultiplier
Config.useShaders
Config.getWeightCapacity()
Config.keybindHUDon
Config.keybindHUDx
Config.toggleModuleSpam
EntityRegistry.registerModEntity(classOf[EntityPlasmaBolt], "entityPlasmaBolt", 2477, this, 64, 20, true)
EntityRegistry.registerModEntity(classOf[EntitySpinningBlade], "entitySpinningBlade", 2478, this, 64, 20, true)
EntityRegistry.registerModEntity(classOf[EntityLuxCapacitor], "entityLuxCapacitor", 2479, this, 64, 20, true)

View file

@ -40,7 +40,7 @@ public class KeybindManager {
public static KeyBinding addKeybinding(String keybindDescription, int keycode, MusePoint2D position) {
KeyBinding kb = new KeyBinding(keybindDescription, keycode, KeybindKeyHandler.mps);
boolean free = !KeyBinding.hash.containsItem(keycode);
getInstance().keybindings.add(new ClickableKeybinding(kb, position, free));
getInstance().keybindings.add(new ClickableKeybinding(kb, position, free, false));
return kb;
}
@ -62,7 +62,7 @@ public class KeybindManager {
writer = new BufferedWriter(new FileWriter(file));
List<IPowerModule> modulesToWrite = MuseItemUtils.getPlayerInstalledModules(Minecraft.getMinecraft().thePlayer);
for (ClickableKeybinding keybinding : getInstance().keybindings) {
writer.write(keybinding.getKeyBinding().getKeyCode() + ":" + keybinding.getPosition().x() + ':' + keybinding.getPosition().y() + '\n');
writer.write(keybinding.getKeyBinding().getKeyCode() + ":" + keybinding.getPosition().x() + ':' + keybinding.getPosition().y() + ':' + keybinding.displayOnHUD() + ':' + keybinding.toggleval() + '\n');
for (ClickableModule module : keybinding.getBoundModules()) {
writer.write(module.getModule().getDataName() + '~' + module.getPosition().x() + '~' + module.getPosition().y() + '\n');
}
@ -95,7 +95,16 @@ public class KeybindManager {
if (!KeyBinding.hash.containsItem(id)) {
MusePoint2D position = new MusePoint2D(Double.parseDouble(exploded[1]), Double.parseDouble(exploded[2]));
boolean free = !KeyBinding.hash.containsItem(id);
workingKeybinding = new ClickableKeybinding(new KeyBinding(Keyboard.getKeyName(id), id, KeybindKeyHandler.mps), position, free);
boolean displayOnHUD = false;
boolean toggleval = false;
if(exploded.length > 3) {
displayOnHUD = Boolean.parseBoolean(exploded[3]);
}
if(exploded.length > 4) {
toggleval = Boolean.parseBoolean(exploded[4]);
}
workingKeybinding = new ClickableKeybinding(new KeyBinding(Keyboard.getKeyName(id), id, KeybindKeyHandler.mps), position, free, displayOnHUD);
workingKeybinding.toggleval_$eq(toggleval);
getInstance().keybindings.add(workingKeybinding);
} else {
workingKeybinding = null;

View file

@ -29,7 +29,7 @@ class ClientTickHandler {
if (event.phase == TickEvent.Phase.START) {
import scala.collection.JavaConversions._
for (kb <- KeybindManager.getKeybindings) {
kb.doToggleTick()
kb.doToggleTick
}
}
else {

View file

@ -3,12 +3,20 @@ package net.machinemuse.powersuits.event
import cpw.mods.fml.common.eventhandler.SubscribeEvent
import cpw.mods.fml.relauncher.{Side, SideOnly}
import net.machinemuse.api.ModuleManager
import net.machinemuse.general.gui.clickable.{ClickableKeybinding, ClickableModule}
import net.machinemuse.numina.geometry.{Colour, DrawableMuseRect}
import net.machinemuse.numina.render.{MuseIconUtils, MuseTextureUtils}
import net.machinemuse.powersuits.common.Config
import net.machinemuse.powersuits.control.KeybindManager
import net.machinemuse.powersuits.powermodule.misc.BinocularsModule
import net.machinemuse.powersuits.powermodule.movement.{FlightControlModule, GliderModule, JetBootsModule, JetPackModule}
import net.machinemuse.utils.MuseItemUtils
import net.machinemuse.utils.render.MuseRenderer
import net.minecraft.client.Minecraft
import net.minecraft.client.gui.ScaledResolution
import net.minecraft.entity.player.EntityPlayer
import net.minecraftforge.client.event.{FOVUpdateEvent, RenderPlayerEvent, RenderWorldLastEvent, TextureStitchEvent}
import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType
import net.minecraftforge.client.event._
object RenderEventHandler {
private[event] var ownFly: Boolean = false
@ -49,4 +57,62 @@ class RenderEventHandler {
}
}
@SubscribeEvent def onPostRenderGameOverlayEvent(e: RenderGameOverlayEvent.Post) {
e.`type` match {
// case ElementType.ALL =>
// case ElementType.HELMET =>
// case ElementType.PORTAL =>
// case ElementType.CROSSHAIRS =>
// case ElementType.BOSSHEALTH =>
// case ElementType.ARMOR =>
// case ElementType.HEALTH =>
// case ElementType.FOOD =>
// case ElementType.AIR =>
case ElementType.HOTBAR => drawKeybindToggles()
// case ElementType.EXPERIENCE =>
// case ElementType.TEXT =>
// case ElementType.HEALTHMOUNT =>
// case ElementType.JUMPBAR =>
case _ =>
}
}
val frame = new DrawableMuseRect(Config.keybindHUDx, Config.keybindHUDy, Config.keybindHUDx + 16, Config.keybindHUDy + 16, true, Colour.DARKGREEN.withAlpha(0.2), Colour.GREEN.withAlpha(0.2))
def drawKeybindToggles(): Unit = {
if(Config.keybindHUDon)
for {
mc <- Option(Minecraft.getMinecraft)
player <- Option(mc.thePlayer)
} {
val screen = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight)
frame.setLeft(Config.keybindHUDx)
frame.setTop(Config.keybindHUDy)
frame.setBottom(frame.top() + 16)
import scala.collection.JavaConverters._
for (kb: ClickableKeybinding <- KeybindManager.getKeybindings.asScala) {
if (kb.displayOnHUD) {
val stringwidth = MuseRenderer.getStringWidth(kb.getLabel)
frame.setWidth(stringwidth + kb.getBoundModules.size() * 16)
frame.draw()
MuseRenderer.drawString(kb.getLabel, frame.left()+1, frame.top()+3, if (kb.toggleval) Colour.RED else Colour.GREEN)
var x = frame.left() + stringwidth
for (module: ClickableModule <- kb.getBoundModules.asScala) {
MuseTextureUtils.pushTexture(module.getModule.getStitchedTexture(null))
var active = false
for (stack <- MuseItemUtils.modularItemsEquipped(player).asScala)
if (ModuleManager.itemHasActiveModule(stack, module.getModule.getDataName))
active = true
MuseIconUtils.drawIconAt(x, frame.top, module.getModule.getIcon(null), if (active) Colour.WHITE else Colour.DARKGREY.withAlpha(0.5))
MuseTextureUtils.popTexture()
x += 16
}
frame.setTop(frame.top() + 16)
frame.setBottom(frame.top() + 16)
}
}
}
}
}

View file

@ -1,5 +1,6 @@
package net.machinemuse.powersuits.item
import com.google.common.collect.Multimap
import cpw.mods.fml.relauncher.{Side, SideOnly}
import net.machinemuse.api.{IModularItem, ArmorTraits, ModuleManager}
import net.machinemuse.numina.geometry.Colour
@ -87,6 +88,8 @@ abstract class ItemPowerArmor(renderIndex: Int, armorType: Int)
model
}
override def getAttributeModifiers(stack: ItemStack): Multimap[_, _] = super.getAttributeModifiers(stack)
override def getItemEnchantability: Int = {
return 0
}