diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java
index 1a94778..8d51340 100644
--- a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java
+++ b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java
@@ -118,6 +118,7 @@ public class FightSystem extends JavaPlugin {
new HellsBells();
new Meteor();
+ new WinconditionAmongUs();
new NoPlayersOnlineCountdown();
new PreSchemCountdown();
diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.properties b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.properties
index 126d650..ef060ac 100644
--- a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.properties
+++ b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.properties
@@ -238,3 +238,8 @@ WIN_LESS_DAMAGE={0} §7less damaged
WIN_POINTS={0} has more points
WIN_POINTS_EQUAL=§7Equal points
WIN_TECHKO={0} §7is tech K.O.
+WIN_IMPOSTER_DEAD={0} §7killed the imposter
+WIN_CREWMATE_DEAD={0} §7killed all team mates
+
+AMONG_US_IMPOSTER_MESSAGE = §4You are the Imposter§8! §7Kill all your team mates to win the game!
+AMONG_US_IMPOSTER_AMONG_MESSAGE = §4There is an Imposter among us§8! §7Kill him to win the game!
diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem_de.properties b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem_de.properties
index 082f69f..2809513 100644
--- a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem_de.properties
+++ b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem_de.properties
@@ -223,3 +223,8 @@ WIN_LESS_DAMAGE={0} §7weniger beschädigt
WIN_POINTS={0} hat mehr Punkte
WIN_POINTS_EQUAL=§7Gleicher Punktestand
WIN_TECHKO={0} §7ist Tech K.O.
+WIN_IMPOSTER_DEAD={0} §7 hat den Imposter getötet
+WIN_CREWMATE_DEAD={0} §7 hat alle Kameraden getötet
+
+AMONG_US_IMPOSTER_MESSAGE = §4Du bist ein Imposter§8! §7Du musst alle Kameraden töten, um zu gewinnen.
+AMONG_US_IMPOSTER_AMONG_MESSAGE = §4Es ist ein Imposter unter uns§8! §7Tötet ihn, um das Spiel zu gewinnen!
\ No newline at end of file
diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/InFightDamage.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/InFightDamage.java
index 09ec33a..9be2167 100644
--- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/InFightDamage.java
+++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/InFightDamage.java
@@ -20,10 +20,12 @@
package de.steamwar.fightsystem.listener;
import de.steamwar.fightsystem.ArenaMode;
+import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.states.FightState;
import de.steamwar.fightsystem.states.StateDependentListener;
+import de.steamwar.fightsystem.winconditions.Winconditions;
import net.md_5.bungee.api.ChatMessageType;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Player;
@@ -36,7 +38,7 @@ import java.util.Objects;
public class InFightDamage implements Listener {
public InFightDamage() {
- new StateDependentListener(ArenaMode.AntiReplay, FightState.Running, this);
+ new StateDependentListener(!Config.ActiveWinconditions.contains(Winconditions.AMONG_US), FightState.Running, this);
}
@EventHandler
diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAmongUs.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAmongUs.java
new file mode 100644
index 0000000..0be9472
--- /dev/null
+++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/WinconditionAmongUs.java
@@ -0,0 +1,87 @@
+/*
+ * This file is a part of the SteamWar software.
+ *
+ * Copyright (C) 2020 SteamWar.de-Serverteam
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package de.steamwar.fightsystem.winconditions;
+
+import de.steamwar.fightsystem.FightSystem;
+import de.steamwar.fightsystem.fight.Fight;
+import de.steamwar.fightsystem.fight.FightPlayer;
+import de.steamwar.fightsystem.fight.FightTeam;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.OneShotStateDependent;
+import de.steamwar.fightsystem.states.StateDependentListener;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.PlayerDeathEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+
+import java.util.*;
+
+public class WinconditionAmongUs extends Wincondition implements Listener {
+
+ private Map imposter = new HashMap<>();
+
+ private final Random random = new Random();
+
+ public WinconditionAmongUs() {
+ super("AmongUs");
+ new OneShotStateDependent(Winconditions.AMONG_US, FightState.Ingame, () -> {
+ imposter.put(Fight.getRedTeam(), sendMessageAndReturnImposter(Fight.getRedTeam().getPlayers()));
+ imposter.put(Fight.getBlueTeam(), sendMessageAndReturnImposter(Fight.getBlueTeam().getPlayers()));
+ });
+ new StateDependentListener(Winconditions.AMONG_US, FightState.Ingame, this);
+ }
+
+ private FightPlayer sendMessageAndReturnImposter(Collection fightPlayers) {
+ List fightPlayerList = new ArrayList<>(fightPlayers);
+ FightPlayer imposter = fightPlayerList.get(random.nextInt(fightPlayerList.size()));
+ for (FightPlayer fightPlayer : fightPlayerList) {
+ if (fightPlayer == imposter) {
+ FightSystem.getMessage().send("AMONG_US_IMPOSTER_MESSAGE", fightPlayer.getPlayer());
+ } else {
+ FightSystem.getMessage().send("AMONG_US_IMPOSTER_AMONG_MESSAGE", fightPlayer.getPlayer());
+ }
+ }
+ return imposter;
+ }
+
+ @EventHandler
+ public void handlePlayerDeath(PlayerDeathEvent event) {
+ handleDeath(event.getEntity().getPlayer());
+ }
+
+ @EventHandler
+ public void handlePlayerQuit(PlayerQuitEvent event) {
+ handleDeath(event.getPlayer());
+ }
+
+ private void handleDeath(Player player){
+ FightTeam team = isTarget(player);
+ if(team == null)
+ return;
+
+ FightPlayer current = team.getFightPlayer(player);
+ if (current == imposter.get(team)) {
+ win(team, "WIN_IMPOSTER_DEAD", team.getPrefix());
+ } else if (team.getAlivePlayers() <= 2 && imposter.get(team).isLiving()) {
+ win(Fight.getOpposite(team), "WIN_CREWMATE_DEAD", Fight.getOpposite(team).getPrefix());
+ }
+ }
+}
diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Winconditions.java b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Winconditions.java
index 9d7ae2a..620a247 100644
--- a/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Winconditions.java
+++ b/FightSystem_Core/src/de/steamwar/fightsystem/winconditions/Winconditions.java
@@ -38,5 +38,6 @@ public enum Winconditions {
PUMPKIN_TECH_KO,
HELLS_BELLS,
- METEOR
+ METEOR,
+ AMONG_US
}