Skip to content

Commit 327d8aa

Browse files
committed
Fixed bugs.
Support Java16 and bukkit 1.17.
1 parent f4d3e09 commit 327d8aa

File tree

9 files changed

+115
-56
lines changed

9 files changed

+115
-56
lines changed

Diff for: build.gradle.kts

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
plugins {
2-
kotlin("jvm") version "1.4.30"
2+
kotlin("jvm") version "1.5.0"
33
id("org.jetbrains.dokka") version "1.4.10.2"
44
id("org.jlleitschuh.gradle.ktlint") version "9.4.1"
55
id("com.github.johnrengelman.shadow") version "6.1.0"
@@ -8,24 +8,24 @@ plugins {
88
}
99

1010
group = "me.scoretwo"
11-
version = "1.1.1-SNAPSHOT"
11+
version = "1.1.3-SNAPSHOT"
1212
description = "FastScript is a Spigot plugin, which can run JavaScript-based scripts more efficiently."
1313

1414
defaultTasks = mutableListOf("ShadowJar", "publishToMavenLocal")
1515

1616
extra.apply {
17-
set("commonsVersion", "2.0.12-SNAPSHOT")
18-
set("kotlinVersion", "1.4.30")
17+
set("commonsVersion", "2.0.15-SNAPSHOT")
18+
set("kotlinVersion", "1.5.0")
1919
}
2020

2121
allprojects {
2222
repositories {
2323
jcenter()
2424
mavenCentral()
2525
mavenLocal()
26+
maven("http://repo.iroselle.com/repository/maven-snapshots/")
27+
maven("http://repo.iroselle.com/repository/maven-public/")
2628
maven("https://maven.aliyun.com/nexus/content/groups/public/")
27-
maven("http://repo.iroselle.com/snapshots/")
28-
maven("http://repo.iroselle.com/public/")
2929
maven("https://nexus.velocitypowered.com/repository/velocity-artifacts-snapshots/")
3030
maven("https://repo.spongepowered.org/maven")
3131
maven("https://jitpack.io")

Diff for: common/src/main/kotlin/me/scoretwo/fastscript/api/expansion/ExpansionManager.kt

+2-4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import me.scoretwo.fastscript.api.utils.process.ProcessResult
77
import me.scoretwo.fastscript.api.utils.process.ProcessResultType
88
import me.scoretwo.fastscript.expansion.javascript.JavaScriptExpansion
99
import me.scoretwo.fastscript.expansion.scala.ScalaExpansion
10+
import me.scoretwo.fastscript.utils.Utils
1011
import me.scoretwo.utils.bukkit.configuration.yaml.file.YamlConfiguration
1112
import me.scoretwo.utils.bukkit.configuration.yaml.patchs.ignoreCase
1213
import java.io.File
@@ -109,10 +110,7 @@ class ExpansionManager {
109110
private fun fromFileExpansion(file: File): Pair<ProcessResult, FastScriptExpansion?> {
110111
val description: ExpansionDescription
111112
val expansionClass = try {
112-
val url = file.toURI().toURL()
113-
val method = URLClassLoader::class.java.getDeclaredMethod("addURL", URL::class.java)
114-
method.isAccessible = true
115-
method.invoke(plugin.pluginClassLoader, url)
113+
Utils.addPath(file)
116114

117115
val jarFile = JarFile(file)
118116
description = try {

Diff for: common/src/main/kotlin/me/scoretwo/fastscript/api/utils/Utils.kt

+60
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,15 @@ import me.scoretwo.utils.sender.GlobalPlayer
1212
import me.scoretwo.utils.sender.GlobalSender
1313
import me.scoretwo.utils.syntaxes.FileUtils
1414
import net.md_5.bungee.api.ChatColor
15+
import sun.misc.Unsafe
1516
import java.io.File
1617
import java.io.InputStream
18+
import java.lang.invoke.MethodHandle
19+
import java.lang.invoke.MethodHandles
20+
import java.lang.invoke.MethodType
21+
import java.lang.reflect.Field
1722
import java.lang.reflect.Method
23+
import java.net.URL
1824

1925
object Utils {
2026

@@ -30,6 +36,57 @@ object Utils {
3036
FileUtils.save(target, inputStream)
3137
}
3238

39+
40+
// Copy in https://github.com/TabooLib/TabooLib-Loader
41+
val unsafe: Unsafe = let {
42+
val field = Unsafe::class.java.getDeclaredField("theUnsafe")
43+
field.isAccessible = true
44+
field[null] as Unsafe
45+
}
46+
// Copy in https://github.com/TabooLib/TabooLib-Loader
47+
val lookup: MethodHandles.Lookup = let {
48+
val lookupField = MethodHandles.Lookup::class.java.getDeclaredField("IMPL_LOOKUP")
49+
val lookupBase = unsafe.staticFieldBase(lookupField)
50+
val lookupOffset = unsafe.staticFieldOffset(lookupField)
51+
unsafe.getObject(lookupBase, lookupOffset) as MethodHandles.Lookup
52+
}
53+
54+
// Copy in https://github.com/TabooLib/TabooLib-Loader
55+
fun addPath(file: File): Boolean {
56+
try {
57+
val loader: ClassLoader = FastScript.instance.plugin.pluginClassLoader
58+
if (loader.javaClass.simpleName == "LaunchClassLoader") {
59+
val methodHandle: MethodHandle = lookup.findVirtual(
60+
loader.javaClass, "addURL", MethodType.methodType(
61+
Void.TYPE,
62+
URL::class.java
63+
)
64+
)
65+
methodHandle.invoke(loader, file.toURI().toURL())
66+
} else {
67+
val ucpField: Field? = try {
68+
loader.javaClass.getDeclaredField("ucp")
69+
} catch (e: NoSuchFieldError) {
70+
loader.javaClass.superclass.getDeclaredField("ucp")
71+
} catch (e: NoSuchFieldException) {
72+
loader.javaClass.superclass.getDeclaredField("ucp")
73+
}
74+
val ucpOffset: Long = unsafe.objectFieldOffset(ucpField)
75+
val ucp: Any = unsafe.getObject(loader, ucpOffset)
76+
val methodHandle: MethodHandle = lookup.findVirtual(
77+
ucp.javaClass, "addURL", MethodType.methodType(
78+
Void.TYPE,
79+
URL::class.java
80+
)
81+
)
82+
methodHandle.invoke(ucp, file.toURI().toURL())
83+
}
84+
return true
85+
} catch (t: Throwable) {
86+
t.printStackTrace()
87+
}
88+
return false
89+
}
3390
}
3491

3592
class Assist {
@@ -38,6 +95,8 @@ class Assist {
3895

3996
fun createCommandBuilder() = CommandBuilder()
4097

98+
fun setPlaceholder(player: GlobalPlayer, text: String) = plugin.setPlaceholder(player, text)
99+
41100
}
42101
lateinit var assist: Assist
43102

@@ -61,6 +120,7 @@ fun String.subStringWithEscape(from: Int, to: Int, escapes: List<Int>): String {
61120
return builder.toString()
62121
}
63122

123+
// 可能存在问题
64124
fun String.protectedSplit(index: Char, protector: Pair<Char, Char>): ArrayList<String> {
65125
val list = ArrayList<String>()
66126
var inner = false

Diff for: common/src/main/kotlin/me/scoretwo/fastscript/api/utils/maven/MavenArtifact.kt

+13-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
package me.scoretwo.fastscript.api.utils.maven
22

3+
import sun.misc.Unsafe;
4+
import me.scoretwo.fastscript.FastScript
35
import me.scoretwo.fastscript.api.utils.process.ProcessResult
46
import me.scoretwo.fastscript.api.utils.process.ProcessResultType
57
import me.scoretwo.fastscript.plugin
8+
import me.scoretwo.fastscript.utils.Utils
69
import java.io.File
7-
import java.io.InputStream
810
import java.io.FileOutputStream
9-
import java.lang.StringBuilder
11+
import java.io.InputStream
12+
import java.lang.invoke.MethodHandle
13+
import java.lang.invoke.MethodHandles
14+
import java.lang.invoke.MethodType
15+
import java.lang.reflect.Field
16+
import java.lang.reflect.Method
1017
import java.net.HttpURLConnection
1118
import java.net.URL
1219
import java.net.URLClassLoader
@@ -83,16 +90,18 @@ class MavenArtifact {
8390
fileOutputStream.close()
8491
inputStream.close()
8592

86-
val method = URLClassLoader::class.java.getDeclaredMethod("addURL", URL::class.java)
93+
Utils.addPath(file)
94+
/*val method = URLClassLoader::class.java.getDeclaredMethod("addURL", URL::class.java)
8795
method.isAccessible = true
88-
method.invoke(plugin.pluginClassLoader, file.toURI().toURL())
96+
method.invoke(plugin.pluginClassLoader, file.toURI().toURL())*/
8997
return ProcessResult(ProcessResultType.SUCCESS)
9098
} catch (t: Throwable) {
9199
t.printStackTrace()
92100
return ProcessResult(ProcessResultType.FAILED)
93101
}
94102
}
95103

104+
96105
override fun toString() = "$groupId:$artifactId:$version"
97106

98107
}

Diff for: common/src/main/kotlin/me/scoretwo/fastscript/command/FSCommandNexus.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@ import me.scoretwo.utils.command.helper.HelpGenerator
1313
import me.scoretwo.utils.command.language.CommandLanguage
1414
import me.scoretwo.utils.sender.GlobalPlayer
1515
import me.scoretwo.utils.sender.GlobalSender
16+
import me.scoretwo.utils.server.globalServer
1617
import net.md_5.bungee.api.chat.ClickEvent
1718
import net.md_5.bungee.api.chat.HoverEvent
1819
import net.md_5.bungee.api.chat.TextComponent
1920
import net.md_5.bungee.api.chat.hover.content.Text
2021

2122
class FSCommandNexus: CommandNexus(
2223
FastScript.instance.plugin,
23-
arrayOf("FastScript", "script", "fs"),
24+
arrayOf("FastScript", "script", "fs", "fs${globalServer.brand.name.lowercase()}"),
2425
SendLimit.ALL,
2526
language,
2627
helpGenerator

Diff for: common/src/main/kotlin/me/scoretwo/fastscript/expansion/javascript/JavaScriptExpansion.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package me.scoretwo.fastscript.expansion.javascript
22

3-
import jdk.nashorn.api.scripting.NashornScriptEngineFactory
43
import me.scoretwo.fastscript.expansion.typeengine.TypeEngineExpansion
4+
import org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory
55
import javax.script.ScriptEngine
66

77
class JavaScriptExpansion: TypeEngineExpansion() {

Diff for: common/src/main/kotlin/me/scoretwo/fastscript/expansion/typeengine/TypeEngineExpansion.kt

+29-38
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import me.scoretwo.fastscript.api.format.FormatHeader
66
import me.scoretwo.fastscript.api.script.Script
77
import me.scoretwo.fastscript.api.script.custom.CustomScript
88
import me.scoretwo.fastscript.utils.assist
9+
import me.scoretwo.utils.sender.GlobalPlayer
910
import me.scoretwo.utils.sender.GlobalSender
11+
import me.scoretwo.utils.server.globalServer
1012
import org.apache.commons.lang.StringUtils
1113
import javax.script.Invocable
1214
import javax.script.ScriptEngine
@@ -26,11 +28,7 @@ abstract class TypeEngineExpansion: FastScriptExpansion() {
2628
return this
2729
}
2830

29-
override fun eval(script: Script, sender: GlobalSender, args: Array<Any?>, otherBindings: Map<String, Any?>): Any? {
30-
val newEngine = engine.factory.scriptEngine
31-
if (!script.texts.keys.contains(sign))
32-
return null
33-
31+
fun addEntries(newEngine: ScriptEngine, script: Script?, sender: GlobalSender, args: Array<Any?>, otherBindings: Map<String, Any?>) {
3432
newEngine.put("meta", HashMap<String, Any?>())
3533
newEngine.put("plugin", plugin.toOriginalPlugin())
3634
newEngine.put("script", script)
@@ -39,23 +37,34 @@ abstract class TypeEngineExpansion: FastScriptExpansion() {
3937
newEngine.put("scriptManager", FastScript.instance.scriptManager)
4038
newEngine.put("expansionManager", FastScript.instance.expansionManager)
4139

42-
if (sender.isPlayer()) {
43-
sender.toPlayer().let {
44-
newEngine.put("globalPlayer", it)
45-
newEngine.put("player", plugin.toOriginalPlayer(it!!))
46-
}
40+
newEngine.put("args", args)
41+
newEngine.put("utils", assist)
42+
newEngine.put("util", assist)
43+
otherBindings.forEach { newEngine.put(it.key, it.value) }
44+
}
45+
46+
fun addSenders(newEngine: ScriptEngine, script: Script?, sender: GlobalSender, args: Array<Any?>, otherBindings: Map<String, Any?>) {
47+
48+
if (globalServer.isOnlinePlayer(sender.name)) {
49+
newEngine.put("globalPlayer", globalServer.getPlayer(sender.name).get())
50+
newEngine.put("player", plugin.toOriginalPlayer(globalServer.getPlayer(sender.name).get()))
4751
} else {
4852
newEngine.put("globalPlayer", null)
4953
newEngine.put("player", null)
5054
}
5155
newEngine.put("globalSender", sender)
5256
newEngine.put("sender", plugin.toOriginalSender(sender))
53-
newEngine.put("args", args)
54-
newEngine.put("utils", assist)
55-
newEngine.put("util", assist)
56-
otherBindings.forEach { newEngine.put(it.key, it.value) }
57+
}
5758

59+
override fun eval(script: Script, sender: GlobalSender, args: Array<Any?>, otherBindings: Map<String, Any?>): Any? {
60+
val newEngine = engine.factory.scriptEngine
61+
if (!script.texts.keys.contains(sign))
62+
return null
63+
64+
addSenders(newEngine, script, sender, args, otherBindings)
65+
addEntries(newEngine, script, sender, args, otherBindings)
5866
engineScripts[script] = newEngine
67+
5968
return let {
6069
try {
6170
newEngine.eval(script.texts[sign]).also {
@@ -78,30 +87,8 @@ abstract class TypeEngineExpansion: FastScriptExpansion() {
7887
if (text.isBlank())
7988
return null
8089

81-
newEngine.put("meta", HashMap<String, Any?>())
82-
newEngine.put("plugin", plugin.toOriginalPlugin())
83-
newEngine.put("server", plugin.toOriginalServer())
84-
newEngine.put("globalServer", plugin.server)
85-
newEngine.put("globalPlugin", plugin)
86-
newEngine.put("scriptManager", FastScript.instance.scriptManager)
87-
newEngine.put("expansionManager", FastScript.instance.expansionManager)
88-
89-
if (sender.isPlayer()) {
90-
sender.toPlayer().let {
91-
newEngine.put("globalPlayer", it)
92-
newEngine.put("player", plugin.toOriginalPlayer(it!!))
93-
}
94-
} else {
95-
newEngine.put("globalPlayer", null)
96-
newEngine.put("player", null)
97-
}
98-
newEngine.put("globalSender", sender)
99-
newEngine.put("sender", plugin.toOriginalSender(sender))
100-
newEngine.put("args", args)
101-
newEngine.put("utils", assist)
102-
newEngine.put("util", assist)
103-
otherBindings.forEach { newEngine.put(it.key, it.value) }
104-
90+
addSenders(newEngine, null, sender, args, otherBindings)
91+
addEntries(newEngine, null, sender, args, otherBindings)
10592
engineTexts[text] = newEngine
10693
return let {
10794
try {
@@ -123,6 +110,8 @@ abstract class TypeEngineExpansion: FastScriptExpansion() {
123110
return try {
124111
if (engineScripts[script] !is Invocable)
125112
eval(script, sender, arrayOf(), otherBindings)
113+
else
114+
addSenders(engineScripts[script]!!, script, sender, args, otherBindings)
126115

127116
val invocable = engineScripts[script] as Invocable
128117

@@ -162,6 +151,8 @@ abstract class TypeEngineExpansion: FastScriptExpansion() {
162151
return try {
163152
if (engineTexts[text] !is Invocable)
164153
eval(text, sender, arrayOf(), otherBindings)
154+
else
155+
addSenders(engineTexts[text]!!, null, sender, args, otherBindings)
165156

166157
val invocable = engineTexts[text] as Invocable
167158

Diff for: common/src/main/kotlin/me/scoretwo/fastscript/placeholder/Placeholders.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ object Placeholders {
1212
val args = params.replace("@", "%").setPlaceholder(player).protectedSplit('_', Pair('[', ']'))
1313
if (args.isEmpty()) return ""
1414

15-
when (args[0].toLowerCase()) {
15+
when (args[0].lowercase()) {
1616
// %fastscript_script_[name]_evaluate(eval)_expansion_<args...>%
1717
// %fastscript_script_[name]_execute(run)_expansion_<main>_<args...>%
1818
"script" -> {

Diff for: version-control/FastScript-bukkit/src/main/kotlin/me/scoretwo/fastscript/bukkit/hook/PlaceholderAPIHook.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class PlaceholderAPIHook(val plugin: Plugin): PlaceholderExpansion() {
1818
}
1919

2020
override fun getIdentifier(): String {
21-
return plugin.description.name.toLowerCase()
21+
return plugin.description.name.lowercase()
2222
}
2323

2424
override fun getAuthor(): String {

0 commit comments

Comments
 (0)