From 16bea29c08e991a6f011ec12344bdb3e323a328e Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Sat, 6 Aug 2016 10:28:05 -0400 Subject: [PATCH] Initial Commit --- .gitignore | 26 +++++ build.gradle | 97 +++++++++++++++++++ gradle.properties | 11 +++ .../shadowfacts/forgelin/ForgelinSetup.java | 27 ++++++ .../shadowfacts/forgelin/ForglinPlugin.java | 37 +++++++ .../net/shadowfacts/forgelin/KotlinAdapter.kt | 78 +++++++++++++++ .../forgelin/extensions/AABBExtensions.kt | 19 ++++ .../extensions/ConfigurationExtensions.kt | 10 ++ .../forgelin/extensions/EntityExtensions.kt | 14 +++ .../forgelin/extensions/NBTExtensions.kt | 13 +++ .../forgelin/extensions/PlayerExtensions.kt | 15 +++ .../extensions/client/KeyBindingExtensions.kt | 11 +++ 12 files changed, 358 insertions(+) create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 src/main/java/net/shadowfacts/forgelin/ForgelinSetup.java create mode 100644 src/main/java/net/shadowfacts/forgelin/ForglinPlugin.java create mode 100644 src/main/kotlin/net/shadowfacts/forgelin/KotlinAdapter.kt create mode 100644 src/main/kotlin/net/shadowfacts/forgelin/extensions/AABBExtensions.kt create mode 100644 src/main/kotlin/net/shadowfacts/forgelin/extensions/ConfigurationExtensions.kt create mode 100644 src/main/kotlin/net/shadowfacts/forgelin/extensions/EntityExtensions.kt create mode 100644 src/main/kotlin/net/shadowfacts/forgelin/extensions/NBTExtensions.kt create mode 100644 src/main/kotlin/net/shadowfacts/forgelin/extensions/PlayerExtensions.kt create mode 100644 src/main/kotlin/net/shadowfacts/forgelin/extensions/client/KeyBindingExtensions.kt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a5770df --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +.DS_Store + +/download +/eclipseBin + +# gradle +/.gradle +/build + +# ForgeGradle +/run + +# eclipse +/eclipse +/.settings +/.metdata +/.classpath +/.project +/bin + +# intellij +/out +/.idea +/*.iml +/*.ipr +/*.iws \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..f354658 --- /dev/null +++ b/build.gradle @@ -0,0 +1,97 @@ +buildscript { + repositories { + jcenter() + maven { + name "forge" + url "http://files.minecraftforge.net/maven/" + } + } + dependencies { + classpath "net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlin_version}" + } +} + +plugins { + id "com.github.johnrengelman.shadow" version "1.2.3" +} + +apply plugin: "net.minecraftforge.gradle.forge" +apply plugin: "kotlin" + +version = mc_version + "-" + mod_version + +sourceCompatibility = JavaVersion.VERSION_1_8 +targetCompatibility = JavaVersion.VERSION_1_8 + +minecraft { + version = mc_version + "-" + forge_version + runDir = "run" + + mappings = mcp_mappings + + replaceIn "Reference.kt" + replaceIn "Reference.kt" + replace "@VERSION@", mod_version + + useDepAts = true +} + +processResources { + inputs.property "version", project.version + inputs.property "mcversion", project.minecraft.version + + from (sourceSets.main.resources.srcDirs) { + include "mcmod.info" + expand "version": project.version, "mcversion": mc_version + } + from (sourceSets.main.resources.srcDirs) { + exclude "mcmod.info" + } +} + +repositories { + maven { + name "shadowfacts" + url "http://mvn.rx14.co.uk/shadowfacts/" + } + maven { + url "http://dvs1.progwml6.com/files/maven" + } + maven { + url "http://maven.epoxide.xyz" + } +} + +dependencies { + compile group: "org.jetbrains.kotlin", name: "kotlin-stdlib", version: kotlin_version + compile group: "org.jetbrains.kotlin", name: "kotlin-reflect", version: kotlin_version + compile group: "org.jetbrains.kotlin", name: "kotlin-runtime", version: kotlin_version + + deobfCompile group: "net.shadowfacts", name: "ShadowMC", version: mc_version + "-" + shadowmc_version +} + +jar { + manifest { + attributes "FMLCorePlugin": "net.shadowfacts.forgelin.ForgelinCorePlugin" + attributes "FMLCorePluginContainsFMLMod": "true" + } +} + +shadowJar { + classifier = "" + dependencies { + include(dependency("org.jetbrains.kotlin:kotlin-stdlib:${kotlin_version}")) + include(dependency("org.jetbrains.kotlin:kotlin-reflect:${kotlin_version}")) + include(dependency("org.jetbrains.kotlin:kotlin-runtime:${kotlin_version}")) + } + manifest { + attributes "FMLCorePlugin": "net.shadowfacts.forgelin.ForgelinCorePlugin" + } +} + +tasks.build.dependsOn shadowJar + +artifacts { + archives shadowJar +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..8c3ca4d --- /dev/null +++ b/gradle.properties @@ -0,0 +1,11 @@ +mod_version = 1.0.0 +group = net.shadowfacts +archivesBaseName = ShadowForgelin + +mc_version = 1.10.2 +mcp_mappings = snapshot_20160802 +forge_version = 12.18.1.2045 + +kotlin_version = 1.0.3 + +shadowmc_version = 3.4.5-SNAPSHOT \ No newline at end of file diff --git a/src/main/java/net/shadowfacts/forgelin/ForgelinSetup.java b/src/main/java/net/shadowfacts/forgelin/ForgelinSetup.java new file mode 100644 index 0000000..42d8dac --- /dev/null +++ b/src/main/java/net/shadowfacts/forgelin/ForgelinSetup.java @@ -0,0 +1,27 @@ +package net.shadowfacts.forgelin; + +import net.minecraftforge.fml.relauncher.IFMLCallHook; + +import java.util.Map; + +/** + * @author shadowfacts + */ +public class ForgelinSetup implements IFMLCallHook { + + @Override + public void injectData(Map data) { + ClassLoader loader = (ClassLoader)data.get("classLoader"); + try { + loader.loadClass("net.shadowfacts.forgelin.ForgelinAdapter"); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + + @Override + public Void call() throws Exception { + return null; + } + +} diff --git a/src/main/java/net/shadowfacts/forgelin/ForglinPlugin.java b/src/main/java/net/shadowfacts/forgelin/ForglinPlugin.java new file mode 100644 index 0000000..6588393 --- /dev/null +++ b/src/main/java/net/shadowfacts/forgelin/ForglinPlugin.java @@ -0,0 +1,37 @@ +package net.shadowfacts.forgelin; + +import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; + +import java.util.Map; + +/** + * @author shadowfacts + */ +public class ForglinPlugin implements IFMLLoadingPlugin { + + @Override + public String[] getASMTransformerClass() { + return new String[0]; + } + + @Override + public String getModContainerClass() { + return null; + } + + @Override + public String getSetupClass() { + return "net.shadowfacts.forgelin.ForgelinSetup"; + } + + @Override + public void injectData(Map data) { + + } + + @Override + public String getAccessTransformerClass() { + return null; + } + +} diff --git a/src/main/kotlin/net/shadowfacts/forgelin/KotlinAdapter.kt b/src/main/kotlin/net/shadowfacts/forgelin/KotlinAdapter.kt new file mode 100644 index 0000000..5ab31cd --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/forgelin/KotlinAdapter.kt @@ -0,0 +1,78 @@ +package net.shadowfacts.forgelin + +import net.minecraftforge.fml.common.FMLModContainer +import net.minecraftforge.fml.common.ILanguageAdapter +import net.minecraftforge.fml.common.ModContainer +import net.minecraftforge.fml.relauncher.Side +import org.apache.logging.log4j.LogManager +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 + */ +public class KotlinAdapter : ILanguageAdapter { + + companion object metadata { + public final val ADAPTER_VERSION: String = "@VERSION@-@KOTLIN@" + } + + private val log = LogManager.getLogger("ILanguageAdapter/Kotlin") + + override fun supportsStatics(): Boolean { + return false + } + + override fun setProxy(target: Field, proxyTarget: Class<*>, proxy: Any) { + log.debug("Setting proxy: {}.{} -> {}", target.getDeclaringClass().getSimpleName(), target.getName(), proxy) + if (proxyTarget.getFields().any { x -> x.getName().equals("INSTANCE$") }) { + // Singleton + try { + 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) + } + } 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.getSimpleName()) + try { + // Try looking for an object type + val f = objectClass.getField("INSTANCE$") + val obj = f.get(null) + if (obj == null) throw NullPointerException() + log.debug("Found an object INSTANCE$ reference in {}, using that. ({})", objectClass.getSimpleName(), obj) + return obj + } catch (ex: Exception) { + // Try looking for a class type + log.debug("Failed to get object reference, trying class construction.") + try { + val obj = objectClass.newInstance() + if (obj == null) 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.getSimpleName()) + return obj + } catch (ex: Exception) { + throw KotlinAdapterException(ex) + } + } + } + + override fun setInternalProxies(mod: ModContainer?, side: Side?, loader: ClassLoader?) { + // 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) + +} \ 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 new file mode 100644 index 0000000..1c12693 --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/forgelin/extensions/AABBExtensions.kt @@ -0,0 +1,19 @@ +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 new file mode 100644 index 0000000..8571e33 --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/forgelin/extensions/ConfigurationExtensions.kt @@ -0,0 +1,10 @@ +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 new file mode 100644 index 0000000..5c865ec --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/forgelin/extensions/EntityExtensions.kt @@ -0,0 +1,14 @@ +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/NBTExtensions.kt b/src/main/kotlin/net/shadowfacts/forgelin/extensions/NBTExtensions.kt new file mode 100644 index 0000000..89d2aea --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/forgelin/extensions/NBTExtensions.kt @@ -0,0 +1,13 @@ +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 new file mode 100644 index 0000000..19d4fd5 --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/forgelin/extensions/PlayerExtensions.kt @@ -0,0 +1,15 @@ +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 new file mode 100644 index 0000000..1c31b49 --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/forgelin/extensions/client/KeyBindingExtensions.kt @@ -0,0 +1,11 @@ +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