From 36282cf81e9ec777b3f272a4709286147cb733f9 Mon Sep 17 00:00:00 2001 From: Gary Tierney Date: Sat, 16 Sep 2017 18:49:06 +0100 Subject: [PATCH] Remove plugins.gradle and factor into common extension --- build.gradle | 1 + buildSrc/build.gradle | 1 + .../apollo/build/plugin/ApolloPlugin.groovy | 12 + .../build/plugin/ApolloPluginExtension.groovy | 101 +++++++++ .../KotlinCompilerConfigurationFactory.groovy | 61 +++++ .../plugin/compiler/KotlinScriptBinary.groovy | 13 ++ .../compiler/KotlinScriptCompiler.groovy | 75 +++++++ .../KotlinScriptCompilerException.groovy | 11 + .../tasks/ApolloScriptCompileTask.groovy | 59 +++++ .../build/compile/KotlinScriptCompiler.kt | 128 ----------- .../build/tasks/KotlinScriptCompileTask.kt | 58 ----- .../gradle-plugins/apollo-plugin.properties | 1 + game/build.gradle | 17 +- game/plugin-testing/build.gradle | 6 + .../game/plugin/testing/KotlinPluginTest.kt | 0 .../plugin/testing/KotlinPluginTestHelpers.kt | 0 .../testing/fakes/FakePluginContextFactory.kt | 0 .../testing/mockito/KotlinArgMatcher.kt | 0 .../mockito/KotlinMockitoExtensions.kt | 0 game/plugin/bank/build.gradle | 7 + game/{src/plugins => plugin}/bank/meta.toml | 0 .../bank/src/bank.plugin.kts | 0 .../bank/test/OpenBankTest.kt | 0 game/plugin/build.gradle | 74 ++++++ .../chat/private-messaging/build.gradle | 3 + .../chat/private-messaging/meta.toml | 0 .../private-messaging/src/friends.plugin.kts | 0 .../private-messaging/src/ignores.plugin.kts | 0 .../src/messaging.plugin.kts | 0 game/plugin/cmd/build.gradle | 13 ++ game/{src/plugins => plugin}/cmd/meta.toml | 0 .../cmd/src/animate-cmd.plugin.kts | 0 .../cmd/src/bank-cmd.plugin.kts | 0 .../cmd/src/item-cmd.plugin.kts | 0 .../cmd/src/lookup.plugin.kts | 0 .../cmd/src/messaging-cmd.plugin.kts | 0 .../cmd/src/punish-cmd.plugin.kts | 0 .../cmd/src/skill-cmd.plugin.kts | 0 .../cmd/src/spawn-cmd.plugin.kts | 0 .../cmd/src/teleport-cmd.plugin.kts | 0 game/plugin/consumables/build.gradle | 7 + .../plugins => plugin}/consumables/meta.toml | 0 .../consumables/src/consumables.kt | 0 .../consumables/src/consumables.plugin.kts | 0 .../consumables/src/drinks.plugin.kts | 0 .../consumables/src/foods.plugin.kts | 0 .../consumables/test/FoodOrDrinkTests.kt | 0 game/plugin/dummy/build.gradle | 7 + game/{src/plugins => plugin}/dummy/meta.toml | 0 .../dummy/src/dummy.plugin.kts | 0 .../dummy/test/TrainingDummyTest.kt | 0 game/plugin/emote-tab/build.gradle | 7 + .../plugins => plugin}/emote-tab/meta.toml | 0 .../emote-tab/src/emote-tab.plugin.kts | 0 game/plugin/entity/following/build.gradle | 12 + .../entity/following/meta.toml | 0 .../entity/following/src/following.kt | 0 .../entity/following/src/following.plugin.kts | 0 game/plugin/entity/player-action/build.gradle | 7 + .../entity/player-action/meta.toml | 0 .../entity/player-action/src/player_action.kt | 0 .../src/player_action.plugin.kts | 0 game/plugin/entity/spawn/build.gradle | 10 + .../plugins => plugin}/entity/spawn/meta.toml | 0 .../entity/spawn/src/spawn.kt | 0 .../entity/spawn/src/spawn.plugin.kts | 0 game/plugin/entity/walk-to/build.gradle | 7 + .../entity/walk-to/meta.toml | 0 .../entity/walk-to/src/walk_to.kt | 0 game/plugin/locations/al-kharid/build.gradle | 10 + .../locations/al-kharid/meta.toml | 0 .../al-kharid/src/al-kharid-npcs.plugin.kts | 0 game/plugin/locations/edgeville/build.gradle | 10 + .../locations/edgeville/meta.toml | 0 .../edgeville/src/edgeville-npcs.plugin.kts | 0 game/plugin/locations/falador/build.gradle | 10 + .../locations/falador/meta.toml | 0 .../falador/src/falador-npcs.plugin.kts | 0 game/plugin/locations/lumbridge/build.gradle | 10 + .../locations/lumbridge/meta.toml | 0 .../lumbridge/src/lumbridge-npcs.plugin.kts | 0 .../locations/tutorial-island/build.gradle | 10 + .../locations/tutorial-island/meta.toml | 0 .../src/tutorial-island-npcs.plugin.kts | 0 game/plugin/locations/varrock/build.gradle | 10 + .../locations/varrock/meta.toml | 0 .../varrock/src/varrock-npcs.plugin.kts | 0 game/plugin/logout/build.gradle | 3 + game/{src/plugins => plugin}/logout/meta.toml | 0 .../logout/src/logout.plugin.kts | 0 .../logout/test/LogoutTests.kt | 0 game/plugin/run/build.gradle | 3 + game/{src/plugins => plugin}/run/meta.toml | 0 .../plugins => plugin}/run/src/run.plugin.kts | 0 game/plugin/util/command/build.gradle | 4 + .../plugins => plugin}/util/command/meta.toml | 0 .../util/command/src/command.kt | 0 game/plugin/util/lookup/build.gradle | 4 + .../plugins => plugin}/util/lookup/meta.toml | 0 .../util/lookup/src/lookup.kt | 0 .../util/lookup/test/LookupTests.kt | 0 game/plugins.gradle | 210 ------------------ game/src/main/kotlin/stub.kt | 2 +- settings.gradle | 32 +++ 104 files changed, 608 insertions(+), 408 deletions(-) create mode 100644 buildSrc/src/main/groovy/org/apollo/build/plugin/ApolloPlugin.groovy create mode 100644 buildSrc/src/main/groovy/org/apollo/build/plugin/ApolloPluginExtension.groovy create mode 100644 buildSrc/src/main/groovy/org/apollo/build/plugin/compiler/KotlinCompilerConfigurationFactory.groovy create mode 100644 buildSrc/src/main/groovy/org/apollo/build/plugin/compiler/KotlinScriptBinary.groovy create mode 100644 buildSrc/src/main/groovy/org/apollo/build/plugin/compiler/KotlinScriptCompiler.groovy create mode 100644 buildSrc/src/main/groovy/org/apollo/build/plugin/compiler/KotlinScriptCompilerException.groovy create mode 100644 buildSrc/src/main/groovy/org/apollo/build/plugin/tasks/ApolloScriptCompileTask.groovy delete mode 100644 buildSrc/src/main/kotlin/org/apollo/build/compile/KotlinScriptCompiler.kt delete mode 100644 buildSrc/src/main/kotlin/org/apollo/build/tasks/KotlinScriptCompileTask.kt create mode 100644 buildSrc/src/main/resources/META-INF/gradle-plugins/apollo-plugin.properties create mode 100644 game/plugin-testing/build.gradle rename game/{src/pluginTesting => plugin-testing/src/test}/kotlin/org/apollo/game/plugin/testing/KotlinPluginTest.kt (100%) rename game/{src/pluginTesting => plugin-testing/src/test}/kotlin/org/apollo/game/plugin/testing/KotlinPluginTestHelpers.kt (100%) rename game/{src/pluginTesting => plugin-testing/src/test}/kotlin/org/apollo/game/plugin/testing/fakes/FakePluginContextFactory.kt (100%) rename game/{src/pluginTesting => plugin-testing/src/test}/kotlin/org/apollo/game/plugin/testing/mockito/KotlinArgMatcher.kt (100%) rename game/{src/pluginTesting => plugin-testing/src/test}/kotlin/org/apollo/game/plugin/testing/mockito/KotlinMockitoExtensions.kt (100%) create mode 100644 game/plugin/bank/build.gradle rename game/{src/plugins => plugin}/bank/meta.toml (100%) rename game/{src/plugins => plugin}/bank/src/bank.plugin.kts (100%) rename game/{src/plugins => plugin}/bank/test/OpenBankTest.kt (100%) create mode 100644 game/plugin/build.gradle create mode 100644 game/plugin/chat/private-messaging/build.gradle rename game/{src/plugins => plugin}/chat/private-messaging/meta.toml (100%) rename game/{src/plugins => plugin}/chat/private-messaging/src/friends.plugin.kts (100%) rename game/{src/plugins => plugin}/chat/private-messaging/src/ignores.plugin.kts (100%) rename game/{src/plugins => plugin}/chat/private-messaging/src/messaging.plugin.kts (100%) create mode 100644 game/plugin/cmd/build.gradle rename game/{src/plugins => plugin}/cmd/meta.toml (100%) rename game/{src/plugins => plugin}/cmd/src/animate-cmd.plugin.kts (100%) rename game/{src/plugins => plugin}/cmd/src/bank-cmd.plugin.kts (100%) rename game/{src/plugins => plugin}/cmd/src/item-cmd.plugin.kts (100%) rename game/{src/plugins => plugin}/cmd/src/lookup.plugin.kts (100%) rename game/{src/plugins => plugin}/cmd/src/messaging-cmd.plugin.kts (100%) rename game/{src/plugins => plugin}/cmd/src/punish-cmd.plugin.kts (100%) rename game/{src/plugins => plugin}/cmd/src/skill-cmd.plugin.kts (100%) rename game/{src/plugins => plugin}/cmd/src/spawn-cmd.plugin.kts (100%) rename game/{src/plugins => plugin}/cmd/src/teleport-cmd.plugin.kts (100%) create mode 100644 game/plugin/consumables/build.gradle rename game/{src/plugins => plugin}/consumables/meta.toml (100%) rename game/{src/plugins => plugin}/consumables/src/consumables.kt (100%) rename game/{src/plugins => plugin}/consumables/src/consumables.plugin.kts (100%) rename game/{src/plugins => plugin}/consumables/src/drinks.plugin.kts (100%) rename game/{src/plugins => plugin}/consumables/src/foods.plugin.kts (100%) rename game/{src/plugins => plugin}/consumables/test/FoodOrDrinkTests.kt (100%) create mode 100644 game/plugin/dummy/build.gradle rename game/{src/plugins => plugin}/dummy/meta.toml (100%) rename game/{src/plugins => plugin}/dummy/src/dummy.plugin.kts (100%) rename game/{src/plugins => plugin}/dummy/test/TrainingDummyTest.kt (100%) create mode 100644 game/plugin/emote-tab/build.gradle rename game/{src/plugins => plugin}/emote-tab/meta.toml (100%) rename game/{src/plugins => plugin}/emote-tab/src/emote-tab.plugin.kts (100%) create mode 100644 game/plugin/entity/following/build.gradle rename game/{src/plugins => plugin}/entity/following/meta.toml (100%) rename game/{src/plugins => plugin}/entity/following/src/following.kt (100%) rename game/{src/plugins => plugin}/entity/following/src/following.plugin.kts (100%) create mode 100644 game/plugin/entity/player-action/build.gradle rename game/{src/plugins => plugin}/entity/player-action/meta.toml (100%) rename game/{src/plugins => plugin}/entity/player-action/src/player_action.kt (100%) rename game/{src/plugins => plugin}/entity/player-action/src/player_action.plugin.kts (100%) create mode 100644 game/plugin/entity/spawn/build.gradle rename game/{src/plugins => plugin}/entity/spawn/meta.toml (100%) rename game/{src/plugins => plugin}/entity/spawn/src/spawn.kt (100%) rename game/{src/plugins => plugin}/entity/spawn/src/spawn.plugin.kts (100%) create mode 100644 game/plugin/entity/walk-to/build.gradle rename game/{src/plugins => plugin}/entity/walk-to/meta.toml (100%) rename game/{src/plugins => plugin}/entity/walk-to/src/walk_to.kt (100%) create mode 100644 game/plugin/locations/al-kharid/build.gradle rename game/{src/plugins => plugin}/locations/al-kharid/meta.toml (100%) rename game/{src/plugins => plugin}/locations/al-kharid/src/al-kharid-npcs.plugin.kts (100%) create mode 100644 game/plugin/locations/edgeville/build.gradle rename game/{src/plugins => plugin}/locations/edgeville/meta.toml (100%) rename game/{src/plugins => plugin}/locations/edgeville/src/edgeville-npcs.plugin.kts (100%) create mode 100644 game/plugin/locations/falador/build.gradle rename game/{src/plugins => plugin}/locations/falador/meta.toml (100%) rename game/{src/plugins => plugin}/locations/falador/src/falador-npcs.plugin.kts (100%) create mode 100644 game/plugin/locations/lumbridge/build.gradle rename game/{src/plugins => plugin}/locations/lumbridge/meta.toml (100%) rename game/{src/plugins => plugin}/locations/lumbridge/src/lumbridge-npcs.plugin.kts (100%) create mode 100644 game/plugin/locations/tutorial-island/build.gradle rename game/{src/plugins => plugin}/locations/tutorial-island/meta.toml (100%) rename game/{src/plugins => plugin}/locations/tutorial-island/src/tutorial-island-npcs.plugin.kts (100%) create mode 100644 game/plugin/locations/varrock/build.gradle rename game/{src/plugins => plugin}/locations/varrock/meta.toml (100%) rename game/{src/plugins => plugin}/locations/varrock/src/varrock-npcs.plugin.kts (100%) create mode 100644 game/plugin/logout/build.gradle rename game/{src/plugins => plugin}/logout/meta.toml (100%) rename game/{src/plugins => plugin}/logout/src/logout.plugin.kts (100%) rename game/{src/plugins => plugin}/logout/test/LogoutTests.kt (100%) create mode 100644 game/plugin/run/build.gradle rename game/{src/plugins => plugin}/run/meta.toml (100%) rename game/{src/plugins => plugin}/run/src/run.plugin.kts (100%) create mode 100644 game/plugin/util/command/build.gradle rename game/{src/plugins => plugin}/util/command/meta.toml (100%) rename game/{src/plugins => plugin}/util/command/src/command.kt (100%) create mode 100644 game/plugin/util/lookup/build.gradle rename game/{src/plugins => plugin}/util/lookup/meta.toml (100%) rename game/{src/plugins => plugin}/util/lookup/src/lookup.kt (100%) rename game/{src/plugins => plugin}/util/lookup/test/LookupTests.kt (100%) delete mode 100644 game/plugins.gradle diff --git a/build.gradle b/build.gradle index 333ae83c..5ce4fad5 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,7 @@ subprojects { repositories { mavenLocal() maven { url "https://repo.maven.apache.org/maven2" } + maven { url "https://dl.bintray.com/kotlin/kotlinx/" } } dependencies { diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 4a399fda..fe67c434 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -1,4 +1,5 @@ apply plugin: 'kotlin' +apply plugin: 'groovy' buildscript { apply from: '../properties.gradle' diff --git a/buildSrc/src/main/groovy/org/apollo/build/plugin/ApolloPlugin.groovy b/buildSrc/src/main/groovy/org/apollo/build/plugin/ApolloPlugin.groovy new file mode 100644 index 00000000..e312c143 --- /dev/null +++ b/buildSrc/src/main/groovy/org/apollo/build/plugin/ApolloPlugin.groovy @@ -0,0 +1,12 @@ +package org.apollo.build.plugin + +import org.gradle.api.Plugin +import org.gradle.api.Project + +class ApolloPlugin implements Plugin { + + @Override + void apply(Project project) { + project.extensions.create('apolloPlugin', ApolloPluginExtension, project) + } +} diff --git a/buildSrc/src/main/groovy/org/apollo/build/plugin/ApolloPluginExtension.groovy b/buildSrc/src/main/groovy/org/apollo/build/plugin/ApolloPluginExtension.groovy new file mode 100644 index 00000000..00743dcf --- /dev/null +++ b/buildSrc/src/main/groovy/org/apollo/build/plugin/ApolloPluginExtension.groovy @@ -0,0 +1,101 @@ +package org.apollo.build.plugin + +import org.apollo.build.plugin.tasks.ApolloScriptCompileTask +import org.gradle.api.Project +import org.gradle.api.file.FileTree + +class ApolloPluginExtension { + private Project project + + /** + * The name of this plugin (defaults to the project name). + */ + String name + + /** + * The package that plugin scripts (.kts files) will be packaged under for this plugin. + */ + String packageName = "org.apollo.game.plugins" + + /** + * An optional description of this plugin. + */ + String description = "Empty description" + + /** + * A list of other {@link ApolloPlugin}s that this plugin depends on. + */ + List dependencies = [] + + /** + * A list of others who contributed to this plugin. + */ + List authors = [] + + /** + * The directory that library files and script files are found under. + */ + final String srcDir = "src/" + + /** + * The directory that tests are found under. + */ + final String testDir = "test/" + + ApolloPluginExtension(Project project) { + this.project = project + this.name = project.name + + init() + } + + /** + * Setup the {@link Project} with the correct dependencies and tasks required to build the plugin + * and its scripts. + */ + def init() { + def gameProject = project.findProject(":game") + def pluginTestingProject = project.findProject(':game:plugin-testing') + + project.plugins.apply('kotlin') + project.sourceSets { + main { + kotlin { + srcDir this.srcDir + exclude '*.kts' + } + } + + test { + kotlin { + srcDir this.testDir + } + } + } + + project.dependencies.add('compile', gameProject) + project.dependencies.add('testCompile', pluginTestingProject.sourceSets.test.output) + + dependencies.each { + project.dependencies.add('compile', project.findProject(":game:plugin:$it")) + } + + project.tasks.create('compileScripts', ApolloScriptCompileTask) { + def mainSources = project.sourceSets.main + def outputDir = mainSources.output.classesDir + + FileTree filtered = project.fileTree(srcDir).matching { + include '*.kts' + } + + inputs.files filtered.files + outputsDir = outputDir + + compileClasspath = mainSources.compileClasspath + + mainSources.runtimeClasspath + + scriptDefinitionClass = "org.apollo.game.plugin.kotlin.KotlinPluginScript" + mustRunAfter project.tasks['classes'] + } + } +} diff --git a/buildSrc/src/main/groovy/org/apollo/build/plugin/compiler/KotlinCompilerConfigurationFactory.groovy b/buildSrc/src/main/groovy/org/apollo/build/plugin/compiler/KotlinCompilerConfigurationFactory.groovy new file mode 100644 index 00000000..2be6e28b --- /dev/null +++ b/buildSrc/src/main/groovy/org/apollo/build/plugin/compiler/KotlinCompilerConfigurationFactory.groovy @@ -0,0 +1,61 @@ +package org.apollo.build.plugin.compiler + +import kotlin.jvm.JvmClassMappingKt +import kotlin.reflect.KClass +import kotlin.reflect.full.KClasses +import kotlin.reflect.jvm.internal.KClassImpl +import kotlin.script.templates.ScriptTemplateDefinition +import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys +import org.jetbrains.kotlin.cli.common.messages.MessageCollector +import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot +import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.config.JVMConfigurationKeys +import org.jetbrains.kotlin.script.KotlinScriptDefinitionFromAnnotatedTemplate + +import java.lang.management.ManagementFactory + +class KotlinCompilerConfigurationFactory { + + static CompilerConfiguration create(String scriptDefinitionClassName, Collection classpath, MessageCollector messageCollector) { + def parentClassLoader = (URLClassLoader) Thread.currentThread().contextClassLoader + if (parentClassLoader == null) { + throw new RuntimeException("Unable to find current classloader") + } + + URL[] classpathUrls = parentClassLoader.getURLs() + + for (classpathUrl in classpathUrls) { + try { + classpath.add(new File(classpathUrl.toURI())) + } catch (ex) { + throw new RuntimeException("URL returned by ClassLoader is invalid", ex) + } + + } + + def runtimeBean = ManagementFactory.getRuntimeMXBean() + if (!runtimeBean.bootClassPathSupported) { + println("Warning! Boot class path is not supported, must be supplied on the command line") + } else { + def bootClasspath = runtimeBean.bootClassPath + classpath.addAll(bootClasspath.split(File.pathSeparatorChar.toString()).collect { new File(it) }) + } + + + def classLoader = new URLClassLoader(classpath.collect { it.toURL() }.toArray(new URL[classpath.size()])) + def configuration = new CompilerConfiguration() + def scriptDefinitionClass = classLoader.loadClass(scriptDefinitionClassName) + def classpathFiles = classpath.collect { it } + + def scriptDefinition = new KotlinScriptDefinitionFromAnnotatedTemplate(JvmClassMappingKt.getKotlinClass(scriptDefinitionClass), + null, null, null, classpathFiles) + + configuration.add(JVMConfigurationKeys.SCRIPT_DEFINITIONS, scriptDefinition) + configuration.put(JVMConfigurationKeys.CONTENT_ROOTS, classpath.collect { new JvmClasspathRoot(it) }) + configuration.put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, true) + configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector) + configuration.copy() + + return configuration + } +} diff --git a/buildSrc/src/main/groovy/org/apollo/build/plugin/compiler/KotlinScriptBinary.groovy b/buildSrc/src/main/groovy/org/apollo/build/plugin/compiler/KotlinScriptBinary.groovy new file mode 100644 index 00000000..e4df437d --- /dev/null +++ b/buildSrc/src/main/groovy/org/apollo/build/plugin/compiler/KotlinScriptBinary.groovy @@ -0,0 +1,13 @@ +package org.apollo.build.plugin.compiler + +import java.nio.file.Path + +class KotlinScriptBinary { + final String fullyQualifiedName + final Path output + + KotlinScriptBinary(String fullyQualifiedName, Path output) { + this.output = output + this.fullyQualifiedName = fullyQualifiedName + } +} diff --git a/buildSrc/src/main/groovy/org/apollo/build/plugin/compiler/KotlinScriptCompiler.groovy b/buildSrc/src/main/groovy/org/apollo/build/plugin/compiler/KotlinScriptCompiler.groovy new file mode 100644 index 00000000..20f510d2 --- /dev/null +++ b/buildSrc/src/main/groovy/org/apollo/build/plugin/compiler/KotlinScriptCompiler.groovy @@ -0,0 +1,75 @@ +package org.apollo.build.plugin.compiler + +import org.jetbrains.kotlin.cli.common.messages.MessageCollector +import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler +import org.jetbrains.kotlin.com.intellij.openapi.util.Disposer +import org.jetbrains.kotlin.config.CommonConfigurationKeys +import org.jetbrains.kotlin.config.JVMConfigurationKeys +import org.jetbrains.kotlin.config.KotlinSourceRoot + +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.StandardOpenOption + +class KotlinScriptCompiler { + private String scriptDefinitionClass + private Collection classpath + private MessageCollector messageCollector + + KotlinScriptCompiler(String scriptDefinitionClass, Collection classpath, MessageCollector messageCollector) { + this.scriptDefinitionClass = scriptDefinitionClass + this.classpath = classpath + this.messageCollector = messageCollector + } + + KotlinScriptBinary compile(Path input, Path output) { + def compilerConfiguration = KotlinCompilerConfigurationFactory.create( + scriptDefinitionClass, + classpath, + messageCollector + ) + + def rootDisposable = Disposer.newDisposable() + def configuration = compilerConfiguration.copy() + + output.toFile().mkdirs() + + configuration.put(CommonConfigurationKeys.MODULE_NAME, input.toString()) + configuration.add(JVMConfigurationKeys.CONTENT_ROOTS, new KotlinSourceRoot(input.toAbsolutePath().toString())) + + def configFiles = EnvironmentConfigFiles.JVM_CONFIG_FILES + def environment = KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, configFiles) + + try { + def generationState = KotlinToJVMBytecodeCompiler.INSTANCE.analyzeAndGenerate(environment) + if (generationState == null) { + throw new KotlinScriptCompilerException("Failed to generate bytecode for kotlin script") + } + + def sourceFiles = environment.getSourceFiles() + def script = sourceFiles[0].script + if (script == null) { + throw new KotlinScriptCompilerException("Main source file is not a script") + } + + def scriptFilePath = script.fqName.asString().replace('.', '/') + ".class" + def scriptFileClass = generationState.factory.get(scriptFilePath) + + if (scriptFileClass == null) { + throw new KotlinScriptCompilerException("Unable to find compiled plugin class file $scriptFilePath") + } + + generationState.factory.asList().forEach { + Files.write(output.resolve(it.relativePath), it.asByteArray(), StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING) + } + + return new KotlinScriptBinary(script.fqName.asString(), output.resolve(scriptFileClass.relativePath)) + } catch (ex) { + throw new KotlinScriptCompilerException("Compilation failed", ex) + } finally { + Disposer.dispose(rootDisposable) + } + } +} diff --git a/buildSrc/src/main/groovy/org/apollo/build/plugin/compiler/KotlinScriptCompilerException.groovy b/buildSrc/src/main/groovy/org/apollo/build/plugin/compiler/KotlinScriptCompilerException.groovy new file mode 100644 index 00000000..ae899f48 --- /dev/null +++ b/buildSrc/src/main/groovy/org/apollo/build/plugin/compiler/KotlinScriptCompilerException.groovy @@ -0,0 +1,11 @@ +package org.apollo.build.plugin.compiler + +class KotlinScriptCompilerException extends Exception { + KotlinScriptCompilerException(String message) { + super(message) + } + + KotlinScriptCompilerException(String message, Throwable cause) { + super(message, cause) + } +} diff --git a/buildSrc/src/main/groovy/org/apollo/build/plugin/tasks/ApolloScriptCompileTask.groovy b/buildSrc/src/main/groovy/org/apollo/build/plugin/tasks/ApolloScriptCompileTask.groovy new file mode 100644 index 00000000..2846531b --- /dev/null +++ b/buildSrc/src/main/groovy/org/apollo/build/plugin/tasks/ApolloScriptCompileTask.groovy @@ -0,0 +1,59 @@ +package org.apollo.build.plugin.tasks + +import org.apollo.build.plugin.compiler.KotlinScriptCompiler +import org.gradle.api.DefaultTask +import org.gradle.api.file.FileCollection +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.TaskAction +import org.gradle.api.tasks.incremental.IncrementalTaskInputs +import org.jetbrains.kotlin.cli.common.messages.MessageRenderer +import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector + +class ApolloScriptCompileTask extends DefaultTask { + File outputsDir + + @Input + FileCollection compileClasspath + + @Input + String scriptDefinitionClass + + @TaskAction + def execute(IncrementalTaskInputs inputs) { + if (scriptDefinitionClass == null) { + throw new Exception("No script definition class given") + } + + if (compileClasspath == null) { + throw new Exception("No compile classpath given") + } + + def classpath = compileClasspath.files + def messageCollector = new PrintingMessageCollector(System.err, MessageRenderer.PLAIN_RELATIVE_PATHS, true); + def compiler = new KotlinScriptCompiler(scriptDefinitionClass, classpath, messageCollector) + + inputs.outOfDate { + removeBinariesFor(it.file) + compiler.compile(it.file.toPath(), outputsDir.toPath()) + } + + inputs.removed { + removeBinariesFor(it.file) + } + } + + def removeBinariesFor(File file) { + def normalizedFilename = file.name.replace("[^A-Z_]", "_") + def normalizedPrefix = normalizedFilename.subSequence(0, normalizedFilename.lastIndexOf('.')) + + FileFilter filter = { + it.name.startsWith(normalizedPrefix) + } + + def binaries = outputsDir.listFiles FileFilter { dir, name -> name.startsWith(normalizedPrefix) } + + binaries.forEach { + it.delete() + } + } +} diff --git a/buildSrc/src/main/kotlin/org/apollo/build/compile/KotlinScriptCompiler.kt b/buildSrc/src/main/kotlin/org/apollo/build/compile/KotlinScriptCompiler.kt deleted file mode 100644 index eaebdeb8..00000000 --- a/buildSrc/src/main/kotlin/org/apollo/build/compile/KotlinScriptCompiler.kt +++ /dev/null @@ -1,128 +0,0 @@ -package org.apollo.build.compile - -import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys -import org.jetbrains.kotlin.cli.common.messages.MessageCollector -import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles -import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler -import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot -import org.jetbrains.kotlin.codegen.CompilationException -import org.jetbrains.kotlin.com.intellij.openapi.util.Disposer -import org.jetbrains.kotlin.config.CommonConfigurationKeys -import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.config.JVMConfigurationKeys -import org.jetbrains.kotlin.config.addKotlinSourceRoot -import org.jetbrains.kotlin.script.KotlinScriptDefinitionFromAnnotatedTemplate -import java.io.File -import java.lang.management.ManagementFactory -import java.net.URISyntaxException -import java.net.URLClassLoader -import java.nio.file.Files -import java.nio.file.Path -import java.nio.file.StandardOpenOption -import java.util.* - - -data class KotlinCompilerResult(val fqName: String, val outputPath: Path) - -class KotlinScriptCompiler { - - val classpath: List - val messageCollector: MessageCollector - val compilerConfiguration: CompilerConfiguration - - constructor(scriptDefinitionClassName: String, classpath: Collection, messageCollector: MessageCollector) { - this.classpath = classpath + currentClasspath() - this.messageCollector = messageCollector - this.compilerConfiguration = createCompilerConfiguration(scriptDefinitionClassName) - } - - companion object { - - fun currentClasspath(): List { - val classLoader = Thread.currentThread().contextClassLoader as? URLClassLoader ?: - throw RuntimeException("Unable to resolve classpath for current ClassLoader") - - val classpathUrls = classLoader.urLs - val classpath = ArrayList() - - for (classpathUrl in classpathUrls) { - try { - classpath.add(File(classpathUrl.toURI())) - } catch (e: URISyntaxException) { - throw RuntimeException("URL returned by ClassLoader is invalid") - } - - } - - val runtimeBean = ManagementFactory.getRuntimeMXBean() - if (!runtimeBean.isBootClassPathSupported) { - println("Warning! Boot class path is not supported, must be supplied on the command line") - } else { - val bootClasspath = runtimeBean.bootClassPath - classpath.addAll(bootClasspath.split(File.pathSeparatorChar).map { File(it) }) - } - - return classpath - } - } - - private fun createCompilerConfiguration(scriptDefinitionClassName: String): CompilerConfiguration { - val classLoader = URLClassLoader(classpath.map { it.toURL() }.toTypedArray()) - val configuration = CompilerConfiguration() - val scriptDefinitionClass = classLoader.loadClass(scriptDefinitionClassName) - val scriptDefinition = KotlinScriptDefinitionFromAnnotatedTemplate(scriptDefinitionClass.kotlin) - - configuration.add(JVMConfigurationKeys.SCRIPT_DEFINITIONS, scriptDefinition) - configuration.put(JVMConfigurationKeys.CONTENT_ROOTS, classpath.map { JvmClasspathRoot(it) }) - configuration.put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, true) - configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector) - configuration.copy() - - return configuration - } - - @Throws(KotlinPluginCompilerException::class) - fun compile(inputPath: Path, outputPath: Path): KotlinCompilerResult { - val rootDisposable = Disposer.newDisposable() - val configuration = compilerConfiguration.copy() - - configuration.put(CommonConfigurationKeys.MODULE_NAME, inputPath.toString()) - configuration.addKotlinSourceRoot(inputPath.toAbsolutePath().toString()) - - val configFiles = EnvironmentConfigFiles.JVM_CONFIG_FILES - val environment = KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, configFiles) - - try { - val generationState = KotlinToJVMBytecodeCompiler.analyzeAndGenerate(environment) - if (generationState == null) { - throw KotlinPluginCompilerException("Failed to generate bytecode for kotlin script") - } - - val sourceFiles = environment.getSourceFiles() - val script = sourceFiles[0].script ?: throw KotlinPluginCompilerException("Main script file isnt a script") - - val scriptFilePath = script.fqName.asString().replace('.', '/') + ".class" - val scriptFileClass = generationState.factory.get(scriptFilePath) - - if (scriptFileClass == null) { - throw KotlinPluginCompilerException("Unable to find compiled plugin class file $scriptFilePath") - } - - generationState.factory.asList().forEach { - Files.write(outputPath.resolve(it.relativePath), it.asByteArray(), StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING) - } - - return KotlinCompilerResult(script.fqName.asString(), outputPath.resolve(scriptFileClass.relativePath)) - } catch (e: CompilationException) { - throw KotlinPluginCompilerException("Compilation failed", e) - } finally { - Disposer.dispose(rootDisposable) - } - } - -} - -class KotlinPluginCompilerException(message: String, cause: Throwable? = null) : Exception(message, cause) { - -} diff --git a/buildSrc/src/main/kotlin/org/apollo/build/tasks/KotlinScriptCompileTask.kt b/buildSrc/src/main/kotlin/org/apollo/build/tasks/KotlinScriptCompileTask.kt deleted file mode 100644 index 2e7cc5ed..00000000 --- a/buildSrc/src/main/kotlin/org/apollo/build/tasks/KotlinScriptCompileTask.kt +++ /dev/null @@ -1,58 +0,0 @@ -package org.apollo.build.tasks - -import org.apollo.build.compile.KotlinScriptCompiler -import org.gradle.api.DefaultTask -import org.gradle.api.file.FileCollection -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.TaskAction -import org.gradle.api.tasks.incremental.IncrementalTaskInputs -import org.jetbrains.kotlin.cli.common.messages.MessageRenderer -import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector -import java.io.File - -open class KotlinScriptCompileTask : DefaultTask() { - @OutputDirectory - var outputsDir: File? = null - - @Input - var compileClasspath: FileCollection? = null - - @Input - var scriptDefinitionClass: String? = null - - @TaskAction - fun execute(inputs: IncrementalTaskInputs) { - if (scriptDefinitionClass == null) { - throw Exception("No script definition class given") - } - - if (compileClasspath == null) { - throw Exception("No compile classpath given") - } - - val classpath = compileClasspath!!.files - val messageCollector = PrintingMessageCollector(System.err, MessageRenderer.PLAIN_RELATIVE_PATHS, true); - val compiler = KotlinScriptCompiler(scriptDefinitionClass!!, classpath, messageCollector) - - inputs.outOfDate { - removeBinariesFor(it.file) - compiler.compile(it.file.toPath(), outputsDir!!.toPath()) - } - - inputs.removed { - removeBinariesFor(it.file) - } - } - - private fun removeBinariesFor(file: File) { - val normalizedFilename = file.name.replace("[^A-Z_]", "_") - val normalizedPrefix = normalizedFilename.subSequence(0, normalizedFilename.lastIndexOf('.')) - - val binaries = outputsDir!!.listFiles { dir, name -> name.startsWith(normalizedPrefix) } - - binaries.forEach { - it.delete() - } - } -} diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/apollo-plugin.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/apollo-plugin.properties new file mode 100644 index 00000000..5b546ceb --- /dev/null +++ b/buildSrc/src/main/resources/META-INF/gradle-plugins/apollo-plugin.properties @@ -0,0 +1 @@ +implementation-class=org.apollo.build.plugin.ApolloPlugin \ No newline at end of file diff --git a/game/build.gradle b/game/build.gradle index b4441d4a..d1d4bab3 100644 --- a/game/build.gradle +++ b/game/build.gradle @@ -6,15 +6,11 @@ buildscript { } dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" - classpath group: 'com.moandjiezana.toml', name: 'toml4j', version: '0.7.1' + classpath group: 'org.jetbrains.kotlin', name: 'kotlin-gradle-plugin', version: "$kotlinVersion" } } -ext.pluginsDir = "$projectDir/src/plugins" - apply plugin: 'kotlin' -apply from: 'plugins.gradle' sourceSets { main { @@ -24,12 +20,6 @@ sourceSets { } } -repositories { - maven { - url { 'https://dl.bintray.com/kotlin/kotlinx/' } - } -} - dependencies { compile project(':cache') compile project(':net') @@ -41,6 +31,11 @@ dependencies { compile group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-jdk8', version: '0.16' compile group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core', version: '0.16' + project(":game:plugin").subprojects.each { plugin -> + println(plugin) + runtime plugin + } + testCompile group: 'org.assertj', name: 'assertj-core', version: '3.8.0' } diff --git a/game/plugin-testing/build.gradle b/game/plugin-testing/build.gradle new file mode 100644 index 00000000..2c0f8547 --- /dev/null +++ b/game/plugin-testing/build.gradle @@ -0,0 +1,6 @@ +apply plugin: 'kotlin' + + +dependencies { + compile project(':game') +} \ No newline at end of file diff --git a/game/src/pluginTesting/kotlin/org/apollo/game/plugin/testing/KotlinPluginTest.kt b/game/plugin-testing/src/test/kotlin/org/apollo/game/plugin/testing/KotlinPluginTest.kt similarity index 100% rename from game/src/pluginTesting/kotlin/org/apollo/game/plugin/testing/KotlinPluginTest.kt rename to game/plugin-testing/src/test/kotlin/org/apollo/game/plugin/testing/KotlinPluginTest.kt diff --git a/game/src/pluginTesting/kotlin/org/apollo/game/plugin/testing/KotlinPluginTestHelpers.kt b/game/plugin-testing/src/test/kotlin/org/apollo/game/plugin/testing/KotlinPluginTestHelpers.kt similarity index 100% rename from game/src/pluginTesting/kotlin/org/apollo/game/plugin/testing/KotlinPluginTestHelpers.kt rename to game/plugin-testing/src/test/kotlin/org/apollo/game/plugin/testing/KotlinPluginTestHelpers.kt diff --git a/game/src/pluginTesting/kotlin/org/apollo/game/plugin/testing/fakes/FakePluginContextFactory.kt b/game/plugin-testing/src/test/kotlin/org/apollo/game/plugin/testing/fakes/FakePluginContextFactory.kt similarity index 100% rename from game/src/pluginTesting/kotlin/org/apollo/game/plugin/testing/fakes/FakePluginContextFactory.kt rename to game/plugin-testing/src/test/kotlin/org/apollo/game/plugin/testing/fakes/FakePluginContextFactory.kt diff --git a/game/src/pluginTesting/kotlin/org/apollo/game/plugin/testing/mockito/KotlinArgMatcher.kt b/game/plugin-testing/src/test/kotlin/org/apollo/game/plugin/testing/mockito/KotlinArgMatcher.kt similarity index 100% rename from game/src/pluginTesting/kotlin/org/apollo/game/plugin/testing/mockito/KotlinArgMatcher.kt rename to game/plugin-testing/src/test/kotlin/org/apollo/game/plugin/testing/mockito/KotlinArgMatcher.kt diff --git a/game/src/pluginTesting/kotlin/org/apollo/game/plugin/testing/mockito/KotlinMockitoExtensions.kt b/game/plugin-testing/src/test/kotlin/org/apollo/game/plugin/testing/mockito/KotlinMockitoExtensions.kt similarity index 100% rename from game/src/pluginTesting/kotlin/org/apollo/game/plugin/testing/mockito/KotlinMockitoExtensions.kt rename to game/plugin-testing/src/test/kotlin/org/apollo/game/plugin/testing/mockito/KotlinMockitoExtensions.kt diff --git a/game/plugin/bank/build.gradle b/game/plugin/bank/build.gradle new file mode 100644 index 00000000..b128b5e0 --- /dev/null +++ b/game/plugin/bank/build.gradle @@ -0,0 +1,7 @@ +apolloPlugin { + name = "Banking" + packageName = "org.apollo.game.plugin.banking" + authors = [ + "Major", + ] +} \ No newline at end of file diff --git a/game/src/plugins/bank/meta.toml b/game/plugin/bank/meta.toml similarity index 100% rename from game/src/plugins/bank/meta.toml rename to game/plugin/bank/meta.toml diff --git a/game/src/plugins/bank/src/bank.plugin.kts b/game/plugin/bank/src/bank.plugin.kts similarity index 100% rename from game/src/plugins/bank/src/bank.plugin.kts rename to game/plugin/bank/src/bank.plugin.kts diff --git a/game/src/plugins/bank/test/OpenBankTest.kt b/game/plugin/bank/test/OpenBankTest.kt similarity index 100% rename from game/src/plugins/bank/test/OpenBankTest.kt rename to game/plugin/bank/test/OpenBankTest.kt diff --git a/game/plugin/build.gradle b/game/plugin/build.gradle new file mode 100644 index 00000000..7635586b --- /dev/null +++ b/game/plugin/build.gradle @@ -0,0 +1,74 @@ +import com.moandjiezana.toml.Toml + +import java.nio.file.Paths + +buildscript { + repositories { + mavenCentral() + } + + dependencies { + classpath group: 'com.moandjiezana.toml', name: 'toml4j', version: '0.7.1' + } +} + +subprojects { + if (it.buildFile.exists()) { + apply plugin: 'apollo-plugin' + + repositories { + mavenCentral() + maven { + url { 'https://dl.bintray.com/kotlin/kotlinx/' } + } + } + } +} + +task("convertPluginTomlToGradle") { + def pluginTree = fileTree(dir: "${project.rootDir}/game/src/plugins/") + def pluginDefinitions = pluginTree.matching { + include "**/*.toml" + } + + pluginDefinitions.each { file -> + def meta = new Toml() + meta.read(file.absoluteFile) + + def pluginFolder = Paths.get(file.parentFile.absolutePath) + def name = meta.getString("name", pluginFolder.getFileName().toString()) + def normalizedName = name.replaceAll("[^a-zA-Z0-9_]", '_').toLowerCase() + def description = meta.getString("description", "") + def packageName = meta.getString("package", "org.apollo.game.plugin") + def authors = meta.getList("authors", new ArrayList()) + def dependencies = meta.getList("dependencies", new ArrayList()) + + def buildFile = new File(pluginFolder.toFile(), 'build.gradle') + buildFile.withWriter('UTF-8') { writer -> + writer.write("apolloPlugin {\n") + writer.write(" name = \"$normalizedName\"\n") + + if (packageName != "org.apollo.game.plugin") { + writer.write(" packageName = \"$packageName\"\n") + } + + if (description.length() > 0) { + writer.write(" description = \"$description\"\n") + } + + if (authors.size > 0) { + writer.write(" authors = [\n") + authors.each { writer.write(" \"$it\",\n") } + writer.write(" ]\n") + } + + if (dependencies.size > 0) { + writer.write(" dependencies = [\n") + dependencies.each { writer.write(" \"$it\",\n") } + writer.write(" ]\n") + } + + writer.write("}") + } + } +} \ No newline at end of file diff --git a/game/plugin/chat/private-messaging/build.gradle b/game/plugin/chat/private-messaging/build.gradle new file mode 100644 index 00000000..f1f46407 --- /dev/null +++ b/game/plugin/chat/private-messaging/build.gradle @@ -0,0 +1,3 @@ +apolloPlugin { + name = "private-messaging" +} \ No newline at end of file diff --git a/game/src/plugins/chat/private-messaging/meta.toml b/game/plugin/chat/private-messaging/meta.toml similarity index 100% rename from game/src/plugins/chat/private-messaging/meta.toml rename to game/plugin/chat/private-messaging/meta.toml diff --git a/game/src/plugins/chat/private-messaging/src/friends.plugin.kts b/game/plugin/chat/private-messaging/src/friends.plugin.kts similarity index 100% rename from game/src/plugins/chat/private-messaging/src/friends.plugin.kts rename to game/plugin/chat/private-messaging/src/friends.plugin.kts diff --git a/game/src/plugins/chat/private-messaging/src/ignores.plugin.kts b/game/plugin/chat/private-messaging/src/ignores.plugin.kts similarity index 100% rename from game/src/plugins/chat/private-messaging/src/ignores.plugin.kts rename to game/plugin/chat/private-messaging/src/ignores.plugin.kts diff --git a/game/src/plugins/chat/private-messaging/src/messaging.plugin.kts b/game/plugin/chat/private-messaging/src/messaging.plugin.kts similarity index 100% rename from game/src/plugins/chat/private-messaging/src/messaging.plugin.kts rename to game/plugin/chat/private-messaging/src/messaging.plugin.kts diff --git a/game/plugin/cmd/build.gradle b/game/plugin/cmd/build.gradle new file mode 100644 index 00000000..ecb98912 --- /dev/null +++ b/game/plugin/cmd/build.gradle @@ -0,0 +1,13 @@ +apolloPlugin { + name = "Chat commands" + packageName = "org.apollo.game.plugin.cmd" + authors = [ + "Graham", + "Major", + "lare96", + "cubeee", + ] + dependencies = [ + "util:command", + ] +} \ No newline at end of file diff --git a/game/src/plugins/cmd/meta.toml b/game/plugin/cmd/meta.toml similarity index 100% rename from game/src/plugins/cmd/meta.toml rename to game/plugin/cmd/meta.toml diff --git a/game/src/plugins/cmd/src/animate-cmd.plugin.kts b/game/plugin/cmd/src/animate-cmd.plugin.kts similarity index 100% rename from game/src/plugins/cmd/src/animate-cmd.plugin.kts rename to game/plugin/cmd/src/animate-cmd.plugin.kts diff --git a/game/src/plugins/cmd/src/bank-cmd.plugin.kts b/game/plugin/cmd/src/bank-cmd.plugin.kts similarity index 100% rename from game/src/plugins/cmd/src/bank-cmd.plugin.kts rename to game/plugin/cmd/src/bank-cmd.plugin.kts diff --git a/game/src/plugins/cmd/src/item-cmd.plugin.kts b/game/plugin/cmd/src/item-cmd.plugin.kts similarity index 100% rename from game/src/plugins/cmd/src/item-cmd.plugin.kts rename to game/plugin/cmd/src/item-cmd.plugin.kts diff --git a/game/src/plugins/cmd/src/lookup.plugin.kts b/game/plugin/cmd/src/lookup.plugin.kts similarity index 100% rename from game/src/plugins/cmd/src/lookup.plugin.kts rename to game/plugin/cmd/src/lookup.plugin.kts diff --git a/game/src/plugins/cmd/src/messaging-cmd.plugin.kts b/game/plugin/cmd/src/messaging-cmd.plugin.kts similarity index 100% rename from game/src/plugins/cmd/src/messaging-cmd.plugin.kts rename to game/plugin/cmd/src/messaging-cmd.plugin.kts diff --git a/game/src/plugins/cmd/src/punish-cmd.plugin.kts b/game/plugin/cmd/src/punish-cmd.plugin.kts similarity index 100% rename from game/src/plugins/cmd/src/punish-cmd.plugin.kts rename to game/plugin/cmd/src/punish-cmd.plugin.kts diff --git a/game/src/plugins/cmd/src/skill-cmd.plugin.kts b/game/plugin/cmd/src/skill-cmd.plugin.kts similarity index 100% rename from game/src/plugins/cmd/src/skill-cmd.plugin.kts rename to game/plugin/cmd/src/skill-cmd.plugin.kts diff --git a/game/src/plugins/cmd/src/spawn-cmd.plugin.kts b/game/plugin/cmd/src/spawn-cmd.plugin.kts similarity index 100% rename from game/src/plugins/cmd/src/spawn-cmd.plugin.kts rename to game/plugin/cmd/src/spawn-cmd.plugin.kts diff --git a/game/src/plugins/cmd/src/teleport-cmd.plugin.kts b/game/plugin/cmd/src/teleport-cmd.plugin.kts similarity index 100% rename from game/src/plugins/cmd/src/teleport-cmd.plugin.kts rename to game/plugin/cmd/src/teleport-cmd.plugin.kts diff --git a/game/plugin/consumables/build.gradle b/game/plugin/consumables/build.gradle new file mode 100644 index 00000000..84c3ff79 --- /dev/null +++ b/game/plugin/consumables/build.gradle @@ -0,0 +1,7 @@ +apolloPlugin { + name = "consumables" + packageName = "org.apollo.game.plugin.consumables" + authors = [ + "Gary Tierney", + ] +} \ No newline at end of file diff --git a/game/src/plugins/consumables/meta.toml b/game/plugin/consumables/meta.toml similarity index 100% rename from game/src/plugins/consumables/meta.toml rename to game/plugin/consumables/meta.toml diff --git a/game/src/plugins/consumables/src/consumables.kt b/game/plugin/consumables/src/consumables.kt similarity index 100% rename from game/src/plugins/consumables/src/consumables.kt rename to game/plugin/consumables/src/consumables.kt diff --git a/game/src/plugins/consumables/src/consumables.plugin.kts b/game/plugin/consumables/src/consumables.plugin.kts similarity index 100% rename from game/src/plugins/consumables/src/consumables.plugin.kts rename to game/plugin/consumables/src/consumables.plugin.kts diff --git a/game/src/plugins/consumables/src/drinks.plugin.kts b/game/plugin/consumables/src/drinks.plugin.kts similarity index 100% rename from game/src/plugins/consumables/src/drinks.plugin.kts rename to game/plugin/consumables/src/drinks.plugin.kts diff --git a/game/src/plugins/consumables/src/foods.plugin.kts b/game/plugin/consumables/src/foods.plugin.kts similarity index 100% rename from game/src/plugins/consumables/src/foods.plugin.kts rename to game/plugin/consumables/src/foods.plugin.kts diff --git a/game/src/plugins/consumables/test/FoodOrDrinkTests.kt b/game/plugin/consumables/test/FoodOrDrinkTests.kt similarity index 100% rename from game/src/plugins/consumables/test/FoodOrDrinkTests.kt rename to game/plugin/consumables/test/FoodOrDrinkTests.kt diff --git a/game/plugin/dummy/build.gradle b/game/plugin/dummy/build.gradle new file mode 100644 index 00000000..c76482a9 --- /dev/null +++ b/game/plugin/dummy/build.gradle @@ -0,0 +1,7 @@ +apolloPlugin { + name = "training-dummy" + packageName = "org.apollo.game.plugin.entity" + authors = [ + "Gary Tierney", + ] +} \ No newline at end of file diff --git a/game/src/plugins/dummy/meta.toml b/game/plugin/dummy/meta.toml similarity index 100% rename from game/src/plugins/dummy/meta.toml rename to game/plugin/dummy/meta.toml diff --git a/game/src/plugins/dummy/src/dummy.plugin.kts b/game/plugin/dummy/src/dummy.plugin.kts similarity index 100% rename from game/src/plugins/dummy/src/dummy.plugin.kts rename to game/plugin/dummy/src/dummy.plugin.kts diff --git a/game/src/plugins/dummy/test/TrainingDummyTest.kt b/game/plugin/dummy/test/TrainingDummyTest.kt similarity index 100% rename from game/src/plugins/dummy/test/TrainingDummyTest.kt rename to game/plugin/dummy/test/TrainingDummyTest.kt diff --git a/game/plugin/emote-tab/build.gradle b/game/plugin/emote-tab/build.gradle new file mode 100644 index 00000000..64d546aa --- /dev/null +++ b/game/plugin/emote-tab/build.gradle @@ -0,0 +1,7 @@ +apolloPlugin { + name = "emote-tab" + packageName = "org.apollo.game.plugin.widget" + authors = [ + "Gary Tierney", + ] +} \ No newline at end of file diff --git a/game/src/plugins/emote-tab/meta.toml b/game/plugin/emote-tab/meta.toml similarity index 100% rename from game/src/plugins/emote-tab/meta.toml rename to game/plugin/emote-tab/meta.toml diff --git a/game/src/plugins/emote-tab/src/emote-tab.plugin.kts b/game/plugin/emote-tab/src/emote-tab.plugin.kts similarity index 100% rename from game/src/plugins/emote-tab/src/emote-tab.plugin.kts rename to game/plugin/emote-tab/src/emote-tab.plugin.kts diff --git a/game/plugin/entity/following/build.gradle b/game/plugin/entity/following/build.gradle new file mode 100644 index 00000000..cca1aa0a --- /dev/null +++ b/game/plugin/entity/following/build.gradle @@ -0,0 +1,12 @@ +apolloPlugin { + name = "following" + packageName = "org.apollo.game.plugin.entity" + authors = [ + "Gary Tierney", + ] + dependencies = [ + "walkto", + "command_utilities", + "player_action", + ] +} \ No newline at end of file diff --git a/game/src/plugins/entity/following/meta.toml b/game/plugin/entity/following/meta.toml similarity index 100% rename from game/src/plugins/entity/following/meta.toml rename to game/plugin/entity/following/meta.toml diff --git a/game/src/plugins/entity/following/src/following.kt b/game/plugin/entity/following/src/following.kt similarity index 100% rename from game/src/plugins/entity/following/src/following.kt rename to game/plugin/entity/following/src/following.kt diff --git a/game/src/plugins/entity/following/src/following.plugin.kts b/game/plugin/entity/following/src/following.plugin.kts similarity index 100% rename from game/src/plugins/entity/following/src/following.plugin.kts rename to game/plugin/entity/following/src/following.plugin.kts diff --git a/game/plugin/entity/player-action/build.gradle b/game/plugin/entity/player-action/build.gradle new file mode 100644 index 00000000..c85b336d --- /dev/null +++ b/game/plugin/entity/player-action/build.gradle @@ -0,0 +1,7 @@ +apolloPlugin { + name = "player_action" + packageName = "org.apollo.game.plugin.entity" + authors = [ + "Gary Tierney", + ] +} \ No newline at end of file diff --git a/game/src/plugins/entity/player-action/meta.toml b/game/plugin/entity/player-action/meta.toml similarity index 100% rename from game/src/plugins/entity/player-action/meta.toml rename to game/plugin/entity/player-action/meta.toml diff --git a/game/src/plugins/entity/player-action/src/player_action.kt b/game/plugin/entity/player-action/src/player_action.kt similarity index 100% rename from game/src/plugins/entity/player-action/src/player_action.kt rename to game/plugin/entity/player-action/src/player_action.kt diff --git a/game/src/plugins/entity/player-action/src/player_action.plugin.kts b/game/plugin/entity/player-action/src/player_action.plugin.kts similarity index 100% rename from game/src/plugins/entity/player-action/src/player_action.plugin.kts rename to game/plugin/entity/player-action/src/player_action.plugin.kts diff --git a/game/plugin/entity/spawn/build.gradle b/game/plugin/entity/spawn/build.gradle new file mode 100644 index 00000000..48d810a7 --- /dev/null +++ b/game/plugin/entity/spawn/build.gradle @@ -0,0 +1,10 @@ +apolloPlugin { + name = "spawning" + packageName = "org.apollo.game.plugin.entity" + authors = [ + "Gary Tierney", + ] + dependencies = [ + "entity_lookup", + ] +} \ No newline at end of file diff --git a/game/src/plugins/entity/spawn/meta.toml b/game/plugin/entity/spawn/meta.toml similarity index 100% rename from game/src/plugins/entity/spawn/meta.toml rename to game/plugin/entity/spawn/meta.toml diff --git a/game/src/plugins/entity/spawn/src/spawn.kt b/game/plugin/entity/spawn/src/spawn.kt similarity index 100% rename from game/src/plugins/entity/spawn/src/spawn.kt rename to game/plugin/entity/spawn/src/spawn.kt diff --git a/game/src/plugins/entity/spawn/src/spawn.plugin.kts b/game/plugin/entity/spawn/src/spawn.plugin.kts similarity index 100% rename from game/src/plugins/entity/spawn/src/spawn.plugin.kts rename to game/plugin/entity/spawn/src/spawn.plugin.kts diff --git a/game/plugin/entity/walk-to/build.gradle b/game/plugin/entity/walk-to/build.gradle new file mode 100644 index 00000000..7102d620 --- /dev/null +++ b/game/plugin/entity/walk-to/build.gradle @@ -0,0 +1,7 @@ +apolloPlugin { + name = "walkto" + packageName = "org.apollo.plugin.entity.walkto" + authors = [ + "Gary Tierney", + ] +} \ No newline at end of file diff --git a/game/src/plugins/entity/walk-to/meta.toml b/game/plugin/entity/walk-to/meta.toml similarity index 100% rename from game/src/plugins/entity/walk-to/meta.toml rename to game/plugin/entity/walk-to/meta.toml diff --git a/game/src/plugins/entity/walk-to/src/walk_to.kt b/game/plugin/entity/walk-to/src/walk_to.kt similarity index 100% rename from game/src/plugins/entity/walk-to/src/walk_to.kt rename to game/plugin/entity/walk-to/src/walk_to.kt diff --git a/game/plugin/locations/al-kharid/build.gradle b/game/plugin/locations/al-kharid/build.gradle new file mode 100644 index 00000000..64a4c527 --- /dev/null +++ b/game/plugin/locations/al-kharid/build.gradle @@ -0,0 +1,10 @@ +apolloPlugin { + name = "al-kharid npc spawns" + packageName = "org.apollo.game.plugin.locations" + authors = [ + "Jesse W", + ] + dependencies = [ + "spawning", + ] +} \ No newline at end of file diff --git a/game/src/plugins/locations/al-kharid/meta.toml b/game/plugin/locations/al-kharid/meta.toml similarity index 100% rename from game/src/plugins/locations/al-kharid/meta.toml rename to game/plugin/locations/al-kharid/meta.toml diff --git a/game/src/plugins/locations/al-kharid/src/al-kharid-npcs.plugin.kts b/game/plugin/locations/al-kharid/src/al-kharid-npcs.plugin.kts similarity index 100% rename from game/src/plugins/locations/al-kharid/src/al-kharid-npcs.plugin.kts rename to game/plugin/locations/al-kharid/src/al-kharid-npcs.plugin.kts diff --git a/game/plugin/locations/edgeville/build.gradle b/game/plugin/locations/edgeville/build.gradle new file mode 100644 index 00000000..e7262e2f --- /dev/null +++ b/game/plugin/locations/edgeville/build.gradle @@ -0,0 +1,10 @@ +apolloPlugin { + name = "edgeville npc spawns" + packageName = "org.apollo.game.plugin.locations" + authors = [ + "Jesse W", + ] + dependencies = [ + "spawning", + ] +} \ No newline at end of file diff --git a/game/src/plugins/locations/edgeville/meta.toml b/game/plugin/locations/edgeville/meta.toml similarity index 100% rename from game/src/plugins/locations/edgeville/meta.toml rename to game/plugin/locations/edgeville/meta.toml diff --git a/game/src/plugins/locations/edgeville/src/edgeville-npcs.plugin.kts b/game/plugin/locations/edgeville/src/edgeville-npcs.plugin.kts similarity index 100% rename from game/src/plugins/locations/edgeville/src/edgeville-npcs.plugin.kts rename to game/plugin/locations/edgeville/src/edgeville-npcs.plugin.kts diff --git a/game/plugin/locations/falador/build.gradle b/game/plugin/locations/falador/build.gradle new file mode 100644 index 00000000..47f2171e --- /dev/null +++ b/game/plugin/locations/falador/build.gradle @@ -0,0 +1,10 @@ +apolloPlugin { + name = "falador npc spawns" + packageName = "org.apollo.game.plugin.locations" + authors = [ + "Jesse W", + ] + dependencies = [ + "spawning", + ] +} \ No newline at end of file diff --git a/game/src/plugins/locations/falador/meta.toml b/game/plugin/locations/falador/meta.toml similarity index 100% rename from game/src/plugins/locations/falador/meta.toml rename to game/plugin/locations/falador/meta.toml diff --git a/game/src/plugins/locations/falador/src/falador-npcs.plugin.kts b/game/plugin/locations/falador/src/falador-npcs.plugin.kts similarity index 100% rename from game/src/plugins/locations/falador/src/falador-npcs.plugin.kts rename to game/plugin/locations/falador/src/falador-npcs.plugin.kts diff --git a/game/plugin/locations/lumbridge/build.gradle b/game/plugin/locations/lumbridge/build.gradle new file mode 100644 index 00000000..6a47562c --- /dev/null +++ b/game/plugin/locations/lumbridge/build.gradle @@ -0,0 +1,10 @@ +apolloPlugin { + name = "lumbridge npc spawns" + packageName = "org.apollo.game.plugin.locations" + authors = [ + "Gary Tierney", + ] + dependencies = [ + "spawning", + ] +} \ No newline at end of file diff --git a/game/src/plugins/locations/lumbridge/meta.toml b/game/plugin/locations/lumbridge/meta.toml similarity index 100% rename from game/src/plugins/locations/lumbridge/meta.toml rename to game/plugin/locations/lumbridge/meta.toml diff --git a/game/src/plugins/locations/lumbridge/src/lumbridge-npcs.plugin.kts b/game/plugin/locations/lumbridge/src/lumbridge-npcs.plugin.kts similarity index 100% rename from game/src/plugins/locations/lumbridge/src/lumbridge-npcs.plugin.kts rename to game/plugin/locations/lumbridge/src/lumbridge-npcs.plugin.kts diff --git a/game/plugin/locations/tutorial-island/build.gradle b/game/plugin/locations/tutorial-island/build.gradle new file mode 100644 index 00000000..0b184b50 --- /dev/null +++ b/game/plugin/locations/tutorial-island/build.gradle @@ -0,0 +1,10 @@ +apolloPlugin { + name = "tutorial island npc spawns" + packageName = "org.apollo.game.plugin.locations" + authors = [ + "Jesse W", + ] + dependencies = [ + "spawning", + ] +} \ No newline at end of file diff --git a/game/src/plugins/locations/tutorial-island/meta.toml b/game/plugin/locations/tutorial-island/meta.toml similarity index 100% rename from game/src/plugins/locations/tutorial-island/meta.toml rename to game/plugin/locations/tutorial-island/meta.toml diff --git a/game/src/plugins/locations/tutorial-island/src/tutorial-island-npcs.plugin.kts b/game/plugin/locations/tutorial-island/src/tutorial-island-npcs.plugin.kts similarity index 100% rename from game/src/plugins/locations/tutorial-island/src/tutorial-island-npcs.plugin.kts rename to game/plugin/locations/tutorial-island/src/tutorial-island-npcs.plugin.kts diff --git a/game/plugin/locations/varrock/build.gradle b/game/plugin/locations/varrock/build.gradle new file mode 100644 index 00000000..02061ca6 --- /dev/null +++ b/game/plugin/locations/varrock/build.gradle @@ -0,0 +1,10 @@ +apolloPlugin { + name = "varrock npc spawns" + packageName = "org.apollo.game.plugin.locations" + authors = [ + "Jesse W", + ] + dependencies = [ + "spawning", + ] +} \ No newline at end of file diff --git a/game/src/plugins/locations/varrock/meta.toml b/game/plugin/locations/varrock/meta.toml similarity index 100% rename from game/src/plugins/locations/varrock/meta.toml rename to game/plugin/locations/varrock/meta.toml diff --git a/game/src/plugins/locations/varrock/src/varrock-npcs.plugin.kts b/game/plugin/locations/varrock/src/varrock-npcs.plugin.kts similarity index 100% rename from game/src/plugins/locations/varrock/src/varrock-npcs.plugin.kts rename to game/plugin/locations/varrock/src/varrock-npcs.plugin.kts diff --git a/game/plugin/logout/build.gradle b/game/plugin/logout/build.gradle new file mode 100644 index 00000000..341b83a7 --- /dev/null +++ b/game/plugin/logout/build.gradle @@ -0,0 +1,3 @@ +apolloPlugin { + name = "logout" +} \ No newline at end of file diff --git a/game/src/plugins/logout/meta.toml b/game/plugin/logout/meta.toml similarity index 100% rename from game/src/plugins/logout/meta.toml rename to game/plugin/logout/meta.toml diff --git a/game/src/plugins/logout/src/logout.plugin.kts b/game/plugin/logout/src/logout.plugin.kts similarity index 100% rename from game/src/plugins/logout/src/logout.plugin.kts rename to game/plugin/logout/src/logout.plugin.kts diff --git a/game/src/plugins/logout/test/LogoutTests.kt b/game/plugin/logout/test/LogoutTests.kt similarity index 100% rename from game/src/plugins/logout/test/LogoutTests.kt rename to game/plugin/logout/test/LogoutTests.kt diff --git a/game/plugin/run/build.gradle b/game/plugin/run/build.gradle new file mode 100644 index 00000000..cb2a3408 --- /dev/null +++ b/game/plugin/run/build.gradle @@ -0,0 +1,3 @@ +apolloPlugin { + name = "run" +} \ No newline at end of file diff --git a/game/src/plugins/run/meta.toml b/game/plugin/run/meta.toml similarity index 100% rename from game/src/plugins/run/meta.toml rename to game/plugin/run/meta.toml diff --git a/game/src/plugins/run/src/run.plugin.kts b/game/plugin/run/src/run.plugin.kts similarity index 100% rename from game/src/plugins/run/src/run.plugin.kts rename to game/plugin/run/src/run.plugin.kts diff --git a/game/plugin/util/command/build.gradle b/game/plugin/util/command/build.gradle new file mode 100644 index 00000000..df15b2d0 --- /dev/null +++ b/game/plugin/util/command/build.gradle @@ -0,0 +1,4 @@ +apolloPlugin { + name = "command utilities" + packageName = "org.apollo.game.plugins.util" +} \ No newline at end of file diff --git a/game/src/plugins/util/command/meta.toml b/game/plugin/util/command/meta.toml similarity index 100% rename from game/src/plugins/util/command/meta.toml rename to game/plugin/util/command/meta.toml diff --git a/game/src/plugins/util/command/src/command.kt b/game/plugin/util/command/src/command.kt similarity index 100% rename from game/src/plugins/util/command/src/command.kt rename to game/plugin/util/command/src/command.kt diff --git a/game/plugin/util/lookup/build.gradle b/game/plugin/util/lookup/build.gradle new file mode 100644 index 00000000..61396524 --- /dev/null +++ b/game/plugin/util/lookup/build.gradle @@ -0,0 +1,4 @@ +apolloPlugin { + name = "entity lookup" + packageName = "org.apollo.game.plugins.util" +} \ No newline at end of file diff --git a/game/src/plugins/util/lookup/meta.toml b/game/plugin/util/lookup/meta.toml similarity index 100% rename from game/src/plugins/util/lookup/meta.toml rename to game/plugin/util/lookup/meta.toml diff --git a/game/src/plugins/util/lookup/src/lookup.kt b/game/plugin/util/lookup/src/lookup.kt similarity index 100% rename from game/src/plugins/util/lookup/src/lookup.kt rename to game/plugin/util/lookup/src/lookup.kt diff --git a/game/src/plugins/util/lookup/test/LookupTests.kt b/game/plugin/util/lookup/test/LookupTests.kt similarity index 100% rename from game/src/plugins/util/lookup/test/LookupTests.kt rename to game/plugin/util/lookup/test/LookupTests.kt diff --git a/game/plugins.gradle b/game/plugins.gradle deleted file mode 100644 index c2ab058f..00000000 --- a/game/plugins.gradle +++ /dev/null @@ -1,210 +0,0 @@ -import com.moandjiezana.toml.Toml -import org.apollo.build.tasks.KotlinScriptCompileTask - -import java.nio.file.Paths - -def PLUGIN_VERIFICATION_GROUP = "plugin-verification" -def PLUGIN_BUILD_GROUP = "plugin-build" - -buildscript { - repositories { - mavenCentral() - } - - dependencies { - classpath group: 'com.moandjiezana.toml', name: 'toml4j', version: '0.7.1' - } -} - -task testPlugins { - -} - -sourceSets { - pluginTesting { - kotlin { - srcDir 'src/pluginTesting/kotlin' - } - } -} - -dependencies { - pluginTestingCompile sourceSets.test.output - pluginTestingCompile sourceSets.test.compileClasspath -} - -check.dependsOn testPlugins - -class PluginBuildData { - PluginBuildData(String normalizedName, SourceSet mainSources, SourceSet testSources, - FileCollection scriptFiles, List dependencyNames) { - this.normalizedName = normalizedName - this.mainSources = mainSources - this.testSources = testSources - this.scriptFiles = scriptFiles - this.dependencyNames = dependencyNames - } - - String normalizedName - SourceSet mainSources - SourceSet testSources - FileCollection scriptFiles - List dependencyNames -} - -Map pluginMap = new HashMap<>() - -def configurePluginDependencies(SourceSet mainSources, SourceSet testSources, - List pluginDependencies) { - - def testConfiguration = testSources.compileConfigurationName - def mainConfiguration = mainSources.compileConfigurationName - - // Add this plugin as a runtime dependency to the main game project - dependencies.add(configurations.runtime.name, mainSources.output) - - pluginDependencies.each { - dependencies.add(mainConfiguration, it.mainSources.output) - dependencies.add(testConfiguration, it.testSources.output) - } - - dependencies.add(mainConfiguration, configurations.compile) - dependencies.add(mainConfiguration, sourceSets.main.output) - - dependencies.add(testConfiguration, mainSources.output) - dependencies.add(testConfiguration, configurations.testCompile) - dependencies.add(testConfiguration, sourceSets.test.output) - dependencies.add(testConfiguration, sourceSets.test.compileClasspath) - dependencies.add(testConfiguration, sourceSets.pluginTesting.output) -} - -def configurePluginTasks(String name, SourceSet mainSources, SourceSet testSources, - FileCollection scriptFiles, List pluginDependencies) { - def taskName = name.split("_").collect { it.capitalize() }.join("") - - def testsTask = task("test${taskName}", type: Test) { - group = "plugin-verification" - - testClassesDirs = testSources.output.classesDirs - classpath = testSources.runtimeClasspath + mainSources.runtimeClasspath - - binResultsDir = file("$buildDir/plugin-test-results/binary/$name") - - reports { - junitXml.destination = "$buildDir/plugin-tests/$name" - } - - testLogging { - events "passed", "skipped", "failed" - } - } - - testPlugins.dependsOn testsTask - - if (!scriptFiles.empty) { - def compileScriptsTask = task("compile${taskName}Scripts", type: KotlinScriptCompileTask) { - group = "plugin-compile" - - def outputDir = mainSources.output.classesDir - - inputs.files scriptFiles - outputsDir = outputDir - - compileClasspath = sourceSets.main.compileClasspath + - sourceSets.main.runtimeClasspath + - mainSources.compileClasspath + - mainSources.runtimeClasspath - - scriptDefinitionClass = "org.apollo.game.plugin.kotlin.KotlinPluginScript" - mustRunAfter tasks[mainSources.classesTaskName] - } - - testPlugins.dependsOn compileScriptsTask - tasks[mainSources.classesTaskName].finalizedBy compileScriptsTask - } -} - -def pluginTree = fileTree(dir: "$pluginsDir") -def pluginDefinitions = pluginTree.matching { - include '**/meta.toml' -} - -class PluginScriptFile { - def scriptFileName - def pluginDir - - PluginScriptFile(scriptFileName, pluginDir) { - this.scriptFileName = scriptFileName - this.pluginDir = pluginDir - } -} - -def pluginFiles = new ArrayList() - -pluginDefinitions.each { file -> - def meta = new Toml() - meta.read(file.absoluteFile) - - def pluginFolder = Paths.get(file.parentFile.absolutePath) - def name = meta.getString("name", pluginFolder.getFileName().toString()) - def normalizedName = name.replaceAll("[^a-zA-Z0-9_]", '_').toLowerCase() - def displayNameArray = normalizedName.split("_").collect { it.capitalize() }.join("").toCharArray() - displayNameArray[0] = displayNameArray[0].toLowerCase() - - def sourceSetName = new String(displayNameArray) - - def packageName = meta.getString("package", "org.apollo.game.plugin") - def authors = meta.getList("authors", new ArrayList()) - def dependencies = meta.getList("dependencies", new ArrayList()) - - def scripts = fileTree(file.parentFile) { - include '**/*.plugin.kts' - exclude '*.kt' - } - - def srcsDir = meta.getString("config.src", "src/") - def testDir = meta.getString("config.test", "test/") - - def mainSources = sourceSets.create("${sourceSetName}Main") { - kotlin { - srcDir pluginFolder.resolve(srcsDir).toString() - exclude '*.kts' - } - } - - def testSources = sourceSets.create("${sourceSetName}Test") { - kotlin { - srcDir pluginFolder.resolve(testDir).toString() - } - } - - scripts.files.forEach { - def scriptFileName = it.getName() - - //@todo - also compare package - def existingFile = pluginFiles.find { it.scriptFileName == scriptFileName } - if (existingFile != null) { - throw new GradleException("Duplicate script file found named ${scriptFileName} in ${pluginFolder}, " + - "also exists in ${existingFile.pluginDir}") - } - - pluginFiles.add(new PluginScriptFile(scriptFileName, pluginFolder)) - } - - def pluginData = new PluginBuildData(normalizedName, mainSources, testSources, scripts, dependencies) - pluginMap.put(normalizedName, pluginData) -} - -pluginMap.values().each { - def dependencies = it.dependencyNames.collect { name -> pluginMap.get(name) } - - configurePluginDependencies(it.mainSources, it.testSources, dependencies) - configurePluginTasks(it.normalizedName, it.mainSources, it.testSources, it.scriptFiles, dependencies) -} - -task testPluginsReport(type: TestReport) { - destinationDir = file("$buildDir/reports/plugin-tests") - reportOn tasks.findAll { it.group.equals("plugin-verification"); } -} - -testPlugins.finalizedBy testPluginsReport \ No newline at end of file diff --git a/game/src/main/kotlin/stub.kt b/game/src/main/kotlin/stub.kt index 48dd599a..c236c3a3 100644 --- a/game/src/main/kotlin/stub.kt +++ b/game/src/main/kotlin/stub.kt @@ -23,6 +23,6 @@ fun on_player_event(type: () -> KClass): KotlinPlayerHandle fun on_command(command: String, privileges: PrivilegeLevel): KotlinPlayerHandlerProxyTrait = null!! fun on_button(button: Int): KotlinPlayerHandlerProxyTrait = null!! -fun start(callback: (World) -> Unit) = {} +fun start(callback: (World) -> Unit) {} fun stop(callback: (World) -> Unit) = {} diff --git a/settings.gradle b/settings.gradle index 2bde76af..8747757d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1,37 @@ +import java.nio.file.Paths +import java.nio.file.Path + rootProject.name = 'org.apollo' include ':cache' include ':game' +include ':game:plugin' +include ':game:plugin-testing' include ':net' include ':util' + +def pluginDirs = [ + rootProject.projectDir.toPath().resolve("game/plugin"), +] + +def processPluginDir(Path pluginDir) { + if (pluginDir.toFile().exists()) { + def pluginFileFinder = new FileNameFinder(); + def pluginFiles = pluginFileFinder.getFileNames(pluginDir.toString(), "**/*.gradle"); + + pluginFiles.each { filename -> + def path = Paths.get(filename) + def parentPath = path.parent + + if (parentPath == pluginDir) { + return + } + + def relativePath = pluginDir.relativize(parentPath) + def pluginName = relativePath.toString().replaceAll("/", ":") + + include ":game:plugin:$pluginName" + } + } +} + +pluginDirs.each { processPluginDir(it) } \ No newline at end of file