init 5
This commit is contained in:
@@ -15,6 +15,7 @@ import org.bukkit.inventory.ItemStack
|
|||||||
import org.bukkit.scheduler.BukkitTask
|
import org.bukkit.scheduler.BukkitTask
|
||||||
import org.bukkit.scoreboard.Team
|
import org.bukkit.scoreboard.Team
|
||||||
import xyz.fortern.minehunt.rule.RuleItem
|
import xyz.fortern.minehunt.rule.RuleItem
|
||||||
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 游戏控制台
|
* 游戏控制台
|
||||||
@@ -56,14 +57,14 @@ class Console {
|
|||||||
val spectatorSet: MutableSet<Player> = HashSet()
|
val spectatorSet: MutableSet<Player> = HashSet()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 存活中的速通者列表,用于指南针指向的遍历
|
* 速通者列表,用于指南针指向的遍历
|
||||||
*/
|
*/
|
||||||
val speedrunnerList: MutableList<Player> = ArrayList()
|
lateinit var speedrunnerList: List<Player>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 猎人持有的指南针指向的速通者在speedrunnerList中的index
|
* 猎人持有的指南针指向的速通者在speedrunnerList中的index
|
||||||
*/
|
*/
|
||||||
val trackRunnerMap: MutableMap<String, Int> = HashMap()
|
val trackRunnerMap: MutableMap<String, Int> = ConcurrentHashMap()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 猎人的指南针标记
|
* 猎人的指南针标记
|
||||||
@@ -72,10 +73,14 @@ class Console {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 猎人指南针物品
|
* 猎人指南针物品
|
||||||
|
*
|
||||||
|
* 出生与复活是唯一获取此物品的方法
|
||||||
*/
|
*/
|
||||||
private val hunterCompass: ItemStack = ItemStack(Material.COMPASS).apply {
|
private val hunterCompass: ItemStack = ItemStack(Material.COMPASS).apply {
|
||||||
|
// 最大堆叠数设为1
|
||||||
|
itemMeta.setMaxStackSize(1)
|
||||||
// 设置名称
|
// 设置名称
|
||||||
itemMeta.displayName(Component.text("猎人指南针", NamedTextColor.GOLD))
|
itemMeta.displayName(Component.text(compassFlag, NamedTextColor.GOLD))
|
||||||
// 设置Lore
|
// 设置Lore
|
||||||
itemMeta.lore(
|
itemMeta.lore(
|
||||||
listOf(
|
listOf(
|
||||||
@@ -183,6 +188,8 @@ class Console {
|
|||||||
* 游戏阶段由 PREPARING 变为 PROCESSING
|
* 游戏阶段由 PREPARING 变为 PROCESSING
|
||||||
*/
|
*/
|
||||||
fun start() {
|
fun start() {
|
||||||
|
if (speedrunnerSet.isEmpty()) throw RuntimeException("No Speedrunner")
|
||||||
|
|
||||||
// 修改游戏规则
|
// 修改游戏规则
|
||||||
val world = Bukkit.getWorld("world")!!
|
val world = Bukkit.getWorld("world")!!
|
||||||
world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, true)
|
world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, true)
|
||||||
@@ -206,10 +213,8 @@ class Console {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 速通者更改为生存模式,并加入speedrunnerList
|
// 速通者更改为生存模式,并加入speedrunnerList
|
||||||
speedrunnerSet.forEach {
|
speedrunnerSet.forEach { it.gameMode = GameMode.SURVIVAL }
|
||||||
it.gameMode = GameMode.SURVIVAL
|
speedrunnerList = speedrunnerSet.toList()
|
||||||
speedrunnerList.add(it)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 将猎人传送到世界底部,且指南针开始有所指向
|
// 将猎人传送到世界底部,且指南针开始有所指向
|
||||||
hunterSet.forEach {
|
hunterSet.forEach {
|
||||||
@@ -217,11 +222,6 @@ class Console {
|
|||||||
trackRunnerMap.put(it.name, 0)
|
trackRunnerMap.put(it.name, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
Runnable {
|
|
||||||
compassMeta.setLodestoneTracked(false)
|
|
||||||
compassMeta.setLodestone(event.getFindLoc())
|
|
||||||
}
|
|
||||||
|
|
||||||
// 猎人出生倒计时Task
|
// 猎人出生倒计时Task
|
||||||
hunterSpawnCD = Bukkit.getScheduler().runTaskTimerAsynchronously(Minehunt.instance(), Runnable {
|
hunterSpawnCD = Bukkit.getScheduler().runTaskTimerAsynchronously(Minehunt.instance(), Runnable {
|
||||||
hunterSet.forEach {
|
hunterSet.forEach {
|
||||||
@@ -231,12 +231,46 @@ class Console {
|
|||||||
it.inventory.addItem(hunterCompass)
|
it.inventory.addItem(hunterCompass)
|
||||||
}
|
}
|
||||||
speedrunnerSet.forEach { it.sendMessage(Component.text("猎人开始追杀", NamedTextColor.RED)) }
|
speedrunnerSet.forEach { it.sendMessage(Component.text("猎人开始追杀", NamedTextColor.RED)) }
|
||||||
|
// 指南针开始追踪
|
||||||
|
compassRefreshTask = Bukkit.getScheduler().runTaskTimerAsynchronously(Minehunt.instance(), Runnable {
|
||||||
|
// TODO 如何取得玩家身上的指南针?
|
||||||
|
hunterSet.forEach {
|
||||||
|
if (it.isOnline) {
|
||||||
|
var i = (trackRunnerMap[it.name] ?: return@forEach) % speedrunnerList.size
|
||||||
|
val speedrunner = speedrunnerList[i]
|
||||||
|
val location = speedrunner.location
|
||||||
|
val items = it.inventory.all(hunterCompass)
|
||||||
|
items.forEach { k, v ->
|
||||||
|
val lore = v.lore()
|
||||||
|
if (lore != null && lore.isNotEmpty() && lore[0].equals(compassFlag)) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}, 0, 20)
|
||||||
|
|
||||||
}, RuleItem.HUNTER_READY_CD.value * 20L, 0)
|
}, RuleItem.HUNTER_READY_CD.value * 20L, 0)
|
||||||
|
|
||||||
// TODO 如何不再阻止玩家移动?
|
// TODO 如何不再阻止玩家移动?
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断物品是否为猎人指南针
|
||||||
|
*/
|
||||||
|
fun isHunterCompass(itemStack: ItemStack) = hunterCompass == itemStack
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 让该玩家所追踪的目标切换倒下一个
|
||||||
|
*/
|
||||||
|
fun trackNextPlayer(playerName: String) {
|
||||||
|
var i = trackRunnerMap[playerName] ?: return
|
||||||
|
i++
|
||||||
|
trackRunnerMap[playerName] = i % speedrunnerList.size
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 游戏阶段
|
* 游戏阶段
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package xyz.fortern.minehunt.listener
|
|||||||
import org.bukkit.GameMode
|
import org.bukkit.GameMode
|
||||||
import org.bukkit.event.EventHandler
|
import org.bukkit.event.EventHandler
|
||||||
import org.bukkit.event.Listener
|
import org.bukkit.event.Listener
|
||||||
|
import org.bukkit.event.player.PlayerDropItemEvent
|
||||||
import org.bukkit.event.player.PlayerJoinEvent
|
import org.bukkit.event.player.PlayerJoinEvent
|
||||||
import org.bukkit.event.player.PlayerQuitEvent
|
import org.bukkit.event.player.PlayerQuitEvent
|
||||||
import xyz.fortern.minehunt.Console
|
import xyz.fortern.minehunt.Console
|
||||||
@@ -45,10 +46,20 @@ class PlayerListener(
|
|||||||
fun onPlayerQuit(event: PlayerQuitEvent) {
|
fun onPlayerQuit(event: PlayerQuitEvent) {
|
||||||
val player = event.player
|
val player = event.player
|
||||||
// 速通者退出时,从speedrunnerList中移除,避免指南针遍历
|
// 速通者退出时,从speedrunnerList中移除,避免指南针遍历
|
||||||
if (console.stage == GameStage.PROCESSING && console.speedrunnerSet.contains(player))
|
// if (console.stage == GameStage.PROCESSING && console.speedrunnerSet.contains(player))
|
||||||
console.speedrunnerList.remove(player)
|
// console.speedrunnerList.remove(player)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
fun onDropItem(event: PlayerDropItemEvent) {
|
||||||
|
val itemStack = event.itemDrop.itemStack
|
||||||
|
if (!console.isHunterCompass(itemStack)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val player = event.player
|
||||||
|
console.trackRunnerMap[player.name] = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user