Fix bugs
This commit is contained in:
@@ -39,7 +39,7 @@ class GlobalAddedDataManagerImpl(val plugin: ParcelsPlugin) : GlobalAddedDataMan
|
|||||||
}
|
}
|
||||||
|
|
||||||
private companion object {
|
private companion object {
|
||||||
val emptyData = mapOf<UUID, AddedStatus>() as MutableMap<UUID, AddedStatus>
|
val emptyData = Collections.emptyMap<UUID, AddedStatus>() as MutableMap<UUID, AddedStatus>
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,8 +31,13 @@ class Parcel(val world: ParcelWorld, val pos: Vec2i) : ParcelData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun copyData(data: ParcelData) {
|
fun copyData(data: ParcelData) {
|
||||||
world.storage.setParcelData(this, data)
|
|
||||||
copyDataIgnoringDatabase(data)
|
copyDataIgnoringDatabase(data)
|
||||||
|
world.storage.setParcelData(this, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun dispose() {
|
||||||
|
copyDataIgnoringDatabase(ParcelDataHolder())
|
||||||
|
world.storage.setParcelData(this, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
override val addedMap: Map<UUID, AddedStatus> get() = data.addedMap
|
override val addedMap: Map<UUID, AddedStatus> get() = data.addedMap
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ package io.dico.parcels2
|
|||||||
import io.dico.parcels2.storage.SerializableParcel
|
import io.dico.parcels2.storage.SerializableParcel
|
||||||
import io.dico.parcels2.storage.SerializableWorld
|
import io.dico.parcels2.storage.SerializableWorld
|
||||||
import io.dico.parcels2.storage.Storage
|
import io.dico.parcels2.storage.Storage
|
||||||
|
import io.dico.parcels2.storage.getParcelBySerializedValue
|
||||||
import io.dico.parcels2.util.Vec2i
|
import io.dico.parcels2.util.Vec2i
|
||||||
import io.dico.parcels2.util.doAwait
|
|
||||||
import io.dico.parcels2.util.floor
|
import io.dico.parcels2.util.floor
|
||||||
import kotlinx.coroutines.experimental.launch
|
import kotlinx.coroutines.experimental.launch
|
||||||
import org.bukkit.Bukkit
|
import org.bukkit.Bukkit
|
||||||
@@ -17,8 +17,6 @@ import org.bukkit.entity.Player
|
|||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.coroutines.experimental.buildIterator
|
import kotlin.coroutines.experimental.buildIterator
|
||||||
import kotlin.coroutines.experimental.buildSequence
|
import kotlin.coroutines.experimental.buildSequence
|
||||||
import kotlin.reflect.jvm.javaMethod
|
|
||||||
import kotlin.reflect.jvm.kotlinFunction
|
|
||||||
|
|
||||||
class Worlds(val plugin: ParcelsPlugin) {
|
class Worlds(val plugin: ParcelsPlugin) {
|
||||||
val worlds: Map<String, ParcelWorld> get() = _worlds
|
val worlds: Map<String, ParcelWorld> get() = _worlds
|
||||||
@@ -42,11 +40,6 @@ class Worlds(val plugin: ParcelsPlugin) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
init {
|
|
||||||
val function = ::loadWorlds
|
|
||||||
function.javaMethod!!.kotlinFunction
|
|
||||||
}
|
|
||||||
|
|
||||||
operator fun SerializableParcel.invoke(): Parcel? {
|
operator fun SerializableParcel.invoke(): Parcel? {
|
||||||
return world()?.parcelByID(pos)
|
return world()?.parcelByID(pos)
|
||||||
}
|
}
|
||||||
@@ -72,31 +65,28 @@ class Worlds(val plugin: ParcelsPlugin) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
_worlds.put(worldName, world)
|
_worlds[worldName] = world
|
||||||
|
}
|
||||||
|
|
||||||
if (Bukkit.getWorld(worldName) == null) {
|
plugin.functionHelper.schedule(10) {
|
||||||
plugin.doAwait {
|
println("Parcels generating worlds now")
|
||||||
cond = {
|
for ((name, world) in _worlds) {
|
||||||
try {
|
if (Bukkit.getWorld(name) == null) {
|
||||||
// server.getDefaultGameMode() throws an error before any worlds are initialized.
|
val bworld = WorldCreator(name).generator(world.generator).createWorld()
|
||||||
// createWorld() below calls that method.
|
val spawn = world.generator.getFixedSpawnLocation(bworld, null)
|
||||||
// Plugin needs to load on STARTUP for generators to be registered correctly.
|
bworld.setSpawnLocation(spawn.x.floor(), spawn.y.floor(), spawn.z.floor())
|
||||||
// Means we need to await the initial worlds getting loaded.
|
|
||||||
|
|
||||||
plugin.server.defaultGameMode; true
|
|
||||||
} catch (ex: Throwable) {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onSuccess = {
|
|
||||||
val bworld = WorldCreator(worldName).generator(world.generator).createWorld()
|
|
||||||
val spawn = world.generator.getFixedSpawnLocation(bworld, null)
|
|
||||||
bworld.setSpawnLocation(spawn.x.floor(), spawn.y.floor(), spawn.z.floor())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val channel = plugin.storage.readAllParcelData()
|
||||||
|
val job = plugin.functionHelper.launchLazilyOnMainThread {
|
||||||
|
do {
|
||||||
|
val pair = channel.receiveOrNull() ?: break
|
||||||
|
val parcel = getParcelBySerializedValue(pair.first) ?: continue
|
||||||
|
pair.second?.let { parcel.copyDataIgnoringDatabase(it) }
|
||||||
|
} while (true)
|
||||||
|
}
|
||||||
|
job.start()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -205,7 +195,8 @@ class DefaultParcelContainer(private val world: ParcelWorld,
|
|||||||
buildIterator {
|
buildIterator {
|
||||||
val center = world.options.axisLimit
|
val center = world.options.axisLimit
|
||||||
for (radius in 0..center) {
|
for (radius in 0..center) {
|
||||||
var x = center - radius; var z = center - radius
|
var x = center - radius;
|
||||||
|
var z = center - radius
|
||||||
repeat(radius * 2) { yield(parcels[x++][z]) }
|
repeat(radius * 2) { yield(parcels[x++][z]) }
|
||||||
repeat(radius * 2) { yield(parcels[x][z++]) }
|
repeat(radius * 2) { yield(parcels[x][z++]) }
|
||||||
repeat(radius * 2) { yield(parcels[x--][z]) }
|
repeat(radius * 2) { yield(parcels[x--][z]) }
|
||||||
|
|||||||
@@ -12,14 +12,13 @@ import io.dico.parcels2.storage.Storage
|
|||||||
import io.dico.parcels2.storage.yamlObjectMapper
|
import io.dico.parcels2.storage.yamlObjectMapper
|
||||||
import io.dico.parcels2.util.FunctionHelper
|
import io.dico.parcels2.util.FunctionHelper
|
||||||
import io.dico.parcels2.util.tryCreate
|
import io.dico.parcels2.util.tryCreate
|
||||||
import kotlinx.coroutines.experimental.asCoroutineDispatcher
|
|
||||||
import org.bukkit.Bukkit
|
import org.bukkit.Bukkit
|
||||||
import org.bukkit.plugin.java.JavaPlugin
|
import org.bukkit.plugin.java.JavaPlugin
|
||||||
|
import org.slf4j.Logger
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.concurrent.Executor
|
|
||||||
|
|
||||||
val logger = LoggerFactory.getLogger("ParcelsPlugin")
|
val logger: Logger = LoggerFactory.getLogger("ParcelsPlugin")
|
||||||
private inline val plogger get() = logger
|
private inline val plogger get() = logger
|
||||||
|
|
||||||
class ParcelsPlugin : JavaPlugin() {
|
class ParcelsPlugin : JavaPlugin() {
|
||||||
@@ -64,14 +63,14 @@ class ParcelsPlugin : JavaPlugin() {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
globalAddedData = GlobalAddedDataManagerImpl(this)
|
||||||
worlds.loadWorlds(options)
|
worlds.loadWorlds(options)
|
||||||
|
entityTracker = ParcelEntityTracker(worlds)
|
||||||
} catch (ex: Exception) {
|
} catch (ex: Exception) {
|
||||||
plogger.error("Error loading options", ex)
|
plogger.error("Error loading options", ex)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
globalAddedData = GlobalAddedDataManagerImpl(this)
|
|
||||||
entityTracker = ParcelEntityTracker(worlds)
|
|
||||||
registerListeners()
|
registerListeners()
|
||||||
registerCommands()
|
registerCommands()
|
||||||
|
|
||||||
@@ -79,21 +78,23 @@ class ParcelsPlugin : JavaPlugin() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun loadOptions(): Boolean {
|
fun loadOptions(): Boolean {
|
||||||
if (optionsFile.exists()) {
|
when {
|
||||||
yamlObjectMapper.readerForUpdating(options).readValue<Options>(optionsFile)
|
optionsFile.exists() -> yamlObjectMapper.readerForUpdating(options).readValue<Options>(optionsFile)
|
||||||
} else if (optionsFile.tryCreate()) {
|
optionsFile.tryCreate() -> {
|
||||||
options.addWorld("parcels", WorldOptions())
|
options.addWorld("parcels", WorldOptions())
|
||||||
try {
|
try {
|
||||||
yamlObjectMapper.writeValue(optionsFile, options)
|
yamlObjectMapper.writeValue(optionsFile, options)
|
||||||
} catch (ex: Throwable) {
|
} catch (ex: Throwable) {
|
||||||
optionsFile.delete()
|
optionsFile.delete()
|
||||||
throw ex
|
throw ex
|
||||||
|
}
|
||||||
|
plogger.warn("Created options file with a world template. Please review it before next start.")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
plogger.error("Failed to save options file ${optionsFile.canonicalPath}")
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
plogger.warn("Created options file with a world template. Please review it before next start.")
|
|
||||||
return false
|
|
||||||
} else {
|
|
||||||
plogger.error("Failed to save options file ${optionsFile.canonicalPath}")
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@@ -105,7 +106,7 @@ class ParcelsPlugin : JavaPlugin() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun registerListeners() {
|
private fun registerListeners() {
|
||||||
if (listeners != null) {
|
if (listeners == null) {
|
||||||
listeners = ParcelListeners(worlds, entityTracker)
|
listeners = ParcelListeners(worlds, entityTracker)
|
||||||
registrator.registerListeners(listeners!!)
|
registrator.registerListeners(listeners!!)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ enum class RegionTraversal(private val builder: suspend SequenceBuilder<Vec3i>.(
|
|||||||
|
|
||||||
}),
|
}),
|
||||||
|
|
||||||
UPDARD({ region ->
|
UPWARD({ region ->
|
||||||
val origin = region.origin
|
val origin = region.origin
|
||||||
val size = region.size
|
val size = region.size
|
||||||
|
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ import io.dico.dicore.command.CommandException
|
|||||||
import io.dico.dicore.command.ExecutionContext
|
import io.dico.dicore.command.ExecutionContext
|
||||||
import io.dico.dicore.command.ICommandReceiver
|
import io.dico.dicore.command.ICommandReceiver
|
||||||
import io.dico.parcels2.ParcelOwner
|
import io.dico.parcels2.ParcelOwner
|
||||||
|
import io.dico.parcels2.ParcelWorld
|
||||||
import io.dico.parcels2.ParcelsPlugin
|
import io.dico.parcels2.ParcelsPlugin
|
||||||
import io.dico.parcels2.util.hasAdminManage
|
import io.dico.parcels2.util.hasAdminManage
|
||||||
import io.dico.parcels2.util.parcelLimit
|
import io.dico.parcels2.util.parcelLimit
|
||||||
import io.dico.parcels2.util.uuid
|
|
||||||
import org.bukkit.entity.Player
|
import org.bukkit.entity.Player
|
||||||
import org.bukkit.plugin.Plugin
|
import org.bukkit.plugin.Plugin
|
||||||
import java.lang.reflect.Method
|
import java.lang.reflect.Method
|
||||||
@@ -29,9 +29,10 @@ abstract class AbstractParcelCommands(val plugin: ParcelsPlugin) : ICommandRecei
|
|||||||
if (!plugin.storage.isConnected) error("Parcels cannot $action right now because of a database error")
|
if (!plugin.storage.isConnected) error("Parcels cannot $action right now because of a database error")
|
||||||
}
|
}
|
||||||
|
|
||||||
protected suspend fun checkParcelLimit(player: Player) {
|
protected suspend fun checkParcelLimit(player: Player, world: ParcelWorld) {
|
||||||
if (player.hasAdminManage) return
|
if (player.hasAdminManage) return
|
||||||
val numOwnedParcels = plugin.storage.getNumParcels(ParcelOwner(uuid = player.uuid)).await()
|
val numOwnedParcels = plugin.storage.getOwnedParcels(ParcelOwner(player)).await()
|
||||||
|
.filter { it.world.world == world.world }.size
|
||||||
|
|
||||||
val limit = player.parcelLimit
|
val limit = player.parcelLimit
|
||||||
if (numOwnedParcels >= limit) {
|
if (numOwnedParcels >= limit) {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class CommandsAddedStatus(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin
|
|||||||
shortVersion = "allows a player to build on this parcel")
|
shortVersion = "allows a player to build on this parcel")
|
||||||
@ParcelRequire(owner = true)
|
@ParcelRequire(owner = true)
|
||||||
fun ParcelScope.cmdAllow(sender: Player, player: OfflinePlayer): Any? {
|
fun ParcelScope.cmdAllow(sender: Player, player: OfflinePlayer): Any? {
|
||||||
Validate.isTrue(parcel.owner != null && !sender.hasAdminManage, "This parcel is unowned")
|
Validate.isTrue(parcel.owner != null || sender.hasAdminManage, "This parcel is unowned")
|
||||||
Validate.isTrue(!parcel.owner!!.matches(player), "The target already owns the parcel")
|
Validate.isTrue(!parcel.owner!!.matches(player), "The target already owns the parcel")
|
||||||
Validate.isTrue(parcel.allow(player), "${player.name} is already allowed to build on this parcel")
|
Validate.isTrue(parcel.allow(player), "${player.name} is already allowed to build on this parcel")
|
||||||
return "${player.name} is now allowed to build on this parcel"
|
return "${player.name} is now allowed to build on this parcel"
|
||||||
@@ -37,7 +37,7 @@ class CommandsAddedStatus(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin
|
|||||||
shortVersion = "bans a player from this parcel")
|
shortVersion = "bans a player from this parcel")
|
||||||
@ParcelRequire(owner = true)
|
@ParcelRequire(owner = true)
|
||||||
fun ParcelScope.cmdBan(sender: Player, player: OfflinePlayer): Any? {
|
fun ParcelScope.cmdBan(sender: Player, player: OfflinePlayer): Any? {
|
||||||
Validate.isTrue(parcel.owner != null && !sender.hasAdminManage, "This parcel is unowned")
|
Validate.isTrue(parcel.owner != null || sender.hasAdminManage, "This parcel is unowned")
|
||||||
Validate.isTrue(!parcel.owner!!.matches(player), "The owner cannot be banned from the parcel")
|
Validate.isTrue(!parcel.owner!!.matches(player), "The owner cannot be banned from the parcel")
|
||||||
Validate.isTrue(parcel.ban(player), "${player.name} is already banned from this parcel")
|
Validate.isTrue(parcel.ban(player), "${player.name} is already banned from this parcel")
|
||||||
return "${player.name} is now banned from this parcel"
|
return "${player.name} is now banned from this parcel"
|
||||||
|
|||||||
@@ -1,12 +1,17 @@
|
|||||||
package io.dico.parcels2.command
|
package io.dico.parcels2.command
|
||||||
|
|
||||||
import io.dico.dicore.command.CommandException
|
import io.dico.dicore.command.CommandException
|
||||||
|
import io.dico.dicore.command.EMessageType
|
||||||
|
import io.dico.dicore.command.ExecutionContext
|
||||||
import io.dico.dicore.command.annotation.Cmd
|
import io.dico.dicore.command.annotation.Cmd
|
||||||
import io.dico.parcels2.ParcelsPlugin
|
import io.dico.parcels2.ParcelsPlugin
|
||||||
|
import io.dico.parcels2.blockvisitor.RegionTraversal
|
||||||
import org.bukkit.Bukkit
|
import org.bukkit.Bukkit
|
||||||
|
import org.bukkit.Material
|
||||||
import org.bukkit.entity.Player
|
import org.bukkit.entity.Player
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
class CommandsDebug(val plugin: ParcelsPlugin) {
|
class CommandsDebug(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
|
||||||
|
|
||||||
@Cmd("reloadoptions")
|
@Cmd("reloadoptions")
|
||||||
fun reloadOptions() {
|
fun reloadOptions() {
|
||||||
@@ -23,4 +28,23 @@ class CommandsDebug(val plugin: ParcelsPlugin) {
|
|||||||
return "Teleported you to $worldName spawn"
|
return "Teleported you to $worldName spawn"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Cmd("make_mess")
|
||||||
|
@ParcelRequire(owner = true)
|
||||||
|
fun ParcelScope.cmdMakeMess(context: ExecutionContext) {
|
||||||
|
val server = plugin.server
|
||||||
|
val blockDatas = arrayOf(
|
||||||
|
server.createBlockData(Material.STICKY_PISTON),
|
||||||
|
server.createBlockData(Material.GLASS),
|
||||||
|
server.createBlockData(Material.STONE_SLAB),
|
||||||
|
server.createBlockData(Material.QUARTZ_BLOCK)
|
||||||
|
)
|
||||||
|
val random = Random()
|
||||||
|
world.generator.doBlockOperation(parcel, direction = RegionTraversal.UPWARD) { block ->
|
||||||
|
block.blockData = blockDatas[random.nextInt(4)]
|
||||||
|
}.onProgressUpdate(1000, 1000) { progress, elapsedTime ->
|
||||||
|
context.sendMessage(EMessageType.INFORMATIVE, "Mess progress: %.02f%%, %.2fs elapsed"
|
||||||
|
.format(progress * 100, elapsedTime / 1000.0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -8,16 +8,12 @@ import io.dico.dicore.command.annotation.Flag
|
|||||||
import io.dico.dicore.command.annotation.RequireParameters
|
import io.dico.dicore.command.annotation.RequireParameters
|
||||||
import io.dico.parcels2.ParcelOwner
|
import io.dico.parcels2.ParcelOwner
|
||||||
import io.dico.parcels2.ParcelsPlugin
|
import io.dico.parcels2.ParcelsPlugin
|
||||||
import io.dico.parcels2.blockvisitor.RegionTraversal
|
|
||||||
import io.dico.parcels2.storage.getParcelBySerializedValue
|
import io.dico.parcels2.storage.getParcelBySerializedValue
|
||||||
import io.dico.parcels2.util.hasAdminManage
|
import io.dico.parcels2.util.hasAdminManage
|
||||||
import io.dico.parcels2.util.hasParcelHomeOthers
|
import io.dico.parcels2.util.hasParcelHomeOthers
|
||||||
import io.dico.parcels2.util.uuid
|
import io.dico.parcels2.util.uuid
|
||||||
import org.bukkit.Material
|
|
||||||
import org.bukkit.entity.Player
|
import org.bukkit.entity.Player
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
//@Suppress("unused")
|
|
||||||
class CommandsGeneral(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
|
class CommandsGeneral(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
|
||||||
|
|
||||||
@Cmd("auto")
|
@Cmd("auto")
|
||||||
@@ -26,7 +22,7 @@ class CommandsGeneral(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
|
|||||||
shortVersion = "sets you up with a fresh, unclaimed parcel")
|
shortVersion = "sets you up with a fresh, unclaimed parcel")
|
||||||
suspend fun WorldScope.cmdAuto(player: Player): Any? {
|
suspend fun WorldScope.cmdAuto(player: Player): Any? {
|
||||||
checkConnected("be claimed")
|
checkConnected("be claimed")
|
||||||
checkParcelLimit(player)
|
checkParcelLimit(player, world)
|
||||||
|
|
||||||
val parcel = world.nextEmptyParcel()
|
val parcel = world.nextEmptyParcel()
|
||||||
?: error("This world is full, please ask an admin to upsize it")
|
?: error("This world is full, please ask an admin to upsize it")
|
||||||
@@ -58,7 +54,7 @@ class CommandsGeneral(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
|
|||||||
|
|
||||||
val ownedParcels = ownedParcelsResult
|
val ownedParcels = ownedParcelsResult
|
||||||
.map { worlds.getParcelBySerializedValue(it) }
|
.map { worlds.getParcelBySerializedValue(it) }
|
||||||
.filter { it != null && ownerTarget.world == it.world && ownerTarget.owner == it.owner }
|
.filter { it != null && ownerTarget.world == it.world }
|
||||||
|
|
||||||
val targetMatch = ownedParcels.getOrNull(target.index)
|
val targetMatch = ownedParcels.getOrNull(target.index)
|
||||||
?: error("The specified parcel could not be matched")
|
?: error("The specified parcel could not be matched")
|
||||||
@@ -76,11 +72,19 @@ class CommandsGeneral(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
|
|||||||
error(if (it.matches(player)) "You already own this parcel" else "This parcel is not available")
|
error(if (it.matches(player)) "You already own this parcel" else "This parcel is not available")
|
||||||
}
|
}
|
||||||
|
|
||||||
checkParcelLimit(player)
|
checkParcelLimit(player, world)
|
||||||
parcel.owner = ParcelOwner(player)
|
parcel.owner = ParcelOwner(player)
|
||||||
return "Enjoy your new parcel!"
|
return "Enjoy your new parcel!"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Cmd("unclaim")
|
||||||
|
@Desc("Unclaims this parcel")
|
||||||
|
@ParcelRequire(owner = true)
|
||||||
|
fun ParcelScope.cmdUnclaim(player: Player): Any? {
|
||||||
|
parcel.dispose()
|
||||||
|
return "Your parcel has been disposed"
|
||||||
|
}
|
||||||
|
|
||||||
@Cmd("clear")
|
@Cmd("clear")
|
||||||
@ParcelRequire(owner = true)
|
@ParcelRequire(owner = true)
|
||||||
fun ParcelScope.cmdClear(context: ExecutionContext, @Flag sure: Boolean): Any? {
|
fun ParcelScope.cmdClear(context: ExecutionContext, @Flag sure: Boolean): Any? {
|
||||||
@@ -101,23 +105,4 @@ class CommandsGeneral(plugin: ParcelsPlugin) : AbstractParcelCommands(plugin) {
|
|||||||
TODO()
|
TODO()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Cmd("make_mess")
|
|
||||||
@ParcelRequire(owner = true)
|
|
||||||
fun ParcelScope.cmdMakeMess(context: ExecutionContext) {
|
|
||||||
val server = plugin.server
|
|
||||||
val blockDatas = arrayOf(
|
|
||||||
server.createBlockData(Material.STICKY_PISTON),
|
|
||||||
server.createBlockData(Material.GLASS),
|
|
||||||
server.createBlockData(Material.STONE_SLAB),
|
|
||||||
server.createBlockData(Material.QUARTZ_BLOCK)
|
|
||||||
)
|
|
||||||
val random = Random()
|
|
||||||
world.generator.doBlockOperation(parcel, direction = RegionTraversal.UPDARD) { block ->
|
|
||||||
block.blockData = blockDatas[random.nextInt(4)]
|
|
||||||
}.onProgressUpdate(1000, 1000) { progress, elapsedTime ->
|
|
||||||
context.sendMessage(EMessageType.INFORMATIVE, "Mess progress: %.02f%%, %.2fs elapsed"
|
|
||||||
.format(progress * 100, elapsedTime / 1000.0))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -15,7 +15,7 @@ fun getParcelCommands(plugin: ParcelsPlugin): ICommandDispatcher {
|
|||||||
return CommandBuilder()
|
return CommandBuilder()
|
||||||
.setChatController(ParcelsChatController())
|
.setChatController(ParcelsChatController())
|
||||||
.addParameterType(false, ParcelParameterType(plugin.worlds))
|
.addParameterType(false, ParcelParameterType(plugin.worlds))
|
||||||
.addParameterType(true, ParcelHomeParameterType(plugin.worlds))
|
.addParameterType(true, ParcelTarget.PType(plugin.worlds))
|
||||||
|
|
||||||
.group("parcel", "plot", "plots", "p")
|
.group("parcel", "plot", "plots", "p")
|
||||||
.registerCommands(CommandsGeneral(plugin))
|
.registerCommands(CommandsGeneral(plugin))
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ data class SerializableWorld(val name: String? = null,
|
|||||||
|
|
||||||
val world: World? by lazy { uid?.let { Bukkit.getWorld(it) } ?: name?.let { Bukkit.getWorld(it) } }
|
val world: World? by lazy { uid?.let { Bukkit.getWorld(it) } ?: name?.let { Bukkit.getWorld(it) } }
|
||||||
//val parcelWorld: ParcelWorld? by lazy { TODO() }
|
//val parcelWorld: ParcelWorld? by lazy { TODO() }
|
||||||
|
|
||||||
|
constructor(world: World) : this(world.name, world.uid)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -33,5 +35,6 @@ fun Worlds.getWorldBySerializedValue(input: SerializableWorld): ParcelWorld? {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun Worlds.getParcelBySerializedValue(input: SerializableParcel): Parcel? {
|
fun Worlds.getParcelBySerializedValue(input: SerializableParcel): Parcel? {
|
||||||
return getWorldBySerializedValue(input.world)?.parcelByID(input.pos)
|
return getWorldBySerializedValue(input.world)
|
||||||
|
?.parcelByID(input.pos)
|
||||||
}
|
}
|
||||||
@@ -4,9 +4,13 @@ package io.dico.parcels2.storage.exposed
|
|||||||
|
|
||||||
import com.zaxxer.hikari.HikariDataSource
|
import com.zaxxer.hikari.HikariDataSource
|
||||||
import io.dico.parcels2.*
|
import io.dico.parcels2.*
|
||||||
import io.dico.parcels2.storage.*
|
import io.dico.parcels2.storage.Backing
|
||||||
|
import io.dico.parcels2.storage.SerializableParcel
|
||||||
import io.dico.parcels2.util.toUUID
|
import io.dico.parcels2.util.toUUID
|
||||||
|
import kotlinx.coroutines.experimental.CoroutineStart
|
||||||
|
import kotlinx.coroutines.experimental.Unconfined
|
||||||
import kotlinx.coroutines.experimental.channels.ProducerScope
|
import kotlinx.coroutines.experimental.channels.ProducerScope
|
||||||
|
import kotlinx.coroutines.experimental.launch
|
||||||
import org.jetbrains.exposed.sql.*
|
import org.jetbrains.exposed.sql.*
|
||||||
import org.jetbrains.exposed.sql.SchemaUtils.create
|
import org.jetbrains.exposed.sql.SchemaUtils.create
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.sql.transactions.transaction
|
||||||
@@ -35,6 +39,12 @@ class ExposedBacking(private val dataSourceFactory: suspend () -> DataSource) :
|
|||||||
|
|
||||||
private fun <T> transaction(statement: Transaction.() -> T) = transaction(database!!, statement)
|
private fun <T> transaction(statement: Transaction.() -> T) = transaction(database!!, statement)
|
||||||
|
|
||||||
|
private suspend fun transactionLaunch(statement: suspend Transaction.() -> Unit): Unit = transaction(database!!) {
|
||||||
|
launch(context = Unconfined, start = CoroutineStart.UNDISPATCHED) {
|
||||||
|
statement(this@transaction)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override suspend fun init() {
|
override suspend fun init() {
|
||||||
if (isShutdown) throw IllegalStateException()
|
if (isShutdown) throw IllegalStateException()
|
||||||
dataSource = dataSourceFactory()
|
dataSource = dataSourceFactory()
|
||||||
@@ -61,7 +71,7 @@ class ExposedBacking(private val dataSourceFactory: suspend () -> DataSource) :
|
|||||||
channel.close()
|
channel.close()
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun ProducerScope<Pair<SerializableParcel, ParcelData?>>.produceAllParcelData() {
|
override suspend fun ProducerScope<Pair<SerializableParcel, ParcelData?>>.produceAllParcelData() = transactionLaunch {
|
||||||
ParcelsT.selectAll().forEach { row ->
|
ParcelsT.selectAll().forEach { row ->
|
||||||
val parcel = ParcelsT.getSerializable(row) ?: return@forEach
|
val parcel = ParcelsT.getSerializable(row) ?: return@forEach
|
||||||
val data = rowToParcelData(row)
|
val data = rowToParcelData(row)
|
||||||
@@ -150,13 +160,13 @@ class ExposedBacking(private val dataSourceFactory: suspend () -> DataSource) :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun ProducerScope<Pair<ParcelOwner, MutableMap<UUID, AddedStatus>>>.produceAllGlobalAddedData() {
|
override suspend fun ProducerScope<Pair<ParcelOwner, MutableMap<UUID, AddedStatus>>>.produceAllGlobalAddedData() = transactionLaunch {
|
||||||
AddedGlobalT.sendAllAddedData(channel)
|
AddedGlobalT.sendAllAddedData(channel)
|
||||||
channel.close()
|
channel.close()
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun readGlobalAddedData(owner: ParcelOwner): MutableMap<UUID, AddedStatus> {
|
override suspend fun readGlobalAddedData(owner: ParcelOwner): MutableMap<UUID, AddedStatus> = transaction {
|
||||||
return AddedGlobalT.readAddedData(OwnersT.getId(owner) ?: return hashMapOf())
|
return@transaction AddedGlobalT.readAddedData(OwnersT.getId(owner) ?: return@transaction hashMapOf())
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun setGlobalPlayerStatus(owner: ParcelOwner, player: UUID, status: AddedStatus) = transaction {
|
override suspend fun setGlobalPlayerStatus(owner: ParcelOwner, player: UUID, status: AddedStatus) = transaction {
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package io.dico.parcels2.storage
|
package io.dico.parcels2.storage.exposed
|
||||||
|
|
||||||
import org.jetbrains.exposed.sql.Column
|
import org.jetbrains.exposed.sql.Column
|
||||||
import org.jetbrains.exposed.sql.Index
|
import org.jetbrains.exposed.sql.Index
|
||||||
@@ -7,7 +7,6 @@ import io.dico.parcels2.ParcelOwner
|
|||||||
import io.dico.parcels2.ParcelWorld
|
import io.dico.parcels2.ParcelWorld
|
||||||
import io.dico.parcels2.storage.SerializableParcel
|
import io.dico.parcels2.storage.SerializableParcel
|
||||||
import io.dico.parcels2.storage.SerializableWorld
|
import io.dico.parcels2.storage.SerializableWorld
|
||||||
import io.dico.parcels2.storage.uniqueIndexR
|
|
||||||
import io.dico.parcels2.util.Vec2i
|
import io.dico.parcels2.util.Vec2i
|
||||||
import io.dico.parcels2.util.toByteArray
|
import io.dico.parcels2.util.toByteArray
|
||||||
import io.dico.parcels2.util.toUUID
|
import io.dico.parcels2.util.toUUID
|
||||||
@@ -42,7 +41,7 @@ sealed class IdTransactionsTable<TableT : IdTransactionsTable<TableT, QueryObj,
|
|||||||
|
|
||||||
object WorldsT : IdTransactionsTable<WorldsT, ParcelWorld, SerializableWorld>("parcel_worlds", "world_id") {
|
object WorldsT : IdTransactionsTable<WorldsT, ParcelWorld, SerializableWorld>("parcel_worlds", "world_id") {
|
||||||
val name = varchar("name", 50)
|
val name = varchar("name", 50)
|
||||||
val uid = binary("uid", 2)
|
val uid = binary("uid", 16)
|
||||||
val index_uid = uniqueIndexR("index_uid", uid)
|
val index_uid = uniqueIndexR("index_uid", uid)
|
||||||
|
|
||||||
internal inline fun getId(binaryUid: ByteArray): Int? = getId { uid eq binaryUid }
|
internal inline fun getId(binaryUid: ByteArray): Int? = getId { uid eq binaryUid }
|
||||||
@@ -90,7 +89,7 @@ object ParcelsT : IdTransactionsTable<ParcelsT, Parcel, SerializableParcel>("par
|
|||||||
}
|
}
|
||||||
|
|
||||||
object OwnersT : IdTransactionsTable<OwnersT, ParcelOwner, ParcelOwner>("parcel_owners", "owner_id") {
|
object OwnersT : IdTransactionsTable<OwnersT, ParcelOwner, ParcelOwner>("parcel_owners", "owner_id") {
|
||||||
val uuid = binary("uuid", 2).nullable()
|
val uuid = binary("uuid", 16).nullable()
|
||||||
val name = varchar("name", 32)
|
val name = varchar("name", 32)
|
||||||
val index_pair = uniqueIndexR("index_pair", uuid, name)
|
val index_pair = uniqueIndexR("index_pair", uuid, name)
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ import io.dico.parcels2.AddedStatus
|
|||||||
import io.dico.parcels2.Parcel
|
import io.dico.parcels2.Parcel
|
||||||
import io.dico.parcels2.ParcelOwner
|
import io.dico.parcels2.ParcelOwner
|
||||||
import io.dico.parcels2.storage.SerializableParcel
|
import io.dico.parcels2.storage.SerializableParcel
|
||||||
import io.dico.parcels2.storage.uniqueIndexR
|
|
||||||
import io.dico.parcels2.storage.upsert
|
|
||||||
import io.dico.parcels2.util.toByteArray
|
import io.dico.parcels2.util.toByteArray
|
||||||
import io.dico.parcels2.util.toUUID
|
import io.dico.parcels2.util.toUUID
|
||||||
import kotlinx.coroutines.experimental.channels.SendChannel
|
import kotlinx.coroutines.experimental.channels.SendChannel
|
||||||
@@ -55,6 +53,7 @@ sealed class AddedTable<AttachT, SerializableT>(name: String, val idTable: IdTra
|
|||||||
}
|
}
|
||||||
|
|
||||||
suspend fun sendAllAddedData(channel: AddedStatusSendChannel<SerializableT>) {
|
suspend fun sendAllAddedData(channel: AddedStatusSendChannel<SerializableT>) {
|
||||||
|
/*
|
||||||
val iterator = selectAll().orderBy(attach_id).iterator()
|
val iterator = selectAll().orderBy(attach_id).iterator()
|
||||||
|
|
||||||
if (iterator.hasNext()) {
|
if (iterator.hasNext()) {
|
||||||
@@ -96,7 +95,7 @@ sealed class AddedTable<AttachT, SerializableT>(name: String, val idTable: IdTra
|
|||||||
}
|
}
|
||||||
|
|
||||||
sendIfPresent()
|
sendIfPresent()
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
private inline fun Boolean?.asAddedStatus() = if (this == null) AddedStatus.DEFAULT else if (this) AddedStatus.ALLOWED else AddedStatus.BANNED
|
private inline fun Boolean?.asAddedStatus() = if (this == null) AddedStatus.DEFAULT else if (this) AddedStatus.ALLOWED else AddedStatus.BANNED
|
||||||
|
|||||||
Reference in New Issue
Block a user