1
0
Fork 0

Fix the case when a player dies while another player has a Second Chance

This commit is contained in:
Moritz Ruth 2020-06-19 17:37:24 +02:00
parent cf22ce12c0
commit 66d091c7fb
No known key found for this signature in database
GPG key ID: AFD57E23E753841B
6 changed files with 32 additions and 18 deletions

View file

@ -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)

View file

@ -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) {

View file

@ -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())
} }
} }

View file

@ -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

View file

@ -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
@ -19,9 +20,12 @@ import kotlin.random.Random
object PlayerManager { object PlayerManager {
val tttPlayers = mutableListOf<TTTPlayer>() val tttPlayers = mutableListOf<TTTPlayer>()
val availablePlayers get() = plugin.server.onlinePlayers.filter { it.gameMode === GameMode.SURVIVAL } private fun getAvailablePlayers() = plugin.server.onlinePlayers.filter { it.gameMode === GameMode.SURVIVAL }
val stillLivingRoles get() = tttPlayers.filter { it.alive }.map { it.role }.toSet() private fun getStillLivingRoleGroups() = getStillLivingRoles().map { it.group }.toSet()
private val stillLivingRoleGroups get() = stillLivingRoles.map { it.group }.toSet() fun getStillLivingRoles() = tttPlayers.filter {
it.alive || SecondChance.getInstance(it)?.preventRoundEnd == true
}.map { it.role }.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")

View file

@ -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()
} }
} }