diff --git a/README.md b/README.md index 5d8cef2..6e793ef 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,9 @@ # Forgelin -**WARNING:** This project is no longer maintained. It has been superseded by Kotlin integration in [ShadowMC](https://github.com/shadowfacts/ShadowMC). - -Fork of [Emberwalker's Forgelin](https://github.com/Emberwalker/Forgelin) with some sprinkles on top. +Fork of [Emberwalker's Forgelin](https://github.com/Emberwalker/Forgelin). ## Additions -- Extensions for Minecraft/Forge code. See them in the [extensions package](https://github.com/shadowfacts/Forgelin/tree/master/src/main/kotlin/net/shadowfacts/forgelin/extensions/). +- Shades the Kotlin standard library, runtime, and reflect libraries so you don't have to. +- Provides a Forge `ILanguageAdapter` for using Kotlin `object` classes as your main mod class. ## Usage ```groovy diff --git a/gradle.properties b/gradle.properties index ad08166..39dbc7f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -mod_version = 1.0.5 +mod_version = 1.1.0 group = net.shadowfacts archivesBaseName = Forgelin @@ -6,4 +6,4 @@ mc_version = 1.10.2 mcp_mappings = snapshot_20160802 forge_version = 12.18.1.2045 -kotlin_version = 1.0.3 +kotlin_version = 1.0.5 diff --git a/src/main/kotlin/net/shadowfacts/forgelin/KotlinAdapter.kt b/src/main/kotlin/net/shadowfacts/forgelin/KotlinAdapter.kt index 028fe26..4bdf24c 100644 --- a/src/main/kotlin/net/shadowfacts/forgelin/KotlinAdapter.kt +++ b/src/main/kotlin/net/shadowfacts/forgelin/KotlinAdapter.kt @@ -9,64 +9,59 @@ import java.lang.reflect.Field import java.lang.reflect.Method /** - * Kotlin implementation of FML's ILanguageAdapter. - * - * Use by setting
modLanguageAdapter = "io.drakon.forgelinFR.KotlinAdapter"
in the Mod annotation - * (Forge 1.8-11.14.1.1371 or above required). - * - * @author Arkan + * Forge {@link ILanguageAdapter} for Kotlin + * Usage: Set the {@code modLanguageAdapter} field in your {@code @Mod} annotation to {@code net.shadowfacts.forgelin.KotlinAdapter} + * @author shadowfacts */ class KotlinAdapter : ILanguageAdapter { - private val log = LogManager.getLogger("ILanguageAdapter/Kotlin") + private val log = LogManager.getLogger("KotlinAdapter") override fun supportsStatics(): Boolean { return false } override fun setProxy(target: Field, proxyTarget: Class<*>, proxy: Any) { - log.debug("Setting proxy: {}.{} -> {}", target.declaringClass.simpleName, target.name, proxy) - if (proxyTarget.fields.any { x -> x.name.equals("INSTANCE") }) { + log.debug("Setting proxy: ${target.declaringClass.simpleName}.${target.name} -> $proxy") + if (proxyTarget.fields.any { x -> x.name == "INSTANCE" }) { // Singleton try { - log.debug("Setting proxy on INSTANCE; singleton target.") + log.debug("Setting proxy on INSTANCE; singleton target") val obj = proxyTarget.getField("INSTANCE").get(null) target.set(obj, proxy) - } catch (ex: Exception) { - throw KotlinAdapterException(ex) + } catch (e: Exception) { + throw KotlinAdapterException(e) } } else { - //TODO Log? target.set(proxyTarget, proxy) } } - override fun getNewInstance(container: FMLModContainer?, objectClass: Class<*>, classLoader: ClassLoader, factoryMarkedAnnotation: Method?): Any? { - log.debug("FML has asked for {} to be constructed...", objectClass.simpleName) + override fun getNewInstance(container: FMLModContainer, objectClass: Class<*>, classLoader: ClassLoader, factoryMarkedAnnotation: Method?): Any { + log.debug("FML has asked for ${objectClass.simpleName} to be constructed") try { // Try looking for an object type val f = objectClass.getField("INSTANCE") val obj = f.get(null) ?: throw NullPointerException() - log.debug("Found an object INSTANCE reference in {}, using that. ({})", objectClass.simpleName, obj) + log.debug("Found an object INSTANCE reference in ${objectClass.simpleName}, using that. ${obj}") return obj - } catch (ex: Exception) { + } catch (e: Exception) { // Try looking for a class type - log.debug("Failed to get object reference, trying class construction.") + log.debug("Failed to get object reference, trying class construction") try { val obj = objectClass.newInstance() ?: throw NullPointerException() - log.debug("Constructed an object from a class type ({}), using that. ({})", objectClass, obj) - log.warn("Hey, you, modder who owns {} - you should be using 'object' instead of 'class' on your @Mod class.", objectClass.simpleName) + log.debug("Constructed an object from a class type ($objectClass), using that. $obj") return obj - } catch (ex: Exception) { - throw KotlinAdapterException(ex) + } catch (e: Exception) { + throw KotlinAdapterException(e) } } } override fun setInternalProxies(mod: ModContainer?, side: Side?, loader: ClassLoader?) { - // Nothing to do; FML's got this covered for Kotlin. + // Nothing to do; FML's got this covered for Kotlin } - private class KotlinAdapterException(ex: Exception) : RuntimeException("Kotlin adapter error - do not report to Forge!", ex) + private class KotlinAdapterException(e: Exception) : RuntimeException("Kotlin adapter error - do not report to Forge!", e) } \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/forgelin/extensions/AABBExtensions.kt b/src/main/kotlin/net/shadowfacts/forgelin/extensions/AABBExtensions.kt deleted file mode 100644 index 1c12693..0000000 --- a/src/main/kotlin/net/shadowfacts/forgelin/extensions/AABBExtensions.kt +++ /dev/null @@ -1,19 +0,0 @@ -package net.shadowfacts.forgelin.extensions - -import net.minecraft.util.EnumFacing -import net.minecraft.util.math.AxisAlignedBB - -/** - * @author shadowfacts - */ -fun AxisAlignedBB.rotateFace(side: EnumFacing): AxisAlignedBB { - when (side) { - EnumFacing.DOWN -> return this - EnumFacing.UP -> return AxisAlignedBB(minX, 1 - maxY, minZ, maxX, 1 - minY, maxZ) - EnumFacing.NORTH -> return AxisAlignedBB(minX, minZ, minY, maxX, maxZ, maxY) - EnumFacing.SOUTH -> return AxisAlignedBB(minX, minZ, 1 - maxY, maxX, maxZ, 1 - minY) - EnumFacing.WEST -> return AxisAlignedBB(minY, minZ, minX, maxY, maxZ, maxX) - EnumFacing.EAST -> return AxisAlignedBB(1 - maxY, minZ, minX, 1 - minY, maxZ, maxX) - else -> return this - } -} \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/forgelin/extensions/ConfigurationExtensions.kt b/src/main/kotlin/net/shadowfacts/forgelin/extensions/ConfigurationExtensions.kt deleted file mode 100644 index 8571e33..0000000 --- a/src/main/kotlin/net/shadowfacts/forgelin/extensions/ConfigurationExtensions.kt +++ /dev/null @@ -1,10 +0,0 @@ -package net.shadowfacts.forgelin.extensions - -import net.minecraftforge.common.config.Configuration - -/** - * @author shadowfacts - */ -fun Configuration.getLong(name: String, category: String, defaultInt: Int, defaultLong: Long, minValue: Int, maxValue: Int, comment: String): Long { - return get(category, name, defaultInt, comment, minValue, maxValue).getLong(defaultLong) -} \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/forgelin/extensions/EntityExtensions.kt b/src/main/kotlin/net/shadowfacts/forgelin/extensions/EntityExtensions.kt deleted file mode 100644 index 5c865ec..0000000 --- a/src/main/kotlin/net/shadowfacts/forgelin/extensions/EntityExtensions.kt +++ /dev/null @@ -1,14 +0,0 @@ -package net.shadowfacts.forgelin.extensions - -import net.minecraft.entity.Entity -import net.minecraft.util.math.RayTraceResult - -/** - * @author shadowfacts - */ -fun Entity.rayTrace(distance: Double): RayTraceResult? { - val eyePos = getPositionEyes(0f) - val lookVec = getLook(0f) - val vec = eyePos.addVector(lookVec.xCoord * distance, lookVec.yCoord * distance, lookVec.zCoord * distance) - return worldObj.rayTraceBlocks(eyePos, vec, false, false, true) -} \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/forgelin/extensions/ListExtensions.kt b/src/main/kotlin/net/shadowfacts/forgelin/extensions/ListExtensions.kt deleted file mode 100644 index d14a0c9..0000000 --- a/src/main/kotlin/net/shadowfacts/forgelin/extensions/ListExtensions.kt +++ /dev/null @@ -1,15 +0,0 @@ -package net.shadowfacts.forgelin.extensions - -import net.minecraft.item.ItemStack - -/** - * @author shadowfacts - */ -fun List.containsStack(stack: ItemStack): Boolean { - forEach { - if (it.item == stack.item && it.itemDamage == stack.itemDamage) { - return true - } - } - return false -} \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/forgelin/extensions/NBTExtensions.kt b/src/main/kotlin/net/shadowfacts/forgelin/extensions/NBTExtensions.kt deleted file mode 100644 index 89d2aea..0000000 --- a/src/main/kotlin/net/shadowfacts/forgelin/extensions/NBTExtensions.kt +++ /dev/null @@ -1,13 +0,0 @@ -package net.shadowfacts.forgelin.extensions - -import net.minecraft.nbt.NBTBase -import net.minecraft.nbt.NBTTagList - -/** - * @author shadowfacts - */ -fun NBTTagList.forEach(action: (NBTBase) -> Unit) { - for (i in 0.until(tagCount())) { - action(get(i)) - } -} \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/forgelin/extensions/PlayerExtensions.kt b/src/main/kotlin/net/shadowfacts/forgelin/extensions/PlayerExtensions.kt deleted file mode 100644 index 19d4fd5..0000000 --- a/src/main/kotlin/net/shadowfacts/forgelin/extensions/PlayerExtensions.kt +++ /dev/null @@ -1,15 +0,0 @@ -package net.shadowfacts.forgelin.extensions - -import net.minecraft.entity.player.EntityPlayer -import net.minecraft.util.text.TextComponentString - -/** - * @author shadowfacts - */ -fun EntityPlayer.addChatMsg(msg: String) { - addChatComponentMessage(TextComponentString(msg)) -} - -fun EntityPlayer.addChatMsg(msg: String, vararg params: Any) { - addChatMsg(String.format(msg, params)) -} \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/forgelin/extensions/client/KeyBindingExtensions.kt b/src/main/kotlin/net/shadowfacts/forgelin/extensions/client/KeyBindingExtensions.kt deleted file mode 100644 index 1c31b49..0000000 --- a/src/main/kotlin/net/shadowfacts/forgelin/extensions/client/KeyBindingExtensions.kt +++ /dev/null @@ -1,11 +0,0 @@ -package net.shadowfacts.forgelin.extensions.client - -import net.minecraft.client.settings.GameSettings -import net.minecraft.client.settings.KeyBinding - -/** - * @author shadowfacts - */ -fun KeyBinding.getDisplayString(): String { - return GameSettings.getKeyDisplayString(keyCode) -} \ No newline at end of file