蚯嫁嚎坏事做尽!!!(主体部分完成)

This commit is contained in:
TONY_All 2022-11-01 18:07:10 +08:00
parent 5124478878
commit 4c37dff413
14 changed files with 97 additions and 82 deletions

View File

@ -1,9 +1,17 @@
package cc.maxmc.blastingcrisis package cc.maxmc.blastingcrisis
import cc.maxmc.blastingcrisis.command.DebugCommand import cc.maxmc.blastingcrisis.command.DebugCommand
import cc.maxmc.blastingcrisis.game.Game
import cc.maxmc.blastingcrisis.map.GameMap
import cc.maxmc.blastingcrisis.map.MapTeam
import cc.maxmc.blastingcrisis.misc.Area
import cc.maxmc.blastingcrisis.misc.GameManager
import cc.maxmc.blastingcrisis.misc.info import cc.maxmc.blastingcrisis.misc.info
import cc.maxmc.blastingcrisis.misc.pluginScope import cc.maxmc.blastingcrisis.misc.pluginScope
import kotlinx.coroutines.cancel import kotlinx.coroutines.cancel
import org.bukkit.Bukkit
import org.bukkit.ChatColor
import org.bukkit.Location
import taboolib.common.env.RuntimeDependency import taboolib.common.env.RuntimeDependency
import taboolib.common.platform.Plugin import taboolib.common.platform.Plugin
@ -15,9 +23,55 @@ object BlastingCrisis : Plugin() {
info("§a| §7Loading BlastingCrisis") info("§a| §7Loading BlastingCrisis")
DebugCommand.debug("debugcmd") DebugCommand.debug("debugcmd")
info("§a| §7Loading BlastingCrisis") info("§a| §7Loading BlastingCrisis")
createDefaultGame()
} }
override fun onDisable() { override fun onDisable() {
pluginScope.cancel() pluginScope.cancel()
} }
private fun createDefaultGame() {
fun location(x: Int, y: Int, z: Int) =
Location(Bukkit.getWorlds().first(), x.toDouble(), y.toDouble(), z.toDouble())
val teamRed = MapTeam(
"红队",
ChatColor.RED,
location(0, 72, -44),
location(0, 72, -44),
location(-8, 73, -47),
Area(location(14, 72, -48), location(-13, 78, -34)),
Area(location(-13, 78, -33), location(13, 72, -33)),
Area(location(-13, 78, -32), location(13, 71, -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))
),
)
val teamGreen = MapTeam(
"绿队",
ChatColor.GREEN,
location(0, 72, 44),
location(0, 72, 44),
location(8, 73, 47),
Area(location(-14, 72, 48), location(13, 78, 34)),
Area(location(13, 78, 33), location(-13, 72, 33)),
Area(location(13, 78, 32), location(-13, 71, 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))
),
)
val map = GameMap(
"test",
Area(location(20, 70, -49), location(-20, 79, 49)),
Area(location(-13, 78, 0), location(13, 72, 0)),
listOf(
teamRed, teamGreen
),
1
)
DebugCommand.game = Game(map)
GameManager.currentGame = DebugCommand.game
}
} }

View File

@ -3,15 +3,10 @@ package cc.maxmc.blastingcrisis.command
import cc.maxmc.blastingcrisis.game.Game import cc.maxmc.blastingcrisis.game.Game
import cc.maxmc.blastingcrisis.game.GameOreGenerator import cc.maxmc.blastingcrisis.game.GameOreGenerator
import cc.maxmc.blastingcrisis.game.GameState import cc.maxmc.blastingcrisis.game.GameState
import cc.maxmc.blastingcrisis.map.GameMap
import cc.maxmc.blastingcrisis.map.MapTeam
import cc.maxmc.blastingcrisis.misc.Area import cc.maxmc.blastingcrisis.misc.Area
import cc.maxmc.blastingcrisis.misc.GameManager
import cc.maxmc.blastingcrisis.packet.BEntityVillager import cc.maxmc.blastingcrisis.packet.BEntityVillager
import kotlinx.coroutines.cancel import kotlinx.coroutines.cancel
import org.bukkit.Bukkit import org.bukkit.Bukkit
import org.bukkit.ChatColor
import org.bukkit.Location
import org.bukkit.entity.Player import org.bukkit.entity.Player
import taboolib.common.platform.ProxyPlayer import taboolib.common.platform.ProxyPlayer
import taboolib.common.platform.command.command import taboolib.common.platform.command.command
@ -27,52 +22,6 @@ object DebugCommand {
lateinit var villager: BEntityVillager lateinit var villager: BEntityVillager
fun debug(cmd: String) = command(cmd) { fun debug(cmd: String) = command(cmd) {
literal("game") { literal("game") {
execute<Player> { sender, _, _ ->
fun location(x: Int, y: Int, z: Int) = Location(sender.world, x.toDouble(), y.toDouble(), z.toDouble())
Bukkit.broadcastMessage(sender.name)
val teamRed = MapTeam(
"红队",
ChatColor.RED,
location(0, 72, -44),
location(0, 72, -44),
location(-8, 73, -47),
Area(location(14, 72, -48), location(-13, 78, -34)),
Area(location(-13, 78, -33), location(13, 72, -33)),
Area(location(-13, 78, -32), location(13, 71, -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))
),
)
val teamGreen = MapTeam(
"绿队",
ChatColor.GREEN,
location(0, 72, 44),
location(0, 72, 44),
location(8, 73, 47),
Area(location(-14, 72, 48), location(13, 78, 34)),
Area(location(13, 78, 33), location(-13, 72, 33)),
Area(location(13, 78, 32), location(-13, 71, 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))
),
)
val map = GameMap(
"test",
Area(location(20, 70, -49), location(-20, 79, 49)),
Area(location(-13, 78, 0), location(13, 72, 0)),
listOf(
teamRed, teamGreen
),
1
)
game = Game(map)
GameManager.currentGame = game
}
literal("join") { literal("join") {
execute<Player> { sender, _, _ -> execute<Player> { sender, _, _ ->
game.join(sender) game.join(sender)

View File

@ -2,7 +2,6 @@ package cc.maxmc.blastingcrisis.game
import cc.maxmc.blastingcrisis.map.GameMap import cc.maxmc.blastingcrisis.map.GameMap
import cc.maxmc.blastingcrisis.misc.debug import cc.maxmc.blastingcrisis.misc.debug
import org.bukkit.Bukkit
import org.bukkit.Material import org.bukkit.Material
import org.bukkit.entity.Player import org.bukkit.entity.Player
import taboolib.common.platform.function.submit import taboolib.common.platform.function.submit
@ -52,7 +51,7 @@ class Game(
timer.startTimer() timer.startTimer()
timer.submitEvent("wall_fall", Duration.ofMinutes(1)) { timer.submitEvent("wall_fall", Duration.ofMinutes(1)) {
broadcast { it.sendLang("game_wall_fall") } broadcast { it.sendLang("game_wall_fall") }
submit(now = true) { submit {
map.wall.forBlocksInArea().forEach { map.wall.forBlocksInArea().forEach {
it.block.type = Material.AIR it.block.type = Material.AIR
} }

View File

@ -5,5 +5,5 @@ import org.bukkit.entity.Player
val Player.team: GameTeam? val Player.team: GameTeam?
get() = GameManager.currentGame.teams.findLast { get() = GameManager.currentGame.teams.findLast {
it.players.contains(this) it.players.contains(this)
} }

View File

@ -1,7 +1,6 @@
package cc.maxmc.blastingcrisis.game package cc.maxmc.blastingcrisis.game
import cc.maxmc.blastingcrisis.game.GameState.* import cc.maxmc.blastingcrisis.game.GameState.*
import cc.maxmc.blastingcrisis.misc.debug
import org.bukkit.entity.Player import org.bukkit.entity.Player
import taboolib.module.nms.sendScoreboard import taboolib.module.nms.sendScoreboard
import taboolib.platform.util.asLangText import taboolib.platform.util.asLangText
@ -14,7 +13,6 @@ class GameScoreboard(val game: Game) {
} }
fun sendScoreboardPlayer(player: Player) { fun sendScoreboardPlayer(player: Player) {
debug("sending Scoreboard to ${player.name}")
val scoreboardText = when (game.state) { val scoreboardText = when (game.state) {
WAITING -> { WAITING -> {
player.asLangText("scoreboard_waiting", game.players.size, game.map.maxPlayer) player.asLangText("scoreboard_waiting", game.players.size, game.map.maxPlayer)

View File

@ -3,6 +3,7 @@ package cc.maxmc.blastingcrisis.game
import cc.maxmc.blastingcrisis.listener.GameListener import cc.maxmc.blastingcrisis.listener.GameListener
import cc.maxmc.blastingcrisis.map.MapTeam import cc.maxmc.blastingcrisis.map.MapTeam
import cc.maxmc.blastingcrisis.misc.debug import cc.maxmc.blastingcrisis.misc.debug
import cc.maxmc.blastingcrisis.misc.toPlayerLocation
import org.bukkit.entity.Player import org.bukkit.entity.Player
import taboolib.platform.util.sendLang import taboolib.platform.util.sendLang
@ -14,7 +15,7 @@ class GameTeam(val game: Game, val teamInfo: MapTeam) {
private set private set
fun start() { fun start() {
players.forEach { it.teleport(teamInfo.spawn) } players.forEach { it.teleport(teamInfo.spawn.toPlayerLocation()) }
villager.spawn() villager.spawn()
GameListener.interactSubscribed[teamInfo.upgrade] = { GameListener.interactSubscribed[teamInfo.upgrade] = {
debug("interact team ${teamInfo.name} upgrade.") debug("interact team ${teamInfo.name} upgrade.")

View File

@ -1,7 +1,6 @@
package cc.maxmc.blastingcrisis.game package cc.maxmc.blastingcrisis.game
import cc.maxmc.blastingcrisis.configuration.GlobalSettings import cc.maxmc.blastingcrisis.configuration.GlobalSettings
import cc.maxmc.blastingcrisis.misc.info
import cc.maxmc.blastingcrisis.misc.pluginScope import cc.maxmc.blastingcrisis.misc.pluginScope
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.delay import kotlinx.coroutines.delay

View File

@ -1,13 +1,14 @@
package cc.maxmc.blastingcrisis.game package cc.maxmc.blastingcrisis.game
import cc.maxmc.blastingcrisis.configuration.GlobalSettings import cc.maxmc.blastingcrisis.configuration.GlobalSettings
import cc.maxmc.blastingcrisis.misc.toPlayerLocation
import cc.maxmc.blastingcrisis.packet.BEntityVillager import cc.maxmc.blastingcrisis.packet.BEntityVillager
import org.bukkit.Bukkit import org.bukkit.Bukkit
import taboolib.platform.BukkitPlugin import taboolib.platform.BukkitPlugin
import taboolib.platform.util.asLangText import taboolib.platform.util.asLangText
class TeamVillager(private val team: GameTeam) { class TeamVillager(private val team: GameTeam) {
private val packetVillager = BEntityVillager.create(team.teamInfo.villager) private val packetVillager = BEntityVillager.create(team.teamInfo.villager.toPlayerLocation())
var health: Int = GlobalSettings.GameSettings.villagerMaxHealth var health: Int = GlobalSettings.GameSettings.villagerMaxHealth
private set private set

View File

@ -3,8 +3,9 @@ package cc.maxmc.blastingcrisis.listener
import cc.maxmc.blastingcrisis.game.team import cc.maxmc.blastingcrisis.game.team
import cc.maxmc.blastingcrisis.misc.GameManager import cc.maxmc.blastingcrisis.misc.GameManager
import cc.maxmc.blastingcrisis.misc.debug import cc.maxmc.blastingcrisis.misc.debug
import cc.maxmc.blastingcrisis.misc.toPlayerLocation
import org.bukkit.Location import org.bukkit.Location
import org.bukkit.event.block.BlockExplodeEvent import org.bukkit.event.entity.EntityExplodeEvent
import org.bukkit.event.player.PlayerInteractEvent import org.bukkit.event.player.PlayerInteractEvent
import org.bukkit.event.player.PlayerMoveEvent import org.bukkit.event.player.PlayerMoveEvent
import taboolib.common.platform.event.SubscribeEvent import taboolib.common.platform.event.SubscribeEvent
@ -19,7 +20,7 @@ object GameListener {
val team = player.team ?: return val team = player.team ?: return
if (!team.teamInfo.teleport.isInArea(event.to)) return if (!team.teamInfo.teleport.isInArea(event.to)) return
debug("teleporting ${event.player} to battle field") debug("teleporting ${event.player} to battle field")
player.teleport(team.teamInfo.mine.randomLocation()) player.teleport(team.teamInfo.mine.randomLocation().toPlayerLocation())
} }
@SubscribeEvent @SubscribeEvent
@ -29,11 +30,12 @@ object GameListener {
} }
@SubscribeEvent @SubscribeEvent
fun onTNT(tntExplode: BlockExplodeEvent) { fun onTNT(tntExplode: EntityExplodeEvent) {
debug("tnt exploded at ${tntExplode.block.location}") debug("${tntExplode.entityType} exploded at ${tntExplode.location}")
tntExplode.blockList().clear() tntExplode.blockList().clear()
if (!GameManager.currentGame.state.isStarted()) return
GameManager.currentGame.teams.findLast { GameManager.currentGame.teams.findLast {
it.teamSurvive && it.teamInfo.home.isInArea(tntExplode.block.location) it.teamSurvive && it.teamInfo.home.isInArea(tntExplode.location)
}?.apply { }?.apply {
villager.damage() villager.damage()
debug("team ${teamInfo.name}'s villager damaged") debug("team ${teamInfo.name}'s villager damaged")

View File

@ -2,10 +2,7 @@ package cc.maxmc.blastingcrisis.map
import cc.maxmc.blastingcrisis.misc.Area import cc.maxmc.blastingcrisis.misc.Area
object MapInitializer { object MapInitializer
}
class MapInfo( class MapInfo(
var name: String, var name: String,
@ -13,6 +10,4 @@ class MapInfo(
val teams: List<MapTeam>, val teams: List<MapTeam>,
val maxPlayersPerTeam: Int, val maxPlayersPerTeam: Int,
) { )
}

View File

@ -2,6 +2,7 @@ package cc.maxmc.blastingcrisis.misc
import org.bukkit.Location import org.bukkit.Location
import org.bukkit.Material import org.bukkit.Material
import org.bukkit.block.Block
import org.bukkit.configuration.serialization.ConfigurationSerializable import org.bukkit.configuration.serialization.ConfigurationSerializable
import org.bukkit.configuration.serialization.SerializableAs import org.bukkit.configuration.serialization.SerializableAs
import org.bukkit.util.Vector import org.bukkit.util.Vector
@ -30,10 +31,19 @@ class Area(loc1: Location, loc2: Location) : ConfigurationSerializable {
* @return true if the location is in this area * @return true if the location is in this area
*/ */
fun isInArea(location: Location): Boolean { fun isInArea(location: Location): Boolean {
if (location.world != locTop.world) return debug("world").let { false } if (location.world != locTop.world) return false
if (location.x !in locTop.x..locMin.x) return debug("x").let { false } if (location.x !in (locMin.x - 1)..(locTop.x + 1)) return false
if (location.y !in locTop.y..locMin.y) return debug("y").let { false } if (location.y !in locMin.y..locTop.y + 1) return false
if (location.z !in locTop.z..locMin.z) return debug("z").let { false } if (location.z !in (locMin.z - 1)..(locTop.z + 1)) return false
return true
}
fun isBlockInArea(block: Block): Boolean {
val location = block.location
if (location.world != locTop.world) return false
if (location.x !in locMin.x..locTop.x) return false
if (location.y !in locMin.y..locTop.y) return false
if (location.z !in locMin.z..locTop.z) return false
return true return true
} }
@ -44,9 +54,9 @@ class Area(loc1: Location, loc2: Location) : ConfigurationSerializable {
*/ */
fun forBlocksInArea(): List<Location> { fun forBlocksInArea(): List<Location> {
val blocks = arrayListOf<Location>() val blocks = arrayListOf<Location>()
for (x in locTop.blockX..locMin.blockX) { for (x in locMin.blockX..locTop.blockX) {
for (y in locTop.blockY..locMin.blockY) { for (y in locMin.blockY..locTop.blockY) {
for (z in locTop.blockZ..locMin.blockZ) { for (z in locMin.blockZ..locTop.blockZ) {
blocks.add(Location(locTop.world, x.toDouble(), y.toDouble(), z.toDouble())) blocks.add(Location(locTop.world, x.toDouble(), y.toDouble(), z.toDouble()))
} }
} }

View File

@ -3,5 +3,5 @@ package cc.maxmc.blastingcrisis.misc
import cc.maxmc.blastingcrisis.game.Game import cc.maxmc.blastingcrisis.game.Game
object GameManager { object GameManager {
lateinit var currentGame : Game lateinit var currentGame: Game
} }

View File

@ -1,6 +1,7 @@
package cc.maxmc.blastingcrisis.misc package cc.maxmc.blastingcrisis.misc
import com.google.common.base.Preconditions import com.google.common.base.Preconditions
import org.bukkit.Location
import java.util.* import java.util.*
@ -21,4 +22,10 @@ class WeightRandom<K, V : Number>(list: List<Pair<K, V>>) {
val tailMap: SortedMap<Double, K> = weightMap.tailMap(randomWeight, false) val tailMap: SortedMap<Double, K> = weightMap.tailMap(randomWeight, false)
return weightMap[tailMap.firstKey()]!! return weightMap[tailMap.firstKey()]!!
} }
}
fun Location.toPlayerLocation(): Location = clone().apply {
x = blockX + 0.5
y = blockY.toDouble()
z = blockZ + 0.5
} }

View File

@ -2,6 +2,6 @@ package cc.maxmc.blastingcrisis.packet
import net.minecraft.server.v1_8_R3.DataWatcher import net.minecraft.server.v1_8_R3.DataWatcher
import taboolib.library.reflex.Reflex.Companion.invokeMethod import taboolib.library.reflex.Reflex.Companion.invokeMethod
import java.lang.IllegalStateException
fun DataWatcher.getWatchableObject(id: Int): DataWatcher.WatchableObject = this.invokeMethod<DataWatcher.WatchableObject>("j", id) ?: throw IllegalStateException("Object not exists.") fun DataWatcher.getWatchableObject(id: Int): DataWatcher.WatchableObject =
this.invokeMethod<DataWatcher.WatchableObject>("j", id) ?: throw IllegalStateException("Object not exists.")