From 9b72d3fbd5765519560852123cad9aada754fdc9 Mon Sep 17 00:00:00 2001 From: Jared Dunbar Date: Thu, 28 Mar 2024 23:36:05 -0400 Subject: [PATCH] Several improvements * Fixed crappy key handler - * Key can now be bound to something other than C * Configured keyboard key will save and work on reload * Less complex naming and handler to ease adding new keys * Fixed Chisel blocks not being able to be placed on cables * Fixed language handler crashing game --- src/main/java/mods/eln/Eln.java | 5 - src/main/java/mods/eln/i18n/I18N.java | 8 +- .../heater/ElectricalLoadHeatThermalLoad.kt | 2 +- src/main/kotlin/mods/eln/PacketHandler.kt | 21 ++- src/main/kotlin/mods/eln/ServerKeyHandler.kt | 17 +++ .../mods/eln/client/ClientKeyHandler.kt | 123 +++++++----------- src/main/kotlin/mods/eln/misc/Utils.kt | 3 +- src/main/kotlin/mods/eln/node/NodeBase.kt | 3 +- src/main/kotlin/mods/eln/node/six/SixNode.kt | 10 +- .../mods/eln/node/six/SixNodeCacheStd.kt | 4 + .../kotlin/mods/eln/server/PlayerManager.kt | 83 ------------ 11 files changed, 96 insertions(+), 183 deletions(-) create mode 100644 src/main/kotlin/mods/eln/ServerKeyHandler.kt delete mode 100644 src/main/kotlin/mods/eln/server/PlayerManager.kt diff --git a/src/main/java/mods/eln/Eln.java b/src/main/java/mods/eln/Eln.java index f2ffa84ae..50348f940 100644 --- a/src/main/java/mods/eln/Eln.java +++ b/src/main/java/mods/eln/Eln.java @@ -149,7 +149,6 @@ public class Eln { public static SaveConfig saveConfig; public static GhostManager ghostManager; public static GhostManagerNbt ghostManagerNbt; - public static PlayerManager playerManager; public static ModbusTcpServer modbusServer; public static NodeManagerNbt nodeManagerNbt; public static Simulator simulator = null; @@ -369,8 +368,6 @@ public void preInit(FMLPreInitializationEvent event) { ghostManager = new GhostManager("caca2"); delayedTask = new DelayedTaskManager(); - playerManager = new PlayerManager(); - oreRegenerate = new OreRegenerate(); nodeServer = new NodeServer(); clientLiveDataManager = new LiveDataManager(); @@ -485,7 +482,6 @@ public void onServerStopped(FMLServerStoppedEvent ev) { NodeBlockEntity.clientList.clear(); TeleporterElement.teleporterList.clear(); IWirelessSignalSpot.spots.clear(); - playerManager.clear(); clientLiveDataManager.stop(); nodeManager.clear(); ghostManager.clear(); @@ -509,7 +505,6 @@ public void onServerStart(FMLServerAboutToStartEvent ev) { LightBlockEntity.observers.clear(); WirelessSignalTxElement.channelMap.clear(); LampSupplyElement.channelMap.clear(); - playerManager.clear(); clientLiveDataManager.start(); simulator.init(); simulator.addSlowProcess(wind = new WindProcess()); diff --git a/src/main/java/mods/eln/i18n/I18N.java b/src/main/java/mods/eln/i18n/I18N.java index f879d40e8..a20a58715 100644 --- a/src/main/java/mods/eln/i18n/I18N.java +++ b/src/main/java/mods/eln/i18n/I18N.java @@ -2,6 +2,7 @@ import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.registry.LanguageRegistry; +import mods.eln.misc.Utils; /** * Internationalization and localization helper class. @@ -50,7 +51,12 @@ static String encodeLangKey(String key, boolean replaceWhitspaces) { */ public static String tr(final String text, Object... objects) { // Try to find the translation for the string using forge API. - String translation = languageRegistry.getStringLocalization(encodeLangKey(text)); + String translation = null; + try { + translation = languageRegistry.getStringLocalization(encodeLangKey(text)); + } catch (NullPointerException ignored) { + Utils.println("Unable to translate string: " + text); + } // If no translation was found, just use the original text. if (translation == null || "".equals(translation)) { diff --git a/src/main/java/mods/eln/sim/process/heater/ElectricalLoadHeatThermalLoad.kt b/src/main/java/mods/eln/sim/process/heater/ElectricalLoadHeatThermalLoad.kt index 4d7746915..fb343de90 100644 --- a/src/main/java/mods/eln/sim/process/heater/ElectricalLoadHeatThermalLoad.kt +++ b/src/main/java/mods/eln/sim/process/heater/ElectricalLoadHeatThermalLoad.kt @@ -9,7 +9,7 @@ class ElectricalLoadHeatThermalLoad(var resistor: ElectricalLoad, var load: Ther override fun process(time: Double) { if (resistor.isNotSimulated) return val current = resistor.current - println("Moving heat: ${current * current * resistor.serialResistance * 2} watts at $resistor $load") + // println("Moving heat: ${current * current * resistor.serialResistance * 2} watts at $resistor $load") load.movePowerTo(current * current * resistor.serialResistance * 2) } } diff --git a/src/main/kotlin/mods/eln/PacketHandler.kt b/src/main/kotlin/mods/eln/PacketHandler.kt index be18f24cb..b248680f8 100644 --- a/src/main/kotlin/mods/eln/PacketHandler.kt +++ b/src/main/kotlin/mods/eln/PacketHandler.kt @@ -83,7 +83,7 @@ class PacketHandler { } } - fun packetPlaySound(stream: DataInputStream, @Suppress("UNUSED_PARAMETER") manager: NetworkManager, player: EntityPlayer) { + private fun packetPlaySound(stream: DataInputStream, @Suppress("UNUSED_PARAMETER") manager: NetworkManager, player: EntityPlayer) { try { if (stream.readByte().toInt() != player.dimension) return SoundClient.play(SoundCommand.fromStream(stream, player.worldObj)) @@ -92,7 +92,7 @@ class PacketHandler { } } - fun packetOpenLocalGui(stream: DataInputStream, @Suppress("UNUSED_PARAMETER") manager: NetworkManager, player: EntityPlayer) { + private fun packetOpenLocalGui(stream: DataInputStream, @Suppress("UNUSED_PARAMETER") manager: NetworkManager, player: EntityPlayer) { try { player.openGui(Eln.instance, stream.readInt(), player.worldObj, stream.readInt(), stream.readInt(), @@ -102,7 +102,7 @@ class PacketHandler { } } - fun packetForNode(stream: DataInputStream, @Suppress("UNUSED_PARAMETER") manager: NetworkManager, player: EntityPlayer?) { + private fun packetForNode(stream: DataInputStream, @Suppress("UNUSED_PARAMETER") manager: NetworkManager, player: EntityPlayer?) { try { val coordinate = Coordinate(stream.readInt(), stream.readInt(), stream.readInt(), stream.readByte().toInt()) val node = NodeManager.instance!!.getNodeFromCoordonate(coordinate) @@ -116,7 +116,7 @@ class PacketHandler { } } - fun packetForClientNode(stream: DataInputStream, @Suppress("UNUSED_PARAMETER") manager: NetworkManager, player: EntityPlayer) { + private fun packetForClientNode(stream: DataInputStream, @Suppress("UNUSED_PARAMETER") manager: NetworkManager, player: EntityPlayer) { try { val x = stream.readInt() val y = stream.readInt() @@ -145,7 +145,7 @@ class PacketHandler { } } - fun packetNodeSingleSerialized(stream: DataInputStream, @Suppress("UNUSED_PARAMETER") manager: NetworkManager, player: EntityPlayer) { + private fun packetNodeSingleSerialized(stream: DataInputStream, @Suppress("UNUSED_PARAMETER") manager: NetworkManager, player: EntityPlayer) { try { val x: Int = stream.readInt() val y: Int = stream.readInt() @@ -174,16 +174,11 @@ class PacketHandler { } } - fun packetPlayerKey(stream: DataInputStream, @Suppress("UNUSED_PARAMETER") manager: NetworkManager, player: EntityPlayer?) { - val playerMP = player as EntityPlayerMP? - val id: Byte + private fun packetPlayerKey(stream: DataInputStream, @Suppress("UNUSED_PARAMETER") manager: NetworkManager, player: EntityPlayer?) { try { - id = stream.readByte() + val name = stream.readUTF() val state = stream.readBoolean() - if (id.toInt() == ClientKeyHandler.wrenchId) { - val metadata = Eln.playerManager[playerMP!!] - metadata!!.interactEnable = state - } + ServerKeyHandler.set(name, state) } catch (e: IOException) { e.printStackTrace() } diff --git a/src/main/kotlin/mods/eln/ServerKeyHandler.kt b/src/main/kotlin/mods/eln/ServerKeyHandler.kt new file mode 100644 index 000000000..ef18337ea --- /dev/null +++ b/src/main/kotlin/mods/eln/ServerKeyHandler.kt @@ -0,0 +1,17 @@ +package mods.eln + +data class KeyState(val name: String, var state: Boolean = false) + +object ServerKeyHandler { + val WRENCH = "Wrench" + val WIKI = "Wiki" + private val keyState = listOf(KeyState(WRENCH)) + + fun get(name: String): Boolean { + return keyState.firstOrNull {it.name == name}?.state?: false + } + + fun set(name: String, state: Boolean) { + keyState.firstOrNull { it.name == name }?.state = state + } +} \ No newline at end of file diff --git a/src/main/kotlin/mods/eln/client/ClientKeyHandler.kt b/src/main/kotlin/mods/eln/client/ClientKeyHandler.kt index b9449479c..0dd4d9bc6 100644 --- a/src/main/kotlin/mods/eln/client/ClientKeyHandler.kt +++ b/src/main/kotlin/mods/eln/client/ClientKeyHandler.kt @@ -1,88 +1,65 @@ -package mods.eln.client; +package mods.eln.client -import cpw.mods.fml.client.registry.ClientRegistry; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.InputEvent.KeyInputEvent; -import cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent; -import cpw.mods.fml.common.gameevent.TickEvent.Phase; -import mods.eln.Eln; -import mods.eln.misc.UtilsClient; -import mods.eln.wiki.Root; -import net.minecraft.client.Minecraft; -import net.minecraft.client.settings.KeyBinding; -import net.minecraft.util.StatCollector; -import org.lwjgl.input.Keyboard; +import cpw.mods.fml.client.registry.ClientRegistry +import cpw.mods.fml.common.eventhandler.SubscribeEvent +import cpw.mods.fml.common.gameevent.InputEvent.KeyInputEvent +import mods.eln.Eln +import mods.eln.ServerKeyHandler +import mods.eln.i18n.I18N.tr +import mods.eln.misc.Utils +import mods.eln.misc.UtilsClient.clientOpenGui +import mods.eln.misc.UtilsClient.sendPacketToServer +import mods.eln.wiki.Root +import net.minecraft.client.settings.KeyBinding +import net.minecraft.util.StatCollector +import org.lwjgl.input.Keyboard +import java.io.ByteArrayOutputStream +import java.io.DataOutputStream +import java.io.IOException -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.IOException; -//import mods.eln.wiki.Root; +data class ElectricalAgeKey(var defaultKeybind: Int, val name: String, var lastState: Boolean = false, var binding: KeyBinding? = null) -public class ClientKeyHandler { +class ClientKeyHandler { + // Note: C is the default wrench key, but it can be changed with the GUI in-game. This is override with the value stored in options.txt + private val keyboardKeys = listOf( + ElectricalAgeKey(Keyboard.KEY_C, ServerKeyHandler.WRENCH), + ElectricalAgeKey(Keyboard.KEY_W, ServerKeyHandler.WIKI) + ) - static public final int openWikiId = 0; - static public final int wrenchId = 1; - static final String openWiki = "Open Wiki"; - static final String wrench = "Wrench"; - private static final int[] keyValues = {Keyboard.KEY_X, Keyboard.KEY_C}; - private static final String[] desc = {openWiki, wrench}; - public static final KeyBinding[] keys = new KeyBinding[desc.length]; - - boolean[] states = new boolean[desc.length]; - - Minecraft mc; - - public ClientKeyHandler() { - mc = Minecraft.getMinecraft(); - - for (int i = 0; i < desc.length; ++i) { - if (i != 3) - states[i] = false; - keys[i] = new KeyBinding(desc[i], keyValues[i], StatCollector.translateToLocal("ElectricalAge")); - ClientRegistry.registerKeyBinding(keys[i]); - } - } - - @SubscribeEvent - public void onKeyInput(KeyInputEvent event) { - for (int i = 0; i < desc.length; ++i) { - boolean s = keys[i].getIsKeyPressed(); - if (s == false) continue; - if (states[i]) - setState(i, false); - setState(i, true); + init { + keyboardKeys.forEach { + it.binding = KeyBinding(it.name, it.defaultKeybind, StatCollector.translateToLocal("ElectricalAge")) + ClientRegistry.registerKeyBinding(it.binding) } } @SubscribeEvent - public void tick(ClientTickEvent event) { - if (event.phase != Phase.START) return; - for (int i = 0; i < desc.length; ++i) { - boolean s = keys[i].getIsKeyPressed(); - if (s == false && states[i] == true) { - setState(i, false); - } + fun onKeyInput(event: KeyInputEvent?) { + keyboardKeys.forEach { + setState(it.name, it.binding?.isKeyPressed ?: return@forEach) } } - void setState(int id, boolean state) { - states[id] = state; - - if (id == openWikiId) { - UtilsClient.clientOpenGui(new Root(null)); - } + fun setState(name: String, state: Boolean) { + val entry = keyboardKeys.firstOrNull { it.name == name }?: return + if (entry.lastState != state) { + entry.lastState = state // Be sure to set the state so that it calls again when key released - ByteArrayOutputStream bos = new ByteArrayOutputStream(64); - DataOutputStream stream = new DataOutputStream(bos); + if (entry.name == ServerKeyHandler.WIKI) { + clientOpenGui(Root(null)) + } - try { - stream.writeByte(Eln.packetPlayerKey); - stream.writeByte(id); - stream.writeBoolean(state); - } catch (IOException e) { - e.printStackTrace(); + Utils.println("Sending a client key event to server: ${entry.name} is $state") + val bos = ByteArrayOutputStream(64) + val stream = DataOutputStream(bos) + try { + stream.writeByte(Eln.packetPlayerKey.toInt()) + stream.writeUTF(entry.name) + stream.writeBoolean(state) + } catch (e: IOException) { + e.printStackTrace() + } + sendPacketToServer(bos) } - - UtilsClient.sendPacketToServer(bos); } -} +} \ No newline at end of file diff --git a/src/main/kotlin/mods/eln/misc/Utils.kt b/src/main/kotlin/mods/eln/misc/Utils.kt index 2aa07bd4a..5d93b2773 100644 --- a/src/main/kotlin/mods/eln/misc/Utils.kt +++ b/src/main/kotlin/mods/eln/misc/Utils.kt @@ -16,6 +16,7 @@ import org.lwjgl.opengl.GL11 import net.minecraft.world.World import cpw.mods.fml.common.FMLCommonHandler import cpw.mods.fml.relauncher.Side +import mods.eln.ServerKeyHandler import net.minecraftforge.common.DimensionManager import net.minecraft.entity.item.EntityItem import java.io.IOException @@ -1236,7 +1237,7 @@ object Utils { @JvmStatic fun isPlayerUsingWrench(player: EntityPlayer?): Boolean { if (player == null) return false - if (Eln.playerManager[player]!!.interactEnable) return true + if (ServerKeyHandler.get(ServerKeyHandler.WRENCH)) return true val stack = player.inventory.getCurrentItem() ?: return false return isWrench(stack) } diff --git a/src/main/kotlin/mods/eln/node/NodeBase.kt b/src/main/kotlin/mods/eln/node/NodeBase.kt index 14979832f..dccd31b2f 100644 --- a/src/main/kotlin/mods/eln/node/NodeBase.kt +++ b/src/main/kotlin/mods/eln/node/NodeBase.kt @@ -24,6 +24,7 @@ import java.io.IOException import kotlin.jvm.JvmOverloads import net.minecraft.server.MinecraftServer import cpw.mods.fml.common.FMLCommonHandler +import mods.eln.ServerKeyHandler import net.minecraft.world.WorldServer import net.minecraft.entity.item.EntityItem import net.minecraft.inventory.IInventory @@ -173,7 +174,7 @@ abstract class NodeBase { } val act: String var snd = beepError - if (entityPlayer.isSneaking || Eln.playerManager[entityPlayer]!!.interactEnable) { + if (entityPlayer.isSneaking && ServerKeyHandler.get(ServerKeyHandler.WRENCH)) { if (writeConfigTool(side, equipped.tagCompound, entityPlayer)) snd = beepDownloaded act = "write" } else { diff --git a/src/main/kotlin/mods/eln/node/six/SixNode.kt b/src/main/kotlin/mods/eln/node/six/SixNode.kt index 91a2c0041..668434ad0 100644 --- a/src/main/kotlin/mods/eln/node/six/SixNode.kt +++ b/src/main/kotlin/mods/eln/node/six/SixNode.kt @@ -1,6 +1,7 @@ package mods.eln.node.six import mods.eln.Eln +import mods.eln.ServerKeyHandler import mods.eln.item.IConfigurable import mods.eln.misc.Direction import mods.eln.misc.Direction.Companion.fromInt @@ -412,11 +413,11 @@ class SixNode : Node() { val stack = entityPlayer.currentEquippedItem var b = Blocks.air if (stack != null) b = Block.getBlockFromItem(stack.item) - var accepted = false - if (Eln.playerManager[entityPlayer]!!.interactEnable && stack != null) { + var isWrenchReplacingBlock = false + if (ServerKeyHandler.get(ServerKeyHandler.WRENCH) && stack != null) { for (a in sixNodeCacheList) { if (a.accept(stack)) { - accepted = true + isWrenchReplacingBlock = true sixNodeCacheBlock = b sixNodeCacheBlockMeta = a.getMeta(stack).toByte() break @@ -424,8 +425,7 @@ class SixNode : Node() { } } - if (accepted) { - println("ACACAC") + if (isWrenchReplacingBlock) { needPublish = true if (!isCreative((entityPlayer as EntityPlayerMP))) entityPlayer.inventory.decrStackSize(entityPlayer.inventory.currentItem, 1) diff --git a/src/main/kotlin/mods/eln/node/six/SixNodeCacheStd.kt b/src/main/kotlin/mods/eln/node/six/SixNodeCacheStd.kt index 16d36f9f4..df67e8962 100644 --- a/src/main/kotlin/mods/eln/node/six/SixNodeCacheStd.kt +++ b/src/main/kotlin/mods/eln/node/six/SixNodeCacheStd.kt @@ -1,5 +1,6 @@ package mods.eln.node.six +import mods.eln.misc.Utils import mods.eln.node.ISixNodeCache import net.minecraft.block.Block import net.minecraft.block.BlockContainer @@ -7,12 +8,15 @@ import net.minecraft.item.ItemStack class SixNodeCacheStd : ISixNodeCache { override fun accept(stack: ItemStack): Boolean { + Utils.println("Testing item ${stack.displayName} for blockiness") val b = Block.getBlockFromItem(stack.item) ?: return false if (b is BlockContainer) return false + Utils.println("Item is probably a block with render type ${b.renderType}") return if (stack.item is SixNodeItem) false else when (b.renderType) { 0 -> true 31 -> true // Logs 39 -> true // Quartz block + 59 -> true // Chisel? else -> false } } diff --git a/src/main/kotlin/mods/eln/server/PlayerManager.kt b/src/main/kotlin/mods/eln/server/PlayerManager.kt deleted file mode 100644 index 031b57738..000000000 --- a/src/main/kotlin/mods/eln/server/PlayerManager.kt +++ /dev/null @@ -1,83 +0,0 @@ -package mods.eln.server - -import cpw.mods.fml.common.FMLCommonHandler -import cpw.mods.fml.common.eventhandler.SubscribeEvent -import cpw.mods.fml.common.gameevent.TickEvent -import cpw.mods.fml.common.gameevent.TickEvent.ServerTickEvent -import mods.eln.misc.Utils -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.entity.player.EntityPlayerMP -import java.util.* - -class PlayerManager { - private val metadataHash: MutableMap = Hashtable() - - inner class PlayerMetadata(p: EntityPlayer) { - private var timeout = 0 - var interactEnable: Boolean = false - get() { - timeoutReset() - return field - } - set(interactEnable) { - if (!this.interactEnable && interactEnable) { - interactRiseBuffer = true - Utils.println("interactRiseBuffer") - } - field = interactEnable - timeoutReset() - Utils.println("interactEnable : $interactEnable") - } - var interactRise = false - var interactRiseBuffer = false - var player: EntityPlayer - fun needDelete(): Boolean { - return timeout == 0 - } - - fun timeoutReset() { - timeout = 20 * 120 - } - - fun timeoutDec() { - timeout-- - if (timeout < 0) timeout = 0 - } - - init { - timeoutReset() - player = p - } - } - - fun clear() { - metadataHash.clear() - } - - @SubscribeEvent - fun tick(event: ServerTickEvent) { - if (event.phase != TickEvent.Phase.START) return - for ((key, p) in metadataHash) { - p.interactRise = p.interactRiseBuffer - p.interactRiseBuffer = false - if (p.needDelete()) { - metadataHash.remove(key) - } - } - } - - operator fun get(player: EntityPlayerMP): PlayerMetadata? { - val metadata = metadataHash[player] - if (metadata != null) return metadata - metadataHash[player] = PlayerMetadata(player) - return metadataHash[player] - } - - operator fun get(player: EntityPlayer): PlayerMetadata? { - return get(player as EntityPlayerMP) - } - - init { - FMLCommonHandler.instance().bus().register(this) - } -}