diff --git a/build.gradle.kts b/build.gradle.kts index 41f3bd0..56dd0cf 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - kotlin("jvm") version "1.7.20" - id("io.izzel.taboolib") version "1.50" + kotlin("jvm") version "2.0.0" + id("io.izzel.taboolib") version "2.0.11" } group = "cc.maxmc.blastingcrisis" @@ -11,12 +11,14 @@ version = "1.0-SNAPSHOT" repositories { mavenCentral() mavenLocal() + maven("https://repo.vip.maxmc.cc:30443/releases") } dependencies { implementation(kotlin("stdlib")) - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0-RC") implementation("ink.ptms.core:v10800:10800") +// taboo("cc.maxmc.agones:AgonesKt:0.1.3") // implementation("ink.ptms.core:v11200:11200") } @@ -27,16 +29,18 @@ taboolib { name("TONY_All") } } - install("common", "common-5") - install("platform-bukkit") - install("module-nms", "module-nms-util") - install("module-chat", "module-lang", "module-configuration") +// install("common", "common-5") +// install("platform-bukkit") +// install("module-nms", "module-nms-util") +// install("module-chat", "module-lang", "module-configuration") - classifier = null - options("skip-kotlin-relocate") - version = "6.0.10-12" +// classifier = null +// options("skip-kotlin-relocate") + version { + taboolib = "6.1.1" + } } -tasks.withType { - kotlinOptions.jvmTarget = "1.8" -} \ No newline at end of file +//tasks.withType { +// kotlinOptions.jvmTarget = "1.8" +//} \ No newline at end of file diff --git a/src/main/kotlin/cc/maxmc/blastingcrisis/BlastingCrisis.kt b/src/main/kotlin/cc/maxmc/blastingcrisis/BlastingCrisis.kt index a274382..ebc868e 100644 --- a/src/main/kotlin/cc/maxmc/blastingcrisis/BlastingCrisis.kt +++ b/src/main/kotlin/cc/maxmc/blastingcrisis/BlastingCrisis.kt @@ -8,12 +8,15 @@ import cc.maxmc.blastingcrisis.misc.Area import cc.maxmc.blastingcrisis.misc.GameManager import cc.maxmc.blastingcrisis.misc.info import cc.maxmc.blastingcrisis.misc.pluginScope +import dev.cubxity.libs.agones.AgonesSDK import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch import org.bukkit.Bukkit import org.bukkit.ChatColor import org.bukkit.Location import taboolib.common.env.RuntimeDependency import taboolib.common.platform.Plugin +import taboolib.common.platform.function.submit @RuntimeDependency( "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4", @@ -23,9 +26,21 @@ object BlastingCrisis : Plugin() { info("§a| §7Loading BlastingCrisis") DebugCommand.debug("debugcmd") createDefaultGame() + submit(delay = 1) { + pluginScope.launch { + AgonesSDK().use { sdk -> + sdk.ready() + } + } + } } override fun onDisable() { + pluginScope.launch { + AgonesSDK().use { sdk -> + sdk.shutdown() + } + } pluginScope.cancel() } @@ -44,8 +59,7 @@ object BlastingCrisis : Plugin() { Area(location(-13, 78, -32), location(13, 72, -1)), Area(location(7, 72, -45), location(9, 74, -48)), listOf( - Area(location(15, 72, -1), location(19, 78, -48)), - Area(location(-19, 78, -48), location(-15, 72, -1)) + Area(location(15, 72, -1), location(19, 78, -48)), Area(location(-19, 78, -48), location(-15, 72, -1)) ), ) val teamGreen = MapTeam( @@ -59,8 +73,7 @@ object BlastingCrisis : Plugin() { Area(location(13, 78, 32), location(-13, 72, 1)), Area(location(-7, 72, 45), location(-9, 74, 48)), listOf( - Area(location(-15, 72, 1), location(-19, 78, 48)), - Area(location(19, 78, 48), location(15, 72, 1)) + Area(location(-15, 72, 1), location(-19, 78, 48)), Area(location(19, 78, 48), location(15, 72, 1)) ), ) val map = GameMap( @@ -71,7 +84,11 @@ object BlastingCrisis : Plugin() { teamRed, teamGreen ), 1, - "default" + "default", + listOf( + location(-5, 72, -44), location(5, 72, -44), location(0, 72, -48), + location(-5, 72, 44), location(5, 72, 44), location(0, 72, 48) + ) ) DebugCommand.game = Game(map) GameManager.currentGame = DebugCommand.game diff --git a/src/main/kotlin/cc/maxmc/blastingcrisis/command/DebugCommand.kt b/src/main/kotlin/cc/maxmc/blastingcrisis/command/DebugCommand.kt index b165644..7d5fe5c 100644 --- a/src/main/kotlin/cc/maxmc/blastingcrisis/command/DebugCommand.kt +++ b/src/main/kotlin/cc/maxmc/blastingcrisis/command/DebugCommand.kt @@ -78,6 +78,12 @@ object DebugCommand { } } + literal("respawn") { + execute { sender, _, _ -> + villager.spawnForPlayer(sender) + } + } + literal("rename") { dynamic { execute { _, _, arg -> diff --git a/src/main/kotlin/cc/maxmc/blastingcrisis/configuration/GlobalSettings.kt b/src/main/kotlin/cc/maxmc/blastingcrisis/configuration/GlobalSettings.kt index 5c8f908..49c79e0 100644 --- a/src/main/kotlin/cc/maxmc/blastingcrisis/configuration/GlobalSettings.kt +++ b/src/main/kotlin/cc/maxmc/blastingcrisis/configuration/GlobalSettings.kt @@ -8,7 +8,10 @@ object GlobalSettings { lateinit var settings: Configuration val timeToStart - get() = settings.getInt("time-to-start") + get() = settings.getInt("time_to_start") + + val itemGenDelay + get() = settings.getLong("item_gen_delay") object GameSettings { val villagerMaxHealth diff --git a/src/main/kotlin/cc/maxmc/blastingcrisis/debug/DListener.kt b/src/main/kotlin/cc/maxmc/blastingcrisis/debug/DListener.kt index c33987f..e5ab5dd 100644 --- a/src/main/kotlin/cc/maxmc/blastingcrisis/debug/DListener.kt +++ b/src/main/kotlin/cc/maxmc/blastingcrisis/debug/DListener.kt @@ -1,10 +1,13 @@ package cc.maxmc.blastingcrisis.debug +import net.minecraft.server.v1_8_R3.PacketPlayOutEntityDestroy import net.minecraft.server.v1_8_R3.PacketPlayOutSpawnEntityLiving import org.bukkit.Bukkit import taboolib.common.platform.event.SubscribeEvent +import taboolib.library.reflex.Reflex.Companion.getProperty import taboolib.module.nms.PacketSendEvent import taboolib.platform.BukkitPlugin +import taboolib.platform.util.broadcast object DListener { @SubscribeEvent @@ -12,13 +15,18 @@ object DListener { Bukkit.getScheduler().runTask(BukkitPlugin.getInstance()) { if (it.player.name != "TONY_All") return@runTask // val source = it.packet.source - if (!it.packet.name.lowercase().contains("entity")) return@runTask -// println(it.packet.name) - if (it.packet.source !is PacketPlayOutSpawnEntityLiving) { - return@runTask +// if (!it.packet.name.lowercase().contains("entity")) return@runTask + val pname = listOf("PacketPlayOutSpawnEntityLiving", "PacketPlayOutEntityDestroy") + if (pname.contains(it.packet.name)) println(it.packet.name) + + if (it.packet.source is PacketPlayOutSpawnEntityLiving) { + it.packet.source.getProperty("a")!!.broadcast() + it.packet.source.getProperty("b")!!.broadcast() + } + + if (it.packet.source is PacketPlayOutEntityDestroy) { + it.packet.source.getProperty("a")!!.contentToString().broadcast() } -// it.packet.source.getProperty("a")!!.broadcast() -// it.packet.source.getProperty("b")!!.broadcast() } } } \ No newline at end of file diff --git a/src/main/kotlin/cc/maxmc/blastingcrisis/game/Game.kt b/src/main/kotlin/cc/maxmc/blastingcrisis/game/Game.kt index 774c2fe..24716f2 100644 --- a/src/main/kotlin/cc/maxmc/blastingcrisis/game/Game.kt +++ b/src/main/kotlin/cc/maxmc/blastingcrisis/game/Game.kt @@ -5,6 +5,7 @@ import cc.maxmc.blastingcrisis.misc.Area import cc.maxmc.blastingcrisis.misc.BlockGenManager import cc.maxmc.blastingcrisis.misc.UniArea import cc.maxmc.blastingcrisis.misc.debug +import kotlinx.coroutines.Job import org.bukkit.Material import org.bukkit.entity.Player import taboolib.common.platform.function.submit @@ -21,6 +22,8 @@ class Game( val placeBreakRule = GamePlaceBreakRule(this) val generator = BlockGenManager.getGenerator(map.blockGen)!! var state: GameState = GameState.WAITING + private lateinit var oreGenJob: Job + private lateinit var itemGenJob: List private fun autoJoinTeam() { players.filter { it.team == null }.shuffled().forEach { @@ -50,10 +53,15 @@ class Game( checkEnd() } + fun respawnPlayer(player: Player) { + teams.forEach { it.villager.respawn(player) } + } + fun start() { debug("game ${map.name} started.") placeBreakRule.loadDefaultRule() - startOreGen() +// startOreGen() +// startItemGen() state = GameState.START timer.startTimer() timer.submitEvent("wall_fall", Duration.ofMinutes(1)) { @@ -92,7 +100,14 @@ class Game( list += team.sides list } - generator.enable(UniArea(mines)) + oreGenJob = generator.enable(UniArea(mines)) + } + + private fun startItemGen() { + val generator = GameItemGenerator(Material.LOG) + itemGenJob = map.itemGen.map { + generator.generate(it) + } } fun checkEnd() { diff --git a/src/main/kotlin/cc/maxmc/blastingcrisis/game/GameItemGenerator.kt b/src/main/kotlin/cc/maxmc/blastingcrisis/game/GameItemGenerator.kt new file mode 100644 index 0000000..0cab6ca --- /dev/null +++ b/src/main/kotlin/cc/maxmc/blastingcrisis/game/GameItemGenerator.kt @@ -0,0 +1,31 @@ +package cc.maxmc.blastingcrisis.game + +import cc.maxmc.blastingcrisis.configuration.GlobalSettings +import cc.maxmc.blastingcrisis.misc.debug +import cc.maxmc.blastingcrisis.misc.pluginScope +import cc.maxmc.blastingcrisis.misc.toEntityLocation +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import org.bukkit.Bukkit +import org.bukkit.Location +import org.bukkit.Material +import org.bukkit.inventory.ItemStack +import org.bukkit.util.Vector +import taboolib.platform.BukkitPlugin + +class GameItemGenerator(val type: Material) { + + fun generate(location: Location): Job = pluginScope.launch { + while (true) { + Bukkit.getScheduler().runTask(BukkitPlugin.getInstance()) { + val item = location.world.dropItem(location.toEntityLocation(), ItemStack(type)) + item.teleport(location.toEntityLocation()) + item.velocity = Vector(0.0, 0.2, 0.0) + debug("Generate Item at ${location.toVector()}") + } + delay(GlobalSettings.itemGenDelay * 50) + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/cc/maxmc/blastingcrisis/game/GameOreGenerator.kt b/src/main/kotlin/cc/maxmc/blastingcrisis/game/GameOreGenerator.kt index eaa8330..02ef6c9 100644 --- a/src/main/kotlin/cc/maxmc/blastingcrisis/game/GameOreGenerator.kt +++ b/src/main/kotlin/cc/maxmc/blastingcrisis/game/GameOreGenerator.kt @@ -53,5 +53,4 @@ class GameOreGenerator(config: Configuration) { } } - } \ No newline at end of file diff --git a/src/main/kotlin/cc/maxmc/blastingcrisis/game/GameTeam.kt b/src/main/kotlin/cc/maxmc/blastingcrisis/game/GameTeam.kt index 4d1c07d..daaee59 100644 --- a/src/main/kotlin/cc/maxmc/blastingcrisis/game/GameTeam.kt +++ b/src/main/kotlin/cc/maxmc/blastingcrisis/game/GameTeam.kt @@ -3,7 +3,7 @@ package cc.maxmc.blastingcrisis.game import cc.maxmc.blastingcrisis.listener.GameListener import cc.maxmc.blastingcrisis.map.MapTeam import cc.maxmc.blastingcrisis.misc.debug -import cc.maxmc.blastingcrisis.misc.toPlayerLocation +import cc.maxmc.blastingcrisis.misc.toEntityLocation import org.bukkit.entity.Player import taboolib.platform.util.sendLang @@ -15,7 +15,7 @@ class GameTeam(val game: Game, val teamInfo: MapTeam) { private set fun start() { - players.forEach { it.teleport(teamInfo.spawn.toPlayerLocation()) } + players.forEach { it.teleport(teamInfo.spawn.toEntityLocation()) } villager.spawn() GameListener.interactSubscribed[teamInfo.upgrade] = { debug("interact team ${teamInfo.name} upgrade.") @@ -24,7 +24,7 @@ class GameTeam(val game: Game, val teamInfo: MapTeam) { val player = it.player ?: throw IllegalStateException("Bukkit API LOL") debug("teleporting $player to battle field") val team = player.team ?: throw IllegalStateException("Player ${player.name} should have a team") - player.teleport(team.teamInfo.mine.randomLocationRestrict().toPlayerLocation()) + player.teleport(team.teamInfo.mine.randomLocationRestrict().toEntityLocation()) }) } diff --git a/src/main/kotlin/cc/maxmc/blastingcrisis/game/TeamVillager.kt b/src/main/kotlin/cc/maxmc/blastingcrisis/game/TeamVillager.kt index 2ea44ef..000c55c 100644 --- a/src/main/kotlin/cc/maxmc/blastingcrisis/game/TeamVillager.kt +++ b/src/main/kotlin/cc/maxmc/blastingcrisis/game/TeamVillager.kt @@ -1,14 +1,15 @@ package cc.maxmc.blastingcrisis.game import cc.maxmc.blastingcrisis.configuration.GlobalSettings -import cc.maxmc.blastingcrisis.misc.toPlayerLocation +import cc.maxmc.blastingcrisis.misc.toEntityLocation import cc.maxmc.blastingcrisis.packet.BEntityVillager import org.bukkit.Bukkit +import org.bukkit.entity.Player import taboolib.platform.BukkitPlugin import taboolib.platform.util.asLangText class TeamVillager(private val team: GameTeam) { - private val packetVillager = BEntityVillager.create(team.teamInfo.villager.toPlayerLocation()) + private val packetVillager = BEntityVillager.create(team.teamInfo.villager.toEntityLocation()) var health: Int = GlobalSettings.GameSettings.villagerMaxHealth private set @@ -40,5 +41,9 @@ class TeamVillager(private val team: GameTeam) { team.game.checkEnd() } + fun respawn(player: Player) { + packetVillager.respawnForPlayer(player) + } + } \ No newline at end of file diff --git a/src/main/kotlin/cc/maxmc/blastingcrisis/listener/GameListener.kt b/src/main/kotlin/cc/maxmc/blastingcrisis/listener/GameListener.kt index 496da45..04ca913 100644 --- a/src/main/kotlin/cc/maxmc/blastingcrisis/listener/GameListener.kt +++ b/src/main/kotlin/cc/maxmc/blastingcrisis/listener/GameListener.kt @@ -5,7 +5,7 @@ import cc.maxmc.blastingcrisis.game.team import cc.maxmc.blastingcrisis.misc.Area import cc.maxmc.blastingcrisis.misc.GameManager import cc.maxmc.blastingcrisis.misc.debug -import cc.maxmc.blastingcrisis.misc.toPlayerLocation +import cc.maxmc.blastingcrisis.misc.toEntityLocation import org.bukkit.Location import org.bukkit.Material import org.bukkit.entity.EntityType @@ -90,10 +90,11 @@ object GameListener { @SubscribeEvent fun onRespawn(respawnEvent: PlayerRespawnEvent) { val team = respawnEvent.player.team ?: return // ignore none game player - respawnEvent.respawnLocation = team.teamInfo.spawn.toPlayerLocation() + GameManager.currentGame.respawnPlayer(respawnEvent.player) + respawnEvent.respawnLocation = team.teamInfo.spawn.toEntityLocation() } - @SubscribeEvent +// @SubscribeEvent fun protectDamageBeforeGame(damageEvent: EntityDamageEvent) { if (damageEvent.entity !is Player) return // ignore none player entity if (GameManager.currentGame.state.isStarted()) return diff --git a/src/main/kotlin/cc/maxmc/blastingcrisis/map/GameMap.kt b/src/main/kotlin/cc/maxmc/blastingcrisis/map/GameMap.kt index 1b0c204..59f1ed2 100644 --- a/src/main/kotlin/cc/maxmc/blastingcrisis/map/GameMap.kt +++ b/src/main/kotlin/cc/maxmc/blastingcrisis/map/GameMap.kt @@ -1,6 +1,7 @@ package cc.maxmc.blastingcrisis.map import cc.maxmc.blastingcrisis.misc.Area +import org.bukkit.Location class GameMap( val name: String, @@ -8,7 +9,8 @@ class GameMap( val wall: Area, val teams: List, val maxPlayersPerTeam: Int, - val blockGen: String + val blockGen: String, + val itemGen: List ) { val maxPlayer: Int get() = maxPlayersPerTeam * teams.size diff --git a/src/main/kotlin/cc/maxmc/blastingcrisis/misc/Math.kt b/src/main/kotlin/cc/maxmc/blastingcrisis/misc/Math.kt index f457c4b..f4c1153 100644 --- a/src/main/kotlin/cc/maxmc/blastingcrisis/misc/Math.kt +++ b/src/main/kotlin/cc/maxmc/blastingcrisis/misc/Math.kt @@ -28,7 +28,7 @@ fun List>.weightedRandom(): WeightRandom { return WeightRandom(this) } -fun Location.toPlayerLocation(): Location = clone().apply { +fun Location.toEntityLocation(): Location = clone().apply { x = blockX + 0.5 y = blockY.toDouble() z = blockZ + 0.5 diff --git a/src/main/kotlin/cc/maxmc/blastingcrisis/packet/BEntity.kt b/src/main/kotlin/cc/maxmc/blastingcrisis/packet/BEntity.kt index 4a797a7..40fb4d2 100644 --- a/src/main/kotlin/cc/maxmc/blastingcrisis/packet/BEntity.kt +++ b/src/main/kotlin/cc/maxmc/blastingcrisis/packet/BEntity.kt @@ -11,6 +11,7 @@ import taboolib.library.reflex.Reflex.Companion.getProperty import taboolib.library.reflex.Reflex.Companion.setProperty import taboolib.library.reflex.Reflex.Companion.unsafeInstance import taboolib.module.nms.sendPacket +import taboolib.module.nms.sendPacketBlocking import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.locks.ReentrantReadWriteLock @@ -58,7 +59,7 @@ abstract class BEntity(var loc: Location, val entityType: Int) { } packet.setProperty("l", dataWatcher) - viewers.forEach { it.sendPacket(packet) } + player.sendPacketBlocking(packet) } open fun addViewer(viewer: Player) { @@ -67,10 +68,18 @@ abstract class BEntity(var loc: Location, val entityType: Int) { } open fun removeViewer(viewer: Player) { - viewer.sendPacket(PacketPlayOutEntityDestroy(entityID)) + viewer.sendPacketBlocking(PacketPlayOutEntityDestroy(entityID)) viewers.remove(viewer) } + fun respawnForPlayer(player: Player) { + println(viewers) + if (!viewers.contains(player)) return + println("Respawning?") + removeViewer(player) + addViewer(player) + } + fun destroy() { ArrayList(viewers).forEach { removeViewer(it) } } diff --git a/src/main/kotlin/cc/maxmc/blastingcrisis/packet/BEntityVillager.kt b/src/main/kotlin/cc/maxmc/blastingcrisis/packet/BEntityVillager.kt index d0165dd..a3a6a73 100644 --- a/src/main/kotlin/cc/maxmc/blastingcrisis/packet/BEntityVillager.kt +++ b/src/main/kotlin/cc/maxmc/blastingcrisis/packet/BEntityVillager.kt @@ -30,6 +30,8 @@ class BEntityVillager private constructor(loc: Location) : BEntity(loc, 120) { nameTag.removeViewer(viewer) } + + override fun DataWatcher.initEntity() { a(6, 1.0f) // Health a(7, 0) // Potion Effect Color diff --git a/src/main/resources/settings.yml b/src/main/resources/settings.yml index 2924f6b..5ee1350 100644 --- a/src/main/resources/settings.yml +++ b/src/main/resources/settings.yml @@ -1,7 +1,10 @@ # Time before game start # Unit: second -time-to-start: 15 +time_to_start: 15 + +# Unit: tick +item_gen_delay: 20 game: villager_max_health: 150