diff --git a/src/main/kotlin/com/pobnellion/aoe/Aoe.kt b/src/main/kotlin/com/pobnellion/aoe/Aoe.kt index 2cdde48..5376922 100644 --- a/src/main/kotlin/com/pobnellion/aoe/Aoe.kt +++ b/src/main/kotlin/com/pobnellion/aoe/Aoe.kt @@ -1,6 +1,7 @@ package com.pobnellion.aoe import com.pobnellion.aoe.command.TestCommand +import com.pobnellion.aoe.command.TestTabCompleter import com.pobnellion.aoe.team.Team import com.pobnellion.aoe.ui.PlaceHint import com.pobnellion.aoe.ui.PlaceItem @@ -8,6 +9,7 @@ import org.bukkit.Bukkit import org.bukkit.entity.Player import org.bukkit.plugin.java.JavaPlugin import java.io.File +import java.nio.file.Paths class Aoe : JavaPlugin() { companion object { @@ -18,7 +20,8 @@ class Aoe : JavaPlugin() { return teams.singleOrNull() { team -> team.players.contains(player) } } - fun getSchematicsFolder(): File = File(instance!!.dataFolder, "schematics") + fun getSchematicFile(schematicName: String): File = + Paths.get(instance!!.dataFolder.path, "schematics", "$schematicName.schem").toFile() } override fun onEnable() { @@ -29,7 +32,8 @@ class Aoe : JavaPlugin() { Bukkit.getPluginManager().registerEvents(PlaceHint, this) // Commands - this.getCommand("debug")!!.setExecutor(TestCommand()) + this.getCommand("aoe")!!.setExecutor(TestCommand()) + this.getCommand("aoe")!!.tabCompleter = TestTabCompleter() } override fun onDisable() { diff --git a/src/main/kotlin/com/pobnellion/aoe/building/Building.kt b/src/main/kotlin/com/pobnellion/aoe/building/Building.kt index 766d722..139eacb 100644 --- a/src/main/kotlin/com/pobnellion/aoe/building/Building.kt +++ b/src/main/kotlin/com/pobnellion/aoe/building/Building.kt @@ -1,7 +1,6 @@ package com.pobnellion.aoe.building import org.bukkit.Location -import org.bukkit.entity.Player abstract class Building(val location: Location, val variant: Int) { } diff --git a/src/main/kotlin/com/pobnellion/aoe/building/BuildingType.kt b/src/main/kotlin/com/pobnellion/aoe/building/BuildingType.kt index 30cb223..33563d7 100644 --- a/src/main/kotlin/com/pobnellion/aoe/building/BuildingType.kt +++ b/src/main/kotlin/com/pobnellion/aoe/building/BuildingType.kt @@ -1,10 +1,15 @@ package com.pobnellion.aoe.building enum class BuildingType { + ARCHERY_RANGE, BARRACKS, + DOCK, FARM, HOUSE, + LUMBER_CAMP, MILL, + MINING_CAMP, + STABLE, TOWN_CENTER, UNIQUE, WALL, diff --git a/src/main/kotlin/com/pobnellion/aoe/building/TownCenter.kt b/src/main/kotlin/com/pobnellion/aoe/building/TownCenter.kt new file mode 100644 index 0000000..73ca48f --- /dev/null +++ b/src/main/kotlin/com/pobnellion/aoe/building/TownCenter.kt @@ -0,0 +1,51 @@ +package com.pobnellion.aoe.building + +import com.pobnellion.aoe.Aoe +import com.pobnellion.aoe.ui.PlaceHintValidators +import com.sk89q.worldedit.WorldEdit +import com.sk89q.worldedit.extent.clipboard.Clipboard +import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats +import com.sk89q.worldedit.function.operation.Operation +import com.sk89q.worldedit.function.operation.Operations +import com.sk89q.worldedit.math.BlockVector3 +import com.sk89q.worldedit.session.ClipboardHolder +import com.sk89q.worldedit.world.World +import org.bukkit.Location +import java.io.File +import java.io.FileInputStream + + +class TownCenter(location: Location, variant: Int): Building(location, variant) { + companion object Info: BuildingInfo { + override val buildingType: BuildingType = BuildingType.TOWN_CENTER + override val schematicNames: List = listOf("plains_towncenter") + + override fun validate(location: Location): Boolean { + return PlaceHintValidators.allReplaceable(location, 10f, 10f, 10f, -2) + } + + override fun create(location: Location, variant: Int): Building { + return TownCenter(location, variant) + } + } + + init { + var clipboard: Clipboard + + val file: File = Aoe.getSchematicFile(schematicNames[variant]) + val format = ClipboardFormats.findByFile(file) + format!!.getReader(FileInputStream(file)).use { reader -> + clipboard = reader.read() + } + + clipboard.origin = BlockVector3.ZERO + + WorldEdit.getInstance().newEditSession(location.world as World).use { editSession -> + val operation: Operation = ClipboardHolder(clipboard) + .createPaste(editSession) + .to(BlockVector3.at(location.x, location.y, location.z)) // configure here + .build() + Operations.complete(operation) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/pobnellion/aoe/command/TestCommand.kt b/src/main/kotlin/com/pobnellion/aoe/command/TestCommand.kt index 22863e0..5fbb956 100644 --- a/src/main/kotlin/com/pobnellion/aoe/command/TestCommand.kt +++ b/src/main/kotlin/com/pobnellion/aoe/command/TestCommand.kt @@ -1,9 +1,11 @@ package com.pobnellion.aoe.command -import com.pobnellion.aoe.entity.AoeVillager +import com.pobnellion.aoe.Aoe +import com.pobnellion.aoe.team.Plains import org.bukkit.command.Command import org.bukkit.command.CommandExecutor import org.bukkit.command.CommandSender +import org.bukkit.command.TabCompleter import org.bukkit.entity.Player class TestCommand : CommandExecutor { @@ -13,7 +15,42 @@ class TestCommand : CommandExecutor { return true } - val player: Player = sender + if (args.isEmpty()) { + sender.sendMessage("invalid command") + return true + } + + when (args[0]) { + "team" -> team(sender, args) + else -> sender.sendMessage("Invalid argument: ${args[0]}") + } + return true } + + private fun team(sender: CommandSender, args: Array) { + if (args.size == 1) { + sender.sendMessage("please provide a team") + return + } + + when (args[1]) { + "plains" -> Aoe.teams.add(Plains(listOf(sender as Player))) + else -> sender.sendMessage("Invalid team: ${args[1]}") + } + } +} + +class TestTabCompleter: TabCompleter { + override fun onTabComplete(sender: CommandSender, command: Command, label: String, args: Array): MutableList? { + val options: MutableList = mutableListOf() + + if (args.size == 1) + options.add("team") + + if (args.size == 2) + options.add("plains") + + return options + } } \ No newline at end of file diff --git a/src/main/kotlin/com/pobnellion/aoe/team/Plains.kt b/src/main/kotlin/com/pobnellion/aoe/team/Plains.kt index 31e2dda..3c81349 100644 --- a/src/main/kotlin/com/pobnellion/aoe/team/Plains.kt +++ b/src/main/kotlin/com/pobnellion/aoe/team/Plains.kt @@ -3,17 +3,24 @@ package com.pobnellion.aoe.team import com.pobnellion.aoe.building.BuildingInfo import com.pobnellion.aoe.building.BuildingType import com.pobnellion.aoe.building.House +import com.pobnellion.aoe.building.TownCenter import org.bukkit.entity.Player class Plains(players: List) : Team(players) { + override val name: String = "Plains" override fun getBuildingInfo(type: BuildingType): BuildingInfo { return when (type) { + BuildingType.ARCHERY_RANGE -> TODO() BuildingType.BARRACKS -> TODO() + BuildingType.DOCK -> TODO() BuildingType.FARM -> TODO() BuildingType.HOUSE -> House.Info + BuildingType.LUMBER_CAMP -> TODO() BuildingType.MILL -> TODO() - BuildingType.TOWN_CENTER -> TODO() + BuildingType.MINING_CAMP -> TODO() + BuildingType.STABLE -> TODO() + BuildingType.TOWN_CENTER -> TownCenter.Info BuildingType.UNIQUE -> TODO() BuildingType.WALL -> TODO() BuildingType.WATCH_TOWER -> TODO() diff --git a/src/main/kotlin/com/pobnellion/aoe/team/Team.kt b/src/main/kotlin/com/pobnellion/aoe/team/Team.kt index e61b675..d04ad1a 100644 --- a/src/main/kotlin/com/pobnellion/aoe/team/Team.kt +++ b/src/main/kotlin/com/pobnellion/aoe/team/Team.kt @@ -9,9 +9,14 @@ import org.bukkit.entity.Player import kotlin.random.Random abstract class Team(val players: List) { - val buildings: MutableList = mutableListOf() + private val buildings: MutableList = mutableListOf() + + init { + players.forEach { player -> player.sendMessage("Joined team $name") } + } protected abstract fun getBuildingInfo(type: BuildingType): BuildingInfo + protected abstract val name: String fun addBuilding(location: Location, building: BuildingInfo, variant: Int) { buildings.add(building.create(location, variant)) diff --git a/src/main/kotlin/com/pobnellion/aoe/ui/BuildingPlaceHint.kt b/src/main/kotlin/com/pobnellion/aoe/ui/BuildingPlaceHint.kt index 690c832..061fc06 100644 --- a/src/main/kotlin/com/pobnellion/aoe/ui/BuildingPlaceHint.kt +++ b/src/main/kotlin/com/pobnellion/aoe/ui/BuildingPlaceHint.kt @@ -40,8 +40,7 @@ class BuildingPlaceHint( init { val schematicName = buildingInfo.schematicNames[buildingVariant] - val file = File(Aoe.getSchematicsFolder(), - if (schematicName.endsWith(".schem")) schematicName else "$schematicName.schem") + val file = Aoe.getSchematicFile(schematicName) val format = ClipboardFormats.findByFile(file) val reader = format?.getReader(FileInputStream(file)) @@ -51,7 +50,8 @@ class BuildingPlaceHint( this.offset = Vector( -floor(clipboard.dimensions.x() / 2.0), - clipboard.minY.toDouble(), +// clipboard.minY.toDouble(), + 0.0, -floor(clipboard.dimensions.z() / 2.0)) } @@ -65,7 +65,7 @@ class BuildingPlaceHint( if (!block.material.isAir && !block.material.isEmpty) { val x = (blockPosition.x() - schematic.minimumPoint.x()).toFloat() - val y = blockPosition.y().toFloat() + val y = (blockPosition.y() - schematic.minimumPoint.y()).toFloat() val z = (blockPosition.z() - schematic.minimumPoint.z()).toFloat() displayIds.add(spawnBlockDisplay(initialLocation, block, offset = Vector3f(x, y, z), options = 0b01000000)) diff --git a/src/main/kotlin/com/pobnellion/aoe/ui/PlaceHint.kt b/src/main/kotlin/com/pobnellion/aoe/ui/PlaceHint.kt index fc5f35d..db9075f 100644 --- a/src/main/kotlin/com/pobnellion/aoe/ui/PlaceHint.kt +++ b/src/main/kotlin/com/pobnellion/aoe/ui/PlaceHint.kt @@ -6,6 +6,7 @@ import com.comphenix.protocol.events.PacketContainer import com.comphenix.protocol.wrappers.* import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry import com.destroystokyo.paper.MaterialSetTag +import org.bukkit.Bukkit import org.bukkit.Location import org.bukkit.block.data.BlockData import org.bukkit.entity.EntityType @@ -59,6 +60,7 @@ abstract class PlaceHint { return val target = event.player.getTargetBlockExact(MAX_TARGET_DISTANCE) + val block = if (target == null) null else event.player.getTargetBlock(MaterialSetTag.REPLACEABLE.values, MAX_TARGET_DISTANCE) playerHints[event.player.uniqueId]!!.moveTo(block?.location) } @@ -107,7 +109,7 @@ abstract class PlaceHint { protected abstract fun confirm() protected abstract fun validate(location: Location): Boolean - protected fun show(initialLocation: Location) { + private fun show(initialLocation: Location) { initialLocation.add(this.offset) currentLocation = initialLocation @@ -160,7 +162,7 @@ abstract class PlaceHint { } if (currentLocation == null) { - addDisplays(newLocation) + show(newLocation) return } @@ -234,7 +236,7 @@ abstract class PlaceHint { } protected open fun updateColour() { - // outline + // outline glow val outlineTeamPacket = PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM) outlineTeamPacket.strings.write(0, "placeValid") outlineTeamPacket.integers.write(0, 2) diff --git a/src/main/kotlin/com/pobnellion/aoe/ui/PlaceItem.kt b/src/main/kotlin/com/pobnellion/aoe/ui/PlaceItem.kt index 033672c..2429749 100644 --- a/src/main/kotlin/com/pobnellion/aoe/ui/PlaceItem.kt +++ b/src/main/kotlin/com/pobnellion/aoe/ui/PlaceItem.kt @@ -36,6 +36,9 @@ class PlaceItem : Listener { if (event.material != Material.BRICKS) return + if (Aoe.getTeam(event.player) == null) + return + event.isCancelled = true event.player.openInventory(buildingInventory) } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 28fd838..d0d97af 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -6,6 +6,6 @@ depend: - ProtocolLib - WorldEdit commands: - debug: + aoe: description: Debug command - usage: /debug + usage: /aoe