Fix the case when a player dies while another player has a Second Chance
This commit is contained in:
parent
cf22ce12c0
commit
66d091c7fb
6 changed files with 32 additions and 18 deletions
|
@ -165,7 +165,7 @@ object GameManager {
|
||||||
GameMessenger.combatPhaseStarted()
|
GameMessenger.combatPhaseStarted()
|
||||||
|
|
||||||
Timers.startCombatPhaseTimer {
|
Timers.startCombatPhaseTimer {
|
||||||
if (PlayerManager.stillLivingRoles.contains(Role.INNOCENT)) {
|
if (PlayerManager.getStillLivingRoles().contains(Role.INNOCENT)) {
|
||||||
letRoleWin(Role.INNOCENT)
|
letRoleWin(Role.INNOCENT)
|
||||||
} else {
|
} else {
|
||||||
letRoleWin(null)
|
letRoleWin(null)
|
||||||
|
|
|
@ -38,9 +38,9 @@ open class TTTItem<InstanceT: TTTItem.Instance>(
|
||||||
open fun getInstance(tttPlayer: TTTPlayer) = instancesByUUID.values.find { it.carrier === tttPlayer }
|
open fun getInstance(tttPlayer: TTTPlayer) = instancesByUUID.values.find { it.carrier === tttPlayer }
|
||||||
|
|
||||||
fun reset() {
|
fun reset() {
|
||||||
instancesByUUID.values.forEach {
|
instancesByUUID.values.toList().forEach {
|
||||||
it.carrier?.removeItem(it.tttItem, removeInstance = false)
|
it.carrier?.removeItem(it.tttItem, removeInstance = false)
|
||||||
it.reset()
|
it.remove()
|
||||||
}
|
}
|
||||||
instancesByUUID.clear()
|
instancesByUUID.clear()
|
||||||
}
|
}
|
||||||
|
@ -80,6 +80,11 @@ open class TTTItem<InstanceT: TTTItem.Instance>(
|
||||||
persistentDataContainer.set(ID_KEY, PersistentDataType.STRING, uuid.toString())
|
persistentDataContainer.set(ID_KEY, PersistentDataType.STRING, uuid.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun remove() {
|
||||||
|
tttItem.instancesByUUID.remove(uuid)
|
||||||
|
reset()
|
||||||
|
}
|
||||||
|
|
||||||
private var isFirstCarrier = true
|
private var isFirstCarrier = true
|
||||||
open var carrier: TTTPlayer? = null
|
open var carrier: TTTPlayer? = null
|
||||||
set(newCarrier) {
|
set(newCarrier) {
|
||||||
|
@ -127,7 +132,7 @@ open class TTTItem<InstanceT: TTTItem.Instance>(
|
||||||
open fun onLeftClick(event: ClickEvent) { event.isCancelled = false }
|
open fun onLeftClick(event: ClickEvent) { event.isCancelled = false }
|
||||||
open fun onHandSwap() {}
|
open fun onHandSwap() {}
|
||||||
|
|
||||||
open fun reset() {}
|
protected open fun reset() {}
|
||||||
|
|
||||||
var isSelected = false
|
var isSelected = false
|
||||||
set(value) {
|
set(value) {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import de.moritzruth.spigot_ttt.game.GameManager
|
||||||
import de.moritzruth.spigot_ttt.game.items.TTTItem
|
import de.moritzruth.spigot_ttt.game.items.TTTItem
|
||||||
import de.moritzruth.spigot_ttt.game.items.TTTItemListener
|
import de.moritzruth.spigot_ttt.game.items.TTTItemListener
|
||||||
import de.moritzruth.spigot_ttt.game.players.Role
|
import de.moritzruth.spigot_ttt.game.players.Role
|
||||||
|
import de.moritzruth.spigot_ttt.game.players.TTTPlayer
|
||||||
import de.moritzruth.spigot_ttt.game.players.TTTPlayerTrueDeathEvent
|
import de.moritzruth.spigot_ttt.game.players.TTTPlayerTrueDeathEvent
|
||||||
import de.moritzruth.spigot_ttt.game.players.roles
|
import de.moritzruth.spigot_ttt.game.players.roles
|
||||||
import de.moritzruth.spigot_ttt.plugin
|
import de.moritzruth.spigot_ttt.plugin
|
||||||
|
@ -33,10 +34,12 @@ object MartyrdomGrenade: TTTItem<MartyrdomGrenade.Instance>(
|
||||||
shopInfo = ShopInfo(
|
shopInfo = ShopInfo(
|
||||||
buyableBy = roles(Role.TRAITOR, Role.JACKAL),
|
buyableBy = roles(Role.TRAITOR, Role.JACKAL),
|
||||||
price = 1
|
price = 1
|
||||||
)
|
),
|
||||||
|
removeInstanceOnDeath = false
|
||||||
) {
|
) {
|
||||||
class Instance: TTTItem.Instance(MartyrdomGrenade, true) {
|
class Instance: TTTItem.Instance(MartyrdomGrenade) {
|
||||||
var explodeTask: BukkitTask? = null
|
var explodeTask: BukkitTask? = null
|
||||||
|
var tttPlayer: TTTPlayer? = null
|
||||||
|
|
||||||
override fun reset() {
|
override fun reset() {
|
||||||
explodeTask?.cancel()
|
explodeTask?.cancel()
|
||||||
|
@ -48,7 +51,7 @@ object MartyrdomGrenade: TTTItem<MartyrdomGrenade.Instance>(
|
||||||
@EventHandler
|
@EventHandler
|
||||||
fun onTTTPlayerTrueDeath(event: TTTPlayerTrueDeathEvent) {
|
fun onTTTPlayerTrueDeath(event: TTTPlayerTrueDeathEvent) {
|
||||||
val instance = getInstance(event.tttPlayer) ?: return
|
val instance = getInstance(event.tttPlayer) ?: return
|
||||||
event.tttPlayer.removeItem(MartyrdomGrenade, false)
|
instance.tttPlayer = event.tttPlayer
|
||||||
|
|
||||||
instance.explodeTask = plugin.server.scheduler.runTaskLater(plugin, fun() {
|
instance.explodeTask = plugin.server.scheduler.runTaskLater(plugin, fun() {
|
||||||
GameManager.world.playSound(
|
GameManager.world.playSound(
|
||||||
|
@ -59,7 +62,8 @@ object MartyrdomGrenade: TTTItem<MartyrdomGrenade.Instance>(
|
||||||
1F
|
1F
|
||||||
)
|
)
|
||||||
|
|
||||||
createKillExplosion(event.tttPlayer, event.location, 2.5)
|
createKillExplosion(event.tttPlayer, event.location, 5.0)
|
||||||
|
instance.remove()
|
||||||
}, secondsToTicks(3).toLong())
|
}, secondsToTicks(3).toLong())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,7 +136,7 @@ object SecondChance: TTTItem<SecondChance.Instance>(
|
||||||
fun onTTTPlayerTrueDeath(event: TTTPlayerTrueDeathEvent) {
|
fun onTTTPlayerTrueDeath(event: TTTPlayerTrueDeathEvent) {
|
||||||
val instance = getInstance(event.tttPlayer) ?: return
|
val instance = getInstance(event.tttPlayer) ?: return
|
||||||
instance.possiblyTrigger()
|
instance.possiblyTrigger()
|
||||||
if (instancesByUUID.values.find { it.preventRoundEnd } != null) event.winnerRoleGroup = null
|
event.winnerRoleGroup = PlayerManager.getOnlyRemainingRoleGroup()
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
|
|
|
@ -7,6 +7,7 @@ import de.moritzruth.spigot_ttt.game.GameManager
|
||||||
import de.moritzruth.spigot_ttt.game.GameMessenger
|
import de.moritzruth.spigot_ttt.game.GameMessenger
|
||||||
import de.moritzruth.spigot_ttt.game.GamePhase
|
import de.moritzruth.spigot_ttt.game.GamePhase
|
||||||
import de.moritzruth.spigot_ttt.game.classes.TTTClassManager
|
import de.moritzruth.spigot_ttt.game.classes.TTTClassManager
|
||||||
|
import de.moritzruth.spigot_ttt.game.items.impl.SecondChance
|
||||||
import de.moritzruth.spigot_ttt.plugin
|
import de.moritzruth.spigot_ttt.plugin
|
||||||
import de.moritzruth.spigot_ttt.utils.nextTick
|
import de.moritzruth.spigot_ttt.utils.nextTick
|
||||||
import de.moritzruth.spigot_ttt.utils.noop
|
import de.moritzruth.spigot_ttt.utils.noop
|
||||||
|
@ -17,11 +18,14 @@ import org.bukkit.entity.Player
|
||||||
import kotlin.random.Random
|
import kotlin.random.Random
|
||||||
|
|
||||||
object PlayerManager {
|
object PlayerManager {
|
||||||
val tttPlayers= mutableListOf<TTTPlayer>()
|
val tttPlayers = mutableListOf<TTTPlayer>()
|
||||||
|
|
||||||
|
private fun getAvailablePlayers() = plugin.server.onlinePlayers.filter { it.gameMode === GameMode.SURVIVAL }
|
||||||
|
private fun getStillLivingRoleGroups() = getStillLivingRoles().map { it.group }.toSet()
|
||||||
|
fun getStillLivingRoles() = tttPlayers.filter {
|
||||||
|
it.alive || SecondChance.getInstance(it)?.preventRoundEnd == true
|
||||||
|
}.map { it.role }.toSet()
|
||||||
|
|
||||||
val availablePlayers get() = plugin.server.onlinePlayers.filter { it.gameMode === GameMode.SURVIVAL }
|
|
||||||
val stillLivingRoles get() = tttPlayers.filter { it.alive }.map { it.role }.toSet()
|
|
||||||
private val stillLivingRoleGroups get() = stillLivingRoles.map { it.group }.toSet()
|
|
||||||
private val playersJoinedDuringRound = mutableSetOf<Player>()
|
private val playersJoinedDuringRound = mutableSetOf<Player>()
|
||||||
|
|
||||||
fun getPlayersByRole() = mutableMapOf<Role, MutableSet<TTTPlayer>>()
|
fun getPlayersByRole() = mutableMapOf<Role, MutableSet<TTTPlayer>>()
|
||||||
|
@ -45,7 +49,7 @@ object PlayerManager {
|
||||||
|
|
||||||
fun getOnlyRemainingRoleGroup(): RoleGroup? {
|
fun getOnlyRemainingRoleGroup(): RoleGroup? {
|
||||||
GameManager.ensurePhase(GamePhase.COMBAT)
|
GameManager.ensurePhase(GamePhase.COMBAT)
|
||||||
return if (stillLivingRoleGroups.count() == 1) stillLivingRoleGroups.first()
|
return if (getStillLivingRoleGroups().count() == 1) getStillLivingRoleGroups().first()
|
||||||
else null
|
else null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +97,7 @@ object PlayerManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createTTTPlayers() {
|
fun createTTTPlayers() {
|
||||||
val playersWithoutRole = availablePlayers.toMutableSet()
|
val playersWithoutRole = getAvailablePlayers().toMutableSet()
|
||||||
val playerCount = playersWithoutRole.count()
|
val playerCount = playersWithoutRole.count()
|
||||||
|
|
||||||
if (Settings.traitorCount < 1) throw IllegalStateException("roles.traitor.count may not be lower than 1")
|
if (Settings.traitorCount < 1) throw IllegalStateException("roles.traitor.count may not be lower than 1")
|
||||||
|
|
|
@ -108,8 +108,10 @@ class TTTPlayer(player: Player, role: Role, val tttClass: TTTClassCompanion = TT
|
||||||
).call()
|
).call()
|
||||||
|
|
||||||
reallyScream = event.scream
|
reallyScream = event.scream
|
||||||
|
if (GameManager.phase == GamePhase.COMBAT) {
|
||||||
event.winnerRoleGroup?.run { GameManager.letRoleWin(primaryRole) }
|
event.winnerRoleGroup?.run { GameManager.letRoleWin(primaryRole) }
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
clearInventory(true)
|
clearInventory(true)
|
||||||
|
|
||||||
|
@ -232,8 +234,7 @@ class TTTPlayer(player: Player, role: Role, val tttClass: TTTClassCompanion = TT
|
||||||
item.getInstance(this)?.let {
|
item.getInstance(this)?.let {
|
||||||
it.carrier = null
|
it.carrier = null
|
||||||
if (removeInstance && (!becauseOfDeath || it.tttItem.removeInstanceOnDeath)) {
|
if (removeInstance && (!becauseOfDeath || it.tttItem.removeInstanceOnDeath)) {
|
||||||
item.instancesByUUID.remove(it.uuid)
|
it.remove()
|
||||||
it.reset()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in a new issue