This commit is contained in:
Gary Tierney
2019-07-18 02:44:35 +01:00
parent fe457d762a
commit 0b61e559fc
13 changed files with 321 additions and 27 deletions
+4 -1
View File
@@ -8,7 +8,9 @@
*~ *~
*.class *.class
*.iml *.iml
.project
.classpath
**/bin/
/game/data/rsa.pem /game/data/rsa.pem
/game/data/savedGames /game/data/savedGames
/lib/ /lib/
@@ -16,3 +18,4 @@
*/build/ */build/
**/build/ **/build/
**/out/ **/out/
/vendor/
-2
View File
@@ -1,6 +1,4 @@
plugins { plugins {
id 'org.asciidoctor.gradle.asciidoctor' version '1.5.1' apply(false)
id 'org.asciidoctor.convert' version '1.5.3' apply(false)
id 'org.jetbrains.kotlin.jvm' version '1.3.41' apply(false) id 'org.jetbrains.kotlin.jvm' version '1.3.41' apply(false)
id 'org.jetbrains.intellij' version '0.4.9' apply(false) id 'org.jetbrains.intellij' version '0.4.9' apply(false)
id 'org.jmailen.kotlinter' version '1.26.0' apply(false) id 'org.jmailen.kotlinter' version '1.26.0' apply(false)
+5
View File
@@ -0,0 +1,5 @@
---
uid: on_button
---
`on_button` allows registering @"handlers"
+20 -8
View File
@@ -1,13 +1,25 @@
plugins { configurations {
id 'org.asciidoctor.gradle.asciidoctor' doclet {
id 'org.asciidoctor.convert' transitive(true)
}
} }
repositories { dependencies {
mavenCentral() doclet files("vendor/docfx-doclet-1.0-SNAPSHOT-jar-with-dependencies.jar")
} }
asciidoctor { gradle.projectsEvaluated {
attributes 'source-highlighter': 'prettify',
'toc': 'left' task generateApiDocs(type: Javadoc) {
source = project(":game").sourceSets.main.java.sourceDirectories
classpath = project(":game").configurations.runtimeClasspath + project(":game").sourceSets.main.output
options.encoding 'UTF-8'
destinationDir = file("build/generated-files")
options.addStringOption("doclet", "com.microsoft.doclet.DocFxDoclet")
options.docletpath = configurations.doclet.toList()
dependsOn(project(":game").assemble)
}
} }
+2 -4
View File
@@ -17,7 +17,7 @@
{ {
"files": [ "files": [
"api/**.yml", "api/**.yml",
"api/index.md" "api/**.md"
] ]
}, },
{ {
@@ -50,9 +50,7 @@
"dest": "_site", "dest": "_site",
"globalMetadataFiles": [], "globalMetadataFiles": [],
"fileMetadataFiles": [], "fileMetadataFiles": [],
"template": [ "template": [ "default", "templates/material" ],
"default"
],
"postProcessors": [], "postProcessors": [],
"markdownEngineName": "markdig", "markdownEngineName": "markdig",
"noLangKeyword": false, "noLangKeyword": false,
@@ -1 +1,8 @@
# What is a plugin? # What is a plugin?
Plugins in Apollo are a mechanism for extending the server with new functionality without having to change any of the core Java code.
Every plugin is a straight forward Kotlin project with `.plugin.kts` files containing the plugin extension behaviour and optional Kotlin source files containing generic reusable code.
## Plugin framework architecture
Under the hood, the Kotlin compiler transofmrs every `.plugin.kts` file into a class file that extends from @"org.apollo.game.plugin.kotlin.KotlinPluginScript", giving it access to the game @"org.apollo.game.model.World" and @"org.apollo.game.message.handler.MessageHandlerChainSet" the plugin framework is initialized with.
@@ -10,17 +10,7 @@ branch prior to the release of the Kotlin plugin system for Apollo.
## Create a working environment ## Create a working environment
The project maintainers strongly recommend
[IntelliJ IDEA](https://www.jetbrains.com/idea/).
After starting IDEA, select *checkout project* with the URL:
https://github.com/apollo-rsps/apollo.git and continue. Make sure to
*import using gradle* on the next interface.
Next, checkout the kotlin-experiments branch. To do this via IntelliJ,
use the navigation bar at the top and 'VCS > Git > Branches >
origin/kotlin-experiments > Checkout as new branch'. Name the new branch
something like kotlin-experiments-my-plugin.
## Create the plugin metadata ## Create the plugin metadata
+21
View File
@@ -0,0 +1,21 @@
{{!Copyright (c) Oscar Vasquez. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.}}
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>{{#title}}{{title}}{{/title}}{{^title}}{{>partials/title}}{{/title}} {{#_appTitle}}| {{_appTitle}} {{/_appTitle}}</title>
<meta name="viewport" content="width=device-width">
<meta name="title" content="{{#title}}{{title}}{{/title}}{{^title}}{{>partials/title}}{{/title}} {{#_appTitle}}| {{_appTitle}} {{/_appTitle}}">
<meta name="generator" content="docfx {{_docfxVersion}}">
{{#_description}}<meta name="description" content="{{_description}}">{{/_description}}
<link rel="shortcut icon" href="{{_rel}}{{{_appFaviconPath}}}{{^_appFaviconPath}}favicon.ico{{/_appFaviconPath}}">
<link rel="stylesheet" href="{{_rel}}styles/docfx.vendor.css">
<link rel="stylesheet" href="{{_rel}}styles/docfx.css">
<link rel="stylesheet" href="{{_rel}}styles/main.css">
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
<meta property="docfx:navrel" content="{{_navRel}}">
<meta property="docfx:tocrel" content="{{_tocRel}}">
{{#_noindex}}<meta name="searchOption" content="noindex">{{/_noindex}}
{{#_enableSearch}}<meta property="docfx:rel" content="{{_rel}}">{{/_enableSearch}}
{{#_enableNewTab}}<meta property="docfx:newtab" content="true">{{/_enableNewTab}}
</head>
+202
View File
@@ -0,0 +1,202 @@
body {
color: #34393e;
font-family: 'Roboto', sans-serif;
line-height: 1.5;
font-size: 16px;
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
word-wrap: break-word
}
/* HEADINGS */
h1 {
font-weight: 600;
font-size: 32px;
}
h2 {
font-weight: 600;
font-size: 24px;
line-height: 1.8;
}
h3 {
font-weight: 600;
font-size: 20px;
line-height: 1.8;
}
h5 {
font-size: 14px;
padding: 10px 0px;
}
article h1,
article h2,
article h3,
article h4 {
margin-top: 35px;
margin-bottom: 15px;
}
article h4 {
padding-bottom: 8px;
border-bottom: 2px solid #ddd;
}
/* NAVBAR */
.navbar-brand>img {
color: #fff;
}
.navbar {
border: none;
/* Both navbars use box-shadow */
-webkit-box-shadow: 0px 1px 3px 0px rgba(100, 100, 100, 0.5);
-moz-box-shadow: 0px 1px 3px 0px rgba(100, 100, 100, 0.5);
box-shadow: 0px 1px 3px 0px rgba(100, 100, 100, 0.5);
}
.subnav {
border-top: 1px solid #ddd;
background-color: #fff;
}
.navbar-inverse {
background-color: #0d47a1;
z-index: 100;
}
.navbar-inverse .navbar-nav>li>a,
.navbar-inverse .navbar-text {
color: #fff;
background-color: #0d47a1;
border-bottom: 3px solid transparent;
padding-bottom: 12px;
}
.navbar-inverse .navbar-nav>li>a:focus,
.navbar-inverse .navbar-nav>li>a:hover {
color: #fff;
background-color: #0d47a1;
border-bottom: 3px solid white;
}
.navbar-inverse .navbar-nav>.active>a,
.navbar-inverse .navbar-nav>.active>a:focus,
.navbar-inverse .navbar-nav>.active>a:hover {
color: #fff;
background-color: #0d47a1;
border-bottom: 3px solid white;
}
.navbar-form .form-control {
border: none;
border-radius: 20px;
}
/* SIDEBAR */
.toc .level1>li {
font-weight: 400;
}
.toc .nav>li>a {
color: #34393e;
}
.sidefilter {
background-color: #fff;
border-left: none;
border-right: none;
}
.sidefilter {
background-color: #fff;
border-left: none;
border-right: none;
}
.toc-filter {
padding: 10px;
margin: 0;
}
.toc-filter>input {
border: 2px solid #ddd;
border-radius: 20px;
}
.toc-filter>.filter-icon {
display: none;
}
.sidetoc>.toc {
background-color: #fff;
overflow-x: hidden;
}
.sidetoc {
background-color: #fff;
border: none;
}
/* ALERTS */
.alert {
padding: 0px 0px 5px 0px;
color: inherit;
background-color: inherit;
border: none;
box-shadow: 0px 2px 2px 0px rgba(100, 100, 100, 0.4);
}
.alert>p {
margin-bottom: 0;
padding: 5px 10px;
}
.alert>ul {
margin-bottom: 0;
padding: 5px 40px;
}
.alert>h5 {
padding: 10px 15px;
margin-top: 0;
text-transform: uppercase;
font-weight: bold;
border-radius: 4px 4px 0 0;
}
.alert-info>h5 {
color: #1976d2;
border-bottom: 4px solid #1976d2;
background-color: #e3f2fd;
}
.alert-warning>h5 {
color: #f57f17;
border-bottom: 4px solid #f57f17;
background-color: #fff3e0;
}
.alert-danger>h5 {
color: #d32f2f;
border-bottom: 4px solid #d32f2f;
background-color: #ffebee;
}
/* CODE HIGHLIGHT */
pre {
padding: 9.5px;
margin: 0 0 10px;
font-size: 13px;
word-break: break-all;
word-wrap: break-word;
background-color: #fffaef;
border-radius: 4px;
box-shadow: 0px 1px 4px 1px rgba(100, 100, 100, 0.4);
}
+13
View File
@@ -0,0 +1,13 @@
apply plugin: "java"
apply plugin: 'kotlin'
apply from: "$rootDir/gradle/kotlin.gradle"
repositories {
jcenter()
}
dependencies {
compile group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib-jdk8'
compile 'org.jetbrains.dokka:dokka-fatjar:0.9.18'
}
@@ -0,0 +1,19 @@
package org.apollo.tools.dokka2yaml
import com.google.inject.Binder
import org.jetbrains.dokka.FormatService
import org.jetbrains.dokka.Formats.FormatDescriptor
import org.jetbrains.dokka.Formats.KotlinFormatDescriptorBase
import kotlin.reflect.KClass
class YamlFileFormatDescriptor : KotlinFormatDescriptorBase() {
override val formatServiceClass = YamlFileGenerator::class
override fun configureAnalysis(binder: Binder) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun configureOutput(binder: Binder) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
@@ -0,0 +1,24 @@
package org.apollo.tools.dokka2yaml
import org.jetbrains.dokka.DocumentationNode
import org.jetbrains.dokka.FormatService
import org.jetbrains.dokka.FormattedOutputBuilder
import org.jetbrains.dokka.Location
class YamlFileGenerator(override val extension: String = ".yaml") : FormatService {
override fun createOutputBuilder(to: StringBuilder, location: Location): FormattedOutputBuilder {
return YamlFileOutputBuilder()
}
}
class YamlFileOutputBuilder : FormattedOutputBuilder {
override fun appendNodes(nodes: Iterable<DocumentationNode>) {
for (node in nodes) {
appendNode(node)
}
}
fun appendNode(node: DocumentationNode) {
}
}
@@ -0,0 +1,2 @@
class=org.apollo.tools.dokka2yaml.YamlFileFormatDescriptor
description=Turns KDoc and Javadoc into the code2yaml format for DocFX.