diff --git a/.gitignore b/.gitignore
index 6c1c8c38..8424e65a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,8 @@
examples/src/main/resources/
target/
out/
-.idea/workspace.xml
-.idea/copyright/
-.lib/
+.idea
+.idea_modules
plugins/
bukkit/
.DS_Store
diff --git a/.idea/.name b/.idea/.name
deleted file mode 100644
index 43f6bf80..00000000
--- a/.idea/.name
+++ /dev/null
@@ -1 +0,0 @@
-MinecraftPlugins
\ No newline at end of file
diff --git a/.idea/IdeaProject.iml b/.idea/IdeaProject.iml
deleted file mode 100644
index f28a145e..00000000
--- a/.idea/IdeaProject.iml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml
deleted file mode 100644
index cab819f1..00000000
--- a/.idea/codeStyleSettings.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
deleted file mode 100644
index b22c943f..00000000
--- a/.idea/compiler.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
deleted file mode 100644
index e206d70d..00000000
--- a/.idea/encodings.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/.idea/highlighting.xml b/.idea/highlighting.xml
deleted file mode 100644
index c8f67ffc..00000000
--- a/.idea/highlighting.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
deleted file mode 100644
index 5e642840..00000000
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
deleted file mode 100644
index 3b312839..00000000
--- a/.idea/inspectionProfiles/profiles_settings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/libraries/SBT__com_joshcough_scala_minecraft_plugin_api_2_11_0_3_3.xml b/.idea/libraries/SBT__com_joshcough_scala_minecraft_plugin_api_2_11_0_3_3.xml
deleted file mode 100644
index 0d5d45f4..00000000
--- a/.idea/libraries/SBT__com_joshcough_scala_minecraft_plugin_api_2_11_0_3_3.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/libraries/SBT__javax_servlet_servlet_api_2_5_provided.xml b/.idea/libraries/SBT__javax_servlet_servlet_api_2_5_provided.xml
deleted file mode 100644
index 86233290..00000000
--- a/.idea/libraries/SBT__javax_servlet_servlet_api_2_5_provided.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/libraries/SBT__jline_jline_2_11.xml b/.idea/libraries/SBT__jline_jline_2_11.xml
deleted file mode 100644
index ee67e086..00000000
--- a/.idea/libraries/SBT__jline_jline_2_11.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/libraries/SBT__org_bukkit_bukkit_1_7_2_R0_2.xml b/.idea/libraries/SBT__org_bukkit_bukkit_1_7_2_R0_2.xml
deleted file mode 100644
index b224b4eb..00000000
--- a/.idea/libraries/SBT__org_bukkit_bukkit_1_7_2_R0_2.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/libraries/SBT__org_clojure_clojure_1_4_0.xml b/.idea/libraries/SBT__org_clojure_clojure_1_4_0.xml
deleted file mode 100644
index 5b52389a..00000000
--- a/.idea/libraries/SBT__org_clojure_clojure_1_4_0.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/libraries/SBT__org_scala_lang_modules_scala_parser_combinators_2_11_1_0_1_test.xml b/.idea/libraries/SBT__org_scala_lang_modules_scala_parser_combinators_2_11_1_0_1_test.xml
deleted file mode 100644
index 3a34e70d..00000000
--- a/.idea/libraries/SBT__org_scala_lang_modules_scala_parser_combinators_2_11_1_0_1_test.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/libraries/SBT__org_scala_lang_scala_library_2_11_0.xml b/.idea/libraries/SBT__org_scala_lang_scala_library_2_11_0.xml
deleted file mode 100644
index 6f08996a..00000000
--- a/.idea/libraries/SBT__org_scala_lang_scala_library_2_11_0.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/libraries/SBT__org_scala_sbt_test_interface_1_0_test.xml b/.idea/libraries/SBT__org_scala_sbt_test_interface_1_0_test.xml
deleted file mode 100644
index 1e62135b..00000000
--- a/.idea/libraries/SBT__org_scala_sbt_test_interface_1_0_test.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/libraries/SBT__org_scalacheck_scalacheck_2_11_1_11_3_test.xml b/.idea/libraries/SBT__org_scalacheck_scalacheck_2_11_1_11_3_test.xml
deleted file mode 100644
index 655c7755..00000000
--- a/.idea/libraries/SBT__org_scalacheck_scalacheck_2_11_1_11_3_test.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/libraries/SBT__scala_2_10_3.xml b/.idea/libraries/SBT__scala_2_10_3.xml
deleted file mode 100644
index ea106a53..00000000
--- a/.idea/libraries/SBT__scala_2_10_3.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/libraries/servlet_api_2_5.xml b/.idea/libraries/servlet_api_2_5.xml
deleted file mode 100644
index 15d09691..00000000
--- a/.idea/libraries/servlet_api_2_5.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index 39bae6c9..00000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
- http://www.w3.org/1999/xhtml
-
-
-
-
-
-
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 71f03c09..00000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea/projectCodeStyle.xml b/.idea/projectCodeStyle.xml
deleted file mode 100644
index 0067dabc..00000000
--- a/.idea/projectCodeStyle.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/scala_compiler.xml b/.idea/scala_compiler.xml
deleted file mode 100644
index 8d5717a0..00000000
--- a/.idea/scala_compiler.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/.idea/scala_settings.xml b/.idea/scala_settings.xml
deleted file mode 100644
index 19a662e5..00000000
--- a/.idea/scala_settings.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/scopes/scope_settings.xml b/.idea/scopes/scope_settings.xml
deleted file mode 100644
index 922003b8..00000000
--- a/.idea/scopes/scope_settings.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 9d32e507..00000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/Arena.iml b/.idea_modules/Arena.iml
deleted file mode 100644
index f89a6819..00000000
--- a/.idea_modules/Arena.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/BanArrows.iml b/.idea_modules/BanArrows.iml
deleted file mode 100644
index 17548435..00000000
--- a/.idea_modules/BanArrows.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/BlockChanger.iml b/.idea_modules/BlockChanger.iml
deleted file mode 100644
index f5e105cc..00000000
--- a/.idea_modules/BlockChanger.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/BlockChangerGold.iml b/.idea_modules/BlockChangerGold.iml
deleted file mode 100644
index 874ac5c6..00000000
--- a/.idea_modules/BlockChangerGold.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/Farmer.iml b/.idea_modules/Farmer.iml
deleted file mode 100644
index 691473cb..00000000
--- a/.idea_modules/Farmer.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/GetOffMyLawn.iml b/.idea_modules/GetOffMyLawn.iml
deleted file mode 100644
index 75d261fe..00000000
--- a/.idea_modules/GetOffMyLawn.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/God.iml b/.idea_modules/God.iml
deleted file mode 100644
index 088a4fef..00000000
--- a/.idea_modules/God.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/LightningArrows.iml b/.idea_modules/LightningArrows.iml
deleted file mode 100644
index 8d82e07d..00000000
--- a/.idea_modules/LightningArrows.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/MultiPlayerCommands.iml b/.idea_modules/MultiPlayerCommands.iml
deleted file mode 100644
index 5ac36093..00000000
--- a/.idea_modules/MultiPlayerCommands.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/NoRain.iml b/.idea_modules/NoRain.iml
deleted file mode 100644
index 079efc7c..00000000
--- a/.idea_modules/NoRain.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/PluginCommander.iml b/.idea_modules/PluginCommander.iml
deleted file mode 100644
index 7fba2503..00000000
--- a/.idea_modules/PluginCommander.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/Shock.iml b/.idea_modules/Shock.iml
deleted file mode 100644
index 896c2e1b..00000000
--- a/.idea_modules/Shock.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/TeleportBows.iml b/.idea_modules/TeleportBows.iml
deleted file mode 100644
index d8679956..00000000
--- a/.idea_modules/TeleportBows.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/Thor.iml b/.idea_modules/Thor.iml
deleted file mode 100644
index 4b2fbb78..00000000
--- a/.idea_modules/Thor.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/TreeDelogger.iml b/.idea_modules/TreeDelogger.iml
deleted file mode 100644
index a09169da..00000000
--- a/.idea_modules/TreeDelogger.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/WorldEdit.iml b/.idea_modules/WorldEdit.iml
deleted file mode 100644
index 572798d0..00000000
--- a/.idea_modules/WorldEdit.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/YellowBrickRoad.iml b/.idea_modules/YellowBrickRoad.iml
deleted file mode 100644
index 6f06dccc..00000000
--- a/.idea_modules/YellowBrickRoad.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/ZombieApocalypse.iml b/.idea_modules/ZombieApocalypse.iml
deleted file mode 100644
index 8da838cc..00000000
--- a/.idea_modules/ZombieApocalypse.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/all-build.iml b/.idea_modules/all-build.iml
deleted file mode 100644
index 4c212be4..00000000
--- a/.idea_modules/all-build.iml
+++ /dev/null
@@ -1,88 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/all.iml b/.idea_modules/all.iml
deleted file mode 100644
index 16c149ba..00000000
--- a/.idea_modules/all.iml
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/commonPlugins.iml b/.idea_modules/commonPlugins.iml
deleted file mode 100644
index 9604fd9e..00000000
--- a/.idea_modules/commonPlugins.iml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/core.iml b/.idea_modules/core.iml
deleted file mode 100644
index 69945a89..00000000
--- a/.idea_modules/core.iml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/microexample-build.iml b/.idea_modules/microexample-build.iml
deleted file mode 100644
index d05abf2c..00000000
--- a/.idea_modules/microexample-build.iml
+++ /dev/null
@@ -1,88 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/microexample.iml b/.idea_modules/microexample.iml
deleted file mode 100644
index 9866e569..00000000
--- a/.idea_modules/microexample.iml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/mineLang.iml b/.idea_modules/mineLang.iml
deleted file mode 100644
index 76972780..00000000
--- a/.idea_modules/mineLang.iml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea_modules/scalaLibPlugin.iml b/.idea_modules/scalaLibPlugin.iml
deleted file mode 100644
index 8119761d..00000000
--- a/.idea_modules/scalaLibPlugin.iml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/build.sbt b/build.sbt
new file mode 100644
index 00000000..a351814f
--- /dev/null
+++ b/build.sbt
@@ -0,0 +1,75 @@
+val projectUrl = "https://github.com/joshcough/MinecraftPlugins"
+
+import com.joshcough.minecraft.MinecraftPluginPlugin._
+
+val standardSettings = join(
+ libDeps(
+ "javax.servlet" % "servlet-api" % "2.5" % "provided->default",
+ "org.bukkit" % "bukkit" % "1.16.1-R0.1-SNAPSHOT",
+ "org.scalacheck" %% "scalacheck" % "1.15.4" % "test"
+ ),
+ Seq(organization := "com.joshcough"
+ , version := "0.3.5-SNAPSHOT"
+ , scalaVersion := "3.1.0"
+ , scalacOptions := Seq("-unchecked", "-deprecation"), // "-Ylog-classpath"),
+ resolvers += "Bukkit" at "https://maven.elmakers.com/repository"
+ )
+)
+
+// the core plugin library
+val core = (project in file("core"))
+ .settings(
+ standardSettings,
+ name := "scala-minecraft-plugin-api",
+ copyPluginToBukkitSettings(Some(new File("bukkit")))
+ )
+
+// this project supplies the scala language classes.
+// it is needed in the bukkit plugins dir to run any scala plugins.
+val scalaLibPlugin = (project in file("scala-lib-plugin"))
+ .settings(standardSettings, name := "scala-minecraft-scala-library")
+
+val MultiPlayerCommands = exampleProject("MultiPlayerCommands")
+val WorldEdit = exampleProject("WorldEdit")
+val Warp = exampleProject("Warp")
+val LightningArrows = exampleProject("LightningArrows")
+val NoRain = exampleProject("NoRain")
+val PluginCommander = exampleProject("PluginCommander")
+val Shock = exampleProject("Shock")
+
+def exampleProject(projectName: String) = {
+ Project(projectName, new File("examples/" + projectName))
+ .settings(
+ standardSettings,
+ minecraftProject(
+ author = "Josh Cough",
+ pluginConfigClassName = "com.joshcough.minecraft.examples." + projectName + "Config",
+ bukkitDir = Some(new File("bukkit"))
+ ),
+ ).dependsOn(core)
+}
+
+// this is just a convenience project
+// for me to easily publish my most used plugins to my bukkit server.
+val commonPlugins = (project in file(".commonPlugins"))
+ .settings(standardSettings)
+ .aggregate(scalaLibPlugin, core, MultiPlayerCommands, PluginCommander, Warp, WorldEdit)
+
+def join(settings: Seq[Def.Setting[_]]*) = settings.flatten
+def libDeps(libDeps: sbt.ModuleID*) = Seq(libraryDependencies ++= libDeps)
+
+// TODO:
+// lazy val microExample = Project(id = "microexample", base = file("microexample"))
+
+// // a whole pile of example projects
+// lazy val Arena = exampleProject("Arena")
+// lazy val BanArrows = exampleProject("BanArrows")
+// lazy val BlockChanger = exampleProject("BlockChanger")
+// lazy val BlockChangerGold = exampleProject("BlockChangerGold")
+// lazy val GetOffMyLawn = exampleProject("GetOffMyLawn")
+// lazy val God = exampleProject("God")
+// lazy val Thor = exampleProject("Thor")
+// lazy val TeleportBows = exampleProject("TeleportBows")
+// lazy val TreeDelogger = exampleProject("TreeDelogger")
+// lazy val YellowBrickRoad = exampleProject("YellowBrickRoad")
+// lazy val ZombieApocalypse = exampleProject("ZombieApocalypse")
diff --git a/core/src/main/resources/plugin.yml b/core/src/main/resources/plugin.yml
index b5ffbd50..3cf99004 100644
--- a/core/src/main/resources/plugin.yml
+++ b/core/src/main/resources/plugin.yml
@@ -2,5 +2,6 @@ name: ScalaPluginAPI
main: com.joshcough.minecraft.ScalaPluginAPI
author: Josh Cough
version: 0.3.3
+api-version: 1.13
database: false
depend: [ScalaLibPlugin]
diff --git a/core/src/main/scala/com/joshcough/minecraft/BukkitEnrichment.scala b/core/src/main/scala/com/joshcough/minecraft/BukkitEnrichment.scala
index d639d409..d6d86b51 100644
--- a/core/src/main/scala/com/joshcough/minecraft/BukkitEnrichment.scala
+++ b/core/src/main/scala/com/joshcough/minecraft/BukkitEnrichment.scala
@@ -1,20 +1,24 @@
package com.joshcough.minecraft
-import org.bukkit.{ChatColor, Effect, Location, Material, OfflinePlayer, Server, World}
+import java.util.Date
+
+import org.bukkit.{Bukkit, ChatColor, Effect, Location, Material, OfflinePlayer, Server, World}
+import org.bukkit.BanList.Type
import org.bukkit.block.Block
+import org.bukkit.entity.{Entity, EntityType, LivingEntity, Player}
import org.bukkit.event.Cancellable
import org.bukkit.event.entity.EntityDamageByEntityEvent
+import org.bukkit.event.player.PlayerInteractEvent
import org.bukkit.event.weather.WeatherChangeEvent
import org.bukkit.inventory.ItemStack
import org.bukkit.plugin.{Plugin, PluginManager}
+import scala.jdk.CollectionConverters._
+
import ChatColor._
+import Cube._
import Effect._
import Material._
-import org.bukkit.entity.{LivingEntity, Entity, EntityType, Player}
-import org.bukkit.event.player.PlayerInteractEvent
import util.Try
-import Cube._
-
object BukkitEnrichment extends BukkitEnrichment {
object MaterialAndData {
@@ -23,10 +27,8 @@ object BukkitEnrichment extends BukkitEnrichment {
case class MaterialAndData(m: Material, data: Option[Byte]){
def update(b: Block): Boolean = {
val oldM = b.getType
- val oldData = b.getData
b setType m
- data foreach b.setData
- oldM != m || oldData != data.getOrElse(0)
+ oldM != m
}
def itemStack: ItemStack = data.fold(new ItemStack(m))(new ItemStack(m, 1, 0:Short, _))
}
@@ -86,37 +88,37 @@ trait BukkitEnrichment extends ScalaEnrichment {
def nthBlockAbove(n:Int) = world(xd, yd + n, zd)
// the nth block below b
def nthBlockBelow(n:Int) = world(xd, yd - n, zd)
- // a Stream of all the Blocks above b
- def blocksAbove : Stream[Block] = blockAbove #:: blockAbove.blocksAbove
+ // a LazyList of all the Blocks above b
+ def blocksAbove : LazyList[Block] = blockAbove #:: blockAbove.blocksAbove
// b, and all the blocks above b
- def andBlocksAbove: Stream[Block] = b #:: blocksAbove
- // a Stream of all the Blocks below b
- def blocksBelow : Stream[Block] = blockBelow #:: blockBelow.blocksBelow
+ def andBlocksAbove: LazyList[Block] = b #:: blocksAbove
+ // a LazyList of all the Blocks below b
+ def blocksBelow : LazyList[Block] = blockBelow #:: blockBelow.blocksBelow
// b, and all the blocks below b
- def andBlocksBelow: Stream[Block] = b #:: blocksBelow
+ def andBlocksBelow: LazyList[Block] = b #:: blocksBelow
// the four blocks north, south, east and west of b
- def neighbors4: Stream[Block] =
- blockNorth #:: blockSouth #:: blockEast #:: blockWest #:: Stream.empty
+ def neighbors4: LazyList[Block] =
+ blockNorth #:: blockSouth #:: blockEast #:: blockWest #:: LazyList.empty
// b, and the four blocks north, south, east and west of b
- def andNeighbors4: Stream[Block] = b #:: neighbors4
+ def andNeighbors4: LazyList[Block] = b #:: neighbors4
// the four blocks north, south, east and west of b
// and the four blocks northeast, southeast, northwest, and southwest of b
- def neighbors8 : Stream[Block] = neighbors4 ++ (
- blockNorthEast #:: blockSouthEast #:: blockNorthWest #:: blockSouthWest #:: Stream.empty
+ def neighbors8 : LazyList[Block] = neighbors4 ++ (
+ blockNorthEast #:: blockSouthEast #:: blockNorthWest #:: blockSouthWest #:: LazyList.empty
)
// b and all of b's neighbors8
- def andNeighbors8: Stream[Block] = b #:: neighbors8
+ def andNeighbors8: LazyList[Block] = b #:: neighbors8
/**
* @return all of b's 26 neighbors in 3D space
*/
- def neighbors : Stream[Block] =
+ def neighbors : LazyList[Block] =
neighbors8 ++ b.blockBelow.andNeighbors8 #::: b.blockAbove.andNeighbors8
/**
* @return b, and all of b's 26 neighbors in 3D space
*/
- def andNeighbors : Stream[Block] = b #:: neighbors
+ def andNeighbors : LazyList[Block] = b #:: neighbors
def is(m:Material) = b.getType == m
def isA(m:Material) = b.getType == m
@@ -164,7 +166,7 @@ trait BukkitEnrichment extends ScalaEnrichment {
*/
implicit class RichCancellable(c:Cancellable){
def cancel: Unit = c.setCancelled(true)
- def cancelIf(b: => Boolean, runBeforeCancelling: => Unit = () => ()): Unit =
+ def cancelIf(b: => Boolean, runBeforeCancelling: => Unit = ()): Unit =
if(b) { runBeforeCancelling; c.setCancelled(true) }
}
@@ -205,7 +207,7 @@ trait BukkitEnrichment extends ScalaEnrichment {
*/
implicit class RichWorld(w:World){
def name = w.getName
- def entities = w.getEntities
+ def entities: List[Entity] = w.getEntities.asScala.toList
def apply(x: Int, y: Int, z: Int) : Block = blockAt(x.toDouble, y.toDouble, z.toDouble)
def apply(x: Double, y: Double, z: Double): Block = new Location(w, x, y, z).getBlock
def apply(p: Point): Block = this(p.x, p.y, p.z)
@@ -213,11 +215,11 @@ trait BukkitEnrichment extends ScalaEnrichment {
def blockAt(x: Double, y: Double, z: Double): Block = new Location(w, x, y, z).getBlock
/**
- * Returns an infinite Stream[Block] that increases positively in X (or EAST)
+ * Returns an infinite LazyList[Block] that increases positively in X (or EAST)
* starting at the given Location.
*/
- def fromX(loc:Location): Stream[Block] = {
- lazy val nats:Stream[Int] = 0 #:: 1 #:: nats.tail.map(_+1)
+ def fromX(loc:Location): LazyList[Block] = {
+ lazy val nats:LazyList[Int] = 0 #:: 1 #:: nats.tail.map(_+1)
for (x<-nats) yield w(loc.x + x, loc.y, loc.z)
}
}
@@ -232,7 +234,7 @@ trait BukkitEnrichment extends ScalaEnrichment {
lazy val xyzd = (xd, yd, zd)
def world = loc.getWorld
def block = loc.getBlock
- def spawn(entityType: EntityType): Unit = world.spawnCreature(loc, entityType)
+ def spawn(entityType: EntityType): Unit = world.spawnEntity(loc, entityType)
def spawnN(entityType: EntityType, n: Int): Unit = for (i <- 1 to n) spawn(entityType)
def dropItem(stack: ItemStack): Unit = loc.world.dropItem(loc, stack)
def dropItem(m: Material): Unit = dropItem(m.itemStack)
@@ -245,11 +247,10 @@ trait BukkitEnrichment extends ScalaEnrichment {
}
implicit class RichCubeOfBlocks(c: Cube[Block]) {
- import collection.JavaConversions.asScalaIterator
def world = c(Point(0,0,0)).world
- def blocks = c.toStream
+ def blocks = c.toLazyList
def blocksAndMaterials = blocks.map(b => (b, b.materialAndData))
- def players: Iterator[Player] = world.getPlayers.iterator.filter(contains)
+ def players: Iterator[Player] = world.getPlayers.iterator.asScala.filter(contains)
def contains(p: Player) : Boolean = c.contains(p.loc.point)
def contains(l: Location): Boolean = c.contains(l.point)
}
@@ -260,10 +261,7 @@ trait BukkitEnrichment extends ScalaEnrichment {
implicit class RichServer(s:Server){
def findPlayer(name:String) = tryO(s.getPlayer(name))
def findOnlinePlayer = findPlayer _
- def findOfflinePlayer(name:String) = Option(s.getOfflinePlayer(name))
def findOnlinePlayers(names: List[String]): List[Player] = names.map(findOnlinePlayer).flatten
- def findOfflinePlayers(names: List[String]): List[OfflinePlayer] =
- names.map(findOfflinePlayer).flatten
}
/**
@@ -278,8 +276,10 @@ trait BukkitEnrichment extends ScalaEnrichment {
def inventory = player.getInventory
def is(pname: String) = name == pname
- def holding = player.getItemInHand
- def isHolding (m: Material) = player.getItemInHand.getType == m
+ def isHolding (m: Material) =
+ player.getInventory.getItemInMainHand.getType == m ||
+ player.getInventory.getItemInOffHand.getType == m
+
def isHoldingA (m: Material) = isHolding(m)
def isHoldingAn(m: Material) = isHolding(m)
def isHoldingAnyOf(ms: Material*) = ms.exists(isHolding)
@@ -292,7 +292,7 @@ trait BukkitEnrichment extends ScalaEnrichment {
* If this player were in a box, this function would return all the blocks in that box
* @return
*/
- def blocksAround: Stream[Block] =
+ def blocksAround: LazyList[Block] =
blockOn.nthBlockAbove(1).neighbors8 ++ // 8 blocks at the bottom half of the player
blockOn.nthBlockAbove(2).neighbors8 ++ // 8 blocks at the top half of the player
blockOn.andNeighbors8 #::: // 9 blocks below the player
@@ -306,7 +306,7 @@ trait BukkitEnrichment extends ScalaEnrichment {
/**
* Sends player all of the given messages
*/
- def !* (ss: String*): Unit = ss.foreach(s => player ! s)
+ def !* (ss: List[String]): Unit = ss.foreach(s => player ! s)
/**
* Sends the player the given message, but turns it red.
@@ -331,26 +331,28 @@ trait BukkitEnrichment extends ScalaEnrichment {
def findPlayer(name:String)(f: Player => Unit): Unit =
server.findPlayer(name).fold(sendError("kill could not find player: " + name))(f)
def findPlayers(names:List[String])(f: Player => Unit): Unit = names.foreach(n => findPlayer(n)(f))
- def ban(reason:String){ player.setBanned(true); player.kickPlayer("banned: $reason") }
+ def ban(reason: String, bannedBy: Player): Unit = {
+ Bukkit.getBanList(Type.NAME).addBan(player.name, reason, null, bannedBy.name)
+ }
def kill(playerName:String): Unit = findPlayer(playerName)(kill)
def kill(p:Player): Unit = doTo(p, p.setHealth(0), "killed")
def teleportTo(otherPlayer: Player) = player.teleport(otherPlayer)
def teleportTo(b: Block): Unit = player.teleport(b.loc)
- def shockWith(message:String) {
+ def shockWith(message:String): Unit = {
player.shock
player ! message
}
- def withMaterial[T](nameOrId:String)(f: Material => T) {
+ def withMaterial[T](nameOrId:String)(f: Material => T): Unit = {
attemptO(findMaterial(nameOrId))("No such material: $nameOrId", f)
}
- def attemptO[T, U](ot: Option[T])(s: => String, f: T => U){
+ def attemptO[T, U](ot: Option[T])(s: => String, f: T => U): Unit = {
ot.fold(player ! s)(t => f(t))
}
def attempt[T](f: => T): Unit = try f catch {
- case e: Exception => player ! RED(s"$e ${e.getMessage}\n${e.getStackTraceString}")
+ case e: Exception => player ! RED(s"$e ${e.getMessage}\n${e.getStackTrace.mkString("\n")}")
}
-
- def doTo(otherPlayer: Player, f: => Unit, actionName: String){
+
+ def doTo(otherPlayer: Player, f: => Unit, actionName: String): Unit = {
f
otherPlayer ! GREEN(s"you have been $actionName by ${player.name}")
player ! GREEN(s"you have $actionName ${otherPlayer.name}")
@@ -392,39 +394,35 @@ trait BukkitEnrichment extends ScalaEnrichment {
// arguably, these functions should be someplace else...
def tryO[T](f: => T): Option[T] = Try(Option(f)).getOrElse(None)
- def findEntity(name:String) = Option(EntityType.fromName(name.toUpperCase)).orElse(
- Option(EntityType.valueOf(name.toUpperCase))
- )
+ def findEntity(name:String): Option[EntityType] = Option(EntityType.valueOf(name.toUpperCase))
- def findMaterial(nameOrId: String) = Option(getMaterial(nameOrId.toUpperCase)).orElse(
- tryO(getMaterial(nameOrId.toInt))
- )
+ def findMaterial(nameOrId: String): Option[Material] = Option(getMaterial(nameOrId.toUpperCase))
implicit class RichColor(c: ChatColor) {
- def apply(s: String) = c + s
+ def apply(s: String): String = c.toString + s
}
- sealed case class Color(data:Byte){
- def wool = MaterialAndData(WOOL, Some(data))
- }
-
- object Color {
- val WHITE = new Color(0)
- val ORANGE = new Color(1)
- val MAGENTA = new Color(2)
- val LIGHT_BLUE = new Color(3)
- val YELLOW = new Color(4)
- val LIGHT_GREEN = new Color(5)
- val PINK = new Color(6)
- val GREY = new Color(7)
- val LIGHT_GREY = new Color(8)
- val CYAN = new Color(9)
- val VIOLET = new Color(10)
- val BLUE = new Color(11)
- val BROWN = new Color(12)
- val GREEN = new Color(13)
- val RED = new Color(14)
- val BLACK = new Color(15)
- }
+// sealed case class Color(data:Byte){
+// def wool = MaterialAndData(WOOL, Some(data))
+// }
+//
+// object Color {
+// val WHITE = new Color(0)
+// val ORANGE = new Color(1)
+// val MAGENTA = new Color(2)
+// val LIGHT_BLUE = new Color(3)
+// val YELLOW = new Color(4)
+// val LIGHT_GREEN = new Color(5)
+// val PINK = new Color(6)
+// val GREY = new Color(7)
+// val LIGHT_GREY = new Color(8)
+// val CYAN = new Color(9)
+// val VIOLET = new Color(10)
+// val BLUE = new Color(11)
+// val BROWN = new Color(12)
+// val GREEN = new Color(13)
+// val RED = new Color(14)
+// val BLACK = new Color(15)
+// }
}
diff --git a/core/src/main/scala/com/joshcough/minecraft/CommandsPlugin.scala b/core/src/main/scala/com/joshcough/minecraft/CommandsPlugin.scala
index b1f1e517..86149460 100644
--- a/core/src/main/scala/com/joshcough/minecraft/CommandsPlugin.scala
+++ b/core/src/main/scala/com/joshcough/minecraft/CommandsPlugin.scala
@@ -6,20 +6,19 @@ import org.bukkit.command.{CommandSender, Command => BukkitCommand}
import org.bukkit.entity.{EntityType, Player}
import org.bukkit.{Location, World, Material, GameMode}
import org.bukkit.plugin.Plugin
-
+import org.bukkit.plugin.PluginManager
+import org.bukkit.Server
object MinecraftParsers extends MinecraftParsers
/**
* Parsers for all sorts of useful things in Minecraft.
*/
-trait MinecraftParsers extends ScalaPlugin with ParserCombinators {
+trait MinecraftParsers extends ParserCombinators with BukkitEnrichment {
val gamemode: Parser[GameMode] =
("c" | "creative" | "1") ^^^ CREATIVE |
("s" | "survival" | "0") ^^^ SURVIVAL
val entity : Parser[EntityType] = maybe("entity-type") (findEntity)
val material: Parser[Material] = maybe("material-type")(findMaterial)
- val player : Parser[Player] = maybe("player-name") (server.findPlayer)
- val plugin : Parser[Plugin] = maybe("plugin") (pluginManager.findPlugin(_))
val coordinates = int ~ int ~ int.?
val location: Parser[World => Location] = coordinates ^^ {
case x ~ z ~ Some(y) => (w:World) => w(x, y, z).loc
@@ -30,6 +29,12 @@ trait MinecraftParsers extends ScalaPlugin with ParserCombinators {
val length : Parser[Int] = int.named("length")
val height : Parser[Int] = int.named("height")
val depth : Parser[Int] = int.named("depth")
+
+ def player(implicit server: Server) : Parser[Player]
+ = maybe("player-name") (server.findPlayer)
+ def plugin(implicit pluginManager: PluginManager) : Parser[Plugin]
+ = maybe("plugin") (pluginManager.findPlugin(_))
+
}
/**
@@ -37,60 +42,97 @@ trait MinecraftParsers extends ScalaPlugin with ParserCombinators {
*/
trait
CommandPlugin extends CommandsPlugin {
+ import CommandsPlugin._
val command: Command
def commands = List(command)
}
-object CommandsPlugin extends CommandsPlugin{ val commands = Nil }
/**
- * A trait that greatly simplifies creating Bukkit commands.
- * There are many examples in the examples folder that
- * demonstrate how to use this trait. But here is a simple example:
- *
- * trait GotoPlugin extends CommandsPlugin {
- * val commands = List(
- * Command("goto", "Teleport!", args(location){ case (you, loc) =>
- * you teleport loc(you.world)
- * })
- * )
- * }
- *
- * Users simply provide a list of commands they want to use in their plugin.
- *
- * A Command is:
- * - A name
- * - A description
- * - and a 'CommandBody'
- *
- * A CommandBody consists of
- * - a parser for the arguments of the command
- * - and a function that takes
- * - the player that entered the command
- * - and result of parsing
- *
- * If the command is entered, the parser runs on the arguments.
- * If the parser succeeds, the function is ran.
- * If it fails, the player is given an error message.
- *
- * In the example above, args(location){ you teleport loc(you.world) }
- * TODO keep writing.
- *
- */
+ * A trait that greatly simplifies creating Bukkit commands.
+ * There are many examples in the examples folder that
+ * demonstrate how to use this trait. But here is a simple example:
+ *
+ * trait GotoPlugin extends CommandsPlugin {
+ * val commands = List(
+ * Command("goto", "Teleport!", args(location){ case (you, loc) =>
+ * you teleport loc(you.world)
+ * })
+ * )
+ * }
+ *
+ * Users simply provide a list of commands they want to use in their plugin.
+ *
+ * A Command is:
+ * - A name
+ * - A description
+ * - and a 'CommandBody'
+ *
+ * A CommandBody consists of
+ * - a parser for the arguments of the command
+ * - and a function that takes
+ * - the player that entered the command
+ * - and result of parsing
+ *
+ * If the command is entered, the parser runs on the arguments.
+ * If the parser succeeds, the function is ran.
+ * If it fails, the player is given an error message.
+ *
+ * In the example above, args(location){ you teleport loc(you.world) }
+ * TODO keep writing.
+ *
+ */
trait CommandsPlugin extends ScalaPlugin with MinecraftParsers {
+ import CommandsPlugin._
+
+ def commands: List[Command]
+
+ private lazy val commandsMap = commands.map(c => (c.name.toLowerCase, c)).toMap
+
+ private val consolePlayer = new ConsolePlayer(server)
+
+ /**
+ * This is Bukkit's main entry point for plugins handling commands.
+ * When a command is entered by a player, the plugin will look through
+ * all of its commands. If one matches the command entered, it will be executed.
+ */
+ override def onCommand(sender: CommandSender, cmd: BukkitCommand,
+ commandName: String, args: Array[String]) = {
+ println(s"$name handling $commandName [${args.mkString(",")}]")
+ val p = sender match { case p: Player => p; case _ => consolePlayer.player }
+ (for (c <- commandsMap.get(commandName.toLowerCase)) yield
+ try { c.body(p, args.toList); true }
+ catch { case e: Exception =>
+ p ! RED(e.getMessage)
+ logError(e)
+ false
+ }).getOrElse(true)
+ }
+
+ override def onEnable: Unit = {
+ super.onEnable
+ commandsMap.foreach { case (name, _) => logInfo("command: " + name) }
+ }
+
+ /**
+ * Overriding to add commands into the plugin.yml.
+ */
+ override def yml(author:String, version: String): String =
+ List(super.yml(author, version), CommandsPlugin.yml(commands)).mkString("\n")
+}
+
+object CommandsPlugin extends MinecraftParsers {
case class Command(
- name: String,
- description: String,
- argsDescription: Option[String],
- body: (Player, List[String]) => Unit){
+ name: String,
+ description: String,
+ argsDescription: Option[String],
+ body: (Player, List[String]) => Unit){
def filter(f: Player => Boolean, err: => String) = this.copy(
body = (p, args) => if(f(p)) body(p, args) else p.sendError(err)
)
}
- def commands: List[Command]
-
def ArgsCommand[T](name: String, desc: String, p: Parser[T])
(body: ((Player, T)) => Unit): Command = Command(name, desc, p)(body)
@@ -98,121 +140,106 @@ trait CommandsPlugin extends ScalaPlugin with MinecraftParsers {
(body: Player => Unit): Command = Command(name, desc)(body)
/**
- * Create commands that takes arguments.
- *
- * Takes an Parser[T] and a function from Player and T to Unit
- * If the command is executed, then the parser is run with the command arguments.
- *
- * If those arguments successfully parse, the parser will produce a T.
- * The function (the body of the command) will then be invoked with the player
- * that entered the command, and the T produced by parsing.
- *
- * If the arguments do not parse, then the player who entered the command
- * is sent an error message, explaining what went wrong, and how to use the command.
- *
- * @param name
- * @param desc
- * @param args
- * @param body
- * @tparam T
- * @return
- */
+ * Create commands that takes arguments.
+ *
+ * Takes an Parser[T] and a function from Player and T to Unit
+ * If the command is executed, then the parser is run with the command arguments.
+ *
+ * If those arguments successfully parse, the parser will produce a T.
+ * The function (the body of the command) will then be invoked with the player
+ * that entered the command, and the T produced by parsing.
+ *
+ * If the arguments do not parse, then the player who entered the command
+ * is sent an error message, explaining what went wrong, and how to use the command.
+ *
+ * @param name
+ * @param desc
+ * @param args
+ * @param body
+ * @tparam T
+ * @return
+ */
def Command[T](name: String, desc: String, args: Parser[T])
(body: ((Player, T)) => Unit): Command = new Command(
name = name, description = desc, argsDescription = Some(args.describe),
body = (p: Player, argsList: List[String]) =>
(args <~ eof)(argsList) match {
case Success(t,_) => body(p -> t)
- case Failure(msg) => p !* (RED(msg), RED(desc), RED(s"/$name ${args.describe}"))
+ case Failure(msg) => p !* List(RED(msg), RED(desc), RED(s"/$name ${args.describe}"))
}
)
/**
- * Create a command that take no arguments.
- *
- * Takes a function from Player to unit,
- * and if the command is entered by a player
- * the function is executed with that player.
- * @param name
- * @param desc
- * @param body
- * @return
- */
+ * Create a command that take no arguments.
+ *
+ * Takes a function from Player to unit,
+ * and if the command is entered by a player
+ * the function is executed with that player.
+ * @param name
+ * @param desc
+ * @param body
+ * @return
+ */
def Command(name: String, desc: String)(body: Player => Unit): Command =
Command(name, desc, eof){ case (p, _) => body(p) }
- private lazy val commandsMap = commands.map(c => (c.name.toLowerCase, c)).toMap
-
- /**
- * This is Bukkit's main entry point for plugins handling commands.
- * When a command is entered by a player, the plugin will look through
- * all of its commands. If one matches the command entered, it will be executed.
- */
- override def onCommand(sender: CommandSender, cmd: BukkitCommand,
- commandName: String, args: Array[String]) = {
- println(s"$name handling $commandName [${args.mkString(",")}]")
- val p = sender match { case p: Player => p; case _ => ConsolePlayer.player }
- (for (c <- commandsMap.get(commandName.toLowerCase)) yield
- try { c.body(p, args.toList); true }
- catch { case e: Exception =>
- p ! RED(e.getMessage)
- logError(e)
- false
- }).getOrElse(true)
- }
-
- override def onEnable {
- super.onEnable
- commandsMap.foreach { case (name, _) => logInfo("command: " + name) }
- }
-
/**
- * TODO: rewrite comment
- *
- * This should probably be done better, using bukkit permissions, but later.
- *
- * Takes a CommandBody and wraps it in another CommandBody that first checks
- * if the user is an op. If the user is an op, the inner CommandBody is executed.
- * If not, then the user is given an error message.
- */
+ * TODO: rewrite comment
+ *
+ * This should probably be done better, using bukkit permissions, but later.
+ *
+ * Takes a CommandBody and wraps it in another CommandBody that first checks
+ * if the user is an op. If the user is an op, the inner CommandBody is executed.
+ * If not, then the user is given an error message.
+ */
def OpOnly(c: Command): Command = c.filter(_.isOp, s"You must be an op to run /${c.name}")
/**
- * Simple combinator for creating commands that take a single Player argument (only).
- */
- def P2P(name: String, desc: String)(f: (Player, Player) => Unit): Command =
+ * Simple combinator for creating commands that take a single Player argument (only).
+ */
+ def P2P(name: String, desc: String)(f: (Player, Player) => Unit)(implicit server: Server): Command =
Command(name, desc, player){case (p1,p2) => f(p1, p2)}
- /**
- * Overriding to add commands into the plugin.yml.
- */
- override def yml(author:String, version: String) = {
+ def yml(commands: List[Command]): String = {
def yml(c: Command) =
s" ${c.name}:\n" +
- s" description: ${c.description}\n" +
- s" usage: /${c.name} ${c.argsDescription.getOrElse("")}"
- val commandsYml = s"commands:\n${commands.map(yml).mkString("\n")}"
- List(super.yml(author, version), commandsYml).mkString("\n")
+ s" description: ${c.description}\n" +
+ s" usage: /${c.name} ${c.argsDescription.getOrElse("")}"
+ s"commands:\n${commands.map(yml).mkString("\n")}"
+ }
+
+ def fullPluginYml(pluginName: String,
+ pluginClassName: String,
+ author:String,
+ version: String,
+ dependencies: List[String],
+ mandatoryDependencies: List[String],
+ softDependencies: List[String],
+ commands: List[Command]): String = {
+ List(
+ ScalaPlugin.yml(pluginName, pluginClassName, author, version, dependencies, mandatoryDependencies, softDependencies),
+ CommandsPlugin.yml(commands)
+ ).mkString("\n")
}
/**
- * This is used so that any plugin commands can be entered at the console.
- * it 'converts' a the console to a player, that way not all plugins have to
- * check if(console) then ... else ...
- * this might be less type safe, and allows commands to be entered at the console
- * that really shouldnt be entered, however, it keeps the api very clean
- * and the console owner will generally be aware of what should and shouldnt work
- * at the console anyway.
- *
- * Here's one trivial example of a command that wouldn't work:
- *
- * If there was a command that opened the users inventory (eg: /inv), it wouldn't
- * work because the console has no inventory, and the open inventory function is
- * implemented like this:
- *
- * def openInventory(p1: Inventory): InventoryView = ???
- */
- object ConsolePlayer {
+ * This is used so that any plugin commands can be entered at the console.
+ * it 'converts' a the console to a player, that way not all plugins have to
+ * check if(console) then ... else ...
+ * this might be less type safe, and allows commands to be entered at the console
+ * that really shouldnt be entered, however, it keeps the api very clean
+ * and the console owner will generally be aware of what should and shouldnt work
+ * at the console anyway.
+ *
+ * Here's one trivial example of a command that wouldn't work:
+ *
+ * If there was a command that opened the users inventory (eg: /inv), it wouldn't
+ * work because the console has no inventory, and the open inventory function is
+ * implemented like this:
+ *
+ * def openInventory(p1: Inventory): InventoryView = ???
+ */
+ class ConsolePlayer(server: Server) {
import org.bukkit._
import org.bukkit.inventory._
import org.bukkit.inventory.InventoryView.Property
@@ -232,244 +259,372 @@ trait CommandsPlugin extends ScalaPlugin with MinecraftParsers {
def origin = server.getWorlds.get(0).blockAt(0,0,0).loc
val player = new Player {
- def setWhitelisted(p1: Boolean): Unit = {}
- def setPassenger(p1: Entity): Boolean = true
- def getType: EntityType = EntityType.UNKNOWN
- def throwSnowball: Snowball = getWorld.spawn(origin, classOf[Snowball])
- def getLastDamageCause: EntityDamageEvent = new EntityDamageEvent(this, EntityDamageEvent.DamageCause.FALL, 0)
- def closeInventory: Unit = {}
- def getGameMode: GameMode = GameMode.CREATIVE
- def setMaximumAir(p1: Int): Unit = {}
- def kickPlayer(p1: String): Unit = {}
- def setTicksLived(p1: Int): Unit = {}
- def setExp(p1: Float): Unit = {}
- def addPotionEffect(p1: PotionEffect, p2: Boolean): Boolean = false
- def addPotionEffect(p1: PotionEffect): Boolean = false
- def chat(p1: String): Unit = {}
- def setWindowProperty(p1: Property, p2: Int): Boolean = false
- def getFireTicks: Int = 0
- def getMaximumNoDamageTicks: Int = 0
- def getTotalExperience: Int = 0
- def getPlayerTimeOffset: Long = 0
- def sendRawMessage(p1: String) { println(s"raw message: $p1") }
- def setGameMode(p1: GameMode): Unit = {}
- def setBedSpawnLocation(p1: Location): Unit = {}
- def setBedSpawnLocation(x$1: org.bukkit.Location,x$2: Boolean): Unit = {}
- def getHealth: Double = 0
- def getItemInHand: ItemStack = new ItemStack(Material.AIR)
+ override def setWhitelisted(p1: Boolean): Unit = {}
+ override def setPassenger(p1: Entity): Boolean = true
+ override def getType: EntityType = EntityType.UNKNOWN
+ // override def throwSnowball: Snowball = getWorld.spawn(origin, classOf[Snowball])
+ override def getLastDamageCause: EntityDamageEvent = new EntityDamageEvent(this, EntityDamageEvent.DamageCause.FALL, 0)
+ override def closeInventory: Unit = {}
+ override def getGameMode: GameMode = GameMode.CREATIVE
+ override def setMaximumAir(p1: Int): Unit = {}
+ override def kickPlayer(p1: String): Unit = {}
+ override def setTicksLived(p1: Int): Unit = {}
+ override def setExp(p1: Float): Unit = {}
+ override def addPotionEffect(p1: PotionEffect, p2: Boolean): Boolean = false
+ override def addPotionEffect(p1: PotionEffect): Boolean = false
+ override def chat(p1: String): Unit = {}
+ override def setWindowProperty(p1: Property, p2: Int): Boolean = false
+ override def getFireTicks: Int = 0
+ override def getMaximumNoDamageTicks: Int = 0
+ override def getTotalExperience: Int = 0
+ override def getPlayerTimeOffset: Long = 0
+ override def sendRawMessage(p1: String): Unit = { println(s"raw message: $p1") }
+ override def setGameMode(p1: GameMode): Unit = {}
+ override def setBedSpawnLocation(p1: Location): Unit = {}
+ override def setBedSpawnLocation(x$1: org.bukkit.Location,x$2: Boolean): Unit = {}
+ override def getHealth: Double = 0
+ override def getItemInHand: ItemStack = new ItemStack(Material.AIR)
override def getDisplayName: String = getServer.getName
- def damage(p1: Int, p2: Entity): Unit = {}
- def damage(p1: Int): Unit = {}
- def getNearbyEntities(p1: Double, p2: Double, p3: Double): java.util.List[Entity] = new java.util.LinkedList[Entity]()
- def isSleepingIgnored: Boolean = true
- def setVelocity(p1: Vector): Unit = {}
- def setExhaustion(p1: Float): Unit = {}
- def setCompassTarget(p1: Location): Unit = {}
- def setSaturation(p1: Float): Unit = {}
- def playEffect[T](p1: Location, p2: Effect, p3: T): Unit = {}
- def playEffect(p1: Location, p2: Effect, p3: Int): Unit = {}
- def playEffect(p1: EntityEffect): Unit = {}
- def getListeningPluginChannels: java.util.Set[String] = new java.util.HashSet()
- def getPlayer: Player = this
- def getMaxHealth: Double = 0
- def getVehicle: Entity = this // TODO: might not be ok
- def isSneaking: Boolean = false
- def loadData: Unit = {}
- def setPlayerTime(p1: Long, p2: Boolean): Unit = {}
- def isBlocking: Boolean = false
- def isOp: Boolean = true
- def getMetadata(p1: String): java.util.List[MetadataValue] = new java.util.LinkedList()
- def launchProjectile[T <: Projectile](p1: Class[_ <: T]): T = ???
- def hasMetadata(p1: String): Boolean = false
- def setFlySpeed(p1: Float): Unit = {}
- def getName: String = getServer.getName
- def getMaxFireTicks: Int = 0
- def getBedSpawnLocation: Location = origin
- def isInsideVehicle: Boolean = false
- def getInventory: PlayerInventory = ???
- def setMetadata(p1: String, p2: MetadataValue): Unit = {}
- def setBanned(p1: Boolean): Unit = {}
- def incrementStatistic(p1: Statistic, p2: Material, p3: Int): Unit = {}
- def incrementStatistic(p1: Statistic, p2: Material): Unit = {}
- def incrementStatistic(p1: Statistic, p2: Int): Unit = {}
- def incrementStatistic(p1: Statistic): Unit = {}
- def isWhitelisted: Boolean = true
- def getLastDamage: Double = 0
- def getKiller: Player = this
- def getEffectivePermissions: java.util.Set[PermissionAttachmentInfo] = new java.util.HashSet()
- def openEnchanting(p1: Location, p2: Boolean): InventoryView = ???
- def getFoodLevel: Int = 0
- def updateInventory: Unit = {}
- def getLastPlayed: Long = 0
- def getNoDamageTicks: Int = 0
- def setPlayerListName(p1: String): Unit = {}
- def getServer: Server = server
- def isSleeping: Boolean = false
- def acceptConversationInput(p1: String): Unit = {}
- def hasPotionEffect(p1: PotionEffectType): Boolean = false
- def getAllowFlight: Boolean = false
- def setOp(p1: Boolean): Unit = {}
- def getPlayerListName: String = getServer.getName
- def setMaximumNoDamageTicks(p1: Int): Unit = {}
- def setFireTicks(p1: Int): Unit = {}
- def isPermissionSet(p1: Permission): Boolean = true
- def isPermissionSet(p1: String): Boolean = true
- def getLevel: Int = 0
- def setSneaking(p1: Boolean): Unit = {}
- def getRemainingAir: Int = 0
- def isFlying: Boolean = false
- def performCommand(p1: String): Boolean = false
- def eject: Boolean = true
- def setRemainingAir(p1: Int): Unit = {}
- def getLastTwoTargetBlocks(p1: java.util.HashSet[java.lang.Byte], p2: Int): java.util.List[org.bukkit.block.Block] = new java.util.LinkedList()
- def sendMap(p1: MapView): Unit = {}
- def openInventory(p1: InventoryView): Unit = {}
- def openInventory(p1: Inventory): InventoryView = ???
- def playNote(p1: Location, p2: Instrument, p3: Note): Unit = {}
- def playNote(p1: Location, p2: Byte, p3: Byte): Unit = {}
- def setItemInHand(p1: ItemStack): Unit = {}
- def getWalkSpeed: Float = 0
- def addAttachment(p1: Plugin, p2: Int): PermissionAttachment = ???
- def addAttachment(p1: Plugin, p2: String, p3: Boolean, p4: Int): PermissionAttachment = ???
- def addAttachment(p1: Plugin): PermissionAttachment = ???
- def addAttachment(p1: Plugin, p2: String, p3: Boolean): PermissionAttachment = ???
- def getUniqueId: java.util.UUID = ???
- def hasLineOfSight(p1: Entity): Boolean = false
- def openWorkbench(p1: Location, p2: Boolean): InventoryView = ???
- def awardAchievement(p1: Achievement): Unit = {}
- def abandonConversation(p1: Conversation, p2: ConversationAbandonedEvent): Unit = {}
- def abandonConversation(p1: Conversation): Unit = {}
- def leaveVehicle: Boolean = false
- def getCompassTarget: Location = origin
- def remove: Unit = {}
- def serialize: java.util.Map[String, AnyRef] = new java.util.HashMap[String, AnyRef]
- def recalculatePermissions: Unit = {}
- def getLineOfSight(p1: java.util.HashSet[java.lang.Byte], p2: Int): java.util.List[Block] = new java.util.LinkedList()
- def setLastDamage(p1: Int): Unit = {}
- def getTargetBlock(p1: java.util.HashSet[java.lang.Byte], p2: Int): Block = origin.block
- def removePotionEffect(p1: PotionEffectType): Unit = {}
- def setLevel(p1: Int): Unit = {}
- def setFlying(p1: Boolean): Unit = {}
- def setLastDamageCause(p1: EntityDamageEvent): Unit = {}
- def hasPermission(p1: Permission): Boolean = true
- def hasPermission(p1: String): Boolean = true
- def getFallDistance: Float = 0
- def showPlayer(p1: Player): Unit = {}
- def shootArrow: Arrow = getWorld.spawn(origin, classOf[Arrow])
- def sendChunkChange(p1: Location, p2: Int, p3: Int, p4: Int, p5: Array[Byte]): Boolean = true
- def hasPlayedBefore: Boolean = true
- def setFoodLevel(p1: Int): Unit = {}
- def getWorld: World = getServer.getWorlds.get(0) // TODO: Important
- def sendBlockChange(p1: Location, p2: Int, p3: Byte): Unit = {}
- def sendBlockChange(p1: Location, p2: Material, p3: Byte): Unit = {}
- def setFallDistance(p1: Float): Unit = {}
- def getTicksLived: Int = 0
- def getPlayerTime: Long = 0
- def throwEgg: Egg = getWorld.spawn(origin, classOf[Egg])
- def setDisplayName(p1: String): Unit = {}
- def resetPlayerTime: Unit = {}
- def getActivePotionEffects: java.util.Collection[PotionEffect] = new java.util.LinkedList()
- def teleport(p1: Entity, p2: TeleportCause): Boolean = false
- def teleport(p1: Entity): Boolean = false
- def teleport(p1: Location, p2: TeleportCause): Boolean = false
- def teleport(p1: Location): Boolean = false
- def getFirstPlayed: Long = 0
- def setTotalExperience(p1: Int): Unit = {}
- def saveData: Unit = {}
- def giveExp(p1: Int): Unit = {}
- def removeMetadata(p1: String, p2: Plugin): Unit = {}
- def getMaximumAir: Int = 0
- def getPassenger: Entity = this // TODO: might now be ok
- def setHealth(p1: Int): Unit = {}
- def setNoDamageTicks(p1: Int): Unit = {}
- def isValid: Boolean = true
- def getOpenInventory: InventoryView = ???
- def addPotionEffects(p1: java.util.Collection[PotionEffect]): Boolean = false
- def sendPluginMessage(p1: Plugin, p2: String, p3: Array[Byte]) {
+ // override def damage(p1: Int, p2: Entity): Unit = {}
+ // override def damage(p1: Int): Unit = {}
+ override def getNearbyEntities(p1: Double, p2: Double, p3: Double): java.util.List[Entity] = new java.util.LinkedList[Entity]()
+ override def isSleepingIgnored: Boolean = true
+ override def setVelocity(p1: Vector): Unit = {}
+ override def setExhaustion(p1: Float): Unit = {}
+ override def setCompassTarget(p1: Location): Unit = {}
+ override def setSaturation(p1: Float): Unit = {}
+ override def playEffect[T](p1: Location, p2: Effect, p3: T): Unit = {}
+ override def playEffect(p1: Location, p2: Effect, p3: Int): Unit = {}
+ override def playEffect(p1: EntityEffect): Unit = {}
+ override def getListeningPluginChannels: java.util.Set[String] = new java.util.HashSet()
+ override def getPlayer: Player = this
+ override def getMaxHealth: Double = 0
+ override def getVehicle: Entity = this // TODO: might not be ok
+ override def isSneaking: Boolean = false
+ override def loadData: Unit = {}
+ override def setPlayerTime(p1: Long, p2: Boolean): Unit = {}
+ override def isBlocking: Boolean = false
+ override def isOp: Boolean = true
+ override def getMetadata(p1: String): java.util.List[MetadataValue] = new java.util.LinkedList()
+ override def launchProjectile[T <: Projectile](p1: Class[_ <: T]): T = ???
+ override def launchProjectile[T <: Projectile](p1: Class[_ <: T], x$2: org.bukkit.util.Vector) : T = ???
+ override def hasMetadata(p1: String): Boolean = false
+ override def setFlySpeed(p1: Float): Unit = {}
+ override def getName: String = getServer.getName
+ override def getMaxFireTicks: Int = 0
+ override def getBedSpawnLocation: Location = origin
+ override def isInsideVehicle: Boolean = false
+ override def getInventory: PlayerInventory = ???
+ override def setMetadata(p1: String, p2: MetadataValue): Unit = {}
+ // override def setBanned(p1: Boolean): Unit = {}
+ override def incrementStatistic(p1: Statistic, p2: Material, p3: Int): Unit = {}
+ override def incrementStatistic(p1: Statistic, p2: Material): Unit = {}
+ override def incrementStatistic(p1: Statistic, p2: Int): Unit = {}
+ override def incrementStatistic(p1: Statistic): Unit = {}
+ override def isWhitelisted: Boolean = true
+ override def getLastDamage: Double = 0
+ override def getKiller: Player = this
+ override def getEffectivePermissions: java.util.Set[PermissionAttachmentInfo] = new java.util.HashSet()
+ override def openEnchanting(p1: Location, p2: Boolean): InventoryView = ???
+ override def getFoodLevel: Int = 0
+ override def updateInventory: Unit = {}
+ override def getLastPlayed: Long = 0
+ override def getNoDamageTicks: Int = 0
+ override def setPlayerListName(p1: String): Unit = {}
+ override def getServer: Server = server
+ override def isSleeping: Boolean = false
+ override def acceptConversationInput(p1: String): Unit = {}
+ override def hasPotionEffect(p1: PotionEffectType): Boolean = false
+ override def getAllowFlight: Boolean = false
+ override def setOp(p1: Boolean): Unit = {}
+ override def getPlayerListName: String = getServer.getName
+ override def setMaximumNoDamageTicks(p1: Int): Unit = {}
+ override def setFireTicks(p1: Int): Unit = {}
+ override def isPermissionSet(p1: Permission): Boolean = true
+ override def isPermissionSet(p1: String): Boolean = true
+ override def getLevel: Int = 0
+ override def setSneaking(p1: Boolean): Unit = {}
+ override def getRemainingAir: Int = 0
+ override def isFlying: Boolean = false
+ override def performCommand(p1: String): Boolean = false
+ override def eject: Boolean = true
+ override def setRemainingAir(p1: Int): Unit = {}
+ // override def getLastTwoTargetBlocks(p1: java.util.HashSet[java.lang.Byte], p2: Int): java.util.List[org.bukkit.block.Block] = new java.util.LinkedList()
+ override def sendMap(p1: MapView): Unit = {}
+ override def openInventory(p1: InventoryView): Unit = {}
+ override def openInventory(p1: Inventory): InventoryView = ???
+ override def playNote(p1: Location, p2: Instrument, p3: Note): Unit = {}
+ override def playNote(p1: Location, p2: Byte, p3: Byte): Unit = {}
+ override def setItemInHand(p1: ItemStack): Unit = {}
+ override def getWalkSpeed: Float = 0
+ override def addAttachment(p1: Plugin, p2: Int): PermissionAttachment = ???
+ override def addAttachment(p1: Plugin, p2: String, p3: Boolean, p4: Int): PermissionAttachment = ???
+ override def addAttachment(p1: Plugin): PermissionAttachment = ???
+ override def addAttachment(p1: Plugin, p2: String, p3: Boolean): PermissionAttachment = ???
+ override def getUniqueId: java.util.UUID = ???
+ override def hasLineOfSight(p1: Entity): Boolean = false
+ override def openWorkbench(p1: Location, p2: Boolean): InventoryView = ???
+ override def abandonConversation(p1: Conversation, p2: ConversationAbandonedEvent): Unit = {}
+ override def abandonConversation(p1: Conversation): Unit = {}
+ override def leaveVehicle: Boolean = false
+ override def getCompassTarget: Location = origin
+ override def remove: Unit = {}
+ override def serialize: java.util.Map[String, AnyRef] = new java.util.HashMap[String, AnyRef]
+ override def recalculatePermissions: Unit = {}
+ // override def getLineOfSight(p1: java.util.HashSet[java.lang.Byte], p2: Int): java.util.List[Block] = new java.util.LinkedList()
+ // override def setLastDamage(p1: Int): Unit = {}
+ // override def getTargetBlock(p1: java.util.HashSet[java.lang.Byte], p2: Int): Block = origin.block
+ override def removePotionEffect(p1: PotionEffectType): Unit = {}
+ override def setLevel(p1: Int): Unit = {}
+ override def setFlying(p1: Boolean): Unit = {}
+ override def setLastDamageCause(p1: EntityDamageEvent): Unit = {}
+ override def hasPermission(p1: Permission): Boolean = true
+ override def hasPermission(p1: String): Boolean = true
+ override def getFallDistance: Float = 0
+ override def showPlayer(p1: Player): Unit = {}
+ // override def shootArrow: Arrow = getWorld.spawn(origin, classOf[Arrow])
+ override def sendChunkChange(p1: Location, p2: Int, p3: Int, p4: Int, p5: Array[Byte]): Boolean = true
+ override def hasPlayedBefore: Boolean = true
+ override def setFoodLevel(p1: Int): Unit = {}
+ override def getWorld: World = getServer.getWorlds.get(0) // TODO: Important
+ // override def sendBlockChange(p1: Location, p2: Int, p3: Byte): Unit = {}
+ override def sendBlockChange(p1: Location, p2: Material, p3: Byte): Unit = {}
+ override def setFallDistance(p1: Float): Unit = {}
+ override def getTicksLived: Int = 0
+ override def getPlayerTime: Long = 0
+ // override def throwEgg: Egg = getWorld.spawn(origin, classOf[Egg])
+ override def setDisplayName(p1: String): Unit = {}
+ override def resetPlayerTime: Unit = {}
+ override def getActivePotionEffects: java.util.Collection[PotionEffect] = new java.util.LinkedList()
+ override def teleport(p1: Entity, p2: TeleportCause): Boolean = false
+ override def teleport(p1: Entity): Boolean = false
+ override def teleport(p1: Location, p2: TeleportCause): Boolean = false
+ override def teleport(p1: Location): Boolean = false
+ override def getFirstPlayed: Long = 0
+ override def setTotalExperience(p1: Int): Unit = {}
+ override def saveData: Unit = {}
+ override def giveExp(p1: Int): Unit = {}
+ override def removeMetadata(p1: String, p2: Plugin): Unit = {}
+ override def getMaximumAir: Int = 0
+ override def getPassenger: Entity = this // TODO: might now be ok
+ // override def setHealth(p1: Int): Unit = {}
+ override def setNoDamageTicks(p1: Int): Unit = {}
+ override def isValid: Boolean = true
+ override def getOpenInventory: InventoryView = ???
+ override def addPotionEffects(p1: java.util.Collection[PotionEffect]): Boolean = false
+ override def sendPluginMessage(p1: Plugin, p2: String, p3: Array[Byte]): Unit = {
println(s"plugin message: $p1, $p2, ${p3.mkString("")}")
}
- def setSleepingIgnored(p1: Boolean): Unit = {}
- def isEmpty: Boolean = false
- def isOnline: Boolean = true
- def isPlayerTimeRelative: Boolean = false
- def setWalkSpeed(p1: Float): Unit = {}
- def removeAttachment(p1: PermissionAttachment): Unit = {}
- def getAddress: InetSocketAddress = ???
- def getExhaustion: Float = 0
- def getLocation: Location = origin
- def getLocation(l: org.bukkit.Location): org.bukkit.Location = getLocation
- def getItemOnCursor: ItemStack = new ItemStack(Material.AIR)
- def getEyeLocation: Location = origin
- def isSprinting: Boolean = false
- def getSaturation: Float = 0
- def getExp: Float = 0
- def hidePlayer(p1: Player): Unit = {}
- def setAllowFlight(p1: Boolean): Unit = {}
- def sendMessage(p1: Array[String]) { p1 foreach sendMessage }
- def sendMessage(p1: String) { println(p1) }
- def isBanned: Boolean = false
- def setSprinting(p1: Boolean): Unit = {}
- def getVelocity: Vector = ???
- def getEntityId: Int = 0
- def setItemOnCursor(p1: ItemStack): Unit = {}
- def getExpToLevel: Int = 0
- def isConversing: Boolean = false
- def getSleepTicks: Int = 0
- def isDead: Boolean = false
- def getFlySpeed: Float = 0
- def beginConversation(p1: Conversation): Boolean = false
- def getEyeHeight(p1: Boolean): Double = 0
- def getEyeHeight: Double = 0
- def canSee(p1: Player): Boolean = true
- def getEnderChest(): org.bukkit.inventory.Inventory = ???
- def playSound(x$1: org.bukkit.Location,x$2: org.bukkit.Sound,x$3: Float,x$4: Float): Unit = {}
- def giveExpLevels(x$1: Int): Unit = {}
- def getCanPickupItems(): Boolean = false
- def getEquipment(): org.bukkit.inventory.EntityEquipment = ???
- def getRemoveWhenFarAway(): Boolean = false
+ override def setSleepingIgnored(p1: Boolean): Unit = {}
+ override def isEmpty: Boolean = false
+ override def isOnline: Boolean = true
+ override def isPlayerTimeRelative: Boolean = false
+ override def setWalkSpeed(p1: Float): Unit = {}
+ override def removeAttachment(p1: PermissionAttachment): Unit = {}
+ override def getAddress: InetSocketAddress = ???
+ override def getExhaustion: Float = 0
+ override def getLocation: Location = origin
+ override def getLocation(l: org.bukkit.Location): org.bukkit.Location = getLocation
+ override def getItemOnCursor: ItemStack = new ItemStack(Material.AIR)
+ override def getEyeLocation: Location = origin
+ override def isSprinting: Boolean = false
+ override def getSaturation: Float = 0
+ override def getExp: Float = 0
+ override def hidePlayer(p1: Player): Unit = {}
+ override def setAllowFlight(p1: Boolean): Unit = {}
+ override def sendMessage(p1: Array[String]): Unit = { p1 foreach sendMessage }
+ override def sendMessage(p1: String): Unit = { println(p1) }
+ override def isBanned: Boolean = false
+ override def setSprinting(p1: Boolean): Unit = {}
+ override def getVelocity: Vector = ???
+ override def getEntityId: Int = 0
+ override def setItemOnCursor(p1: ItemStack): Unit = {}
+ override def getExpToLevel: Int = 0
+ override def isConversing: Boolean = false
+ override def getSleepTicks: Int = 0
+ override def isDead: Boolean = false
+ override def getFlySpeed: Float = 0
+ override def beginConversation(p1: Conversation): Boolean = false
+ override def getEyeHeight(p1: Boolean): Double = 0
+ override def getEyeHeight: Double = 0
+ override def canSee(p1: Player): Boolean = true
+ override def getEnderChest(): org.bukkit.inventory.Inventory = ???
+ override def playSound(x$1: org.bukkit.Location,x$2: org.bukkit.Sound,x$3: Float,x$4: Float): Unit = {}
+ override def giveExpLevels(x$1: Int): Unit = {}
+ override def getCanPickupItems(): Boolean = false
+ override def getEquipment(): org.bukkit.inventory.EntityEquipment = ???
+ override def getRemoveWhenFarAway(): Boolean = false
override def setCanPickupItems(x$1: Boolean): Unit = {}
- def setRemoveWhenFarAway(x$1: Boolean): Unit = {}
- def setTexturePack(x$1: String): Unit = {}
- def resetMaxHealth(): Unit = {}
- def setMaxHealth(x: Int): Unit = {}
- def getCustomName(): String = "Server"
- def isCustomNameVisible(): Boolean = true
- def setCustomName(x$1: String): Unit = {}
- def setCustomNameVisible(x$1: Boolean): Unit = {}
- def getPlayerWeather(): org.bukkit.WeatherType = ???
- def getScoreboard(): org.bukkit.scoreboard.Scoreboard = ???
- def isOnGround(): Boolean = false
- def resetPlayerWeather(): Unit = {}
- def setPlayerWeather(x$1: org.bukkit.WeatherType): Unit = {}
- def setScoreboard(x$1: org.bukkit.scoreboard.Scoreboard): Unit = {}
+ override def setRemoveWhenFarAway(x$1: Boolean): Unit = {}
+ override def setTexturePack(x$1: String): Unit = {}
+ override def resetMaxHealth(): Unit = {}
+ // override def setMaxHealth(x: Int): Unit = {}
+ override def getCustomName(): String = "Server"
+ override def isCustomNameVisible(): Boolean = true
+ override def setCustomName(x$1: String): Unit = {}
+ override def setCustomNameVisible(x$1: Boolean): Unit = {}
+ override def getPlayerWeather(): org.bukkit.WeatherType = ???
+ override def getScoreboard(): org.bukkit.scoreboard.Scoreboard = ???
+ override def isOnGround(): Boolean = false
+ override def resetPlayerWeather(): Unit = {}
+ override def setPlayerWeather(x$1: org.bukkit.WeatherType): Unit = {}
+ override def setScoreboard(x$1: org.bukkit.scoreboard.Scoreboard): Unit = {}
- // 1.7 update
- def _INVALID_damage(x$1: Int,x$2: org.bukkit.entity.Entity): Unit = ???
- def _INVALID_damage(x$1: Int): Unit = ???
- def _INVALID_getHealth(): Int = ???
- def _INVALID_getMaxHealth(): Int = ???
- def _INVALID_setHealth(x$1: Int): Unit = ???
- def _INVALID_setMaxHealth(x$1: Int): Unit = ???
- def damage(x$1: Double,x$2: org.bukkit.entity.Entity): Unit = ???
- def damage(x$1: Double): Unit = ???
- def setHealth(x$1: Double): Unit = ???
- def setMaxHealth(x$1: Double): Unit = ???
+ override def damage(x$1: Double,x$2: org.bukkit.entity.Entity): Unit = ???
+ override def damage(x$1: Double): Unit = ???
+ override def setHealth(x$1: Double): Unit = ???
+ override def setMaxHealth(x$1: Double): Unit = ???
- // Members declared in org.bukkit.entity.LivingEntity
- def _INVALID_getLastDamage(): Int = ???
- def _INVALID_setLastDamage(x$1: Int): Unit = ???
- def getLeashHolder(): org.bukkit.entity.Entity = ???
- def isLeashed(): Boolean = ???
- def setLastDamage(x$1: Double): Unit = ???
- def setLeashHolder(x$1: org.bukkit.entity.Entity): Boolean = ???
+ override def getLeashHolder(): org.bukkit.entity.Entity = ???
+ override def isLeashed(): Boolean = ???
+ override def setLastDamage(x$1: Double): Unit = ???
+ override def setLeashHolder(x$1: org.bukkit.entity.Entity): Boolean = ???
+
+ // Members declared in org.bukkit.entity.Player
+ override def getHealthScale(): Double = ???
+ override def isHealthScaled(): Boolean = ???
+ override def playSound(x$1: org.bukkit.Location,x$2: String,x$3: Float,x$4: Float): Unit = ???
+ override def setHealthScale(x$1: Double): Unit = ???
+ override def setHealthScaled(x$1: Boolean): Unit = ???
+ override def setResourcePack(x$1: String): Unit = ???
+ def getAttribute(x$1: org.bukkit.attribute.Attribute): org.bukkit.attribute.AttributeInstance = ???
+ // Members declared in org.bukkit.entity.Entity
+ def addPassenger(x$1: org.bukkit.entity.Entity): Boolean = ???
+ def addScoreboardTag(x$1: String): Boolean = ???
+ def getBoundingBox(): org.bukkit.util.BoundingBox = ???
+ def getFacing(): org.bukkit.block.BlockFace = ???
+ def getHeight(): Double = ???
+ def getPassengers(): java.util.List[org.bukkit.entity.Entity] = ???
+ def getPistonMoveReaction(): org.bukkit.block.PistonMoveReaction = ???
+ def getPortalCooldown(): Int = ???
+ def getScoreboardTags(): java.util.Set[String] = ???
+ def getWidth(): Double = ???
+ def hasGravity(): Boolean = ???
+ def isGlowing(): Boolean = ???
+ def isInvulnerable(): Boolean = ???
+ def isPersistent(): Boolean = ???
+ def isSilent(): Boolean = ???
+ def removePassenger(x$1: org.bukkit.entity.Entity): Boolean = ???
+ def removeScoreboardTag(x$1: String): Boolean = ???
+ def setGlowing(x$1: Boolean): Unit = ???
+ def setGravity(x$1: Boolean): Unit = ???
+ def setInvulnerable(x$1: Boolean): Unit = ???
+ def setPersistent(x$1: Boolean): Unit = ???
+ def setPortalCooldown(x$1: Int): Unit = ???
+ def setSilent(x$1: Boolean): Unit = ???
+ // Members declared in org.bukkit.entity.HumanEntity
+ def discoverRecipe(x$1: org.bukkit.NamespacedKey): Boolean = ???
+ def discoverRecipes(x$1: java.util.Collection[org.bukkit.NamespacedKey]): Int = ???
+ def getCooldown(x$1: org.bukkit.Material): Int = ???
+ def getMainHand(): org.bukkit.inventory.MainHand = ???
+ def getShoulderEntityLeft(): org.bukkit.entity.Entity = ???
+ def getShoulderEntityRight(): org.bukkit.entity.Entity = ???
+ def hasCooldown(x$1: org.bukkit.Material): Boolean = ???
+ def isHandRaised(): Boolean = ???
+ def openMerchant(x$1: org.bukkit.inventory.Merchant,x$2: Boolean): org.bukkit.inventory.InventoryView = ???
+ def openMerchant(x$1: org.bukkit.entity.Villager,x$2: Boolean): org.bukkit.inventory.InventoryView = ???
+ def setCooldown(x$1: org.bukkit.Material,x$2: Int): Unit = ???
+ def setShoulderEntityLeft(x$1: org.bukkit.entity.Entity): Unit = ???
+ def setShoulderEntityRight(x$1: org.bukkit.entity.Entity): Unit = ???
+ def undiscoverRecipe(x$1: org.bukkit.NamespacedKey): Boolean = ???
+ def undiscoverRecipes(x$1: java.util.Collection[org.bukkit.NamespacedKey]): Int = ???
+ // Members declared in org.bukkit.entity.LivingEntity
+ def getLastTwoTargetBlocks(x$1: java.util.Set[org.bukkit.Material],x$2: Int): java.util.List[org.bukkit.block.Block] = ???
+ def getLineOfSight(x$1: java.util.Set[org.bukkit.Material],x$2: Int): java.util.List[org.bukkit.block.Block] = ???
+ def getPotionEffect(x$1: org.bukkit.potion.PotionEffectType): org.bukkit.potion.PotionEffect = ???
+ def getTargetBlock(x$1: java.util.Set[org.bukkit.Material],x$2: Int): org.bukkit.block.Block = ???
+ def getTargetBlockExact(x$1: Int,x$2: org.bukkit.FluidCollisionMode): org.bukkit.block.Block = ???
+ def getTargetBlockExact(x$1: Int): org.bukkit.block.Block = ???
+ def hasAI(): Boolean = ???
+ def isCollidable(): Boolean = ???
+ def isGliding(): Boolean = ???
+ def isRiptiding(): Boolean = ???
+ def isSwimming(): Boolean = ???
+ def rayTraceBlocks(x$1: Double,x$2: org.bukkit.FluidCollisionMode): org.bukkit.util.RayTraceResult = ???
+ def rayTraceBlocks(x$1: Double): org.bukkit.util.RayTraceResult = ???
+ def setAI(x$1: Boolean): Unit = ???
+ def setCollidable(x$1: Boolean): Unit = ???
+ def setGliding(x$1: Boolean): Unit = ???
+ def setSwimming(x$1: Boolean): Unit = ???
// Members declared in org.bukkit.entity.Player
- def getHealthScale(): Double = ???
- def isHealthScaled(): Boolean = ???
- def playSound(x$1: org.bukkit.Location,x$2: String,x$3: Float,x$4: Float): Unit = ???
- def setHealthScale(x$1: Double): Unit = ???
- def setHealthScaled(x$1: Boolean): Unit = ???
- def setResourcePack(x$1: String): Unit = ???
+ def decrementStatistic(x$1: org.bukkit.Statistic,x$2: org.bukkit.entity.EntityType,x$3: Int): Unit = ???
+ def decrementStatistic(x$1: org.bukkit.Statistic,x$2: org.bukkit.entity.EntityType): Unit = ???
+ def decrementStatistic(x$1: org.bukkit.Statistic,x$2: org.bukkit.Material,x$3: Int): Unit = ???
+ def decrementStatistic(x$1: org.bukkit.Statistic,x$2: org.bukkit.Material): Unit = ???
+ def decrementStatistic(x$1: org.bukkit.Statistic,x$2: Int): Unit = ???
+ def decrementStatistic(x$1: org.bukkit.Statistic): Unit = ???
+ def getAdvancementProgress(x$1: org.bukkit.advancement.Advancement): org.bukkit.advancement.AdvancementProgress = ???
+ def getClientViewDistance(): Int = ???
+ def getLocale(): String = ???
+ def getPlayerListFooter(): String = ???
+ def getPlayerListHeader(): String = ???
+ def getSpectatorTarget(): org.bukkit.entity.Entity = ???
+ def getStatistic(x$1: org.bukkit.Statistic,x$2: org.bukkit.entity.EntityType): Int = ???
+ def getStatistic(x$1: org.bukkit.Statistic,x$2: org.bukkit.Material): Int = ???
+ def getStatistic(x$1: org.bukkit.Statistic): Int = ???
+ def hidePlayer(x$1: org.bukkit.plugin.Plugin,x$2: org.bukkit.entity.Player): Unit = ???
+ def incrementStatistic(x$1: org.bukkit.Statistic,x$2: org.bukkit.entity.EntityType,x$3: Int): Unit = ???
+ def incrementStatistic(x$1: org.bukkit.Statistic,x$2: org.bukkit.entity.EntityType): Unit = ???
+ def playSound(x$1: org.bukkit.Location,x$2: String,x$3: org.bukkit.SoundCategory,x$4: Float,x$5: Float): Unit = ???
+ def playSound(x$1: org.bukkit.Location,x$2: org.bukkit.Sound,x$3: org.bukkit.SoundCategory,x$4: Float,x$5: Float): Unit = ???
+ def resetTitle(): Unit = ???
+ def sendBlockChange(x$1: org.bukkit.Location,x$2: org.bukkit.block.data.BlockData): Unit = ???
+ def sendSignChange(x$1: org.bukkit.Location,x$2: Array[String]): Unit = ???
+ def sendTitle(x$1: String,x$2: String,x$3: Int,x$4: Int,x$5: Int): Unit = ???
+ def sendTitle(x$1: String,x$2: String): Unit = ???
+ def setPlayerListFooter(x$1: String): Unit = ???
+ def setPlayerListHeader(x$1: String): Unit = ???
+ def setPlayerListHeaderFooter(x$1: String,x$2: String): Unit = ???
+ def setResourcePack(x$1: String,x$2: Array[Byte]): Unit = ???
+ def setSpectatorTarget(x$1: org.bukkit.entity.Entity): Unit = ???
+ def setStatistic(x$1: org.bukkit.Statistic,x$2: org.bukkit.entity.EntityType,x$3: Int): Unit = ???
+ def setStatistic(x$1: org.bukkit.Statistic,x$2: org.bukkit.Material,x$3: Int): Unit = ???
+ def setStatistic(x$1: org.bukkit.Statistic,x$2: Int): Unit = ???
+ def showPlayer(x$1: org.bukkit.plugin.Plugin,x$2: org.bukkit.entity.Player): Unit = ???
+ def spawnParticle[T](x$1: org.bukkit.Particle,x$2: Double,x$3: Double,x$4: Double,x$5: Int,x$6: Double,x$7: Double,x$8: Double,x$9: Double,x$10: T): Unit = ???
+ def spawnParticle[T](x$1: org.bukkit.Particle,x$2: org.bukkit.Location,x$3: Int,x$4: Double,x$5: Double,x$6: Double,x$7: Double,x$8: T): Unit = ???
+ def spawnParticle(x$1: org.bukkit.Particle,x$2: Double,x$3: Double,x$4: Double,x$5: Int,x$6: Double,x$7: Double,x$8: Double,x$9: Double): Unit = ???
+ def spawnParticle(x$1: org.bukkit.Particle,x$2: org.bukkit.Location,x$3: Int,x$4: Double,x$5: Double,x$6: Double,x$7: Double): Unit = ???
+ def spawnParticle[T](x$1: org.bukkit.Particle,x$2: Double,x$3: Double,x$4: Double,x$5: Int,x$6: Double,x$7: Double,x$8: Double,x$9: T): Unit = ???
+ def spawnParticle[T](x$1: org.bukkit.Particle,x$2: org.bukkit.Location,x$3: Int,x$4: Double,x$5: Double,x$6: Double,x$7: T): Unit = ???
+ def spawnParticle(x$1: org.bukkit.Particle,x$2: Double,x$3: Double,x$4: Double,x$5: Int,x$6: Double,x$7: Double,x$8: Double): Unit = ???
+ def spawnParticle(x$1: org.bukkit.Particle,x$2: org.bukkit.Location,x$3: Int,x$4: Double,x$5: Double,x$6: Double): Unit = ???
+ def spawnParticle[T](x$1: org.bukkit.Particle,x$2: Double,x$3: Double,x$4: Double,x$5: Int,x$6: T): Unit = ???
+ def spawnParticle[T](x$1: org.bukkit.Particle,x$2: org.bukkit.Location,x$3: Int,x$4: T): Unit = ???
+ def spawnParticle(x$1: org.bukkit.Particle,x$2: Double,x$3: Double,x$4: Double,x$5: Int): Unit = ???
+ def spawnParticle(x$1: org.bukkit.Particle,x$2: org.bukkit.Location,x$3: Int): Unit = ???
+ def stopSound(x$1: String,x$2: org.bukkit.SoundCategory): Unit = ???
+ def stopSound(x$1: org.bukkit.Sound,x$2: org.bukkit.SoundCategory): Unit = ???
+ def stopSound(x$1: String): Unit = ???
+ def stopSound(x$1: org.bukkit.Sound): Unit = ???
+ def updateCommands(): Unit = ???
+ // Members declared in org.bukkit.entity.Damageable
+ def getAbsorptionAmount(): Double = ???
+ def setAbsorptionAmount(x$0: Double): Unit = ???
+ // Members declared in org.bukkit.entity.Entity
+ def getPose(): org.bukkit.entity.Pose = ???
+ def setRotation(x$0: Float, x$1: Float): Unit = ???
+ // Members declared in org.bukkit.entity.HumanEntity
+ def getAttackCooldown(): Float = ???
+ def getBedLocation(): org.bukkit.Location = ???
+ def sleep(x$0: org.bukkit.Location, x$1: Boolean): Boolean = ???
+ def wakeup(x$0: Boolean): Unit = ???
+ // Members declared in org.bukkit.entity.LivingEntity
+ def attack(x$0: org.bukkit.entity.Entity): Unit = ???
+ def getCollidableExemptions(): java.util.Set[java.util.UUID] = ???
+ def getMemory[T](x$0: org.bukkit.entity.memory.MemoryKey[T]): T = ???
+ def setMemory[T](x$0: org.bukkit.entity.memory.MemoryKey[T], x$1: T): Unit = ???
+ def swingMainHand(): Unit = ???
+ def swingOffHand(): Unit = ???
+ // Members declared in org.bukkit.persistence.PersistentDataHolder
+ def getPersistentDataContainer(): org.bukkit.persistence.PersistentDataContainer = ???
+ // Members declared in org.bukkit.entity.Player
+ def openBook(x$0: org.bukkit.inventory.ItemStack): Unit = ???
+ def sendExperienceChange(x$0: Float): Unit = ???
+ def sendExperienceChange(x$0: Float, x$1: Int): Unit = ???
+ def sendSignChange(x$0: org.bukkit.Location, x$1: Array[String], x$2: org.bukkit.DyeColor): Unit = ???
}
}
+
}
diff --git a/core/src/main/scala/com/joshcough/minecraft/CommonCommands.scala b/core/src/main/scala/com/joshcough/minecraft/CommonCommands.scala
index 4c0df697..33e509f8 100644
--- a/core/src/main/scala/com/joshcough/minecraft/CommonCommands.scala
+++ b/core/src/main/scala/com/joshcough/minecraft/CommonCommands.scala
@@ -1,34 +1,34 @@
-package com.joshcough.minecraft
-
-import org.bukkit.GameMode._
-import scala.collection.JavaConversions._
-
-/**
- * Some common commands that I found myself writing over and over again
- * for various plugins. I wanted to put them all into one location,
- * so that they could be reused elsewhere.
- */
-trait CommonCommands {
-
- import CommandsPlugin._
-
- // some simple useful commands
- val goto = Command("goto", "Teleport to a player.", player or location){
- case (you, Left(them)) => you.teleportTo(them)
- case (you, Right(loc)) => you.teleport(loc of you.world)
- }
- val timeCommand = Command("set-time", "Sets the time.", time){
- case (p, n) => p.world.setTime(n)
- }
- val day = Command("day", "Sets the time to 1." )(_.world.setTime(1))
- val night = Command("night", "Sets the time to 15000.")(_.world.setTime(15000))
- val gm = Command("gm", "Set your game mode", gamemode){ case (p, gm) => p.setGameMode(gm) }
- val gms = Command("gms", "Set your game mode to survival.")(_.setGameMode(SURVIVAL))
- val gmc = Command("gmc", "Set your game mode to creative.")(_.setGameMode(CREATIVE))
- val kill = Command("kill", "Kill entities.", ("player" ~ player) or entity){
- case (killer, Left(_ ~ deadMan)) => killer.kill(deadMan)
- case (killer, Right(e)) => killer.world.entities.filter { _ isAn e }.foreach(_.remove)
- }
-
- val allCommonCommands = List(goto, timeCommand, day, night, gm, gms, gmc, kill)
-}
+//package com.joshcough.minecraft
+//
+//import org.bukkit.GameMode._
+//import scala.collection.JavaConversions._
+//
+///**
+// * Some common commands that I found myself writing over and over again
+// * for various plugins. I wanted to put them all into one location,
+// * so that they could be reused elsewhere.
+// */
+//trait CommonCommands {
+//
+// import CommandsPlugin._
+//
+// // some simple useful commands
+// val goto = Command("goto", "Teleport to a player.", player() or location){
+// case (you, Left(them)) => you.teleportTo(them)
+// case (you, Right(loc)) => you.teleport(loc of you.world)
+// }
+// val timeCommand = Command("set-time", "Sets the time.", time){
+// case (p, n) => p.world.setTime(n)
+// }
+// val day = Command("day", "Sets the time to 1." )(_.world.setTime(1))
+// val night = Command("night", "Sets the time to 15000.")(_.world.setTime(15000))
+// val gm = Command("gm", "Set your game mode", gamemode){ case (p, gm) => p.setGameMode(gm) }
+// val gms = Command("gms", "Set your game mode to survival.")(_.setGameMode(SURVIVAL))
+// val gmc = Command("gmc", "Set your game mode to creative.")(_.setGameMode(CREATIVE))
+// val kill = Command("kill", "Kill entities.", ("player" ~ player) or entity){
+// case (killer, Left(_ ~ deadMan)) => killer.kill(deadMan)
+// case (killer, Right(e)) => killer.world.entities.filter { _ isAn e }.foreach(_.remove)
+// }
+//
+// val allCommonCommands = List(goto, timeCommand, day, night, gm, gms, gmc, kill)
+//}
diff --git a/core/src/main/scala/com/joshcough/minecraft/Cube.scala b/core/src/main/scala/com/joshcough/minecraft/Cube.scala
index b9540701..73558408 100644
--- a/core/src/main/scala/com/joshcough/minecraft/Cube.scala
+++ b/core/src/main/scala/com/joshcough/minecraft/Cube.scala
@@ -51,49 +51,47 @@ import Cube._
*/
case class Cube[T](corner1: Point, corner2: Point)(f: Point => T) { self =>
- lazy val maxX = math.max(corner1.x, corner2.x)
- lazy val minX = math.min(corner1.x, corner2.x)
- lazy val maxY = math.max(corner1.y, corner2.y)
- lazy val minY = math.min(corner1.y, corner2.y)
- lazy val maxZ = math.max(corner1.z, corner2.z)
- lazy val minZ = math.min(corner1.z, corner2.z)
+ lazy val maxX: Int = math.max(corner1.x, corner2.x)
+ lazy val minX: Int = math.min(corner1.x, corner2.x)
+ lazy val maxY: Int = math.max(corner1.y, corner2.y)
+ lazy val minY: Int = math.min(corner1.y, corner2.y)
+ lazy val maxZ: Int = math.max(corner1.z, corner2.z)
+ lazy val minZ: Int = math.min(corner1.z, corner2.z)
def apply(c: Point): T = f(c)
def map[U](g: T => U): Cube[U] = Cube(corner1, corner1)(g compose f)
def mapCoor[U](f: Point => U): Cube[U] = Cube(corner1, corner2)(f)
- override def toString = s"Cube(l1: ${(maxX,maxY,maxZ)}, l2: ${(minX,minY,minZ)})"
+ override def toString = s"Cube(maxes: ${(maxX,maxY,maxZ)}, mins: ${(minX,minY,minZ)})"
override def equals(a:Any) = a match {
case c:Cube[_] =>
(maxX,maxY,maxZ) == (c.maxX,c.maxY,c.maxZ) && (minX,minY,minZ) == (c.minX,c.minY,c.minZ)
case _ => false
}
- def copy(minX:Int=minX, minY:Int=minY, minZ:Int=minZ,
- maxX:Int=maxX, maxY:Int=maxY, maxZ:Int=maxZ): Cube[T] =
+ def copyCube(minX:Int=minX, minY:Int=minY, minZ:Int=minZ,
+ maxX:Int=maxX, maxY:Int=maxY, maxZ:Int=maxZ): Cube[T] =
Cube(Point(minX, minY, minZ), Point(maxX, maxY, maxZ))(f)
// this must be a def to avoid it memoizing.
- def toCoorStream: Stream[Point] = {
- for {
- x <- (minX to maxX).toStream
- y <- (minY to maxY).toStream
- z <- (minZ to maxZ).toStream
+ def toCoorStream: LazyList[Point] = for {
+ x <- LazyList.range(minX, maxX+1)
+ y <- LazyList.range(minY, maxY+1)
+ z <- LazyList.range(minZ, maxZ+1)
} yield Point(x,y,z)
- }
/**
*
* @return
*/
- def toStream: Stream[T] = toCoorStream map f
+ def toLazyList: LazyList[T] = toCoorStream map f
/**
*
* @return
*/
- def toZippedStream: Stream[(Point, T)] = toCoorStream zip toStream
+ def toZippedStream: LazyList[(Point, T)] = toCoorStream zip toLazyList
def width : Long = maxX.toLong - minX.toLong + 1L
def height: Long = maxY.toLong - minY.toLong + 1L
@@ -137,37 +135,37 @@ case class Cube[T](corner1: Point, corner2: Point)(f: Point => T) { self =>
* TODO: i might just have to get the right blocks myself.
* TODO: I think it just involves shrinking Y by 1 on all the walls.
*/
- def shell: Stream[T] = (floor.toStream #::: ceiling.toStream #::: walls).distinct
+ def shell: LazyList[T] = (floor.toLazyList #::: ceiling.toLazyList #::: walls).distinct
/**
* get the floor of this cube
* @return a new Cube
*/
- def floor = Cube(Point(maxX, minY, maxZ), Point(minX, minY, minZ))(f)
- def bottom = floor _
+ def floor: Cube[T] = Cube(Point(maxX, minY, maxZ), Point(minX, minY, minZ))(f)
+ def bottom: () => Cube[T] = () => floor
/**
* Returns true if the given coordinate is on the floor of this cube
* @param c
* @return
*/
- def onFloor(c: Point) = c.y == minY
- def onBottom = onFloor _
+ def onFloor(c: Point): Boolean = c.y == minY
+ def onBottom: Point => Boolean = onFloor
/**
* get the ceiling of this cube
* @return a new Cube
*/
- def ceiling = Cube(Point(maxX, maxY, maxZ), Point(minX, maxY, minZ))(f)
- def top = ceiling _
+ def ceiling: Cube[T] = Cube(Point(maxX, maxY, maxZ), Point(minX, maxY, minZ))(f)
+ def top: () => Cube[T] = () => ceiling
/**
* Returns true if the given block is on the ceiling of this cube
* @param c
* @return
*/
- def onCeiling(c: Point) = c.y == maxY
- def onTop = onCeiling _
+ def onCeiling(c: Point): Boolean = c.y == maxY
+ def onTop: Point => Boolean = onCeiling
def northWall: Cube[T] = Cube(Point(minX, minY, minZ), Point(maxX, maxY, minZ))(f)
def southWall: Cube[T] = Cube(Point(minX, minY, maxZ), Point(maxX, maxY, maxZ))(f)
@@ -181,7 +179,7 @@ case class Cube[T](corner1: Point, corner2: Point)(f: Point => T) { self =>
* TODO: can i do this more efficiently?
* TODO: can i make this return 4 cubes?
*/
- def walls: Stream[T] = toZippedStream.filter(t => onWall(t._1)).map(_._2)
+ def walls: LazyList[T] = toZippedStream.filter(t => onWall(t._1)).map(_._2)
/**
*
@@ -261,14 +259,14 @@ case class Cube[T](corner1: Point, corner2: Point)(f: Point => T) { self =>
* @return a new Cube
**/
- def growMinXBy (extra:Int) = copy(minX=minX-extra)
- def growMinYBy (extra:Int) = copy(minY=minY-extra)
- def growMinZBy (extra:Int) = copy(minZ=minZ-extra)
- def growMaxXBy (extra:Int) = copy(maxX=maxX+extra)
- def growMaxYBy (extra:Int) = copy(maxY=maxY+extra)
- def growUp (extra:Int) = growMaxYBy(extra)
- def growDown (extra:Int) = growMinYBy(extra)
- def growMaxZBy (extra:Int) = copy(maxZ=maxZ+extra)
+ def growMinXBy (extra:Int): Cube[T] = copyCube(minX=minX-extra)
+ def growMinYBy (extra:Int): Cube[T] = copyCube(minY=minY-extra)
+ def growMinZBy (extra:Int): Cube[T] = copyCube(minZ=minZ-extra)
+ def growMaxXBy (extra:Int): Cube[T] = copyCube(maxX=maxX+extra)
+ def growMaxYBy (extra:Int): Cube[T] = copyCube(maxY=maxY+extra)
+ def growUp (extra:Int): Cube[T] = growMaxYBy(extra)
+ def growDown (extra:Int): Cube[T] = growMinYBy(extra)
+ def growMaxZBy (extra:Int): Cube[T] = copyCube(maxZ=maxZ+extra)
/**
* All shrink operations make the cube smaller
@@ -278,12 +276,12 @@ case class Cube[T](corner1: Point, corner2: Point)(f: Point => T) { self =>
* @return a new Cube
**/
- def shrinkMinXBy(less:Int) = copy(minX=minX+less)
- def shrinkMinYBy(less:Int) = copy(minY=minY+less)
- def shrinkMinZBy(less:Int) = copy(minZ=minZ+less)
- def shrinkMaxXBy(less:Int) = copy(maxX=maxX-less)
- def shrinkMaxYBy(less:Int) = copy(maxY=maxY-less)
- def shrinkMaxZBy(less:Int) = copy(maxZ=maxZ-less)
+ def shrinkMinXBy(less:Int): Cube[T] = copyCube(minX=minX+less)
+ def shrinkMinYBy(less:Int): Cube[T] = copyCube(minY=minY+less)
+ def shrinkMinZBy(less:Int): Cube[T] = copyCube(minZ=minZ+less)
+ def shrinkMaxXBy(less:Int): Cube[T] = copyCube(maxX=maxX-less)
+ def shrinkMaxYBy(less:Int): Cube[T] = copyCube(maxY=maxY-less)
+ def shrinkMaxZBy(less:Int): Cube[T] = copyCube(maxZ=maxZ-less)
// move x and z in by n
def shrinkXZ(n:Int) = shrink(n,0,n)
diff --git a/core/src/main/scala/com/joshcough/minecraft/CubeModifier.scala b/core/src/main/scala/com/joshcough/minecraft/CubeModifier.scala
index 8afb954a..e6fe8432 100644
--- a/core/src/main/scala/com/joshcough/minecraft/CubeModifier.scala
+++ b/core/src/main/scala/com/joshcough/minecraft/CubeModifier.scala
@@ -25,8 +25,6 @@ object CubeModifier {
def run: Boolean = newM update b
}
- type PotentialChanges = Stream[PotentialChange]
-
/**
* Represents a change that actually took place in the world.
* @param b The block that was changed.
@@ -40,27 +38,27 @@ object CubeModifier {
* Represents a number of changes that actually took place in the world.
* @param cs
*/
- case class Changes(cs:Array[Change]){
+ case class Changes(cs:List[Change]){
override def toString = cs.toList.mkString(",")
def size = cs.length
def ++(cs: Changes) = Changes(this.cs ++ cs.cs)
}
/**
- * Actually execute some PotentialChanges,
+ * Actually execute some potential changes,
* handing back a Seq of all the changes that really took place.
* (A potential change might not happen, if for example, you try to change AIR to AIR.)
* @param newData
* @return
*/
- def runChanges(newData: Seq[PotentialChange]): Changes =
- Changes(newData.filter(_.run).map(p => Change(p.b, p.oldM)).toArray)
+ def runChanges(newData: LazyList[PotentialChange]): Changes =
+ Changes(newData.filter(_.run).map(p => Change(p.b, p.oldM)).toList)
/**
* TODO: document me!
*/
def getTransformationChanges(cube: Cube[Block],
- force: Boolean = false): Stream[PotentialChange] = {
+ force: Boolean = false): LazyList[PotentialChange] = {
val s = cube.toZippedStream.map{ case (c,b) =>
PotentialChange(cube.world(c.x, c.y, c.z), b.materialAndData)
}
@@ -78,8 +76,8 @@ object CubeModifier {
/**
* Set all the blocks in this stream to the given Material
*/
- def setAll(bms: Stream[Block], newM: MaterialAndData) = runChanges(
- bms.zip(Stream.continually(newM)).map{ case (b,n) => PotentialChange(b,n) }
+ def setAll(bms: LazyList[Block], newM: MaterialAndData): Changes = runChanges(
+ bms.zip(LazyList.fill(bms.length)(newM)).map{ case (b,n) => PotentialChange(b,n) }
)
/**
@@ -88,6 +86,9 @@ object CubeModifier {
def changeAll(c: Cube[Block], oldM: Material, newM: MaterialAndData): Changes =
setAll(c.blocks.filter(_ is oldM), newM)
+ def changeAllUnder(c: Cube[Block], oldM: Material, underM: Material, newM: MaterialAndData): Changes =
+ setAll(c.blocks.filter(b => (b is oldM) && (b.blockAbove is underM)), newM)
+
/**
* Set all the blocks in this cube to air
* TODO: this really could be removed...
diff --git a/core/src/main/scala/com/joshcough/minecraft/CubeState.scala b/core/src/main/scala/com/joshcough/minecraft/CubeState.scala
index cc7b0c4c..6eb377fd 100644
--- a/core/src/main/scala/com/joshcough/minecraft/CubeState.scala
+++ b/core/src/main/scala/com/joshcough/minecraft/CubeState.scala
@@ -1,39 +1,45 @@
package com.joshcough.minecraft
import BukkitEnrichment._
+import org.bukkit
import org.bukkit.Location
import org.bukkit.block.Block
import org.bukkit.entity.Player
trait CubeState {
- val corners = new PlayerState[List[Location]] {
- override val default = Some(Nil)
+ case class Locations(firstLoc : Location, secondLoc : Option[Location]){
+ def bothLocationsSet: Boolean = secondLoc.isDefined
+ }
+
+ val corners: PlayerState[Locations] = new PlayerState[Locations] {
+ override val default: Option[Locations] = None
}
def cube(p:Player): Cube[Block] =
cubeMaybe(p).getOrElse(p bomb "Both corners must be set!")
- def cubeMaybe(p:Player): Option[Cube[Block]] = corners(p) match {
- case List(c1, c2) => Some(c1 cubeTo c2)
+ def cubeMaybe(p:Player): Option[Cube[Block]] = corners.get(p) match {
+ case Some(Locations(c1, Some(c2))) => Some(c1 cubeTo c2)
case _ => None
}
def setFirstPosition(p:Player,loc: Location): Unit = {
- corners += (p -> List(loc))
+ corners += (p -> Locations(loc, None))
p ! s"first corner set to: ${loc.xyz}"
}
- def setSecondPosition(p:Player,loc2: Location): Unit = corners(p) match {
- case loc1 :: _ =>
- corners += (p -> List(loc1, loc2))
+ def setSecondPosition(p:Player,loc2: Location): Unit = corners.get(p) match {
+ case Some(Locations(loc1, _)) =>
+ corners += (p -> Locations(loc1, Some(loc2)))
p ! s"second corner set to: ${loc2.xyz}"
- case Nil =>
+ case _ =>
p ! "set corner one first! (with a left click)"
}
def cubes: collection.Map[Player, Cube[Block]] =
- corners.state.filter(kv => kv._2.size == 2).mapValues {
- case List(l1, l2) => l1 cubeTo l2
- }
-}
\ No newline at end of file
+ corners.state.filter(kv => kv._2.bothLocationsSet).view.mapValues {
+ case Locations(l1, Some(l2)) => l1 cubeTo l2
+ case Locations(_, None) => sys error "impossible, because we filtered."
+ }.toMap
+}
diff --git a/core/src/main/scala/com/joshcough/minecraft/Listeners.scala b/core/src/main/scala/com/joshcough/minecraft/Listeners.scala
index 04d374f1..f3d7df62 100644
--- a/core/src/main/scala/com/joshcough/minecraft/Listeners.scala
+++ b/core/src/main/scala/com/joshcough/minecraft/Listeners.scala
@@ -2,13 +2,13 @@ package com.joshcough.minecraft
import org.bukkit.block.Block
import org.bukkit.entity.{Arrow, Entity, Player}
-import org.bukkit.event.{EventHandler => EH, Listener}
+import org.bukkit.event.{Listener, EventHandler => EH}
import org.bukkit.event.block.{BlockBreakEvent, BlockDamageEvent}
import org.bukkit.event.block.Action._
-import org.bukkit.event.entity.{ProjectileHitEvent, EntityDamageEvent, PlayerDeathEvent, EntityDamageByEntityEvent}
+import org.bukkit.event.entity.{EntityDamageByEntityEvent, EntityDamageEvent, PlayerDeathEvent, ProjectileHitEvent}
import org.bukkit.event.weather.WeatherChangeEvent
-import org.bukkit.event.player.{PlayerQuitEvent, PlayerInteractEvent, PlayerMoveEvent, PlayerChatEvent,
- PlayerJoinEvent, PlayerKickEvent, PlayerLoginEvent}
+import org.bukkit.event.player._
+import org.bukkit.event.vehicle.VehicleEnterEvent
/**
* A trait that supports exactly one listener.
@@ -24,7 +24,7 @@ import org.bukkit.event.player.{PlayerQuitEvent, PlayerInteractEvent, PlayerMove
trait ListenerPlugin extends ListenersPlugin {
def listener: Listener
def listeners = List(listener)
- override def onEnable(){ super.onEnable(); registerListener(listener) }
+ override def onEnable(): Unit = { super.onEnable(); registerListener(listener) }
}
/**
@@ -42,7 +42,7 @@ trait ListenerPlugin extends ListenersPlugin {
*/
trait ListenersPlugin extends ScalaPlugin with Listeners {
def listeners: List[Listener]
- override def onEnable{ super.onEnable(); listeners.foreach(registerListener) }
+ override def onEnable(): Unit = { super.onEnable(); listeners.foreach(registerListener) }
}
object Listeners extends Listeners
@@ -138,5 +138,11 @@ trait Listeners extends BukkitEnrichment {
case _ =>
}
}
+ def OnPlayerBedEnterEvent(f : (Player, PlayerBedEnterEvent) => Unit) = new Listener {
+ @EH def on(e: PlayerBedEnterEvent): Unit = f(e.getPlayer, e)
+ }
+ def OnVehicleEnterEvent (f : (Player, VehicleEnterEvent) => Unit) = new Listener {
+ @EH def on(e: VehicleEnterEvent): Unit = e.getEntered.whenPlayer(f(_, e))
+ }
}
diff --git a/core/src/main/scala/com/joshcough/minecraft/ParserCombinators.scala b/core/src/main/scala/com/joshcough/minecraft/ParserCombinators.scala
index da442ed7..0d6c1429 100644
--- a/core/src/main/scala/com/joshcough/minecraft/ParserCombinators.scala
+++ b/core/src/main/scala/com/joshcough/minecraft/ParserCombinators.scala
@@ -18,7 +18,7 @@ trait ParserCombinators extends ScalaEnrichment {
trait ParseResult[+T]{
def get: T
- def extract[A](pf: PartialFunction[T, A])
+ def extract[A](pf: PartialFunction[T, A]): Unit
def fold[A](failF: String => A)(sucF: (T,List[String]) => A): A
}
case class Failure(message: String) extends ParseResult[Nothing]{
@@ -69,7 +69,7 @@ trait ParserCombinators extends ScalaEnrichment {
*/
def flatMap[U](f: T => Parser[U]) = new Parser[U] {
def apply(args: List[String]): ParseResult[U] =
- self(args).fold[ParseResult[U]](Failure)(f(_)(_))
+ self(args).fold[ParseResult[U]](Failure.apply)(f(_)(_))
def describe = self.describe
}
diff --git a/core/src/main/scala/com/joshcough/minecraft/PlayerState.scala b/core/src/main/scala/com/joshcough/minecraft/PlayerState.scala
index 07d8898d..cd729809 100644
--- a/core/src/main/scala/com/joshcough/minecraft/PlayerState.scala
+++ b/core/src/main/scala/com/joshcough/minecraft/PlayerState.scala
@@ -1,7 +1,7 @@
package com.joshcough.minecraft
import org.bukkit.entity.Player
-import collection.mutable.Map
+import scala.collection.mutable
/**
* Wrapper functions around a collection.mutable.Map[Player, T]
@@ -14,7 +14,8 @@ trait PlayerState[T] {
*/
val default: Option[T] = None
- lazy val state = default.fold(Map[Player, T]())(t => Map[Player, T]().withDefaultValue(t))
+ lazy val state: mutable.Map[Player, T] =
+ default.fold(mutable.Map[Player, T]())(t => mutable.Map[Player, T]().withDefaultValue(t))
/**
* Get the state for the player
diff --git a/core/src/main/scala/com/joshcough/minecraft/ScalaEnrichment.scala b/core/src/main/scala/com/joshcough/minecraft/ScalaEnrichment.scala
index f7a5e3a1..89f7feda 100644
--- a/core/src/main/scala/com/joshcough/minecraft/ScalaEnrichment.scala
+++ b/core/src/main/scala/com/joshcough/minecraft/ScalaEnrichment.scala
@@ -17,7 +17,7 @@ trait ScalaEnrichment {
/**
* Randomly, return true or false.
*/
- def randomBoolen = math.random > .5
+ def randomBoolean(): Boolean = math.random() > .5
/**
* Allows for F# style pipelining
@@ -28,12 +28,9 @@ trait ScalaEnrichment {
def |> [U](f: T => U) = f(t)
}
- /**
- * Implicit conversion to Runnable.
- */
- implicit def byNameToRunnable(f: => Unit) = new Runnable { override def run = f }
+ def byNameToRunnable(f: => Unit) = new Runnable { override def run = f }
- def spawn(f: => Unit): Unit = new Thread(f).start()
+ def spawn(f: => Unit): Unit = new Thread(new Runnable { override def run(): Unit = f }).start()
/**
* Enrich a Function1.
diff --git a/core/src/main/scala/com/joshcough/minecraft/ScalaPlugin.scala b/core/src/main/scala/com/joshcough/minecraft/ScalaPlugin.scala
index 04b15a91..dc28e73d 100644
--- a/core/src/main/scala/com/joshcough/minecraft/ScalaPlugin.scala
+++ b/core/src/main/scala/com/joshcough/minecraft/ScalaPlugin.scala
@@ -2,11 +2,29 @@ package com.joshcough.minecraft
import org.bukkit.Server
import org.bukkit.entity.Player
-import org.bukkit.event.{Listener, Event}
+import org.bukkit.event.{Event, Listener}
import org.bukkit.plugin.java.JavaPlugin
import util.Try
import java.util.logging.{Level, Logger}
-import javax.persistence.PersistenceException
+
+object ScalaPlugin {
+ // TODO: make defaults for these.
+ def yml(pluginName: String,
+ pluginClassName: String,
+ author:String,
+ version: String,
+ dependencies: List[String],
+ mandatoryDependencies: List[String],
+ softDependencies: List[String]): String = List(
+ "name: " + pluginName,
+ "main: " + pluginClassName,
+ "author: " + author,
+ "version: " + version,
+ "api-version: 1.16.1",
+ "depend: [" + (mandatoryDependencies ++ dependencies).mkString(", ") + "]",
+ "softdepend: [" + softDependencies.mkString(", ") + "]"
+ ).mkString("\n")
+}
/**
* The base class that helps make writing Bukkit plugins vastly easier.
@@ -21,8 +39,6 @@ abstract class ScalaPlugin extends JavaPlugin with BukkitEnrichment { scalaPlugi
// setup stuff
override def onEnable: Unit = {
super.onEnable
- this.saveDefaultConfig
- setupDatabase
logInfo(s"$name enabled!")
}
@@ -49,38 +65,15 @@ abstract class ScalaPlugin extends JavaPlugin with BukkitEnrichment { scalaPlugi
// TODO: is there a real yml data type i could use?
def configs: Map[String, String] = Map()
- /**
- * Classes that want to use a database should override this def, providing
- * all of the Entity classes. See WarpPlugin in examples.
- */
- def dbClasses: List[Class[_]] = Nil
- // this is here just so subclasses dont have to use java.util.ArrayList.
- override def getDatabaseClasses = new java.util.ArrayList[Class[_]](){ dbClasses.foreach(add) }
- // this is horrible bukkit nonsense that every plugin must do if it wants to use the database.
- private def setupDatabase: Unit =
- if(dbClasses.nonEmpty)
- // this somehow forces attempting to initialize the database
- try getDatabase.find(dbClasses.head).findRowCount
- // and if it throws... that means you haven't yet initialized the db,
- // and you need to call installDLL...
- // really, this is just crap. happy to hide it from any users.
- catch{ case e: PersistenceException => logTask("Installing DB"){ installDDL() } }
-
/**
* Generates the plugin.yml contents for this plugin.
* See http://wiki.bukkit.org/Plugin_YAML for more info
* @param author the author of the plugin
* @param version the version of the plugin
**/
- def yml(author:String, version: String) = List(
- "name: " + this.name,
- "main: " + this.getClass.getName,
- "author: " + author,
- "version: " + version,
- "database: " + (this.dbClasses.size > 0),
- "depend: [" + (mandatoryDependencies ++ this.dependencies).mkString(", ") + "]",
- "softdepend: [" + this.softDependencies.mkString(", ") + "]"
- ).mkString("\n")
+ def yml(author:String, version: String): String = ScalaPlugin.yml (
+ this.name, this.getClass.getName, author, version, dependencies, mandatoryDependencies, softDependencies
+ )
/**
* Writes out the plugin.yml file, and config.yml.
@@ -119,7 +112,7 @@ abstract class ScalaPlugin extends JavaPlugin with BukkitEnrichment { scalaPlugi
/**
* Log the given exception at SEVERE level.
*/
- def logError(e:Throwable): Unit = logMessage(Level.SEVERE, e.getMessage + e.getStackTraceString)
+ def logError(e:Throwable): Unit = logMessage(Level.SEVERE, e.getMessage + e.getStackTrace.mkString("\n"))
private def logMessage(level: Level, message: String): Unit =
log.log(level, s"[$name] - $message")
@@ -134,7 +127,6 @@ abstract class ScalaPlugin extends JavaPlugin with BukkitEnrichment { scalaPlugi
logInfo(s"Starting: $message"); val t = f; logInfo(s"Finished: $message"); t
}
-
// Various other little helper functions.
def name = Try(this.getDescription.getName).getOrElse(this.getClass.getSimpleName)
def server: Server = getServer
@@ -142,25 +134,37 @@ abstract class ScalaPlugin extends JavaPlugin with BukkitEnrichment { scalaPlugi
def fire(e:Event): Unit = server.getPluginManager.callEvent(e)
def registerListener(listener:Listener): Unit = pluginManager.registerEvents(listener, this)
- // task stuff:
+ /**
+ * Invokes a command programmatically.
+ */
+ def runCommand(p: Player, commandName: String, args: Seq[String]) = {
+ p ! s"$name running: $commandName ${args.mkString(" ")}"
+ onCommand(p, getCommand(commandName), commandName, args.toArray)
+ }
+}
+
+class TaskManager(server: Server, plugin: ScalaPlugin) extends ScalaEnrichment { tm =>
private lazy val scheduler = server.getScheduler
case class Task(id:Int)
def scheduleSyncTask(task: => Unit): Task =
- Task(scheduler.scheduleSyncDelayedTask(this, task))
+ Task(scheduler.scheduleSyncDelayedTask(plugin, byNameToRunnable(task)))
def scheduleSyncDelayedTask(initialDelay: Long)(task: => Unit): Task =
- Task(scheduler.scheduleSyncDelayedTask(this, task, initialDelay))
+ Task(scheduler.scheduleSyncDelayedTask(plugin, byNameToRunnable(task), initialDelay))
def scheduleSyncRepeatingTask(period: Long)(task: => Unit): Task =
- Task(scheduler.scheduleSyncRepeatingTask(this, task, 0L, period))
+ Task(scheduler.scheduleSyncRepeatingTask(plugin, byNameToRunnable(task), 0L, period))
def scheduleSyncRepeatingTask(initialDelay: Long, period: Long)(task: => Unit): Task =
- Task(scheduler.scheduleSyncRepeatingTask(this, task, initialDelay, period))
+ Task(scheduler.scheduleSyncRepeatingTask(plugin, byNameToRunnable(task), initialDelay, period))
def cancelTask(t: Task) = scheduler cancelTask t.id
+ def pluginManager = server.getPluginManager
+ def registerListener(listener:Listener): Unit = pluginManager.registerEvents(listener, plugin)
+
case class PlayerTasks(cancelOnExit: Boolean = true) extends PlayerState[Seq[Task]] { self =>
override val default: Option[Seq[Task]] = Some(Nil)
@@ -169,32 +173,24 @@ abstract class ScalaPlugin extends JavaPlugin with BukkitEnrichment { scalaPlugi
implicit class PlayerWithTaskFunctions(p:Player){
private def addTask(t: Task): Task = { self += (p -> (self(p) :+ t)); t }
- def scheduleSyncTask(task: => Unit): Task = addTask(scalaPlugin.scheduleSyncTask(task))
+ def scheduleSyncTask(task: => Unit): Task = addTask(tm.scheduleSyncTask(task))
def scheduleSyncRepeatingTask(initialDelay: Long, period: Long)(task: => Unit): Task =
- addTask(scalaPlugin.scheduleSyncRepeatingTask(initialDelay, period)(task))
+ addTask(tm.scheduleSyncRepeatingTask(initialDelay, period)(task))
def cancelTask(t: Task): Unit = {
scheduler cancelTask t.id
self += (p -> self(p).filter(_ != t))
}
def cancelAll: Unit = {
- logInfo(s"canceling all tasks for: $p")
+ plugin.logInfo(s"canceling all tasks for: $p")
(self -= p) foreach { t =>
- logInfo(s"canceling: $t")
+ plugin.logInfo(s"canceling: $t")
scheduler cancelTask t.id
}
}
}
}
-
- /**
- * Invokes a command programmatically.
- */
- def runCommand(p: Player, commandName: String, args: Seq[String]) = {
- p ! s"$name running: $commandName ${args.mkString(" ")}"
- onCommand(p, getCommand(commandName), commandName, args.toArray)
- }
}
/**
diff --git a/core/src/main/scala/com/joshcough/minecraft/TestServer.scala b/core/src/main/scala/com/joshcough/minecraft/TestServer.scala
index 46a5e3db..ede31598 100644
--- a/core/src/main/scala/com/joshcough/minecraft/TestServer.scala
+++ b/core/src/main/scala/com/joshcough/minecraft/TestServer.scala
@@ -20,7 +20,6 @@ import java.net.InetSocketAddress
/**
* Code used for testing purposes.
- * TODO: More information to come on this later.
*/
object TestServer { ts =>
@@ -32,7 +31,6 @@ object TestServer { ts =>
def setTypeIdAndData(p1: Int, p2: Byte, p3: Boolean): Boolean = true
def getLightFromSky: Byte = 0:Byte
def setTypeId(p1: Int, p2: Boolean): Boolean = true
- override def setTypeId(p1: Int): Boolean = true
def getY: Int = y
def getData: Byte = 0:Byte
def getPistonMoveReaction: PistonMoveReaction = sys error "todo"
@@ -73,6 +71,19 @@ object TestServer { ts =>
def getTemperature: Double = 0d
def getFace(p1: Block): BlockFace = sys error "todo"
def isBlockPowered: Boolean = false
+
+ def getBlockData(): org.bukkit.block.data.BlockData = ???
+ def getBoundingBox(): org.bukkit.util.BoundingBox = ???
+ def getDrops(x$0: org.bukkit.inventory.ItemStack, x$1: org.bukkit.entity.Entity):
+ java.util.Collection[org.bukkit.inventory.ItemStack] = ???
+ def isPassable(): Boolean = ???
+ def rayTrace(x$0: org.bukkit.Location, x$1: org.bukkit.util.Vector, x$2: Double, x$3:
+ org.bukkit.FluidCollisionMode
+ ): org.bukkit.util.RayTraceResult = ???
+ def setBlockData(x$0: org.bukkit.block.data.BlockData): Unit = ???
+ def setBlockData(x$0: org.bukkit.block.data.BlockData, x$1: Boolean): Unit = ???
+ def setType(x$0: org.bukkit.Material, x$1: Boolean): Unit = ???
+
}
/**
@@ -93,6 +104,15 @@ object TestServer { ts =>
def getBlock(x: Int, y: Int, z: Int): Block = ts.getBlock(x,y,z)
def getWorld: World = world
def getZ: Int = sys error "todo"
+ def addPluginChunkTicket(x$0: org.bukkit.plugin.Plugin): Boolean = ???
+ def contains(x$0: org.bukkit.block.data.BlockData): Boolean = ???
+ def getInhabitedTime(): Long = ???
+ def getPluginChunkTickets(): java.util.Collection[org.bukkit.plugin.Plugin] = ???
+ def isForceLoaded(): Boolean = ???
+ def isSlimeChunk(): Boolean = ???
+ def removePluginChunkTicket(x$0: org.bukkit.plugin.Plugin): Boolean = ???
+ def setForceLoaded(x$0: Boolean): Unit = ???
+ def setInhabitedTime(x$0: Long): Unit = ???
}
/**
@@ -201,7 +221,7 @@ object TestServer { ts =>
def setWeatherDuration(x$1: Int): Unit = sys error "todo"
def spawn[T <: org.bukkit.entity.Entity](x$1: org.bukkit.Location,x$2: Class[T]): T = sys error "todo"
def spawnArrow(x$1: org.bukkit.Location,x$2: org.bukkit.util.Vector,x$3: Float,x$4: Float): org.bukkit.entity.Arrow = sys error "todo"
- def spawnCreature(x$1: org.bukkit.Location,x$2: org.bukkit.entity.CreatureType): org.bukkit.entity.LivingEntity = sys error "todo"
+// def spawnCreature(x$1: org.bukkit.Location,x$2: org.bukkit.entity.CreatureType): org.bukkit.entity.LivingEntity = sys error "todo"
def spawnCreature(x$1: org.bukkit.Location,x$2: org.bukkit.entity.EntityType): org.bukkit.entity.LivingEntity = sys error "todo"
def spawnEntity(x$1: org.bukkit.Location,x$2: org.bukkit.entity.EntityType): org.bukkit.entity.Entity = sys error "todo"
def spawnFallingBlock(x$1: org.bukkit.Location,x$2: Int,x$3: Byte): org.bukkit.entity.FallingBlock = sys error "todo"
@@ -220,102 +240,382 @@ object TestServer { ts =>
def isGameRule(x$1: String): Boolean = false
def setAmbientSpawnLimit(x$1: Int): Unit = {}
def setGameRuleValue(x$1: String,x$2: String): Boolean = false
+
+ def addPluginChunkTicket
+ (x$0: Int, x$1: Int, x$2: org.bukkit.plugin.Plugin): Boolean = ???
+
+ def createExplosion
+ (x$0: Double, x$1: Double, x$2: Double, x$3: Float, x$4: Boolean, x$5: Boolean
+ ,
+ x$6: org.bukkit.entity.Entity): Boolean = ???
+
+ def createExplosion
+ (x$0: org.bukkit.Location, x$1: Float, x$2: Boolean, x$3: Boolean): Boolean = ???
+
+ def createExplosion
+ (x$0: org.bukkit.Location, x$1: Float, x$2: Boolean, x$3: Boolean, x$4:
+ org.bukkit.entity.Entity
+ ): Boolean = ???
+
+ def getBiome(x$0: Int, x$1: Int, x$2: Int): org.bukkit.block.Biome = ???
+
+ def getEnderDragonBattle(): org.bukkit.boss.DragonBattle = ???
+
+ def getForceLoadedChunks(): java.util.Collection[org.bukkit.Chunk] = ???
+
+ def getGameRuleDefault[T](x$0: org.bukkit.GameRule[T]): T = ???
+
+ def getGameRuleValue[T](x$0: org.bukkit.GameRule[T]): T = ???
+
+ def getHighestBlockAt
+ (x$0: Int, x$1: Int, x$2: org.bukkit.HeightMap): org.bukkit.block.Block = ???
+
+ def getHighestBlockAt
+ (x$0: org.bukkit.Location, x$1: org.bukkit.HeightMap): org.bukkit.block.Block = ???
+
+ def getHighestBlockYAt(x$0: Int, x$1: Int, x$2: org.bukkit.HeightMap): Int = ???
+
+ def getHighestBlockYAt(x$0: org.bukkit.Location, x$1: org.bukkit.HeightMap): Int = ???
+
+ def getHumidity(x$0: Int, x$1: Int, x$2: Int): Double = ???
+
+ def getNearbyEntities
+ (x$0: org.bukkit.Location, x$1: Double, x$2: Double, x$3: Double):
+ java.util.Collection[org.bukkit.entity.Entity] = ???
+
+ def getNearbyEntities
+ (x$0: org.bukkit.Location, x$1: Double, x$2: Double, x$3: Double, x$4:
+ java.util.function.Predicate[org.bukkit.entity.Entity]
+ ): java.util.Collection[org.bukkit.entity.Entity] = ???
+
+ def getNearbyEntities
+ (x$0: org.bukkit.util.BoundingBox):
+ java.util.Collection[org.bukkit.entity.Entity] = ???
+
+ def getNearbyEntities
+ (x$0: org.bukkit.util.BoundingBox, x$1:
+ java.util.function.Predicate[org.bukkit.entity.Entity]
+ ): java.util.Collection[org.bukkit.entity.Entity] = ???
+
+ def getPluginChunkTickets
+ (x$0: Int, x$1: Int): java.util.Collection[org.bukkit.plugin.Plugin] = ???
+
+ def getPluginChunkTickets
+ ():
+ java.util.Map[org.bukkit.plugin.Plugin,
+ java.util.Collection[org.bukkit.Chunk]
+ ] = ???
+
+ def getRaids(): java.util.List[org.bukkit.Raid] = ???
+
+ def getTemperature(x$0: Int, x$1: Int, x$2: Int): Double = ???
+
+ def getTicksPerAmbientSpawns(): Long = ???
+
+ def getTicksPerWaterSpawns(): Long = ???
+
+ def getWorldBorder(): org.bukkit.WorldBorder = ???
+
+ def isChunkForceLoaded(x$0: Int, x$1: Int): Boolean = ???
+
+ def isChunkGenerated(x$0: Int, x$1: Int): Boolean = ???
+
+ def isHardcore(): Boolean = ???
+
+ def locateNearestRaid(x$0: org.bukkit.Location, x$1: Int): org.bukkit.Raid = ???
+
+ def locateNearestStructure
+ (x$0: org.bukkit.Location, x$1: org.bukkit.StructureType, x$2: Int, x$3:
+ Boolean
+ ): org.bukkit.Location = ???
+
+ def playSound
+ (x$0: org.bukkit.Location, x$1: String, x$2: Float, x$3: Float): Unit = ???
+
+ def playSound
+ (x$0: org.bukkit.Location, x$1: org.bukkit.Sound, x$2:
+ org.bukkit.SoundCategory
+ , x$3: Float, x$4: Float): Unit = ???
+
+ def playSound
+ (x$0: org.bukkit.Location, x$1: String, x$2: org.bukkit.SoundCategory, x$3:
+ Float
+ , x$4: Float): Unit = ???
+
+ def rayTrace
+ (x$0: org.bukkit.Location, x$1: org.bukkit.util.Vector, x$2: Double, x$3:
+ org.bukkit.FluidCollisionMode
+ , x$4: Boolean, x$5: Double, x$6:
+ java.util.function.Predicate[org.bukkit.entity.Entity]
+ ): org.bukkit.util.RayTraceResult = ???
+
+ def rayTraceBlocks
+ (x$0: org.bukkit.Location, x$1: org.bukkit.util.Vector, x$2: Double):
+ org.bukkit.util.RayTraceResult = ???
+
+ def rayTraceBlocks
+ (x$0: org.bukkit.Location, x$1: org.bukkit.util.Vector, x$2: Double, x$3:
+ org.bukkit.FluidCollisionMode
+ ): org.bukkit.util.RayTraceResult = ???
+
+ def rayTraceBlocks
+ (x$0: org.bukkit.Location, x$1: org.bukkit.util.Vector, x$2: Double, x$3:
+ org.bukkit.FluidCollisionMode
+ , x$4: Boolean): org.bukkit.util.RayTraceResult = ???
+
+ def rayTraceEntities
+ (x$0: org.bukkit.Location, x$1: org.bukkit.util.Vector, x$2: Double):
+ org.bukkit.util.RayTraceResult = ???
+
+ def rayTraceEntities
+ (x$0: org.bukkit.Location, x$1: org.bukkit.util.Vector, x$2: Double, x$3:
+ Double
+ ): org.bukkit.util.RayTraceResult = ???
+
+ def rayTraceEntities
+ (x$0: org.bukkit.Location, x$1: org.bukkit.util.Vector, x$2: Double, x$3:
+ java.util.function.Predicate[org.bukkit.entity.Entity]
+ ): org.bukkit.util.RayTraceResult = ???
+
+ def rayTraceEntities(x$0: org.bukkit.Location, x$1: org.bukkit.util.Vector, x$2: Double, x$3: Double, x$4: java.util.function.Predicate[org.bukkit.entity.Entity]):
+ org.bukkit.util.RayTraceResult = ???
+
+ def removePluginChunkTicket(x$0: Int, x$1: Int, x$2: org.bukkit.plugin.Plugin): Boolean = ???
+
+ def removePluginChunkTickets(x$0: org.bukkit.plugin.Plugin): Unit = ???
+
+ def setBiome(x$0: Int, x$1: Int, x$2: Int, x$3: org.bukkit.block.Biome): Unit = ???
+
+ def setChunkForceLoaded(x$0: Int, x$1: Int, x$2: Boolean): Unit = ???
+
+ def setGameRule[T](x$0: org.bukkit.GameRule[T], x$1: T): Boolean = ???
+
+ def setHardcore(x$0: Boolean): Unit = ???
+
+ def setSpawnLocation(x$0: org.bukkit.Location): Boolean = ???
+
+ def setTicksPerAmbientSpawns(x$0: Int): Unit = ???
+
+ def setTicksPerWaterSpawns(x$0: Int): Unit = ???
+
+ def spawn[T <: org.bukkit.entity.Entity](x$0: org.bukkit.Location, x$1: Class[T], x$2: org.bukkit.util.Consumer[T]): T = ???
+
+ def spawnArrow[T <: org.bukkit.entity.AbstractArrow](x$0: org.bukkit.Location, x$1: org.bukkit.util.Vector, x$2: Float, x$3: Float, x$4: Class[T]): T = ???
+
+ def spawnFallingBlock(x$0: org.bukkit.Location, x$1: org.bukkit.material.MaterialData): org.bukkit.entity.FallingBlock = ???
+
+ def spawnFallingBlock(x$0: org.bukkit.Location, x$1: org.bukkit.block.data.BlockData): org.bukkit.entity.FallingBlock = ???
+
+ def spawnParticle(x$0: org.bukkit.Particle, x$1: org.bukkit.Location, x$2: Int): Unit = ???
+
+ def spawnParticle(x$0: org.bukkit.Particle, x$1: Double, x$2: Double, x$3: Double, x$4: Int): Unit = ???
+
+ def spawnParticle[T](x$0: org.bukkit.Particle, x$1: org.bukkit.Location, x$2: Int, x$3: T): Unit = ???
+
+ def spawnParticle[T](x$0: org.bukkit.Particle, x$1: Double, x$2: Double, x$3: Double, x$4: Int, x$5: T): Unit = ???
+
+ def spawnParticle
+ (x$0: org.bukkit.Particle, x$1: org.bukkit.Location, x$2: Int, x$3: Double,
+ x$4
+ : Double, x$5: Double): Unit = ???
+
+ def spawnParticle
+ (x$0: org.bukkit.Particle, x$1: Double, x$2: Double, x$3: Double, x$4: Int,
+ x$5
+ : Double, x$6: Double, x$7: Double): Unit = ???
+
+ def spawnParticle[T]
+ (x$0: org.bukkit.Particle, x$1: org.bukkit.Location, x$2: Int, x$3: Double,
+ x$4
+ : Double, x$5: Double, x$6: T): Unit = ???
+
+ def spawnParticle[T]
+ (x$0: org.bukkit.Particle, x$1: Double, x$2: Double, x$3: Double, x$4: Int,
+ x$5
+ : Double, x$6: Double, x$7: Double, x$8: T): Unit = ???
+
+ def spawnParticle
+ (x$0: org.bukkit.Particle, x$1: org.bukkit.Location, x$2: Int, x$3: Double,
+ x$4
+ : Double, x$5: Double, x$6: Double): Unit = ???
+
+ def spawnParticle
+ (x$0: org.bukkit.Particle, x$1: Double, x$2: Double, x$3: Double, x$4: Int,
+ x$5
+ : Double, x$6: Double, x$7: Double, x$8: Double): Unit = ???
+
+ def spawnParticle[T]
+ (x$0: org.bukkit.Particle, x$1: org.bukkit.Location, x$2: Int, x$3: Double,
+ x$4
+ : Double, x$5: Double, x$6: Double, x$7: T): Unit = ???
+
+ def spawnParticle[T]
+ (x$0: org.bukkit.Particle, x$1: Double, x$2: Double, x$3: Double, x$4: Int,
+ x$5
+ : Double, x$6: Double, x$7: Double, x$8: Double, x$9: T): Unit = ???
+
+ def spawnParticle[T]
+ (x$0: org.bukkit.Particle, x$1: org.bukkit.Location, x$2: Int, x$3: Double,
+ x$4
+ : Double, x$5: Double, x$6: Double, x$7: T, x$8: Boolean): Unit = ???
+
+ def spawnParticle[T]
+ (x$0: org.bukkit.Particle, x$1: Double, x$2: Double, x$3: Double, x$4: Int,
+ x$5
+ : Double, x$6: Double, x$7: Double, x$8: Double, x$9: T, x$10: Boolean):
+ Unit = ???
+
}
/**
* Creates a Server object
*/
val server: Server = new Server {
- def getListeningPluginChannels: java.util.Set[String] = sys error "todo"
- def sendPluginMessage(x$1: org.bukkit.plugin.Plugin,x$2: String,x$3: Array[Byte]): Unit = sys error "todo"
+ override def getListeningPluginChannels: java.util.Set[String] = sys error "todo"
+ override def sendPluginMessage(x$1: org.bukkit.plugin.Plugin,x$2: String,x$3: Array[Byte]): Unit = sys error "todo"
// Members declared in org.bukkit.Server
- def addRecipe(x$1: org.bukkit.inventory.Recipe): Boolean = sys error "todo"
- def banIP(x$1: String): Unit = sys error "todo"
- def broadcast(x$1: String,x$2: String): Int = sys error "todo"
- def broadcastMessage(x$1: String): Int = sys error "todo"
- def clearRecipes: Unit = sys error "todo"
- def configureDbConfig(x$1: com.avaje.ebean.config.ServerConfig): Unit = sys error "todo"
- def createInventory(x$1: org.bukkit.inventory.InventoryHolder,x$2: Int,x$3: String): org.bukkit.inventory.Inventory = sys error "todo"
- def createInventory(x$1: org.bukkit.inventory.InventoryHolder,x$2: Int): org.bukkit.inventory.Inventory = sys error "todo"
- def createInventory(x$1: org.bukkit.inventory.InventoryHolder,x$2: org.bukkit.event.inventory.InventoryType): org.bukkit.inventory.Inventory = sys error "todo"
- def createMap(x$1: org.bukkit.World): org.bukkit.map.MapView = sys error "todo"
- def createWorld(x$1: org.bukkit.WorldCreator): org.bukkit.World = sys error "todo"
- def dispatchCommand(x$1: org.bukkit.command.CommandSender,x$2: String): Boolean = sys error "todo"
- def getAllowEnd: Boolean = sys error "todo"
- def getAllowFlight: Boolean = sys error "todo"
- def getAllowNether: Boolean = sys error "todo"
- def getAnimalSpawnLimit: Int = sys error "todo"
- def getBannedPlayers: java.util.Set[org.bukkit.OfflinePlayer] = sys error "todo"
- def getBukkitVersion: String = sys error "todo"
- def getCommandAliases: java.util.Map[String,Array[String]] = sys error "todo"
- def getConnectionThrottle: Long = sys error "todo"
- def getConsoleSender: org.bukkit.command.ConsoleCommandSender = sys error "todo"
- def getDefaultGameMode: org.bukkit.GameMode = sys error "todo"
- def getGenerateStructures: Boolean = sys error "todo"
- def getHelpMap: org.bukkit.help.HelpMap = sys error "todo"
- def getIPBans: java.util.Set[String] = sys error "todo"
- def getIp: String = sys error "todo"
- def getLogger: java.util.logging.Logger = sys error "todo"
- def getMap(x$1: Short): org.bukkit.map.MapView = sys error "todo"
- def getMaxPlayers: Int = sys error "todo"
- def getMessenger: org.bukkit.plugin.messaging.Messenger = sys error "todo"
- def getMonsterSpawnLimit: Int = sys error "todo"
- def getMotd: String = "yo dawgs"
- def getName: String = "test-server"
- def getOfflinePlayer(x$1: String): org.bukkit.OfflinePlayer = sys error "todo"
- def getOfflinePlayers: Array[org.bukkit.OfflinePlayer] = sys error "todo"
- def getOnlineMode: Boolean = false
- def getOnlinePlayers: Array[org.bukkit.entity.Player] = Array(player)
- def getOperators: java.util.Set[org.bukkit.OfflinePlayer] = new java.util.HashSet[org.bukkit.OfflinePlayer](){ add(player) }
- def getPlayer(name: String): org.bukkit.entity.Player = if (name==player.name) player else sys.error("no player: " + name)
- def getPlayerExact(x$1: String): org.bukkit.entity.Player = getPlayer(x$1)
- def getPluginCommand(x$1: String): org.bukkit.command.PluginCommand = sys error "todo"
- def getPluginManager: org.bukkit.plugin.PluginManager = sys error "todo"
- def getPort: Int = sys error "todo"
- def getRecipesFor(x$1: org.bukkit.inventory.ItemStack): java.util.List[org.bukkit.inventory.Recipe] = sys error "todo"
- def getScheduler: org.bukkit.scheduler.BukkitScheduler = sys error "todo"
- def getServerId: String = sys error "todo"
- def getServerName: String = sys error "todo"
- def getServicesManager: org.bukkit.plugin.ServicesManager = sys error "todo"
- def getSpawnRadius: Int = sys error "todo"
- def getTicksPerAnimalSpawns: Int = sys error "todo"
- def getTicksPerMonsterSpawns: Int = sys error "todo"
- def getUpdateFolder: String = sys error "todo"
- def getUpdateFolderFile: java.io.File = sys error "todo"
- def getVersion: String = sys error "todo"
- def getViewDistance: Int = sys error "todo"
- def getWarningState: org.bukkit.Warning.WarningState = sys error "todo"
- def getWaterAnimalSpawnLimit: Int = sys error "todo"
- def getWhitelistedPlayers: java.util.Set[org.bukkit.OfflinePlayer] = sys error "todo"
- def getWorld(x$1: java.util.UUID): org.bukkit.World = world
- def getWorld(x$1: String): org.bukkit.World = world
- def getWorldContainer: java.io.File = sys error "todo"
- def getWorldType: String = sys error "todo"
- def getWorlds: java.util.List[org.bukkit.World] = new util.LinkedList[World](){ add(world) }
- def hasWhitelist: Boolean = sys error "todo"
- def isPrimaryThread: Boolean = sys error "todo"
- def matchPlayer(x$1: String): java.util.List[org.bukkit.entity.Player] = sys error "todo"
- def recipeIterator: java.util.Iterator[org.bukkit.inventory.Recipe] = sys error "todo"
- def reload: Unit = sys error "todo"
- def reloadWhitelist: Unit = sys error "todo"
- def resetRecipes: Unit = sys error "todo"
- def savePlayers: Unit = sys error "todo"
- def setDefaultGameMode(x$1: org.bukkit.GameMode): Unit = sys error "todo"
- def setSpawnRadius(x$1: Int): Unit = sys error "todo"
- def setWhitelist(x$1: Boolean): Unit = sys error "todo"
- def shutdown: Unit = sys error "todo"
- def unbanIP(x$1: String): Unit = sys error "todo"
- def unloadWorld(x$1: org.bukkit.World,x$2: Boolean): Boolean = sys error "todo"
- def unloadWorld(x$1: String,x$2: Boolean): Boolean = sys error "todo"
- def useExactLoginLocation: Boolean = sys error "todo"
- def getAmbientSpawnLimit: Int = 0
- def isHardcore: Boolean = false
- def getItemFactory: org.bukkit.inventory.ItemFactory = sys error "todo"
- def getShutdownMessage: String = "shutting down test server"
- def getScoreboardManager: org.bukkit.scoreboard.ScoreboardManager = sys error "todo"
- def getServerIcon(): org.bukkit.util.CachedServerIcon = ???
- def loadServerIcon(x$1: java.awt.image.BufferedImage): org.bukkit.util.CachedServerIcon = ???
- def loadServerIcon(x$1: java.io.File): org.bukkit.util.CachedServerIcon = ???
+ override def addRecipe(x$1: org.bukkit.inventory.Recipe): Boolean = sys error "todo"
+ override def banIP(x$1: String): Unit = sys error "todo"
+ override def broadcast(x$1: String,x$2: String): Int = sys error "todo"
+ override def broadcastMessage(x$1: String): Int = sys error "todo"
+ override def clearRecipes: Unit = sys error "todo"
+ override def createInventory(x$1: org.bukkit.inventory.InventoryHolder,x$2: Int,x$3: String): org.bukkit.inventory.Inventory = sys error "todo"
+ override def createInventory(x$1: org.bukkit.inventory.InventoryHolder,x$2: Int): org.bukkit.inventory.Inventory = sys error "todo"
+ override def createInventory(x$1: org.bukkit.inventory.InventoryHolder,x$2: org.bukkit.event.inventory.InventoryType): org.bukkit.inventory.Inventory = sys error "todo"
+ override def createMap(x$1: org.bukkit.World): org.bukkit.map.MapView = sys error "todo"
+ override def createWorld(x$1: org.bukkit.WorldCreator): org.bukkit.World = sys error "todo"
+ override def dispatchCommand(x$1: org.bukkit.command.CommandSender,x$2: String): Boolean = sys error "todo"
+ override def getAllowEnd: Boolean = sys error "todo"
+ override def getAllowFlight: Boolean = sys error "todo"
+ override def getAllowNether: Boolean = sys error "todo"
+ override def getAnimalSpawnLimit: Int = sys error "todo"
+ override def getBannedPlayers: java.util.Set[org.bukkit.OfflinePlayer] = sys error "todo"
+ override def getBukkitVersion: String = sys error "todo"
+ override def getCommandAliases: java.util.Map[String,Array[String]] = sys error "todo"
+ override def getConnectionThrottle: Long = sys error "todo"
+ override def getConsoleSender: org.bukkit.command.ConsoleCommandSender = sys error "todo"
+ override def getDefaultGameMode: org.bukkit.GameMode = sys error "todo"
+ override def getGenerateStructures: Boolean = sys error "todo"
+ override def getHelpMap: org.bukkit.help.HelpMap = sys error "todo"
+ override def getIPBans: java.util.Set[String] = sys error "todo"
+ override def getIp: String = sys error "todo"
+ override def getLogger: java.util.logging.Logger = sys error "todo"
+ override def getMaxPlayers: Int = sys error "todo"
+ override def getMessenger: org.bukkit.plugin.messaging.Messenger = sys error "todo"
+ override def getMonsterSpawnLimit: Int = sys error "todo"
+ override def getMotd: String = "yo dawgs"
+ override def getName: String = "test-server"
+ override def getOfflinePlayer(x$1: String): org.bukkit.OfflinePlayer = sys error "todo"
+ override def getOfflinePlayers: Array[org.bukkit.OfflinePlayer] = sys error "todo"
+ override def getOnlineMode: Boolean = false
+ override def getOperators: java.util.Set[org.bukkit.OfflinePlayer] = new java.util.HashSet[org.bukkit.OfflinePlayer](){ add(player) }
+ override def getPlayer(name: String): org.bukkit.entity.Player = if (name==player.name) player else sys.error("no player: " + name)
+ override def getPlayerExact(x$1: String): org.bukkit.entity.Player = getPlayer(x$1)
+ override def getPluginCommand(x$1: String): org.bukkit.command.PluginCommand = sys error "todo"
+ override def getPluginManager: org.bukkit.plugin.PluginManager = sys error "todo"
+ override def getPort: Int = sys error "todo"
+ override def getRecipesFor(x$1: org.bukkit.inventory.ItemStack): java.util.List[org.bukkit.inventory.Recipe] = sys error "todo"
+ override def getScheduler: org.bukkit.scheduler.BukkitScheduler = sys error "todo"
+ override def getServicesManager: org.bukkit.plugin.ServicesManager = sys error "todo"
+ override def getSpawnRadius: Int = sys error "todo"
+ override def getTicksPerAnimalSpawns: Int = sys error "todo"
+ override def getTicksPerMonsterSpawns: Int = sys error "todo"
+ override def getUpdateFolder: String = sys error "todo"
+ override def getUpdateFolderFile: java.io.File = sys error "todo"
+ override def getVersion: String = sys error "todo"
+ override def getViewDistance: Int = sys error "todo"
+ override def getWarningState: org.bukkit.Warning.WarningState = sys error "todo"
+ override def getWaterAnimalSpawnLimit: Int = sys error "todo"
+ override def getWhitelistedPlayers: java.util.Set[org.bukkit.OfflinePlayer] = sys error "todo"
+ override def getWorld(x$1: java.util.UUID): org.bukkit.World = world
+ override def getWorld(x$1: String): org.bukkit.World = world
+ override def getWorldContainer: java.io.File = sys error "todo"
+ override def getWorldType: String = sys error "todo"
+ override def getWorlds: java.util.List[org.bukkit.World] = new util.LinkedList[World](){ add(world) }
+ override def hasWhitelist: Boolean = sys error "todo"
+ override def isPrimaryThread: Boolean = sys error "todo"
+ override def matchPlayer(x$1: String): java.util.List[org.bukkit.entity.Player] = sys error "todo"
+ override def recipeIterator: java.util.Iterator[org.bukkit.inventory.Recipe] = sys error "todo"
+ override def reload: Unit = sys error "todo"
+ override def reloadWhitelist: Unit = sys error "todo"
+ override def resetRecipes: Unit = sys error "todo"
+ override def savePlayers: Unit = sys error "todo"
+ override def setDefaultGameMode(x$1: org.bukkit.GameMode): Unit = sys error "todo"
+ override def setSpawnRadius(x$1: Int): Unit = sys error "todo"
+ override def setWhitelist(x$1: Boolean): Unit = sys error "todo"
+ override def shutdown: Unit = sys error "todo"
+ override def unbanIP(x$1: String): Unit = sys error "todo"
+ override def unloadWorld(x$1: org.bukkit.World,x$2: Boolean): Boolean = sys error "todo"
+ override def unloadWorld(x$1: String,x$2: Boolean): Boolean = sys error "todo"
+ override def getAmbientSpawnLimit: Int = 0
+ override def isHardcore: Boolean = false
+ override def getItemFactory: org.bukkit.inventory.ItemFactory = sys error "todo"
+ override def getShutdownMessage: String = "shutting down test server"
+ override def getScoreboardManager: org.bukkit.scoreboard.ScoreboardManager = sys error "todo"
+ override def getServerIcon(): org.bukkit.util.CachedServerIcon = ???
+ override def loadServerIcon(x$1: java.awt.image.BufferedImage): org.bukkit.util.CachedServerIcon = ???
+ override def loadServerIcon(x$1: java.io.File): org.bukkit.util.CachedServerIcon = ???
+
+ def advancementIterator
+ (): java.util.Iterator[org.bukkit.advancement.Advancement] = ???
+ def createBlockData(x$0: org.bukkit.Material): org.bukkit.block.data.BlockData = ???
+ def createBlockData
+ (x$0: org.bukkit.Material, x$1:
+ java.util.function.Consumer[org.bukkit.block.data.BlockData]
+ ): org.bukkit.block.data.BlockData = ???
+ def createBlockData(x$0: String): org.bukkit.block.data.BlockData = ???
+ def createBlockData
+ (x$0: org.bukkit.Material, x$1: String): org.bukkit.block.data.BlockData = ???
+ def createBossBar
+ (x$0: String, x$1: org.bukkit.boss.BarColor, x$2: org.bukkit.boss.BarStyle,
+ x$3
+ : Array[? <: org.bukkit.boss.BarFlag]): org.bukkit.boss.BossBar = ???
+ def createBossBar
+ (x$0: org.bukkit.NamespacedKey, x$1: String, x$2: org.bukkit.boss.BarColor,
+ x$3
+ : org.bukkit.boss.BarStyle, x$4: Array[? <: org.bukkit.boss.BarFlag]):
+ org.bukkit.boss.KeyedBossBar = ???
+ def createExplorerMap
+ (x$0: org.bukkit.World, x$1: org.bukkit.Location, x$2:
+ org.bukkit.StructureType
+ ): org.bukkit.inventory.ItemStack = ???
+ def createExplorerMap
+ (x$0: org.bukkit.World, x$1: org.bukkit.Location, x$2:
+ org.bukkit.StructureType
+ , x$3: Int, x$4: Boolean): org.bukkit.inventory.ItemStack = ???
+ def createInventory
+ (x$0: org.bukkit.inventory.InventoryHolder, x$1:
+ org.bukkit.event.inventory.InventoryType
+ , x$2: String): org.bukkit.inventory.Inventory = ???
+ def createMerchant(x$0: String): org.bukkit.inventory.Merchant = ???
+ def getAdvancement
+ (x$0: org.bukkit.NamespacedKey): org.bukkit.advancement.Advancement = ???
+ def getBossBar(x$0: org.bukkit.NamespacedKey): org.bukkit.boss.KeyedBossBar = ???
+ def getBossBars(): java.util.Iterator[org.bukkit.boss.KeyedBossBar] = ???
+ def getEntity(x$0: java.util.UUID): org.bukkit.entity.Entity = ???
+ def getIdleTimeout(): Int = ???
+ def getLootTable(x$0: org.bukkit.NamespacedKey): org.bukkit.loot.LootTable = ???
+ def getMap(x$0: Int): org.bukkit.map.MapView = ???
+ def getOfflinePlayer(x$0: java.util.UUID): org.bukkit.OfflinePlayer = ???
+ def getPlayer(x$0: java.util.UUID): org.bukkit.entity.Player = ???
+ def getTag[T <: org.bukkit.Keyed]
+ (x$0: String, x$1: org.bukkit.NamespacedKey, x$2: Class[T]):
+ org.bukkit.Tag[T] = ???
+ def getTicksPerAmbientSpawns(): Int = ???
+ def getTicksPerWaterSpawns(): Int = ???
+ def getUnsafe(): org.bukkit.UnsafeValues = ???
+ def reloadData(): Unit = ???
+ def removeBossBar(x$0: org.bukkit.NamespacedKey): Boolean = ???
+ def removeRecipe(x$0: org.bukkit.NamespacedKey): Boolean = ???
+ def selectEntities
+ (x$0: org.bukkit.command.CommandSender, x$1: String):
+ java.util.List[org.bukkit.entity.Entity] = ???
+ def setIdleTimeout(x$0: Int): Unit = ???
+
+ def getOnlinePlayers(): java.util.Collection[? <: org.bukkit.entity.Player] = ???
+ def getTags[T <: org.bukkit.Keyed](x$0: String, x$1: Class[T]) = ???
+ def createChunkData(x$0: org.bukkit.World) = ???
+ def getBanList(x$0: org.bukkit.BanList.Type) = ???
}
/**
@@ -433,7 +733,6 @@ object TestServer { ts =>
def getUniqueId: java.util.UUID = sys error "todo"
def hasLineOfSight(p1: Entity): Boolean = false
def openWorkbench(p1: Location, p2: Boolean): InventoryView = sys error "todo"
- def awardAchievement(p1: Achievement): Unit = {}
def abandonConversation(p1: Conversation, p2: ConversationAbandonedEvent): Unit = {}
def abandonConversation(p1: Conversation): Unit = {}
def leaveVehicle: Boolean = false
@@ -570,5 +869,209 @@ object TestServer { ts =>
def setHealthScaled(x$1: Boolean): Unit = ???
def setResourcePack(x$1: String): Unit = ???
+ // Members declared in org.bukkit.attribute.Attributable
+ def getAttribute
+ (x$0: org.bukkit.attribute.Attribute): org.bukkit.attribute.AttributeInstance = ???
+ // Members declared in org.bukkit.entity.Damageable
+ def getAbsorptionAmount(): Double = ???
+ def setAbsorptionAmount(x$0: Double): Unit = ???
+ // Members declared in org.bukkit.entity.Entity
+ def addPassenger(x$0: org.bukkit.entity.Entity): Boolean = ???
+ def addScoreboardTag(x$0: String): Boolean = ???
+ def getBoundingBox(): org.bukkit.util.BoundingBox = ???
+ def getFacing(): org.bukkit.block.BlockFace = ???
+ def getHeight(): Double = ???
+ def getPassengers(): java.util.List[org.bukkit.entity.Entity] = ???
+ def getPistonMoveReaction(): org.bukkit.block.PistonMoveReaction = ???
+ def getPortalCooldown(): Int = ???
+ def getPose(): org.bukkit.entity.Pose = ???
+ def getScoreboardTags(): java.util.Set[String] = ???
+ def getWidth(): Double = ???
+ def hasGravity(): Boolean = ???
+ def isGlowing(): Boolean = ???
+ def isInvulnerable(): Boolean = ???
+ def isPersistent(): Boolean = ???
+ def isSilent(): Boolean = ???
+ def removePassenger(x$0: org.bukkit.entity.Entity): Boolean = ???
+ def removeScoreboardTag(x$0: String): Boolean = ???
+ def setGlowing(x$0: Boolean): Unit = ???
+ def setGravity(x$0: Boolean): Unit = ???
+ def setInvulnerable(x$0: Boolean): Unit = ???
+ def setPersistent(x$0: Boolean): Unit = ???
+ def setPortalCooldown(x$0: Int): Unit = ???
+ def setRotation(x$0: Float, x$1: Float): Unit = ???
+ def setSilent(x$0: Boolean): Unit = ???
+ // Members declared in org.bukkit.entity.HumanEntity
+ def discoverRecipe(x$0: org.bukkit.NamespacedKey): Boolean = ???
+ def discoverRecipes(x$0: java.util.Collection[org.bukkit.NamespacedKey]): Int = ???
+ def getAttackCooldown(): Float = ???
+ def getBedLocation(): org.bukkit.Location = ???
+ def getCooldown(x$0: org.bukkit.Material): Int = ???
+ def getMainHand(): org.bukkit.inventory.MainHand = ???
+ def getShoulderEntityLeft(): org.bukkit.entity.Entity = ???
+ def getShoulderEntityRight(): org.bukkit.entity.Entity = ???
+ def hasCooldown(x$0: org.bukkit.Material): Boolean = ???
+ def isHandRaised(): Boolean = ???
+ def openMerchant
+ (x$0: org.bukkit.entity.Villager, x$1: Boolean):
+ org.bukkit.inventory.InventoryView = ???
+ def openMerchant
+ (x$0: org.bukkit.inventory.Merchant, x$1: Boolean):
+ org.bukkit.inventory.InventoryView = ???
+ def setCooldown(x$0: org.bukkit.Material, x$1: Int): Unit = ???
+ def setShoulderEntityLeft(x$0: org.bukkit.entity.Entity): Unit = ???
+ def setShoulderEntityRight(x$0: org.bukkit.entity.Entity): Unit = ???
+ def sleep(x$0: org.bukkit.Location, x$1: Boolean): Boolean = ???
+ def undiscoverRecipe(x$0: org.bukkit.NamespacedKey): Boolean = ???
+ def undiscoverRecipes(x$0: java.util.Collection[org.bukkit.NamespacedKey]): Int = ???
+ def wakeup(x$0: Boolean): Unit = ???
+ // Members declared in org.bukkit.entity.LivingEntity
+ def attack(x$0: org.bukkit.entity.Entity): Unit = ???
+ def getCollidableExemptions(): java.util.Set[java.util.UUID] = ???
+ def getLastTwoTargetBlocks
+ (x$0: java.util.Set[org.bukkit.Material], x$1: Int):
+ java.util.List[org.bukkit.block.Block] = ???
+ def getLineOfSight
+ (x$0: java.util.Set[org.bukkit.Material], x$1: Int):
+ java.util.List[org.bukkit.block.Block] = ???
+ def getMemory[T](x$0: org.bukkit.entity.memory.MemoryKey[T]): T = ???
+ def getPotionEffect
+ (x$0: org.bukkit.potion.PotionEffectType): org.bukkit.potion.PotionEffect = ???
+ def getTargetBlock
+ (x$0: java.util.Set[org.bukkit.Material], x$1: Int): org.bukkit.block.Block = ???
+ def getTargetBlockExact(x$0: Int): org.bukkit.block.Block = ???
+ def getTargetBlockExact
+ (x$0: Int, x$1: org.bukkit.FluidCollisionMode): org.bukkit.block.Block = ???
+ def hasAI(): Boolean = ???
+ def isCollidable(): Boolean = ???
+ def isGliding(): Boolean = ???
+ def isRiptiding(): Boolean = ???
+ def isSwimming(): Boolean = ???
+ def rayTraceBlocks(x$0: Double): org.bukkit.util.RayTraceResult = ???
+ def rayTraceBlocks
+ (x$0: Double, x$1: org.bukkit.FluidCollisionMode):
+ org.bukkit.util.RayTraceResult = ???
+ def setAI(x$0: Boolean): Unit = ???
+ def setCollidable(x$0: Boolean): Unit = ???
+ def setGliding(x$0: Boolean): Unit = ???
+ def setMemory[T](x$0: org.bukkit.entity.memory.MemoryKey[T], x$1: T): Unit = ???
+ def setSwimming(x$0: Boolean): Unit = ???
+ def swingMainHand(): Unit = ???
+ def swingOffHand(): Unit = ???
+ // Members declared in org.bukkit.OfflinePlayer
+ def decrementStatistic(x$0: org.bukkit.Statistic): Unit = ???
+ def decrementStatistic(x$0: org.bukkit.Statistic, x$1: Int): Unit = ???
+ def decrementStatistic
+ (x$0: org.bukkit.Statistic, x$1: org.bukkit.Material): Unit = ???
+ def decrementStatistic
+ (x$0: org.bukkit.Statistic, x$1: org.bukkit.Material, x$2: Int): Unit = ???
+ def decrementStatistic
+ (x$0: org.bukkit.Statistic, x$1: org.bukkit.entity.EntityType): Unit = ???
+ def decrementStatistic
+ (x$0: org.bukkit.Statistic, x$1: org.bukkit.entity.EntityType, x$2: Int): Unit = ???
+ def getStatistic(x$0: org.bukkit.Statistic): Int = ???
+ def getStatistic(x$0: org.bukkit.Statistic, x$1: org.bukkit.Material): Int = ???
+ def getStatistic
+ (x$0: org.bukkit.Statistic, x$1: org.bukkit.entity.EntityType): Int = ???
+ def incrementStatistic
+ (x$0: org.bukkit.Statistic, x$1: org.bukkit.entity.EntityType): Unit = ???
+ def incrementStatistic
+ (x$0: org.bukkit.Statistic, x$1: org.bukkit.entity.EntityType, x$2: Int): Unit = ???
+ def setStatistic(x$0: org.bukkit.Statistic, x$1: Int): Unit = ???
+ def setStatistic
+ (x$0: org.bukkit.Statistic, x$1: org.bukkit.Material, x$2: Int): Unit = ???
+ def setStatistic
+ (x$0: org.bukkit.Statistic, x$1: org.bukkit.entity.EntityType, x$2: Int): Unit = ???
+ // Members declared in org.bukkit.persistence.PersistentDataHolder
+ def getPersistentDataContainer(): org.bukkit.persistence.PersistentDataContainer = ???
+ // Members declared in org.bukkit.entity.Player
+ def getAdvancementProgress
+ (x$0: org.bukkit.advancement.Advancement):
+ org.bukkit.advancement.AdvancementProgress = ???
+ def getClientViewDistance(): Int = ???
+ def getLocale(): String = ???
+ def getPlayerListFooter(): String = ???
+ def getPlayerListHeader(): String = ???
+ def getSpectatorTarget(): org.bukkit.entity.Entity = ???
+ def hidePlayer
+ (x$0: org.bukkit.plugin.Plugin, x$1: org.bukkit.entity.Player): Unit = ???
+ def openBook(x$0: org.bukkit.inventory.ItemStack): Unit = ???
+ def playSound
+ (x$0: org.bukkit.Location, x$1: org.bukkit.Sound, x$2:
+ org.bukkit.SoundCategory
+ , x$3: Float, x$4: Float): Unit = ???
+ def playSound
+ (x$0: org.bukkit.Location, x$1: String, x$2: org.bukkit.SoundCategory, x$3:
+ Float
+ , x$4: Float): Unit = ???
+ def resetTitle(): Unit = ???
+ def sendBlockChange
+ (x$0: org.bukkit.Location, x$1: org.bukkit.block.data.BlockData): Unit = ???
+ def sendExperienceChange(x$0: Float): Unit = ???
+ def sendExperienceChange(x$0: Float, x$1: Int): Unit = ???
+ def sendSignChange(x$0: org.bukkit.Location, x$1: Array[String]): Unit = ???
+ def sendSignChange
+ (x$0: org.bukkit.Location, x$1: Array[String], x$2: org.bukkit.DyeColor): Unit = ???
+ def sendTitle(x$0: String, x$1: String): Unit = ???
+ def sendTitle(x$0: String, x$1: String, x$2: Int, x$3: Int, x$4: Int): Unit = ???
+ def setPlayerListFooter(x$0: String): Unit = ???
+ def setPlayerListHeader(x$0: String): Unit = ???
+ def setPlayerListHeaderFooter(x$0: String, x$1: String): Unit = ???
+ def setResourcePack(x$0: String, x$1: Array[Byte]): Unit = ???
+ def setSpectatorTarget(x$0: org.bukkit.entity.Entity): Unit = ???
+ def showPlayer
+ (x$0: org.bukkit.plugin.Plugin, x$1: org.bukkit.entity.Player): Unit = ???
+ def spawnParticle
+ (x$0: org.bukkit.Particle, x$1: org.bukkit.Location, x$2: Int): Unit = ???
+ def spawnParticle
+ (x$0: org.bukkit.Particle, x$1: Double, x$2: Double, x$3: Double, x$4: Int):
+ Unit = ???
+ def spawnParticle[T]
+ (x$0: org.bukkit.Particle, x$1: org.bukkit.Location, x$2: Int, x$3: T): Unit = ???
+ def spawnParticle[T]
+ (x$0: org.bukkit.Particle, x$1: Double, x$2: Double, x$3: Double, x$4: Int,
+ x$5
+ : T): Unit = ???
+ def spawnParticle
+ (x$0: org.bukkit.Particle, x$1: org.bukkit.Location, x$2: Int, x$3: Double,
+ x$4
+ : Double, x$5: Double): Unit = ???
+ def spawnParticle
+ (x$0: org.bukkit.Particle, x$1: Double, x$2: Double, x$3: Double, x$4: Int,
+ x$5
+ : Double, x$6: Double, x$7: Double): Unit = ???
+ def spawnParticle[T]
+ (x$0: org.bukkit.Particle, x$1: org.bukkit.Location, x$2: Int, x$3: Double,
+ x$4
+ : Double, x$5: Double, x$6: T): Unit = ???
+ def spawnParticle[T]
+ (x$0: org.bukkit.Particle, x$1: Double, x$2: Double, x$3: Double, x$4: Int,
+ x$5
+ : Double, x$6: Double, x$7: Double, x$8: T): Unit = ???
+ def spawnParticle
+ (x$0: org.bukkit.Particle, x$1: org.bukkit.Location, x$2: Int, x$3: Double,
+ x$4
+ : Double, x$5: Double, x$6: Double): Unit = ???
+ def spawnParticle
+ (x$0: org.bukkit.Particle, x$1: Double, x$2: Double, x$3: Double, x$4: Int,
+ x$5
+ : Double, x$6: Double, x$7: Double, x$8: Double): Unit = ???
+ def spawnParticle[T]
+ (x$0: org.bukkit.Particle, x$1: org.bukkit.Location, x$2: Int, x$3: Double,
+ x$4
+ : Double, x$5: Double, x$6: Double, x$7: T): Unit = ???
+ def spawnParticle[T]
+ (x$0: org.bukkit.Particle, x$1: Double, x$2: Double, x$3: Double, x$4: Int,
+ x$5
+ : Double, x$6: Double, x$7: Double, x$8: Double, x$9: T): Unit = ???
+ def stopSound(x$0: org.bukkit.Sound): Unit = ???
+ def stopSound(x$0: String): Unit = ???
+ def stopSound(x$0: org.bukkit.Sound, x$1: org.bukkit.SoundCategory): Unit = ???
+ def stopSound(x$0: String, x$1: org.bukkit.SoundCategory): Unit = ???
+ def updateCommands(): Unit = ???
+ // Members declared in org.bukkit.projectiles.ProjectileSource
+ def launchProjectile[T <: org.bukkit.entity.Projectile]
+ (x$0: Class[? <: T], x$1: org.bukkit.util.Vector): T = ???
+
}
}
diff --git a/core/src/main/scala/com/joshcough/minecraft/UndoState.scala b/core/src/main/scala/com/joshcough/minecraft/UndoState.scala
index ee76dbc7..09c5d22c 100644
--- a/core/src/main/scala/com/joshcough/minecraft/UndoState.scala
+++ b/core/src/main/scala/com/joshcough/minecraft/UndoState.scala
@@ -1,30 +1,29 @@
package com.joshcough.minecraft
-import collection.immutable.Stack
import ScalaEnrichment.RichBoolean
-case class UndoState[T, U](undoStack: Stack[T] = Stack(), redoStack: Stack[U] = Stack()){
+case class UndoState[T, U](undoStack: List[T] = List(), redoStack: List[U] = List()){
override def toString =
- s"UndoState(undoStack=(${undoStack.mkString(",")}) redoState=(${redoStack.toList}))"
+ s"UndoState(undoStack=(${undoStack.mkString(",")}) redoState=(${redoStack}))"
/**
* if you make a change, it goes on top of the undo stack
* and the redo stack is cleared.
*/
- def newChange(t: T): UndoState[T, U] = copy(undoStack = undoStack.push(t), redoStack = Stack[U]())
+ def newChange(t: T): UndoState[T, U] = copy(undoStack = t :: undoStack, redoStack = List[U]())
/**
* undo: take off top of undo stack and put onto redo stack
*/
def undo(f: T => U): Option[UndoState[T, U]] = undoStack.nonEmpty.toOption(
- copy(undoStack.pop, redoStack.push(f(undoStack.top)))
+ copy(undoStack.tail, f(undoStack.head) :: redoStack)
)
/**
* redo: take off top of redo stack and put onto undo stack
*/
def redo(f: U => T): Option[UndoState[T, U]] = redoStack.nonEmpty.toOption(
- copy(undoStack.push(f(redoStack.top)), redoStack.pop)
+ copy(f(redoStack.head) :: undoStack, redoStack.tail)
)
}
diff --git a/core/src/main/scala/com/joshcough/minecraft/YMLGenerator.scala b/core/src/main/scala/com/joshcough/minecraft/YMLGenerator.scala
index 1c21f529..d06ae03a 100644
--- a/core/src/main/scala/com/joshcough/minecraft/YMLGenerator.scala
+++ b/core/src/main/scala/com/joshcough/minecraft/YMLGenerator.scala
@@ -2,6 +2,11 @@ package com.joshcough.minecraft
import ParserCombinators._
+trait PluginConfig[T] {
+ val pluginClass: Class[T]
+ val commands: List[CommandsPlugin.Command] = Nil
+}
+
// A helper object I use to auto generate all my plugin.yml files.
object YMLGenerator {
@@ -10,17 +15,47 @@ object YMLGenerator {
anyString.named("author") ~
anyString.named("version") ~
anyString.named("outputDir") ~
+ anyString.named("configClassName") ~
eof
- def create[T](className: String) = Class.forName(className).newInstance.asInstanceOf[T]
+ def main(args: Array[String]): Unit = argsParser(args.toList).extract {
+ case pluginName ~ author ~ version ~ outputDir ~ configClassName ~ _ =>
+ writeYMLFromConfig(pluginName, author, version, outputDir, configClassName)
+ }
- def generateYml(className: String, author: String, version: String, outputDir: String) =
- create[ScalaPlugin](className).writeYML(author, version, outputDir)
+ def writeYMLFromConfig(pluginName: String,
+ author: String,
+ version: String,
+ outputDir: String = ".",
+ configClassName: String): Unit = {
+ val config = Class.forName(configClassName).getDeclaredConstructor().newInstance().asInstanceOf[PluginConfig[_]]
+ writeYML(pluginName, config.pluginClass.getName, author, version, outputDir, config.commands)
+ }
- def main(args: Array[String]): Unit = {
- argsParser(args.toList).extract {
- case className ~ author ~ version ~ outputDir ~ _ => generateYml(className, author, version, outputDir)
+ def writeYML(pluginName: String,
+ pluginClassName: String,
+ author: String,
+ version: String,
+ outputDir: String = ".",
+ commands: List[CommandsPlugin.Command]): Unit = {
+ val resources = new java.io.File(outputDir)
+ resources.mkdirs
+ println(resources.getAbsolutePath)
+ def write(contents: String, filename:String): Unit = {
+ val f = new java.io.FileWriter(new java.io.File(resources, filename))
+ f.write(contents)
+ f.close()
}
+ val yml = CommandsPlugin.fullPluginYml(
+ pluginName,
+ pluginClassName,
+ author,
+ version,
+ Nil,
+ // TODO: these should not be hardcoded...should come from the config
+ List("ScalaLibPlugin", "ScalaPluginAPI"), Nil,
+ commands)
+ println(yml)
+ write(yml, "plugin.yml")
}
-
}
diff --git a/core/src/test/scala/com/joshcough/minecraft/CubeTests.scala b/core/src/test/scala/com/joshcough/minecraft/CubeTests.scala
index ab5a1238..b1237e15 100644
--- a/core/src/test/scala/com/joshcough/minecraft/CubeTests.scala
+++ b/core/src/test/scala/com/joshcough/minecraft/CubeTests.scala
@@ -11,12 +11,12 @@ import ScalaEnrichment.id
* Generate cubes, possibly up to the maximum sized cube.
*/
trait CubeGenerators {
- type C = Cube[Point]
- implicit val genCoor = for {
+ implicit val genCoor : Gen[Point] = for {
x <- arbitrary[Int]; y <- arbitrary[Int]; z <- arbitrary[Int]
} yield Point(x, y, z)
- implicit val genCube: Gen[C] = for { c1 <- genCoor; c2 <- genCoor } yield Cube(c1, c2)(identity)
- implicit val cubes = Arbitrary(genCube)
+ implicit val genCube: Gen[Cube[Point]] =
+ for { c1 <- genCoor; c2 <- genCoor } yield Cube(c1, c2)(identity)
+ implicit val cubes : Arbitrary[Cube[Point]] = Arbitrary(genCube)
}
/**
@@ -25,18 +25,17 @@ trait CubeGenerators {
* min x, y, and z no less than -50
*/
trait SmallCubeGenerators { self: Properties =>
- type C = Cube[Point]
val smallInteger = Gen.choose(-50,50)
- val genSmallCube: Gen[C] = for {
+ val genSmallCube: Gen[Cube[Point]] = for {
x1 <- smallInteger; y1 <- smallInteger; z1 <- smallInteger
x2 <- smallInteger; y2 <- smallInteger; z2 <- smallInteger
} yield Cube(Point(x1, y1, z1), Point(x2, y2, z2))(identity)
- implicit val smallCubes = Arbitrary(genSmallCube)
+ implicit val smallCubes: Arbitrary[Cube[Point]] = Arbitrary(genSmallCube)
}
abstract class CubeTestBase(name: String) extends Properties(name) with TestHelpers {
- def idCube(p1: Point, p2: Point) = Cube(p1, p2)(id)
- def toList(c: Cube[Point]) = c.toStream.toList
+ def idCube(p1: Point, p2: Point): Cube[Point] = Cube(p1, p2)(id)
+ def toList(cube: Cube[Point]) = cube.toLazyList.toList
def run(c: Cube[Point]) = c.toZippedStream.toList
}
@@ -46,7 +45,7 @@ abstract class CubeTestBase(name: String) extends Properties(name) with TestHelp
* require traversing the whole cube.
*/
object BigCubeTests extends CubeTestBase("Cube Tests Awesome") with CubeGenerators {
- test("cubes size > 0")(forAll{ (c:C) => c.size > 0 })
+ test("cubes size > 0")(forAll{ (c:Cube[Point]) => c.size > 0 })
}
/**
@@ -56,25 +55,25 @@ object BigCubeTests extends CubeTestBase("Cube Tests Awesome") with CubeGenerato
*/
object SmallCubeTests extends CubeTestBase("Cube Tests Awesome") with SmallCubeGenerators {
- test("paste then mirror y same as mirror y then paste")(forAll{ (c:C) =>
+ test("paste then mirror y same as mirror y then paste")(forAll{ (c:Cube[Point]) =>
run(c.translateTo(Point(0, 10, 0)).mirrorY) ?= run(c.mirrorY.translateTo(Point(0, 10, 0)))
})
- test("mirror x y z, same as mirror z y x")(forAll{ (c:C) =>
+ test("mirror x y z, same as mirror z y x")(forAll{ (c:Cube[Point]) =>
run(c.mirrorX.mirrorY.mirrorZ) ?= run(c.mirrorZ.mirrorY.mirrorX)
})
- test("mirror x x, same as identity")(forAll{ (c:C) => run(c.mirrorX.mirrorX) ?= run(c) })
+ test("mirror x x, same as identity")(forAll{ (c:Cube[Point]) => run(c.mirrorX.mirrorX) ?= run(c) })
- test("grow then shrink, same as identity")(forAll{ (c:C) =>
+ test("grow then shrink, same as identity")(forAll{ (c:Cube[Point]) =>
run(c.grow(5,6,7).shrink(5,6,7)) ?= run(c)
})
- test("shift up, shift down, same as identity")(forAll{ (c:C, i: Int) =>
+ test("shift up, shift down, same as identity")(forAll{ (c:Cube[Point], i: Int) =>
run(c.shiftUp(i).shiftDown(i)) ?= run(c)
})
- test("shift by i, shift by -i, same as identity")(forAll{ (c:C, i: Int) =>
+ test("shift by i, shift by -i, same as identity")(forAll{ (c:Cube[Point], i: Int) =>
run(c.shiftX(i).shiftX(-i).shiftY(i).shiftY(-i).shiftZ(i).shiftZ(-i)) ?= run(c)
})
}
@@ -132,7 +131,9 @@ object LiteralCubeMirroringTests extends CubeTestBase("Cube Mirroring Tests") {
val cy = idCube(Point(0,0,0),Point(0,3,0))
val cz = idCube(Point(0,0,0),Point(0,0,3))
- test("normal x") { toList(cx) ?= List(Point(0,0,0),Point(1,0,0),Point(2,0,0),Point(3,0,0)) }
+ test("normal x") {
+ toList(cx) ?= List(Point(0,0,0),Point(1,0,0),Point(2,0,0),Point(3,0,0))
+ }
test("normal y") { toList(cy) ?= List(Point(0,0,0),Point(0,1,0),Point(0,2,0),Point(0,3,0)) }
test("mirrorX") { toList(cx.mirrorX) ?= List(Point(3,0,0),Point(2,0,0),Point(1,0,0),Point(0,0,0)) }
test("mirrorY") { toList(cy.mirrorY) ?= List(Point(0,3,0),Point(0,2,0),Point(0,1,0),Point(0,0,0)) }
diff --git a/core/src/test/scala/com/joshcough/minecraft/MinecraftParsersTests.scala b/core/src/test/scala/com/joshcough/minecraft/MinecraftParsersTests.scala
index 1e993884..7a803bea 100644
--- a/core/src/test/scala/com/joshcough/minecraft/MinecraftParsersTests.scala
+++ b/core/src/test/scala/com/joshcough/minecraft/MinecraftParsersTests.scala
@@ -22,8 +22,12 @@ object MinecraftParsersTests extends Properties("MinecraftParserTests") with Tes
(entity(e.name).get ?= e) && (entity(e.toString.toLowerCase).get ?= e)
}
- test("(material or eof)(gold_ore)") {
- (material or eof)("gold_ore").get.left.get ?= GOLD_ORE
+ test("(material or eof)(GOLD_ORE)") {
+ (material or eof)("GOLD_ORE").get.swap.getOrElse(sys.error("GOLD_ORE not found")) ?= GOLD_ORE
+ }
+
+ test("(material or eof)(STONE)") {
+ (material or eof)("STONE").get.swap.getOrElse(sys.error("STONE not found")) ?= STONE
}
test("(material or eof)(Nil)") {
diff --git a/core/src/test/scala/com/joshcough/minecraft/TestHelpers.scala b/core/src/test/scala/com/joshcough/minecraft/TestHelpers.scala
index 1f2b9365..8e3f1a93 100644
--- a/core/src/test/scala/com/joshcough/minecraft/TestHelpers.scala
+++ b/core/src/test/scala/com/joshcough/minecraft/TestHelpers.scala
@@ -1,12 +1,13 @@
package com.joshcough.minecraft
+import org.bukkit.World
import org.scalacheck.Properties
import org.scalacheck.Prop
import org.scalacheck.Prop._
trait TestHelpers { self: Properties =>
- implicit val world = TestServer.world
+ implicit val world: World = TestServer.world
def trying(f: => Prop) = secure {
try f catch { case e: Throwable => e.printStackTrace; throw e }
diff --git a/examples/Farmer/Farmer.scala b/examples/Farmer/Farmer.scala
deleted file mode 100644
index ab788fbc..00000000
--- a/examples/Farmer/Farmer.scala
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.joshcough.minecraft.examples
-
-import org.bukkit.Material._
-import org.bukkit.block.Block
-import org.bukkit.entity.Player
-import com.joshcough.minecraft.{ListenersPlugin, Listeners}
-import Listeners._
-
-class Farmer extends ListenersPlugin {
- def dropSeedsAt(b: Block) = b.loc.dropItem(SEEDS)
- def hasHoe(p: Player) = p.isHoldingAnyOf(WOOD_HOE, STONE_HOE, IRON_HOE, GOLD_HOE, DIAMOND_HOE)
- val listeners = List(
- OnBlockBreak{ (b,_,_) => if (b is LONG_GRASS) dropSeedsAt(b) },
- OnRightClickBlock{ (p, e) => if (hasHoe(p) and (e.block is GRASS)) dropSeedsAt(e.block) }
- )
-}
diff --git a/examples/LightningArrows/LightningArrows.scala b/examples/LightningArrows/LightningArrows.scala
index 53121d6f..d2ec86b3 100644
--- a/examples/LightningArrows/LightningArrows.scala
+++ b/examples/LightningArrows/LightningArrows.scala
@@ -1,8 +1,13 @@
package com.joshcough.minecraft.examples
+import com.joshcough.minecraft.PluginConfig
import com.joshcough.minecraft.Listeners._
import org.bukkit.entity.EntityType.ARROW
-class LightningArrows extends ListeningFor(OnEntityDamageByEntity { e =>
+class LightningArrowsPlugin extends ListeningFor(OnEntityDamageByEntity { e =>
if (e.damager isAn ARROW) e.damagee.shock
-})
\ No newline at end of file
+})
+
+class LightningArrowsConfig extends PluginConfig[LightningArrowsPlugin] {
+ val pluginClass = classOf[LightningArrowsPlugin]
+}
diff --git a/examples/MultiPlayerCommands/MultiPlayerCommands.scala b/examples/MultiPlayerCommands/MultiPlayerCommands.scala
index 656240d5..916890f7 100644
--- a/examples/MultiPlayerCommands/MultiPlayerCommands.scala
+++ b/examples/MultiPlayerCommands/MultiPlayerCommands.scala
@@ -1,20 +1,31 @@
package com.joshcough.minecraft.examples
+
+import scala.collection.JavaConverters.asScala
+import com.joshcough.minecraft._
+import org.bukkit.{Material, Server}
import org.bukkit.GameMode._
import org.bukkit.Material._
import org.bukkit.entity.EntityType._
-import scala.collection.JavaConversions._
-import com.joshcough.minecraft.CommandsPlugin
-import org.bukkit.Material
/**
* Classic MultiPlayerCommands plugin, done in Scala.
* Gives a whole pile of useful commands.
* Their descriptions serve well as documentation.
*/
-class MultiPlayerCommands extends CommandsPlugin {
+class MultiPlayerCommandsPlugin extends CommandsPlugin {
+ val commands = MultiPlayerCommandsCommands.commands(server)
+}
+
+class MultiPlayerCommandsConfig extends PluginConfig[MultiPlayerCommandsPlugin] {
+ val pluginClass = classOf[MultiPlayerCommandsPlugin]
+ override val commands = MultiPlayerCommandsCommands.commands(null)
+}
+
+object MultiPlayerCommandsCommands {
+ import CommandsPlugin._
- val commands = List(
+ def commands(implicit server: Server) = List(
Command("goto", "Teleport!", player or location){ case (you, e) =>
e.fold(them => you teleportTo them, loc => you.teleport(loc of you.world))
@@ -24,25 +35,16 @@ class MultiPlayerCommands extends CommandsPlugin {
Command("set-time", "Sets the time.", time){ case (p, n) => p.world setTime n },
- Command("day", "Sets the time to day (1000).") (_.world setTime 1000),
-
- Command("night", "Sets the time to night (15000).")(_.world setTime 15000),
-
- Command("gms", "Set your game mode to survival.")(_ setGameMode SURVIVAL),
-
- Command("gmc", "Set your game mode to creative.")(_ setGameMode CREATIVE),
-
Command("gm", "Set your game mode.", gamemode){ case (p, gm) => p setGameMode gm },
- Command("entities", "Display all the entities.")(p => p !* (p.world.entities.map(_.toString): _*)),
+ Command("entities", "Display all the entities.")(p => p !* (p.world.entities.map(_.toString))),
Command("spawn", "Spawn some mobs.", entity ~ int.?.named("number to spawn")){
case (p, e ~ n) => p.loc.spawnN(e, n.fold(1)(id))
},
- Command("ban", "Ban some players.", anyString.named("player").+){ case (you, them) =>
- server.findOnlinePlayers (them) foreach { _ ban s"${you.name} doesn't like you." }
- server.findOfflinePlayers(them) foreach { _ setBanned true }
+ Command("ban", "Ban some players.", player.+){ case (you, them) =>
+ them.foreach(_.ban(s"${you.name} doesn't like you.", you))
},
Command("box", "Put a box around yourself, made of any material.", material){ case (p,m) =>
@@ -60,7 +62,7 @@ class MultiPlayerCommands extends CommandsPlugin {
Command("drill", "Drill down to bedrock immediately.")(p =>
for (b <- p.blockOn.blocksBelow.takeWhile(_ isNot BEDROCK); if b isNot AIR) {
b.erase
- if (b.blockBelow is BEDROCK) b nthBlockAbove 2 changeTo STATIONARY_WATER
+ if (b.blockBelow is BEDROCK) b nthBlockAbove 2 changeTo WATER
}
),
@@ -84,15 +86,15 @@ class MultiPlayerCommands extends CommandsPlugin {
OpOnly(P2P("shock", "Shock a player.")((you, them) => you.doTo(them, them.shock, "shocked"))),
- OpOnly(Command("lamp", "Spawns a lamp wherever you are looking."){ p =>
- val b = p.getTargetBlock(null, 1000)
- if((b is Material.AIR) || math.abs(p.x - b.x) > 50 || math.abs(p.z - b.z) > 50)
- p ! s"That's more than 50 blocks away. (x: ${math.abs(p.x - b.x)}) (z: ${math.abs(p.z - b.z)})"
- else {
- b.blockBelow.changeTo(Material.REDSTONE_TORCH_ON)
- b.changeTo(Material.REDSTONE_LAMP_ON)
- }
- }),
+// OpOnly(Command("lamp", "Spawns a lamp wherever you are looking."){ p =>
+// val b = p.getTargetBlock(null, 1000)
+// if((b is Material.AIR) || math.abs(p.x - b.x) > 50 || math.abs(p.z - b.z) > 50)
+// p ! s"That's more than 50 blocks away. (x: ${math.abs(p.x - b.x)}) (z: ${math.abs(p.z - b.z)})"
+// else {
+// b.blockBelow.changeTo(Material.REDSTONE_TORCH_ON)
+// b.changeTo(Material.REDSTONE_LAMP_ON)
+// }
+// }),
Command("jump", "Jump really high.", (int ~ int ~ int) or eof){
case (p, Left(x ~ y ~ z)) => p.setVelocity(new org.bukkit.util.Vector(x, y, z))
@@ -102,7 +104,6 @@ class MultiPlayerCommands extends CommandsPlugin {
}
/**
-
p = player
t = target
@@ -123,5 +124,4 @@ looking more towards the x axis:
hmm...use those weights?: Vector(x=7.5, y=10, z=2.5)
similar with z axis.
-
*/
\ No newline at end of file
diff --git a/examples/NoRain/NoRain.scala b/examples/NoRain/NoRain.scala
index a3507072..b70333ae 100644
--- a/examples/NoRain/NoRain.scala
+++ b/examples/NoRain/NoRain.scala
@@ -1,8 +1,12 @@
package com.joshcough.minecraft.examples
-import com.joshcough.minecraft.{ListenerPlugin, Listeners}
+import com.joshcough.minecraft._
import Listeners._
-class NoRain extends ListenerPlugin {
+class NoRainPlugin extends ListenerPlugin {
val listener = OnWeatherChange(e => e.cancelIf(e.rain, broadcast("Put up an umbrella.")))
-}
\ No newline at end of file
+}
+
+class NoRainConfig extends PluginConfig[NoRainPlugin] {
+ val pluginClass = classOf[NoRainPlugin]
+}
diff --git a/examples/PluginCommander/PluginCommander.scala b/examples/PluginCommander/PluginCommander.scala
index a6d7d4be..27d46a18 100644
--- a/examples/PluginCommander/PluginCommander.scala
+++ b/examples/PluginCommander/PluginCommander.scala
@@ -1,9 +1,20 @@
package com.joshcough.minecraft.examples
-import com.joshcough.minecraft.CommandsPlugin
+import com.joshcough.minecraft._
+import CommandsPlugin._
+import org.bukkit.plugin.{PluginManager}
-class PluginCommander extends CommandsPlugin {
- val commands = List(
+class PluginCommanderPlugin extends CommandsPlugin {
+ val commands = PluginCommanderCommands.commands(this.pluginManager)
+}
+
+class PluginCommanderConfig extends PluginConfig[PluginCommanderPlugin] {
+ val pluginClass = classOf[PluginCommanderPlugin]
+ override val commands = PluginCommanderCommands.commands(null)
+}
+
+object PluginCommanderCommands {
+ def commands(implicit pluginManager: PluginManager) = List(
Command("enable", "Enable some plugins", plugin.+){
case (_, plugins) => plugins foreach pluginManager.enablePlugin
},
@@ -11,4 +22,4 @@ class PluginCommander extends CommandsPlugin {
case (_, plugins) => plugins foreach pluginManager.disablePlugin
}
)
-}
\ No newline at end of file
+}
diff --git a/examples/Shock/Shock.scala b/examples/Shock/Shock.scala
index be1c510a..2d6ad6f1 100644
--- a/examples/Shock/Shock.scala
+++ b/examples/Shock/Shock.scala
@@ -1,9 +1,19 @@
package com.joshcough.minecraft.examples
-import com.joshcough.minecraft.CommandPlugin
+import com.joshcough.minecraft._
+import CommandsPlugin._
+import org.bukkit.Server
-class Shock extends CommandPlugin {
- val command = Command("shock", "shock a player", player){ case (you, them) =>
- them.shock
- }
+class ShockPlugin extends CommandPlugin {
+ val command = ShockCommands.command(this.server)
+}
+
+class ShockConfig extends PluginConfig[ShockPlugin] {
+ val pluginClass = classOf[ShockPlugin]
+ override val commands = List(ShockCommands.command(null))
+}
+
+object ShockCommands {
+ def command(implicit server: Server) =
+ Command("shock", "shock a player", player){ case (_, them) => them.shock }
}
diff --git a/examples/Warp/Warp.scala b/examples/Warp/Warp.scala
new file mode 100644
index 00000000..868f14c3
--- /dev/null
+++ b/examples/Warp/Warp.scala
@@ -0,0 +1,118 @@
+package com.joshcough.minecraft.examples
+
+import org.bukkit.{Location, World}
+import org.bukkit.entity.Player
+import com.joshcough.minecraft._
+import java.io.File
+
+import org.bukkit.configuration.file.YamlConfiguration
+
+import scala.jdk.CollectionConverters._
+import BukkitEnrichment._
+
+/**
+ * Classic Warp Plugin example, done in Scala.
+ *
+ * Allows players to create warp locations that they can
+ * later warp to. This is good for getting around quickly,
+ * and even better for not worrying about getting lost.
+ *
+ * This plugin also serves as a useful example of how to use the database.
+ * The Warp class is an 'Entity' that gets saved in the database.
+ * Any data saved in the database persists across user logouts, and server restarts.
+ */
+class WarpPlugin extends CommandsPlugin {
+ val commands = WarpCommands.commands(getDataFolder())
+}
+
+object Warp {
+ import com.joshcough.minecraft.CommandsPlugin._
+
+ def warpToken: Parser[String] = anyStringAs("warp-name")
+
+ def getConfig(player: Player)(implicit dataFolder: File): YamlConfiguration = {
+ val configFile = new File(dataFolder, player.getUniqueId.toString + ".yml")
+ YamlConfiguration.loadConfiguration(configFile)
+ }
+
+ def saveConfig(config: YamlConfiguration, player: Player)(implicit dataFolder: File) = {
+ val configFile = new File(dataFolder, player.getUniqueId.toString + ".yml")
+ config.save(configFile)
+ }
+
+ def withConfig[A](player: Player)(f : YamlConfiguration => A)(implicit dataFolder: File): A = {
+ val config = getConfig(player)
+ val a = f(config)
+ saveConfig(config, player)
+ a
+ }
+
+ def setWarp(w:Warp)(implicit dataFolder: File): Unit = Warp.withConfig(w.player){ config =>
+ config.set(w.warpName, s"${w.x}, ${w.y}, ${w.z}")
+ println("warps: " + getAllWarps(w.player))
+ }
+
+ def deleteWarp(player: Player, warpName: String)(implicit dataFolder: File): Unit = Warp.withConfig(player){ config =>
+ config.set(warpName, null)
+ println("warps: " + getAllWarps(player))
+ }
+
+ def getWarp(player: Player, warpName: String)(implicit dataFolder: File): Option[Warp] = Warp.withConfig(player){ config =>
+ val locString = Option(config.getString(warpName))
+ locString.map{xyz =>
+ val Array(x,y,z) = xyz.split(",").map(_.toDouble)
+ Warp(warpName, player, x, y, z)
+ }
+ }
+
+ def getAllWarps(player: Player)(implicit dataFolder: File): List[String] = Warp.withConfig(player){ config =>
+ config.getKeys(false).asScala.toList.sorted
+ }
+}
+
+case class Warp(warpName: String, player: Player, x: Double, y: Double, z: Double) {
+ def location(world: World) = new Location(world, x, y, z)
+ def warp = player teleport location(player.world)
+}
+
+class WarpConfig extends PluginConfig[WarpPlugin] {
+ val pluginClass = classOf[WarpPlugin]
+ override val commands = WarpCommands.commands(null)
+}
+
+object WarpCommands {
+
+ import CommandsPlugin._
+ import Warp._
+
+ def commands(implicit dataFolder: File): List[Command] = {
+ List(
+ Command("warps", "List all warps.")(p => getAllWarps(p).foreach(w => p ! w)),
+ Command("warp", "Warp to the given warp location.", warpToken){ case (p, wt) =>
+ getWarp(p, wt).foreach{ _.warp }
+ },
+ Command("set-warp", "Create a new warp location.", warpToken){ case (p, warpName) =>
+ setWarp(Warp(warpName, p, p.x, p.y, p.z))
+ p ! s"created warp: $warpName"
+ },
+ Command("delete-warp", "Delete a warp.", warpToken){ case (p, warpName) =>
+ deleteWarp(p, warpName)
+ p ! s"deleted warp: $warpName"
+ },
+ Command("home", desc="Warp home.") { case p =>
+ getWarp(p, "home").foreach{ _.warp }
+ },
+ Command("set-home", desc="Set your home location.") { case p =>
+ setWarp(Warp("home", p, p.x, p.y, p.z))
+ },
+ Command("delete-home", "Delete your home location."){ case p =>
+ deleteWarp(p, "home")
+ p ! s"deleted warp: home"
+ },
+ Command("delete-all", "Delete all your warps.")(p =>
+ getAllWarps(p).foreach(deleteWarp(p, _))
+ ),
+ Command("bogus", "bogus")(p => p ! "bogus")
+ )
+ }
+}
diff --git a/examples/WorldEdit/WorldEdit.scala b/examples/WorldEdit/WorldEdit.scala
index d3b6e56e..56db172a 100644
--- a/examples/WorldEdit/WorldEdit.scala
+++ b/examples/WorldEdit/WorldEdit.scala
@@ -8,204 +8,254 @@ import com.joshcough.minecraft._
import com.joshcough.minecraft.UndoState
/**
- * Classic WorldEdit plugin, done in Scala.
- *
- * This plugin allows you to manipulate the world in various ways.
- *
- * To do this, first set two corners of the world by:
- * Using the /wand command to get a wooden axe.
- * Left clicking on the first corner with a wooden axe.
- * Right clicking on the second corner with a wooden axe.
- * Or alternatively, using the pos1 and pos2 commands.
- *
- * After you've set your two corners, you can manipulate blocks in that cube.
- *
- * Popular world manipulation commands are:
- *
- * /set material: sets all the blocks in the cube to the given material
- * /change m1 m2: changes all the blocks of type m1 to m2
- * /walls material: sets the walls of the cube to the given material
- *
- * Have a look through the code, or navigate the help menu for more info on the commands.
- */
-class WorldEdit extends ListenersPlugin with CommandsPlugin with CubeState {
+ * Classic WorldEdit plugin, done in Scala.
+ *
+ * This plugin allows you to manipulate the world in various ways.
+ *
+ * To do this, first set two corners of the world by:
+ * Using the /wand command to get a wooden axe.
+ * Left clicking on the first corner with a wooden axe.
+ * Right clicking on the second corner with a wooden axe.
+ * Or alternatively, using the pos1 and pos2 commands.
+ *
+ * After you've set your two corners, you can manipulate blocks in that cube.
+ *
+ * Popular world manipulation commands are:
+ *
+ * /set material: sets all the blocks in the cube to the given material
+ * /change m1 m2: changes all the blocks of type m1 to m2
+ * /walls material: sets the walls of the cube to the given material
+ *
+ * Have a look through the code, or navigate the help menu for more info on the commands.
+ */
+class WorldEditPlugin extends ListenersPlugin with CommandsPlugin {
+ val cubeState = new CubeState{}
+ val listeners = List(
+ OnLeftClickBlock ((p, e) => if(p isHoldingA WOODEN_AXE){ cubeState.setFirstPosition (p, e.loc); e.cancel }),
+ OnRightClickBlock((p, e) => if(p isHoldingA WOODEN_AXE){ cubeState.setSecondPosition(p, e.loc) })
+ )
+ val commands = WorldEditCommands.commands(getConfig(), cubeState)(server, this)
+}
- import CubeModifier._
+class WorldEditConfig extends PluginConfig[WorldEditPlugin] {
+ val pluginClass = classOf[WorldEditPlugin]
+ override val commands = WorldEditCommands.commands(null, null)(null, null)
+}
- lazy val tasks = new PlayerTasks
- import tasks._
+object WorldEditCommands {
+ import CubeModifier._
+ import CommandsPlugin._
+ import org.bukkit.Server
+ import org.bukkit.configuration.file.FileConfiguration
val undoManager = new UndoManager[Player, Changes, Changes]
- val listeners = List(
- OnLeftClickBlock ((p, e) => if(p isHoldingA WOOD_AXE){ setFirstPosition (p, e.loc); e.cancel }),
- OnRightClickBlock((p, e) => if(p isHoldingA WOOD_AXE){ setSecondPosition(p, e.loc) })
- )
+ def commands(config: FileConfiguration, cubeState: CubeState)(implicit server: Server, plugin: ScalaPlugin) = {
+ import cubeState._
+ import org.bukkit.GameMode._
+ val TaskManager = new TaskManager(server, plugin)
+ import TaskManager._
+ lazy val tasks = new PlayerTasks
+ import tasks._
- val commands = List(
- Command("getconf", "get a config", anyString){ case (p, s) =>
- p ! this.getConfig.getString(s)
- },
- Command("wand", "Get a WorldEdit wand.")(_.loc.dropItem(WOOD_AXE)),
- Command("pos1", "Set the first position", location.?){ case (p, loc) =>
- setFirstPosition (p, loc.fold(p.loc)(_(p.world)))
- },
- Command("pos2", "Set the second position", location.?){ case (p, loc) =>
- setSecondPosition(p, loc.fold(p.loc)(_(p.world)))
- },
- Command(
- name = "set",
- desc = "Set all the selected blocks to the given material type.",
- args = material)(
- body = { case (p, m) => p.newChange(setAll(cube(p), m)) }
- ),
- Command(
- name = "replace",
- desc = "Replace all the selected blocks of the first material type to the second material type.",
- args = material ~ material)(
- body = { case (p, oldM ~ newM) => p.newChange(changeAll(cube(p), oldM, newM.andData)) }
- ),
- Command(
- name = "undo",
- desc = "undo!",
- args = "on" or "off" or eof)(
- body = {
- case (p, Left(Left("on"))) => undoManager.turnOn
- case (p, Left(Right("off"))) => undoManager.turnOff
- case (p, _) => if(undoManager.on) p.undo else p ! "undo is off!"
- }
- ),
- Command(name = "redo", desc = "redo!")(body = p => if(undoManager.on) p.redo else p ! "undo is off!"),
- Command("paste", "Paste your cube at your current location!"){ p =>
- p.newChange(cube(p).translateTo(p.loc.point))
- },
- Command("move", "Move your cube to your current location!"){ p =>
- p.newChange(
- translateAll(cube(p).translateTo(p.loc.point)) ++ setAll(cube(p), Material.AIR)
+ // some simple useful commands
+ val allCommonCommands = {
+ List(
+ Command("goto", "Teleport to a player.", player or location){
+ case (you, Left(them)) => you.teleportTo(them)
+ case (you, Right(loc)) => you.teleport(loc of you.world)
+ },
+ Command("day", "Sets the time to 1." )(_.world.setTime(1)),
+ Command("night", "Sets the time to 15000.")(_.world.setTime(15000)),
+ Command("s", "Set your game mode to survival.")(_.setGameMode(SURVIVAL)),
+ Command("c", "Set your game mode to creative.")(_.setGameMode(CREATIVE))
)
- },
- Command("flip", "Flip your cube upside down!"){ p => p.newChange(cube(p).mirrorY, force = true) },
- Command("flipxz", "Flip x and z"){ p =>
- p.newChange(cube(p).mirrorX.mirrorZ, force = true)
- },
- Command("paste-mirror-y", "paste your cube somewhere, but flipped upside down!"){ p =>
- p.newChange(cube(p).translateTo(p.loc.point).mirrorY, force = true)
- },
- Command("goto", "Teleport!", location){ case (you, loc) => you teleport loc(you.world) },
- Command("cube-to", "Set both positions", location ~ location.?){ case (p, loc1 ~ loc2) =>
- setFirstPosition (p, loc1(p.world))
- setSecondPosition(p, loc2.fold(p.loc)(_(p.world)))
- },
- Command("between", "Set both positions", location ~ "-" ~ location){ case (p, loc1 ~_~ loc2) =>
- setFirstPosition (p, loc1(p.world))
- setSecondPosition(p, loc2(p.world))
- p teleport loc1(p.world)
- },
- Command(
- name = "find",
- desc = "Checks if your cube contains any of the given material, and tells where.",
- args = material)(
- body = { case (p, m) =>
- cube(p).blocks.find(_ is m).fold(s"No $m found in your cube!")(b => s"$m found at ${b.loc.xyz}")
- }
- ),
- Command("erase", "Set all the selected blocks to air.")(p => p.newChange(eraseAll(cube(p)))),
- Command(
- name = "fib-tower",
- desc = "create a tower from the fib numbers",
- args = int ~ material){ case (p, i ~ m) =>
- lazy val fibs: Stream[Int] = 0 #:: 1 #:: fibs.zip(fibs.tail).map{case (i,j) => i+j}
- p.newChange(for {
- (startBlock,n) <- p.world.fromX(p.loc).zip(fibs take i)
- towerBlock <- startBlock.andBlocksAbove take n
- } yield PotentialChange(towerBlock, m))
- },
- Command(
- name = "walls",
- desc = "Create walls with the given material type.",
- args = material)(
- body = { case (p, m) => p.newChange(cube(p).walls.map(PotentialChange(_, m))) }
- ),
- Command(
- name = "empty-tower",
- desc = "Create walls and floor with the given material type, and set everything inside to air.",
- args = material)(
- body = { case (p, m) =>
- p.newChange(for(b <- cube(p).blocks) yield PotentialChange(b,
- if (cube(p).onWall(b.point) || cube(p).onFloor(b.point)) m else AIR)
+ }
+
+ val worldEditCommands = List(
+ // TODO: why is this in world edit? wtf
+ Command("getconf", "get a config", anyString){ case (p, s) =>
+ p ! config.getString(s)
+ },
+ Command("wand", "Get a WorldEdit wand.")(_.loc.dropItem(WOODEN_AXE)),
+ Command("pos1", "Set the first position", location.?){ case (p, loc) =>
+ setFirstPosition (p, loc.fold(p.loc)(_(p.world)))
+ },
+ Command("pos2", "Set the second position", location.?){ case (p, loc) =>
+ setSecondPosition(p, loc.fold(p.loc)(_(p.world)))
+ },
+ Command(
+ name = "set",
+ desc = "Set all the selected blocks to the given material type.",
+ args = material)(
+ body = { case (p, m) => p.newChange(setAll(cube(p), m)) }
+ ),
+ // example: /replace sand obsidian
+ Command(
+ name = "replace",
+ desc = "Replace all the selected blocks of the first material type to the second material type.",
+ args = material ~ material)(
+ body = { case (p, oldM ~ newM) => p.newChange(changeAll(cube(p), oldM, newM.andData)) }
+ ),
+ // example: /replace-under stone air dirt
+ Command(
+ name = "replace-under",
+ desc = "Replace all the selected blocks of the first material type under the second material type, to the third material type.",
+ args = material ~ material ~ material)(
+ body = { case (p, oldM ~ underM ~ newM) =>
+ p.newChange(changeAllUnder(cube(p), oldM, underM, newM.andData))
+ }
+ ),
+ Command(
+ name = "undo",
+ desc = "undo!",
+ args = "on" or "off" or eof)(
+ body = {
+ case (p, Left(Left("on"))) => undoManager.turnOn
+ case (p, Left(Right("off"))) => undoManager.turnOff
+ case (p, _) => if(undoManager.on) p.undo else p ! "undo is off!"
+ }
+ ),
+ Command(name = "redo", desc = "redo!")(body = p => if(undoManager.on) p.redo else p ! "undo is off!"),
+ Command("paste", "Paste your cube at your current location!"){ p =>
+ p.newChange(cube(p).translateTo(p.loc.point))
+ },
+ Command("move", "Move your cube to your current location!"){ p =>
+ p.newChange(
+ translateAll(cube(p).translateTo(p.loc.point)) ++ setAll(cube(p), Material.AIR)
)
- }
- ),
- Command(
- name = "dig",
- desc = "Dig",
- args = oddNum ~ int)(
- body = { case (p, radius ~ depth) =>
- val b = radius / 2
- val (x, y, z) = p.loc.xyzd
- p.newChange(eraseAll(p.world(x + b, y, z + b).cubeTo(p.world(x - b, y - depth, z - b))))
- }
- ),
- Command(
- name = "cycle-walls",
- desc =
- "Create walls, and cycle the walls material between the given materials, " +
- "in a span of N seconds.",
- args = int ~ material ~ material.+)(
- body = { case (p, period ~ initialMaterial ~ materials) =>
- val c = cube(p)
- val allMaterials = initialMaterial :: materials
- def initialDelay(index: Int) = index * period * 20 / allMaterials.size
- for((m, i) <- allMaterials.zipWithIndex)
- p.scheduleSyncRepeatingTask(initialDelay = initialDelay(i), period = period * 20){
- c.walls.foreach(_ changeTo m)
- }
- }
- ),
- Command(
- name = "random-house",
- desc = "make all the blocks in your house change at random!",
- args = material ~ material.+)(
- body = { case (p, initialMaterial ~ materials) =>
- val c = cube(p)
- val allMaterials = (initialMaterial :: materials).toArray
- p.scheduleSyncRepeatingTask(initialDelay = 0, period = 20){
- c.shell.foreach(_ changeTo (allMaterials((math.random * allMaterials.size).toInt)))
+ },
+ Command("flip", "Flip your cube upside down!"){ p => p.newChange(cube(p).mirrorY, force = true) },
+ Command("flipxz", "Flip x and z"){ p =>
+ p.newChange(cube(p).mirrorX.mirrorZ, force = true)
+ },
+ Command("paste-mirror-y", "paste your cube somewhere, but flipped upside down!"){ p =>
+ p.newChange(cube(p).translateTo(p.loc.point).mirrorY, force = true)
+ },
+ Command("goto", "Teleport!", location){ case (you, loc) => you teleport loc(you.world) },
+ Command("cube-to", "Set both positions", location ~ location.?){ case (p, loc1 ~ loc2) =>
+ setFirstPosition (p, loc1(p.world))
+ setSecondPosition(p, loc2.fold(p.loc)(_(p.world)))
+ },
+ Command("between", "Set both positions", location ~ "-" ~ location){ case (p, loc1 ~_~ loc2) =>
+ setFirstPosition (p, loc1(p.world))
+ setSecondPosition(p, loc2(p.world))
+ p teleport loc1(p.world)
+ },
+ Command(
+ name = "find",
+ desc = "Checks if your cube contains any of the given material, and tells where.",
+ args = material)(
+ body = { case (p, m) =>
+ cube(p).blocks.find(_ is m).fold(s"No $m found in your cube!")(b => s"$m found at ${b.loc.xyz}")
+ }
+ ),
+ Command("erase", "Set all the selected blocks to air.")(p => p.newChange(eraseAll(cube(p)))),
+ Command(
+ name = "fib-tower",
+ desc = "create a tower from the fib numbers",
+ args = int ~ material){ case (p, i ~ m) =>
+ lazy val fibs: LazyList[Int] = 0 #:: 1 #:: fibs.zip(fibs.tail).map{case (i,j) => i+j}
+ p.newChange(for {
+ (startBlock,n) <- p.world.fromX(p.loc).zip(fibs take i)
+ towerBlock <- startBlock.andBlocksAbove take n
+ } yield PotentialChange(towerBlock, m))
+ },
+ Command(
+ name = "walls",
+ desc = "Create walls with the given material type.",
+ args = material)(
+ body = { case (p, m) => p.newChange(cube(p).walls.map(PotentialChange(_, m))) }
+ ),
+ Command(
+ name = "empty-tower",
+ desc = "Create walls and floor with the given material type, and set everything inside to air.",
+ args = material)(
+ body = { case (p, m) =>
+ p.newChange(for(b <- cube(p).blocks) yield PotentialChange(b,
+ if (cube(p).onWall(b.point) || cube(p).onFloor(b.point)) m else AIR)
+ )
}
- p.scheduleSyncRepeatingTask(initialDelay = 0, period = 10){
- c.shrink(1, 1, 1).corners.foreach(_ changeTo TORCH)
+ ),
+ Command(
+ name = "dig",
+ desc = "Dig",
+ args = oddNum ~ int)(
+ body = { case (p, radius ~ depth) =>
+ val b = radius / 2
+ val (x, y, z) = p.loc.xyzd
+ p.newChange(eraseAll(p.world(x + b, y, z + b).cubeTo(p.world(x - b, y - depth, z - b))))
}
- }
- ),
- Command(
- name = "wave",
- desc = "Create an awesome wave made of any material.",
- args = length ~ height ~ material)(
- body = { case (p, length ~ height ~ m) =>
- val startX = p.x
- val minHeight = p.y
- val maxHeight = minHeight + height
- val z = p.z
- val up = true
- val down = false
- val directions = Array.fill(length)(up)
- def highestBlock(n: Int) = p.world.getHighestBlockAt(n + startX, z)
-
- for (n <- 0 to length)
- p.scheduleSyncRepeatingTask(initialDelay = n * 10, period = 10 /* every .5 second */ ){
- def hb = highestBlock(n)
- def ascending = directions(n)
- def descending = ! ascending
- def startAscent = directions(n) = up
- def startDescent = directions(n) = down
- def atTop = hb.y >= maxHeight
- def atBottom = hb.y <= minHeight
- if(ascending && atTop) startDescent else if(descending && atBottom) startAscent
- if(ascending) hb changeTo m else hb.blockBelow changeTo AIR
+ ),
+ Command("goto", "Teleport!", player(server) or location){ case (you, e) =>
+ e.fold(them => you teleportTo them, loc => you.teleport(loc of you.world))
+ },
+ Command("up", "Go up to the surface.")(_.surface),
+ Command("set-time", "Sets the time.", time){ case (p, n) => p.world setTime n },
+ Command("day", "Sets the time to day (1000).") (_.world setTime 1000),
+ Command("night", "Sets the time to night (15000).")(_.world setTime 15000),
+ Command(
+ name = "cycle-walls",
+ desc =
+ "Create walls, and cycle the walls material between the given materials, " +
+ "in a span of N seconds.",
+ args = int ~ material ~ material.+)(
+ body = { case (p, period ~ initialMaterial ~ materials) =>
+ val c = cube(p)
+ val allMaterials = initialMaterial :: materials
+ def initialDelay(index: Int) = index * period * 20 / allMaterials.size
+ for((m, i) <- allMaterials.zipWithIndex)
+ p.scheduleSyncRepeatingTask(initialDelay = initialDelay(i), period = period * 20){
+ c.walls.foreach(_ changeTo m)
+ }
+ }
+ ),
+ Command(
+ name = "random-house",
+ desc = "make all the blocks in your house change at random!",
+ args = material ~ material.+)(
+ body = { case (p, initialMaterial ~ materials) =>
+ val c = cube(p)
+ val allMaterials = (initialMaterial :: materials).toArray
+ p.scheduleSyncRepeatingTask(initialDelay = 0, period = 20){
+ c.shell.foreach(_ changeTo (allMaterials((math.random() * allMaterials.size).toInt)))
+ }
+ p.scheduleSyncRepeatingTask(initialDelay = 0, period = 10){
+ c.shrink(1, 1, 1).corners.foreach(_ changeTo TORCH)
}
- }
+ }
+ ),
+ Command(
+ name = "wave",
+ desc = "Create an awesome wave made of any material.",
+ args = length ~ height ~ material)(
+ body = { case (p, length ~ height ~ m) =>
+ val startX = p.x
+ val minHeight = p.y
+ val maxHeight = minHeight + height
+ val z = p.z
+ val up = true
+ val down = false
+ val directions = Array.fill(length)(up)
+ def highestBlock(n: Int) = p.world.getHighestBlockAt(n + startX, z)
+
+ for (n <- 0 to length)
+ p.scheduleSyncRepeatingTask(initialDelay = n * 10, period = 10 /* every .5 second */ ){
+ def hb = highestBlock(n)
+ def ascending = directions(n)
+ def descending = ! ascending
+ def startAscent = directions(n) = up
+ def startDescent = directions(n) = down
+ def atTop = hb.y >= maxHeight
+ def atBottom = hb.y <= minHeight
+ if(ascending && atTop) startDescent else if(descending && atBottom) startAscent
+ if(ascending) hb changeTo m else hb.blockBelow changeTo AIR
+ }
+ }
+ ),
)
- )
+ allCommonCommands ++ worldEditCommands
+ }
/**
*
@@ -215,8 +265,8 @@ class WorldEdit extends ListenersPlugin with CommandsPlugin with CubeState {
*/
class UndoManager[A, U, R] {
var on = true
- def turnOn { on = true }
- def turnOff{ on = false; state.clear() }
+ def turnOn: Unit = { on = true }
+ def turnOff: Unit = { on = false; state.clear() }
import collection.mutable.Map
val initialState = UndoState[U, R]()
val state = Map[A, UndoState[U, R]]().withDefaultValue(initialState)
@@ -227,11 +277,17 @@ class WorldEdit extends ListenersPlugin with CommandsPlugin with CubeState {
implicit class RichPlayerWithChanges(p: Player){
def newChange(cs: Changes): Changes = notifyChange(undoManager.newChange(p, cs))
- def newChange(ps: Seq[PotentialChange]): Unit = newChange(runChanges(ps))
+ def newChange(ps: LazyList[PotentialChange]): Unit = newChange(runChanges(ps))
def newChange(c: Cube[Block], force: Boolean = false): Unit = newChange(translateAll(c, force))
def undo: Unit = undoManager.undo(p)(rerun)
def redo: Unit = undoManager.redo(p)(rerun)
- def rerun(cs: Changes) = notifyChange(runChanges(cs.cs.map(PotentialChange(_))))
+ def rerun(cs: Changes): Changes = notifyChange(runChanges(cs.cs.toSeq.map(PotentialChange(_)).to(LazyList)))
def notifyChange(cs: Changes): Changes = { p ! s"${cs.size} blocks updated."; cs }
}
}
+
+
+
+
+
+
diff --git a/examples/src/main/scala/com/joshcough/minecraft/examples/WorldEditDemo.scala b/examples/src/main/scala/com/joshcough/minecraft/examples/WorldEditDemo.scala
index 90943efb..618f5222 100644
--- a/examples/src/main/scala/com/joshcough/minecraft/examples/WorldEditDemo.scala
+++ b/examples/src/main/scala/com/joshcough/minecraft/examples/WorldEditDemo.scala
@@ -4,15 +4,15 @@ import com.joshcough.minecraft.{CommandsPlugin, ListenersPlugin}
import org.bukkit.{Location, Material}
import org.bukkit.block.Block
import org.bukkit.entity.Player
-import Material.WOOD_AXE
+import Material.WOODEN_AXE
class WorldEditDemo extends ListenersPlugin with CommandsPlugin {
val corners = collection.mutable.Map[Player, List[Location]]().withDefaultValue(Nil)
val listeners = List(
- OnLeftClickBlock ((p, e) => if (p isHoldingA WOOD_AXE) { setFirstPos (p, e.loc); e.cancel }),
- OnRightClickBlock((p, e) => if (p isHoldingA WOOD_AXE) { setSecondPos(p, e.loc) })
+ OnLeftClickBlock ((p, e) => if (p isHoldingA WOODEN_AXE) { setFirstPos (p, e.loc); e.cancel }),
+ OnRightClickBlock((p, e) => if (p isHoldingA WOODEN_AXE) { setSecondPos(p, e.loc) })
)
val commands = List(
diff --git a/microexample/build.sbt b/microexample/build.sbt
index 53616ab9..ad945b07 100644
--- a/microexample/build.sbt
+++ b/microexample/build.sbt
@@ -4,10 +4,10 @@ version := "0.3.4"
organization := "examples"
-scalaVersion := "2.11.6"
+scalaVersion := "2.13.6"
// this specifies where to get the bukkit jar from.
-resolvers += "Bukkit" at "http://repo.bukkit.org/content/groups/public/"
+resolvers += "Bukkit" at "https://maven.elmakers.com/repository"
resolvers += Resolver.jcenterRepo
@@ -16,5 +16,5 @@ seq(pluginYmlSettings("com.example.BlockChanger", "JoshCough"):_*)
// plugins need to depend on com.joshcough.minecraft, and bukkit
libraryDependencies ++= Seq(
"com.joshcough" %% "scala-minecraft-plugin-api" % "0.3.4",
- "org.bukkit" % "bukkit" % "1.7.2-R0.2"
+ "org.bukkit" % "bukkit" % "1.16.1-R0.1" % "SNAPSHOT"
)
diff --git a/microexample/project/build.properties b/microexample/project/build.properties
index a6e117b6..09cac093 100644
--- a/microexample/project/build.properties
+++ b/microexample/project/build.properties
@@ -1 +1 @@
-sbt.version=0.13.8
+sbt.version=sbt.version
diff --git a/other/minelang/src/main/scala/com/joshcough/minecraft/ClojureInScala.scala b/other/minelang/src/main/scala/com/joshcough/minecraft/ClojureInScala.scala
index ca7afca6..7f397cec 100644
--- a/other/minelang/src/main/scala/com/joshcough/minecraft/ClojureInScala.scala
+++ b/other/minelang/src/main/scala/com/joshcough/minecraft/ClojureInScala.scala
@@ -591,7 +591,6 @@ object ClojureInScala {
import jline.console.ConsoleReader
import jline.console.history.FileHistory
import jline.console.completer._
- import scala.collection.JavaConversions._
trait ReplCommand
case object LastError extends ReplCommand
diff --git a/project/build.properties b/project/build.properties
index a6e117b6..3161d214 100644
--- a/project/build.properties
+++ b/project/build.properties
@@ -1 +1 @@
-sbt.version=0.13.8
+sbt.version=1.6.1
diff --git a/project/build.scala b/project/build.scala
deleted file mode 100644
index 44ce172a..00000000
--- a/project/build.scala
+++ /dev/null
@@ -1,198 +0,0 @@
-import sbt._
-import Keys._
-import java.io.File
-import sbtassembly.Plugin._
-import AssemblyKeys._
-
-trait Common {
-
- val projectUrl = "https://github.com/joshcough/MinecraftPlugins"
-
- lazy val standardSettings = join(
- Defaults.defaultSettings,
- libDeps(
- "javax.servlet" % "servlet-api" % "2.5" % "provided->default",
- "org.scalacheck" %% "scalacheck" % "1.11.3" % "test",
- "org.bukkit" % "bukkit" % "1.7.2-R0.2"
- ),
- Seq(
- organization := "com.joshcough",
- version := "0.3.4",
- scalaVersion := "2.11.6",
- crossScalaVersions := Seq("2.10.4", "2.11.6"),
- licenses <++= version(v => Seq("MIT" -> url(projectUrl + "/blob/%s/LICENSE".format(v)))),
- publishMavenStyle := true,
- resolvers ++= Seq(
- Resolver.jcenterRepo,
- Resolver.sonatypeRepo("snapshots"),
- "Bukkit" at "http://repo.bukkit.org/content/groups/public/"
- ),
- traceLevel := 10
- //,logLevel := Level.Warn
- )
- )
-
- // the core plugin library
- lazy val core = Project(
- id = "core",
- base = file("core"),
- settings = join(
- standardSettings,
- copyPluginToBukkitSettings(None),
- named("scala-minecraft-plugin-api"),
- libDeps("org.scalacheck" %% "scalacheck" % "1.10.0" % "test")
- )
- )
-
- def copyPluginToBukkitSettings(meta: Option[String]) = Seq(
- // make publish local also copy jars to my bukkit server :)
- publishLocal <<= (packagedArtifacts, publishLocal) map { case (r, _) =>
- r collectFirst { case (Artifact(_,"jar","jar", m, _, _, name), f) if m == meta =>
- println("copying " + f.name + " to bukkit server")
- IO.copyFile(f, new File("bukkit/plugins/" + f.name))
- }
- }
- )
-
- def join(settings: Seq[Def.Setting[_]]*) = settings.flatten
- def named(pname: String) = Seq(name := pname)
- def libDeps(libDeps: sbt.ModuleID*) = Seq(libraryDependencies ++= libDeps)
-
- def pluginYmlSettings(pluginClassname: String, author: String): Seq[Setting[_]] = Seq[Setting[_]](
- resourceGenerators in Compile <+=
- (resourceManaged in Compile, streams, productDirectories in Compile, dependencyClasspath in Compile, version, compile in Compile, runner) map {
- (dir, s, cp1, cp2, v, _, r) =>
- Run.run(
- "com.joshcough.minecraft.YMLGenerator", (Attributed.blankSeq(cp1) ++ cp2).map(_.data),
- Seq(pluginClassname, author, v, dir.getAbsolutePath),
- s.log)(r)
- Seq(dir / "plugin.yml", dir / "config.yml")
- }
- )
-
-}
-
-object build extends Build
- with Common
- with ExamplesBuild {
-
- // this is the main project, that builds all subprojects.
- // it doesnt contain any code itself.
- lazy val all = Project(
- id = "all",
- base = file("."),
- settings = standardSettings,
- aggregate = Seq(
- scalaLibPlugin,
- core,
- mineLang,
- //microExample,
- Arena,
- BanArrows,
- BlockChanger,
- BlockChangerGold,
- Farmer,
- GetOffMyLawn,
- God,
- LightningArrows,
- MultiPlayerCommands,
- NoRain,
- PluginCommander,
- Shock,
- TeleportBows,
- Thor,
- TreeDelogger,
- WorldEdit,
- YellowBrickRoad,
- ZombieApocalypse
- )
- )
-
- // this is just a convenience project
- // for me to easily publish my most used plugins to my bukkit server.
- // > sbt 'project commonPlugins' publishLocal
- lazy val commonPlugins = Project(
- id = "commonPlugins",
- base = file(".commonPlugins"),
- settings = standardSettings,
- aggregate = Seq(
- scalaLibPlugin,
- core,
- MultiPlayerCommands,
- PluginCommander,
- WorldEdit
- )
- )
-
- // this project supplies the scala language classes.
- // it is needed in the bukkit plugins dir to run any scala plugins.
- lazy val scalaLibPlugin = Project(
- id = "scalaLibPlugin",
- base = file("scala-lib-plugin"),
- settings = join(
- standardSettings,
- named("scala-minecraft-scala-library"),
- assemblySettings,
- copyPluginToBukkitSettings(Some("assembly"))
- )
- )
-
- // minelang is a plugin that contains a language i wrote that is much like clojure
- // and allows people to easily write plugins without having to deploy lots of crap.
- // however, this has more or less been replaced by erminecraft.
- lazy val mineLang = Project(
- id = "mineLang",
- base = file("other/minelang"),
- settings = join(
- standardSettings,
- pluginYmlSettings("com.joshcough.minecraft.MineLangPlugin", "JoshCough"),
- named("MineLang"),
- libDeps(
- "jline" % "jline" % "2.11",
- "org.clojure" % "clojure" % "1.4.0"
- )
- ),
- dependencies = Seq(core)
- )
-}
-
-trait ExamplesBuild extends Build with Common {
- // a special example project...
- lazy val microExample = Project(id = "microexample", base = file("microexample"))
-
- // a whole pile of example projects
- lazy val Arena = exampleProject("Arena")
- lazy val BanArrows = exampleProject("BanArrows")
- lazy val BlockChanger = exampleProject("BlockChanger")
- lazy val BlockChangerGold = exampleProject("BlockChangerGold")
- lazy val Farmer = exampleProject("Farmer")
- lazy val GetOffMyLawn = exampleProject("GetOffMyLawn")
- lazy val God = exampleProject("God")
- lazy val LightningArrows = exampleProject("LightningArrows")
- lazy val MultiPlayerCommands = exampleProject("MultiPlayerCommands")
- lazy val NoRain = exampleProject("NoRain")
- lazy val PluginCommander = exampleProject("PluginCommander")
- lazy val Shock = exampleProject("Shock")
- lazy val Thor = exampleProject("Thor")
- lazy val TeleportBows = exampleProject("TeleportBows")
- lazy val TreeDelogger = exampleProject("TreeDelogger")
- lazy val WorldEdit = exampleProject("WorldEdit")
- lazy val YellowBrickRoad = exampleProject("YellowBrickRoad")
- lazy val ZombieApocalypse = exampleProject("ZombieApocalypse")
-
- def exampleProject(exampleProjectName: String, deps: sbt.ModuleID*) = {
- val pluginClassname = "com.joshcough.minecraft.examples." + exampleProjectName
- Project(
- id = exampleProjectName,
- base = file("examples/" + exampleProjectName),
- settings = join(
- standardSettings,
- named(exampleProjectName),
- pluginYmlSettings(pluginClassname, "JoshCough"),
- copyPluginToBukkitSettings(None),
- libDeps(deps:_*)
- ),
- dependencies = Seq(core)
- )
- }
-}
diff --git a/project/minecraftplugin.scala b/project/minecraftplugin.scala
new file mode 100644
index 00000000..bfe8028b
--- /dev/null
+++ b/project/minecraftplugin.scala
@@ -0,0 +1,53 @@
+package com.joshcough.minecraft
+
+import sbt._, Keys._
+
+object MinecraftPluginPlugin extends AutoPlugin {
+ object autoImport {
+ val minecraftPluginAuthor = taskKey[String]("Author")
+ val minecraftPluginConfigClass = taskKey[String]("Plugin config class")
+ val minecraftPluginPublishLocal = taskKey[Unit]("Runs publishLocal, and copies jar file to bukkit plugins dir")
+ }
+
+ import autoImport._
+
+ def minecraftProject(author: String, pluginConfigClassName: String, bukkitDir: Option[File]) = Seq(
+ minecraftPluginAuthor := author,
+ minecraftPluginConfigClass := pluginConfigClassName,
+ generateYml,
+ copyPluginToBukkitSettings(bukkitDir)
+ )
+
+ def join(settings: Seq[Def.Setting[_]]*) = settings.flatten
+
+ def generateYml: Def.Setting[Seq[Task[Seq[File]]]] =
+ resourceGenerators in Compile += Def.task {
+ Run.run(
+ "com.joshcough.minecraft.YMLGenerator",
+ (productDirectories in Compile).value ++ (dependencyClasspath in Compile).value.map(_.data),
+ List(
+ name.value,
+ minecraftPluginAuthor.value,
+ version.value,
+ (resourceManaged in Compile).value.getAbsolutePath,
+ minecraftPluginConfigClass.value),
+ streams.value.log
+ )(runner.value)
+ Seq((resourceManaged in Compile).value / "plugin.yml")
+ }.taskValue
+
+ def copyPluginToBukkitSettings(bukkitDir: Option[File])=
+ minecraftPluginPublishLocal := {
+ publishLocal.value
+ packagedArtifacts.value.foreach{ case (a, f) =>
+ if(a.classifier.isEmpty && a.`type` == "jar") {
+ val out = bukkitDir match {
+ case None => new File("bukkit/plugins/" + f.name)
+ case Some(dir) => new File(dir.getAbsolutePath + "/plugins/", f.name)
+ }
+ println("copying " + f.name + " to bukkit server at " + out.getAbsolutePath)
+ IO.copyFile(f, out)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/project/plugins.sbt b/project/plugins.sbt
index 40eec516..dc96a6e9 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -1,14 +1,8 @@
resolvers += Resolver.url(
"Josh Cough sbt plugins",
- url("http://dl.bintray.com/content/joshcough/sbt-plugins"))(
+ url("https://dl.bintray.com/content/joshcough/sbt-plugins"))(
Resolver.ivyStylePatterns)
-resolvers ++= Seq(
- "Bukkit" at "http://repo.bukkit.org/content/groups/public/"
-)
+addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "1.1.0")
-addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0")
-
-addSbtPlugin("me.lessis" % "bintray-sbt" % "0.3.0")
-
-addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")
+addSbtPlugin("ch.epfl.scala" % "sbt-scala3-migrate" % "0.4.6")
\ No newline at end of file
diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt
index 8dd913f9..e69de29b 100644
--- a/project/project/plugins.sbt
+++ b/project/project/plugins.sbt
@@ -1 +0,0 @@
-addSbtPlugin("me.lessis" % "bintray-sbt" % "0.3.0")
diff --git a/sbt b/sbt
deleted file mode 100755
index 9b56fa19..00000000
--- a/sbt
+++ /dev/null
@@ -1,441 +0,0 @@
-#!/usr/bin/env bash
-#
-# A more capable sbt runner, coincidentally also called sbt.
-# Author: Paul Phillips
-
-# todo - make this dynamic
-declare -r sbt_release_version=0.13.8
-declare -r sbt_snapshot_version=0.13.9-SNAPSHOT
-
-unset sbt_jar sbt_dir sbt_create sbt_snapshot sbt_launch_dir
-unset scala_version java_home sbt_explicit_version
-unset verbose debug quiet
-
-for arg in "$@"; do
- case $arg in
- -q|-quiet) quiet=1 ;;
- *) ;;
- esac
-done
-
-build_props_sbt () {
- if [[ -f project/build.properties ]]; then
- versionLine=$(grep ^sbt.version project/build.properties)
- versionString=${versionLine##sbt.version=}
- echo "$versionString"
- fi
-}
-
-update_build_props_sbt () {
- local ver="$1"
- local old=$(build_props_sbt)
-
- if [[ $ver == $old ]]; then
- return
- elif [[ -f project/build.properties ]]; then
- perl -pi -e "s/^sbt\.version=.*\$/sbt.version=${ver}/" project/build.properties
- grep -q '^sbt.version=' project/build.properties || echo "sbt.version=${ver}" >> project/build.properties
-
- echo !!!
- echo !!! Updated file project/build.properties setting sbt.version to: $ver
- echo !!! Previous value was: $old
- echo !!!
- fi
-}
-
-sbt_version () {
- if [[ -n $sbt_explicit_version ]]; then
- echo $sbt_explicit_version
- else
- local v=$(build_props_sbt)
- if [[ -n $v ]]; then
- echo $v
- else
- echo $sbt_release_version
- fi
- fi
-}
-
-echoerr () {
- [[ -z $quiet ]] && echo 1>&2 "$@"
-}
-vlog () {
- [[ $verbose || $debug ]] && echoerr "$@"
-}
-dlog () {
- [[ $debug ]] && echoerr "$@"
-}
-
-# this seems to cover the bases on OSX, and someone will
-# have to tell me about the others.
-get_script_path () {
- local path="$1"
- [[ -L "$path" ]] || { echo "$path" ; return; }
-
- local target=$(readlink "$path")
- if [[ "${target:0:1}" == "/" ]]; then
- echo "$target"
- else
- echo "$(dirname $path)/$target"
- fi
-}
-
-# a ham-fisted attempt to move some memory settings in concert
-# so they need not be dicked around with individually.
-get_mem_opts () {
- local mem=${1:-1536}
- local perm=$(( $mem / 4 ))
- (( $perm > 256 )) || perm=256
- (( $perm < 1024 )) || perm=1024
- local codecache=$(( $perm / 2 ))
-
- echo "-Xms${mem}m -Xmx${mem}m -XX:MaxPermSize=${perm}m -XX:ReservedCodeCacheSize=${codecache}m"
-}
-
-die() {
- echo "Aborting: $@"
- exit 1
-}
-
-make_url () {
- groupid="$1"
- category="$2"
- version="$3"
-
- echo "http://typesafe.artifactoryonline.com/typesafe/ivy-$category/$groupid/sbt-launch/$version/sbt-launch.jar"
-}
-
-declare -r default_jvm_opts="-Dfile.encoding=UTF8"
-declare -r default_sbt_opts="-XX:+CMSClassUnloadingEnabled"
-declare -r default_sbt_mem=1536
-declare -r noshare_opts="-Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy"
-declare -r sbt_opts_file=".sbtopts"
-declare -r jvm_opts_file=".jvmopts"
-declare -r latest_28="2.8.2"
-declare -r latest_29="2.9.2"
-declare -r latest_210="2.11.6"
-
-declare -r script_path=$(get_script_path "$BASH_SOURCE")
-declare -r script_dir="$(dirname $script_path)"
-declare -r script_name="$(basename $script_path)"
-
-# some non-read-onlies set with defaults
-declare java_cmd=java
-declare sbt_launch_dir="$script_dir/.lib"
-declare sbt_universal_launcher="$script_dir/lib/sbt-launch.jar"
-declare sbt_mem=$default_sbt_mem
-declare sbt_jar=$sbt_universal_launcher
-
-# pull -J and -D options to give to java.
-declare -a residual_args
-declare -a java_args
-declare -a scalac_args
-declare -a sbt_commands
-
-build_props_scala () {
- if [[ -f project/build.properties ]]; then
- versionLine=$(grep ^build.scala.versions project/build.properties)
- versionString=${versionLine##build.scala.versions=}
- echo ${versionString%% .*}
- fi
-}
-
-execRunner () {
- # print the arguments one to a line, quoting any containing spaces
- [[ $verbose || $debug ]] && echo "# Executing command line:" && {
- for arg; do
- if printf "%s\n" "$arg" | grep -q ' '; then
- printf "\"%s\"\n" "$arg"
- else
- printf "%s\n" "$arg"
- fi
- done
- echo ""
- }
-
- exec "$@"
-}
-
-sbt_groupid () {
- case $(sbt_version) in
- 0.7.*) echo org.scala-tools.sbt ;;
- 0.10.*) echo org.scala-tools.sbt ;;
- 0.11.[12]) echo org.scala-tools.sbt ;;
- *) echo org.scala-sbt ;;
- esac
-}
-
-sbt_artifactory_list () {
- local version0=$(sbt_version)
- local version=${version0%-SNAPSHOT}
- local url="http://typesafe.artifactoryonline.com/typesafe/ivy-snapshots/$(sbt_groupid)/sbt-launch/"
- dlog "Looking for snapshot list at: $url "
-
- curl -s --list-only "$url" | \
- grep -F $version | \
- perl -e 'print reverse <>' | \
- perl -pe 's#^/dev/null
- dlog "curl returned: $?"
- echo "$url"
- return
- done
-}
-
-jar_url () {
- case $(sbt_version) in
- 0.7.*) echo "http://simple-build-tool.googlecode.com/files/sbt-launch-0.7.7.jar" ;;
- *-SNAPSHOT) make_snapshot_url ;;
- *) make_release_url ;;
- esac
-}
-
-jar_file () {
- echo "$sbt_launch_dir/$1/sbt-launch.jar"
-}
-
-download_url () {
- local url="$1"
- local jar="$2"
-
- echo "Downloading sbt launcher $(sbt_version):"
- echo " From $url"
- echo " To $jar"
-
- mkdir -p $(dirname "$jar") && {
- if which curl >/dev/null; then
- curl --fail --silent "$url" --output "$jar"
- elif which wget >/dev/null; then
- wget --quiet -O "$jar" "$url"
- fi
- } && [[ -f "$jar" ]]
-}
-
-acquire_sbt_jar () {
- sbt_url="$(jar_url)"
- sbt_jar="$(jar_file $(sbt_version))"
-
- [[ -f "$sbt_jar" ]] || download_url "$sbt_url" "$sbt_jar"
-}
-
-usage () {
- cat < path to global settings/plugins directory (default: ~/.sbt/)
- -sbt-boot path to shared boot directory (default: ~/.sbt/boot in 0.11 series)
- -ivy path to local Ivy repository (default: ~/.ivy2)
- -mem set memory options (default: $sbt_mem, which is
- $(get_mem_opts $sbt_mem) )
- -no-share use all local caches; no sharing
- -offline put sbt in offline mode
- -jvm-debug Turn on JVM debugging, open at the given port.
- -batch Disable interactive mode
-
- # sbt version (default: from project/build.properties if present, else latest release)
- !!! The only way to accomplish this pre-0.12.0 if there is a build.properties file which
- !!! contains an sbt.version property is to update the file on disk. That's what this does.
- -sbt-version use the specified version of sbt
- -sbt-jar use the specified jar as the sbt launcher
- -sbt-snapshot use a snapshot version of sbt
- -sbt-launch-dir directory to hold sbt launchers (default: $sbt_launch_dir)
-
- # scala version (default: as chosen by sbt)
- -28 use $latest_28
- -29 use $latest_29
- -210 use $latest_210
- -scala-home use the scala build at the specified directory
- -scala-version use the specified version of scala
-
- # java version (default: java from PATH, currently $(java -version |& grep version))
- -java-home alternate JAVA_HOME
-
- # jvm options and output control
- JAVA_OPTS environment variable holding jvm args, if unset uses "$default_jvm_opts"
- SBT_OPTS environment variable holding jvm args, if unset uses "$default_sbt_opts"
- .jvmopts if file is in sbt root, it is prepended to the args given to the jvm
- .sbtopts if file is in sbt root, it is prepended to the args given to **sbt**
- -Dkey=val pass -Dkey=val directly to the jvm
- -J-X pass option -X directly to the jvm (-J is stripped)
- -S-X add -X to sbt's scalacOptions (-J is stripped)
-
-In the case of duplicated or conflicting options, the order above
-shows precedence: JAVA_OPTS lowest, command line options highest.
-EOM
-}
-
-addJava () {
- dlog "[addJava] arg = '$1'"
- java_args=( "${java_args[@]}" "$1" )
-}
-addSbt () {
- dlog "[addSbt] arg = '$1'"
- sbt_commands=( "${sbt_commands[@]}" "$1" )
-}
-addScalac () {
- dlog "[addScalac] arg = '$1'"
- scalac_args=( "${scalac_args[@]}" "$1" )
-}
-addResidual () {
- dlog "[residual] arg = '$1'"
- residual_args=( "${residual_args[@]}" "$1" )
-}
-addResolver () {
- addSbt "set resolvers in ThisBuild += $1"
-}
-addDebugger () {
- addJava "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$1"
-}
-get_jvm_opts () {
- # echo "${JAVA_OPTS:-$default_jvm_opts}"
- # echo "${SBT_OPTS:-$default_sbt_opts}"
-
- [[ -f "$jvm_opts_file" ]] && cat "$jvm_opts_file"
-}
-
-process_args ()
-{
- require_arg () {
- local type="$1"
- local opt="$2"
- local arg="$3"
-
- if [[ -z "$arg" ]] || [[ "${arg:0:1}" == "-" ]]; then
- die "$opt requires <$type> argument"
- fi
- }
- while [[ $# -gt 0 ]]; do
- case "$1" in
- -h|-help) usage; exit 1 ;;
- -v|-verbose) verbose=1 && shift ;;
- -d|-debug) debug=1 && shift ;;
- -q|-quiet) quiet=1 && shift ;;
-
- -ivy) require_arg path "$1" "$2" && addJava "-Dsbt.ivy.home=$2" && shift 2 ;;
- -mem) require_arg integer "$1" "$2" && sbt_mem="$2" && shift 2 ;;
- -no-colors) addJava "-Dsbt.log.noformat=true" && shift ;;
- -no-share) addJava "$noshare_opts" && shift ;;
- -sbt-boot) require_arg path "$1" "$2" && addJava "-Dsbt.boot.directory=$2" && shift 2 ;;
- -sbt-dir) require_arg path "$1" "$2" && sbt_dir="$2" && shift 2 ;;
- -debug-inc) addJava "-Dxsbt.inc.debug=true" && shift ;;
- -offline) addSbt "set offline := true" && shift ;;
- -jvm-debug) require_arg port "$1" "$2" && addDebugger $2 && shift 2 ;;
- -batch) exec 0 )) || echo "Starting $script_name: invoke with -help for other options"
-
-# verify this is an sbt dir or -create was given
-[[ -f ./build.sbt || -d ./project || -n "$sbt_create" ]] || {
- cat < art.copy(`classifier` = Some("assembly")) }
-
addArtifact(artifact in (Compile, assembly), assembly)
-// TODO: plugin doc says "To exclude some jar file, first consider using "provided" dependency."
-// Figure out what that means...
-excludedJars in assembly <<= (fullClasspath in assembly) map { cp =>
- cp filter {_.data.getName.contains("craftbukkit")}
-}
\ No newline at end of file
+assembly / assemblyExcludedJars := {
+ val cp = (assembly / fullClasspath).value
+ cp filter {_.data.getName.contains("bukkit")}
+}
+
diff --git a/scala-lib-plugin/src/main/resources/plugin.yml b/scala-lib-plugin/src/main/resources/plugin.yml
index ebb96445..323be410 100644
--- a/scala-lib-plugin/src/main/resources/plugin.yml
+++ b/scala-lib-plugin/src/main/resources/plugin.yml
@@ -2,4 +2,5 @@ name: ScalaLibPlugin
main: com.joshcough.minecraft.ScalaLibPlugin
author: Josh Cough
version: 2.11.0
+api-version: 1.13
database: false