Skip to content

Commit

Permalink
feat: add /photographer command
Browse files Browse the repository at this point in the history
  • Loading branch information
MC-XiaoHei committed Mar 17, 2024
1 parent 93528a1 commit f49ac65
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 7 deletions.
8 changes: 6 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ repositories {
maven("https://maven.aliyun.com/repository/public")
maven("https://repo.leavesmc.top/releases")
maven("https://repo.leavesmc.top/snapshots")
maven("https://repo.codemc.org/repository/maven-public/")
flatDir {
dirs("libs")
}
Expand All @@ -26,8 +27,10 @@ dependencies {
compileOnly(files("libs/ThemisAPI_0.15.3.jar"))
compileOnly(files("libs/Matrix_7.7.15A.jar"))
implementation("com.moandjiezana.toml:toml4j:0.7.2")
compileOnly("top.leavesmc.leaves:leaves-api:1.20.1-R0.1-SNAPSHOT")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
compileOnly("top.leavesmc.leaves:leaves-api:1.20.4-R0.1-SNAPSHOT")
implementation("dev.jorel:commandapi-bukkit-shade:9.3.0")
implementation("dev.jorel:commandapi-bukkit-kotlin:9.3.0")
implementation("org.jetbrains.kotlin:kotlin-stdlib:1.9.0")
}

val targetJavaVersion = 17
Expand Down Expand Up @@ -55,6 +58,7 @@ tasks.withType<JavaCompile>().configureEach {
}

tasks.withType<ShadowJar> {
relocate("dev.jorel.commandapi", "cn.xor7.iseeyou.commandapi")
minimize()
exclude("META-INF/*.SF")
exclude("META-INF/*.DSA")
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/cn/xor7/iseeyou/EventListener.kt
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ object EventListener : Listener {
*/
@EventHandler
fun onPlayerMove(event: PlayerMoveEvent) {
val photographer: Photographer = photographers[event.player.uniqueId.toString()]!!
val photographer: Photographer = photographers[event.player.uniqueId.toString()] ?: return
val velocity = event.player.velocity
if (toml!!.data.pauseRecordingOnHighSpeed.enabled &&
velocity.x.pow(2.0) + velocity.z.pow(2.0) > pauseRecordingOnHighSpeedThresholdPerTickSquared &&
Expand Down
84 changes: 81 additions & 3 deletions src/main/java/cn/xor7/iseeyou/ISeeYou.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,24 @@ import cn.xor7.iseeyou.anticheat.AntiCheatListener
import cn.xor7.iseeyou.anticheat.listeners.MatrixListener
import cn.xor7.iseeyou.anticheat.listeners.ThemisListener
import cn.xor7.iseeyou.anticheat.suspiciousPhotographers
import dev.jorel.commandapi.CommandAPI
import dev.jorel.commandapi.CommandAPIBukkitConfig
import dev.jorel.commandapi.arguments.ArgumentSuggestions
import dev.jorel.commandapi.kotlindsl.*
import org.bukkit.Bukkit
import org.bukkit.Location
import org.bukkit.command.CommandExecutor
import org.bukkit.configuration.InvalidConfigurationException
import org.bukkit.plugin.java.JavaPlugin
import org.bukkit.scheduler.BukkitRunnable
import top.leavesmc.leaves.entity.Photographer
import java.io.File
import java.io.IOException
import java.nio.file.*
import java.nio.file.attribute.BasicFileAttributes
import java.time.Duration
import java.time.LocalDate
import java.time.LocalDateTime
import java.util.*
import kotlin.io.path.isDirectory
import kotlin.math.pow
Expand All @@ -27,9 +34,18 @@ var instance: JavaPlugin? = null
@Suppress("unused")
class ISeeYou : JavaPlugin(), CommandExecutor {
private var outdatedRecordRetentionDays: Int = 0
private val commandPhotographersNameUUIDMap = mutableMapOf<String, String>() // Name => UUID

override fun onLoad() = CommandAPI.onLoad(
CommandAPIBukkitConfig(this)
.verboseOutput(false)
.silentLogs(true)
)

override fun onEnable() {
instance = this
CommandAPI.onEnable()
registerCommand()
setupConfig()
if (toml != null) {
if (toml!!.data.deleteTmpFileOnLoad) {
Expand All @@ -47,9 +63,7 @@ class ISeeYou : JavaPlugin(), CommandExecutor {
if (toml!!.data.clearOutdatedRecordFile.enabled) {
cleanOutdatedRecordings()
object : BukkitRunnable() {
override fun run() {
cleanOutdatedRecordings()
}
override fun run() = cleanOutdatedRecordings()
}.runTaskTimer(this, 0, 20 * 60 * 60 * 24) // Every day
}
Bukkit.getPluginManager().registerEvents(EventListener, this)
Expand All @@ -69,6 +83,69 @@ class ISeeYou : JavaPlugin(), CommandExecutor {
) Bukkit.getPluginManager().registerEvents(MatrixListener(), this)
}

private fun registerCommand() {
commandTree("photographer") {
literalArgument("create") {
stringArgument("name") {
playerExecutor { player, args ->
val location = player.location
val name = args["name"] as String
createPhotographer(name, location)
player.sendMessage("§a成功创建摄像机:$name")
}
locationArgument("location") {
anyExecutor { sender, args ->
val location = args["location"] as Location
val name = args["name"] as String
createPhotographer(name, location)
sender.sendMessage("§a成功创建摄像机:$name")
}
}
}
}
literalArgument("remove") {
stringArgument("name") {
replaceSuggestions(ArgumentSuggestions.strings(commandPhotographersNameUUIDMap.keys.toList())) // 这不会工作
anyExecutor { sender, args ->
val name = args["name"] as String
val uuid = commandPhotographersNameUUIDMap[name] ?: run {
sender.sendMessage("§4不存在该摄像机!")
return@anyExecutor
}
photographers[uuid]?.stopRecording()
sender.sendMessage("§a成功移除摄像机:$name")
}
}
}
literalArgument("list") {
anyExecutor { sender, _ ->
val photographerNames = commandPhotographersNameUUIDMap.keys.joinToString(", ")
sender.sendMessage("§a摄像机列表:$photographerNames")
}
}
}
}

private fun createPhotographer(name: String, location: Location) {
val photographer = Bukkit
.getPhotographerManager()
.createPhotographer(name, location)
if (photographer == null) throw RuntimeException("Error on create photographer $name")
val uuid = UUID.randomUUID().toString()

photographers[uuid] = photographer
commandPhotographersNameUUIDMap[name] = uuid
val currentTime = LocalDateTime.now()
val recordPath: String = toml!!.data.recordPath
.replace("\${name}", "$name@Command")
.replace("\${uuid}", uuid)
File(recordPath).mkdirs()
val recordFile = File(recordPath + "/" + currentTime.format(EventListener.DATE_FORMATTER) + ".mcpr")
if (recordFile.exists()) recordFile.delete()
recordFile.createNewFile()
photographer.setRecordFile(recordFile)
}

private fun setupConfig() {
toml = TomlEx("plugins/ISeeYou/config.toml", ConfigData::class.java)
val errMsg = toml!!.data.isConfigValid()
Expand All @@ -81,6 +158,7 @@ class ISeeYou : JavaPlugin(), CommandExecutor {
}

override fun onDisable() {
CommandAPI.onDisable()
for (photographer in photographers.values) {
photographer.stopRecording()
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/paper-plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@ dependencies:
required: false
Matrix:
load: BEFORE
required: false
required: false

0 comments on commit f49ac65

Please sign in to comment.