Skip to content
Draft
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ class MfFactionHelpCommand(private val plugin: MedievalFactions) : CommandExecut
arrayOf(TextComponent(plugin.language["CommandFactionHelpFaction"]).apply { color = SpigotChatColor.GRAY }),
arrayOf(TextComponent(plugin.language["CommandFactionHelpFactionAlly"]).apply { color = SpigotChatColor.GRAY }),
arrayOf(TextComponent(plugin.language["CommandFactionHelpFactionAutoclaim"]).apply { color = SpigotChatColor.GRAY }),
arrayOf(TextComponent(plugin.language["CommandFactionHelpFactionAutounclaim"]).apply { color = SpigotChatColor.GRAY }),
arrayOf(TextComponent(plugin.language["CommandFactionHelpFactionBonusPower"]).apply { color = SpigotChatColor.GRAY }),
arrayOf(TextComponent(plugin.language["CommandFactionHelpFactionBreakAlliance"]).apply { color = SpigotChatColor.GRAY }),
arrayOf(TextComponent(plugin.language["CommandFactionHelpFactionBypass"]).apply { color = SpigotChatColor.GRAY }),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package com.dansplugins.factionsystem.command.faction.unclaim

import com.dansplugins.factionsystem.MedievalFactions
import com.dansplugins.factionsystem.player.MfPlayer
import dev.forkhandles.result4k.onFailure
import org.bukkit.ChatColor.GREEN
import org.bukkit.ChatColor.RED
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
import java.util.logging.Level.SEVERE

class MfFactionUnclaimAutoCommand(private val plugin: MedievalFactions) : CommandExecutor, TabCompleter {
override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array<out String>): Boolean {
if (!sender.hasPermission("mf.unclaim.auto") || !sender.hasPermission("mf.autounclaim")) {
sender.sendMessage("$RED${plugin.language["CommandFactionAutounclaimNoPermission"]}")
return true
}
if (sender !is Player) {
sender.sendMessage("$RED${plugin.language["CommandFactionAutounclaimNotAPlayer"]}")
return true
}
plugin.server.scheduler.runTaskAsynchronously(
plugin,
Runnable {
val playerService = plugin.services.playerService
val mfPlayer = playerService.getPlayer(sender)
?: playerService.save(MfPlayer(plugin, sender)).onFailure {
sender.sendMessage("$RED${plugin.language["CommandFactionAutounclaimFailedToSavePlayer"]}")
plugin.logger.log(SEVERE, "Failed to save player: ${it.reason.message}", it.reason.cause)
return@Runnable
}
val factionService = plugin.services.factionService
val faction = factionService.getFaction(mfPlayer.id)
if (faction == null) {
sender.sendMessage("$RED${plugin.language["CommandFactionAutounclaimMustBeInAFaction"]}")
return@Runnable
}
val role = faction.getRole(mfPlayer.id)
if (role == null || !role.hasPermission(faction, plugin.factionPermissions.toggleAutounclaim)) {
sender.sendMessage("$RED${plugin.language["CommandFactionAutounclaimNoFactionPermission"]}")
return@Runnable
}
val updatedFaction = factionService.save(faction.copy(autounclaim = !faction.autounclaim)).onFailure {
sender.sendMessage("$RED${plugin.language["CommandFactionAutounclaimFailedToSaveFaction"]}")
return@Runnable
}

if (updatedFaction.autounclaim) {
sender.sendMessage("$GREEN${plugin.language["CommandFactionAutounclaimEnabled"]}")
plugin.server.scheduler.runTask(
plugin,
Runnable {
updatedFaction.sendMessage(
plugin.language["AutounclaimEnabledNotificationTitle"],
plugin.language["AutounclaimEnabledNotificationBody"]
)
}
)
} else {
sender.sendMessage("$GREEN${plugin.language["CommandFactionAutounclaimDisabled"]}")
plugin.server.scheduler.runTask(
plugin,
Runnable {
updatedFaction.sendMessage(
plugin.language["AutounclaimDisabledNotificationTitle"],
plugin.language["AutounclaimDisabledNotificationBody"]
)
}
)
}
}
)
return true
}

override fun onTabComplete(
sender: CommandSender,
command: Command,
label: String,
args: Array<out String>
) = emptyList<String>()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
package com.dansplugins.factionsystem.command.faction.unclaim

import com.dansplugins.factionsystem.MedievalFactions
import com.dansplugins.factionsystem.claim.MfClaimedChunk
import com.dansplugins.factionsystem.faction.MfFaction
import com.dansplugins.factionsystem.player.MfPlayer
import dev.forkhandles.result4k.onFailure
import org.bukkit.ChatColor.GREEN
import org.bukkit.ChatColor.RED
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
import java.util.logging.Level.SEVERE

class MfFactionUnclaimCircleCommand(private val plugin: MedievalFactions) : CommandExecutor, TabCompleter {
override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array<out String>): Boolean {
if (!sender.hasPermission("mf.unclaim")) {
sender.sendMessage("$RED${plugin.language["CommandFactionUnclaimNoPermission"]}")
return true
}
if (sender !is Player) {
sender.sendMessage("$RED${plugin.language["CommandFactionUnclaimNotAPlayer"]}")
return true
}
plugin.server.scheduler.runTaskAsynchronously(
plugin,
Runnable {
val playerService = plugin.services.playerService
val mfPlayer = playerService.getPlayer(sender)
?: playerService.save(MfPlayer(plugin, sender)).onFailure {
sender.sendMessage("$RED${plugin.language["CommandFactionUnclaimFailedToSavePlayer"]}")
plugin.logger.log(SEVERE, "Failed to save player: ${it.reason.message}", it.reason.cause)
return@Runnable
}
val factionService = plugin.services.factionService
var faction: MfFaction? = null
if (!mfPlayer.isBypassEnabled) { // skip faction check if in bypass mode
faction = factionService.getFaction(mfPlayer.id)
if (faction == null) {
sender.sendMessage("$RED${plugin.language["CommandFactionUnclaimMustBeInAFaction"]}")
return@Runnable
}
val role = faction.getRole(mfPlayer.id)
if (role == null || !role.hasPermission(faction, plugin.factionPermissions.unclaim)) {
sender.sendMessage("$RED${plugin.language["CommandFactionUnclaimNoFactionPermission"]}")
return@Runnable
}
}
val radius = if (args.isNotEmpty()) {
args[0].toIntOrNull()
} else {
null
}
val maxClaimRadius = plugin.config.getInt("factions.maxClaimRadius")
if (radius != null && (radius < 0 || radius > maxClaimRadius)) {
sender.sendMessage("$RED${plugin.language["CommandFactionUnclaimMaxClaimRadius", maxClaimRadius.toString()]}")
return@Runnable
}
val claimService = plugin.services.claimService
val senderChunk = sender.location.chunk
val senderChunkX = senderChunk.x
val senderChunkZ = senderChunk.z
plugin.server.scheduler.runTask(
plugin,
Runnable {
val chunks = if (radius == null) {
listOf(senderChunk)
} else {
(senderChunkX - radius..senderChunkX + radius).flatMap { x ->
(senderChunkZ - radius..senderChunkZ + radius).filter { z ->
val a = x - senderChunkX
val b = z - senderChunkZ
(a * a) + (b * b) <= radius * radius
}.map { z -> sender.world.getChunkAt(x, z) }
}
}
plugin.server.scheduler.runTaskAsynchronously(
plugin,
Runnable saveChunks@{
val claims: List<MfClaimedChunk> = if (!mfPlayer.isBypassEnabled) {
chunks.mapNotNull { chunk ->
claimService.getClaim(chunk)
}.filter { claim ->
if (faction == null) {
return@filter false
}
return@filter claim.factionId.value == faction.id.value
}
} else {
chunks.mapNotNull { chunk ->
claimService.getClaim(chunk)
}
}
if (claims.isEmpty()) {
sender.sendMessage("$RED${plugin.language["CommandFactionUnclaimNoUnclaimableChunks"]}")
return@saveChunks
}
claims.forEach { claim ->
claimService.delete(claim)
.onFailure {
sender.sendMessage("$RED${plugin.language["CommandFactionUnclaimFailedToDeleteClaim"]}")
plugin.logger.log(SEVERE, "Failed to delete claimed chunk: ${it.reason.message}", it.reason.cause)
return@saveChunks
}
}
sender.sendMessage("$GREEN${plugin.language["CommandFactionUnclaimSuccess", chunks.size.toString()]}")
}
)
}
)
}
)
return true
}

override fun onTabComplete(
sender: CommandSender,
command: Command,
label: String,
args: Array<out String>
) = emptyList<String>()
}
Original file line number Diff line number Diff line change
@@ -1,124 +1,36 @@
package com.dansplugins.factionsystem.command.faction.unclaim

import com.dansplugins.factionsystem.MedievalFactions
import com.dansplugins.factionsystem.claim.MfClaimedChunk
import com.dansplugins.factionsystem.faction.MfFaction
import com.dansplugins.factionsystem.player.MfPlayer
import dev.forkhandles.result4k.onFailure
import org.bukkit.ChatColor.GREEN
import org.bukkit.ChatColor.RED
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
import java.util.logging.Level.SEVERE

class MfFactionUnclaimCommand(private val plugin: MedievalFactions) : CommandExecutor, TabCompleter {
private val factionUnclaimAutoCommand = MfFactionUnclaimAutoCommand(plugin)
private val factionUnclaimCircleCommand = MfFactionUnclaimCircleCommand(plugin)

private val autoAliases = listOf("auto", plugin.language["CmdFactionUnclaimAuto"])

private val subcommands = autoAliases

override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array<out String>): Boolean {
if (!sender.hasPermission("mf.unclaim")) {
sender.sendMessage("$RED${plugin.language["CommandFactionUnclaimNoPermission"]}")
return true
}
if (sender !is Player) {
sender.sendMessage("$RED${plugin.language["CommandFactionUnclaimNotAPlayer"]}")
return true
}
plugin.server.scheduler.runTaskAsynchronously(
plugin,
Runnable {
val playerService = plugin.services.playerService
val mfPlayer = playerService.getPlayer(sender)
?: playerService.save(MfPlayer(plugin, sender)).onFailure {
sender.sendMessage("$RED${plugin.language["CommandFactionUnclaimFailedToSavePlayer"]}")
plugin.logger.log(SEVERE, "Failed to save player: ${it.reason.message}", it.reason.cause)
return@Runnable
}
val factionService = plugin.services.factionService
var faction: MfFaction? = null
if (!mfPlayer.isBypassEnabled) { // skip faction check if in bypass mode
faction = factionService.getFaction(mfPlayer.id)
if (faction == null) {
sender.sendMessage("$RED${plugin.language["CommandFactionUnclaimMustBeInAFaction"]}")
return@Runnable
}
val role = faction.getRole(mfPlayer.id)
if (role == null || !role.hasPermission(faction, plugin.factionPermissions.unclaim)) {
sender.sendMessage("$RED${plugin.language["CommandFactionUnclaimNoFactionPermission"]}")
return@Runnable
}
}
val radius = if (args.isNotEmpty()) {
args[0].toIntOrNull()
} else {
null
}
val maxClaimRadius = plugin.config.getInt("factions.maxClaimRadius")
if (radius != null && (radius < 0 || radius > maxClaimRadius)) {
sender.sendMessage("$RED${plugin.language["CommandFactionUnclaimMaxClaimRadius", maxClaimRadius.toString()]}")
return@Runnable
}
val claimService = plugin.services.claimService
val senderChunk = sender.location.chunk
val senderChunkX = senderChunk.x
val senderChunkZ = senderChunk.z
plugin.server.scheduler.runTask(
plugin,
Runnable {
val chunks = if (radius == null) {
listOf(senderChunk)
} else {
(senderChunkX - radius..senderChunkX + radius).flatMap { x ->
(senderChunkZ - radius..senderChunkZ + radius).filter { z ->
val a = x - senderChunkX
val b = z - senderChunkZ
(a * a) + (b * b) <= radius * radius
}.map { z -> sender.world.getChunkAt(x, z) }
}
}
plugin.server.scheduler.runTaskAsynchronously(
plugin,
Runnable saveChunks@{
val claims: List<MfClaimedChunk> = if (!mfPlayer.isBypassEnabled) {
chunks.mapNotNull { chunk ->
claimService.getClaim(chunk)
}.filter { claim ->
if (faction == null) {
return@filter false
}
return@filter claim.factionId.value == faction.id.value
}
} else {
chunks.mapNotNull { chunk ->
claimService.getClaim(chunk)
}
}
if (claims.isEmpty()) {
sender.sendMessage("$RED${plugin.language["CommandFactionUnclaimNoUnclaimableChunks"]}")
return@saveChunks
}
claims.forEach { claim ->
claimService.delete(claim)
.onFailure {
sender.sendMessage("$RED${plugin.language["CommandFactionUnclaimFailedToDeleteClaim"]}")
plugin.logger.log(SEVERE, "Failed to delete claimed chunk: ${it.reason.message}", it.reason.cause)
return@saveChunks
}
}
sender.sendMessage("$GREEN${plugin.language["CommandFactionUnclaimSuccess", chunks.size.toString()]}")
}
)
}
)
return when (args.firstOrNull()?.lowercase()) {
in autoAliases -> factionUnclaimAutoCommand.onCommand(sender, command, label, args.drop(1).toTypedArray())
else -> {
return factionUnclaimCircleCommand.onCommand(sender, command, label, args)
}
)
return true
}
}

override fun onTabComplete(
sender: CommandSender,
command: Command,
label: String,
args: Array<out String>
) = emptyList<String>()
) = when {
args.isEmpty() -> subcommands
args.size == 1 -> subcommands.filter { it.startsWith(args[0].lowercase()) }
else -> emptyList()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ class JooqMfFactionRepository(
.set(MF_FACTION.HOME_PITCH, faction.home?.pitch)
.set(MF_FACTION.BONUS_POWER, faction.bonusPower)
.set(MF_FACTION.AUTOCLAIM, faction.autoclaim)
.set(MF_FACTION.AUTOUNCLAIM, faction.autounclaim)
.set(
MF_FACTION.ROLES,
JSON.valueOf(
Expand All @@ -159,6 +160,7 @@ class JooqMfFactionRepository(
.set(MF_FACTION.HOME_PITCH, faction.home?.pitch)
.set(MF_FACTION.BONUS_POWER, faction.bonusPower)
.set(MF_FACTION.AUTOCLAIM, faction.autoclaim)
.set(MF_FACTION.AUTOUNCLAIM, faction.autounclaim)
.set(MF_FACTION.ROLES, JSON.valueOf(gson.toJson(faction.roles.map(MfFactionRole::serialize))))
.set(MF_FACTION.DEFAULT_ROLE_ID, faction.roles.default.id.value)
.set(
Expand Down Expand Up @@ -296,6 +298,7 @@ class JooqMfFactionRepository(
},
bonusPower = bonusPower,
autoclaim = autoclaim,
autounclaim = autounclaim,
roles = factionRoles,
defaultPermissionsByName = gson.fromJson(
defaultPermissions.data(),
Expand Down
Loading