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