diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e5aa5b3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+.idea
+*.iml
+target
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..65cbb9e
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,59 @@
+
+
+ 4.0.0
+
+ steamwar
+ MissileWars
+ 1.0
+
+
+ UTF-8
+
+
+
+
+ steamwar
+ https://steamwar.de:81/maven
+
+
+
+
+ src
+
+
+ src
+
+ **/*.java
+ **/*.kt
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.6.1
+
+
+ 1.8
+
+
+
+ missilewars
+
+
+
+
+ steamwar
+ Spigot
+ 1.15
+
+
+ steamwar
+ SpigotCore
+ 2.0
+
+
+
\ No newline at end of file
diff --git a/src/Doku.txt b/src/Doku.txt
index e48a346..231b2d0 100644
--- a/src/Doku.txt
+++ b/src/Doku.txt
@@ -1,4 +1,4 @@
-Rot ist im süden
-SpawnEgg name == MissleName (Config)
- incl Color-Tags, ect
-Missle-Configs sind für Team Rot
\ No newline at end of file
+Rot ist im süden
+SpawnEgg name == MissleName (Config)
+ incl Color-Tags, ect
+Missle-Configs sind für Team Rot
\ No newline at end of file
diff --git a/src/ToDo.txt b/src/ToDo.txt
index ab1d365..5d7995d 100644
--- a/src/ToDo.txt
+++ b/src/ToDo.txt
@@ -1,19 +1,14 @@
-Commands:
- join
- leave
- forcestop
-Config:
- Timeout-Time
- Runden max length
- shield / platform / ect item on/off
- give-speed (default: 11)
-Features
- Items:
- shield
- platform
- fireball
- pfeile
- bridge
- Item-giver
- am anfang bogen geben
- listener + commadns registrieren
\ No newline at end of file
+Config:
+ Timeout-Time
+ Runden max length
+ shield / platform / ect item on/off
+ give-speed (default: 11)
+Features
+ Items:
+ shield
+ platform
+ fireball
+ pfeile
+ bridge
+ Item-giver
+ am anfang bogen geben
\ No newline at end of file
diff --git a/src/de/steamwar/misslewars/EndTimer.java b/src/de/steamwar/misslewars/EndTimer.java
deleted file mode 100644
index 74fea99..0000000
--- a/src/de/steamwar/misslewars/EndTimer.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package de.steamwar.misslewars;
-
-import java.util.TimerTask;
-
-import org.bukkit.Bukkit;
-
-public class EndTimer extends TimerTask{
-
- private boolean endPrep; //if true it counts to end of preparing (after end server if not ingame); if false it counts to end of game -> win
-
- public EndTimer(boolean endPrep) {
- this.endPrep = endPrep;
- }
-
- @Override
- public void run() {
- if (endPrep) {
- if (MissleWars.getFightState() != FightState.WAITING) return;
- Bukkit.getServer().broadcastMessage("Da kein Gegner gefunden wurde schaltet der Server sich jetzt ab.");
- Bukkit.getServer().shutdown();
- }else {
- if (MissleWars.getFightState() == FightState.END) return;
- //TODO end match - unentschieden
- }
- this.cancel();
- }
-
-}
\ No newline at end of file
diff --git a/src/de/steamwar/misslewars/FightScoreboard.java b/src/de/steamwar/misslewars/FightScoreboard.java
index 21510bb..f6e6ef2 100644
--- a/src/de/steamwar/misslewars/FightScoreboard.java
+++ b/src/de/steamwar/misslewars/FightScoreboard.java
@@ -1,7 +1,5 @@
package de.steamwar.misslewars;
-import de.steamwar.misslewars.MWTeam;
-
import org.bukkit.Bukkit;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
@@ -29,7 +27,7 @@ public class FightScoreboard {
}
public static void init(){
- Bukkit.getScheduler().scheduleSyncRepeatingTask(MissleWars.getPlugin(), () -> {
+ Bukkit.getScheduler().scheduleSyncRepeatingTask(MissileWars.getPlugin(), () -> {
objective.unregister();
//noinspection deprecation
scoreboard.registerNewObjective("AAA", "BBB", "MissleWars");
@@ -51,14 +49,14 @@ public class FightScoreboard {
private static void teamScoreboard(MWTeam fightTeam){
objective.setDisplayName(fightTeam.getColoredName());
- fightTeam.getPlayers().forEach(fp -> {
- objective.getScore(fightTeam.getPrefix() + fp.getPlayer().getName()).setScore((int) fp.getKills());
+ fightTeam.getPlayers().forEach(p -> {
+ objective.getScore(fightTeam.getPrefix() + p.getName()).setScore(1);
});
}
private static void generalScoreboard(){
objective.setDisplayName("§6Kampf");
- int fightTime = MissleWars.getFightTime();
+ int fightTime = MissileWars.getFightTime();
if (fightTime >= 60)
objective.getScore("§7Zeit: §a" + fightTime / 60 + "m " + fightTime % 60 + "s").setScore(3);
else
@@ -68,9 +66,9 @@ public class FightScoreboard {
private static MWTeam getIndexDisplay() {
index++;
if(index == 1)
- return MissleWars.redTeam;
+ return MissileWars.getRedTeam();
if(index == 2)
- return MissleWars.blueTeam;
+ return MissileWars.getBlueTeam();
index = 0;
return null;
}
diff --git a/src/de/steamwar/misslewars/FightState.java b/src/de/steamwar/misslewars/FightState.java
index 6787a9b..12deb53 100644
--- a/src/de/steamwar/misslewars/FightState.java
+++ b/src/de/steamwar/misslewars/FightState.java
@@ -1,7 +1,7 @@
-package de.steamwar.misslewars;
-
-public enum FightState {
-WAITING, //waiting for at least 2Players
-FIGHTING, //no one has Won
-END // fight ended for some reason
-}
+package de.steamwar.misslewars;
+
+public enum FightState {
+ WAITING, // waiting for at least 2 players
+ FIGHTING, // no one has won
+ END // fight ended for some reason
+}
diff --git a/src/de/steamwar/misslewars/MWPlayer.java b/src/de/steamwar/misslewars/MWPlayer.java
deleted file mode 100644
index 1a5abbd..0000000
--- a/src/de/steamwar/misslewars/MWPlayer.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package de.steamwar.misslewars;
-
-import org.bukkit.entity.Player;
-
-public class MWPlayer {
- private Player p;
- private int kills = 0;
-
- public int getKills() {
- return kills;
- }
-
- public void addKill() {
- kills++;
- }
-
- public MWPlayer (Player p) {
- this.p = p;
- }
-
- public Player getPlayer() {
- return p;
- }
-}
diff --git a/src/de/steamwar/misslewars/MWTeam.java b/src/de/steamwar/misslewars/MWTeam.java
index d2e16f6..cd77b2f 100644
--- a/src/de/steamwar/misslewars/MWTeam.java
+++ b/src/de/steamwar/misslewars/MWTeam.java
@@ -1,89 +1,94 @@
-package de.steamwar.misslewars;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.bukkit.ChatColor;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.bukkit.scoreboard.Team;
-import org.bukkit.scoreboard.Team.Option;
-import org.bukkit.scoreboard.Team.OptionStatus;
-
-public class MWTeam {
- private ChatColor color;
- private String teamName;
- private String prefix;
- private Team sbteam; //scoreboard-Team
- private ArrayList spieler = new ArrayList();
- private Location spawn;
-
- public List getPlayers(){
- return spieler;
- }
-
- public MWTeam(ChatColor color, String teamName, String prefix) {
- this.teamName = teamName;
- this.prefix = prefix;
- this.color = color;
- if(FightScoreboard.getScoreboard().getTeam(teamName) == null)
- sbteam = FightScoreboard.getScoreboard().registerNewTeam(teamName);
- else
- sbteam = FightScoreboard.getScoreboard().getTeam(teamName);
- assert sbteam != null;
- sbteam.setOption(Option.NAME_TAG_VISIBILITY, OptionStatus.FOR_OWN_TEAM);
- sbteam.setAllowFriendlyFire(false);
- }
-
- public void tpToSpawn(Player p) {
- p.teleport(spawn);
- }
-
- public void join (Player p) {
- spieler.add(new MWPlayer(p));
- p.setDisplayName(color + "[" + teamName + "]" + p.getName());
- if (MissleWars.getFightState() == FightState.WAITING) {
- if (!enemy().getPlayers().isEmpty())
- MissleWars.startRound();
- }
- }
-
- public void leave (Player p) {
- for (MWPlayer pl : spieler) {
- if (p == pl.getPlayer()) {
- spieler.remove(pl);
- break;
- }
- p.setDisplayName(p.getName());
- }
- if (spieler.isEmpty())
- MissleWars.end(WinReasons.NOENEMY, enemy());
- }
-
- public MWTeam enemy() {
- if (this == MissleWars.redTeam) return MissleWars.blueTeam;
- return MissleWars.redTeam;
- }
-
- public String getPrefix(){
- return prefix;
- }
-
- public boolean hasPlayer (Player p) {
- for (MWPlayer pl : spieler)
- if (p == pl.getPlayer())
- return true;
- return false;
- }
-
- public MWPlayer getPlayer (Player p) {
- for (MWPlayer pl : spieler)
- if (p == pl.getPlayer())
- return pl;
- return null;
- }
-
- public String getColoredName() {
- return color.toString() + teamName;
- }
-}
+package de.steamwar.misslewars;
+
+import org.bukkit.ChatColor;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.enchantments.Enchantment;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.scoreboard.Team;
+
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+
+public class MWTeam {
+ private static final ItemStack bow = new ItemStack(Material.BOW);
+
+ static {
+ Objects.requireNonNull(bow.getItemMeta()).addEnchant(Enchantment.ARROW_FIRE, 1, false);
+ }
+
+ private final ChatColor color;
+ private final String teamName;
+ private final Team sbteam; //scoreboard-Team
+ private final Location spawn;
+ private final int portalZ;
+
+ private Set players = new HashSet<>();
+
+ public Set getPlayers(){
+ return players;
+ }
+
+ public MWTeam(ChatColor color, Location spawn, String teamName, int portalZ) {
+ this.teamName = teamName;
+ this.color = color;
+ this.spawn = spawn;
+ this.portalZ = portalZ;
+ if(FightScoreboard.getScoreboard().getTeam(teamName) == null)
+ sbteam = FightScoreboard.getScoreboard().registerNewTeam(teamName);
+ else
+ sbteam = FightScoreboard.getScoreboard().getTeam(teamName);
+ assert sbteam != null;
+ sbteam.setAllowFriendlyFire(false);
+ sbteam.setColor(color);
+ }
+
+ public int getPortalZ() {
+ return portalZ;
+ }
+
+ public Location getSpawn(){
+ return spawn;
+ }
+
+ public void join (Player p) {
+ players.add(p);
+ p.teleport(spawn);
+ p.setItemOnCursor(bow);
+ sbteam.addPlayer(p);
+ p.setDisplayName(color + teamName + " " + p.getName());
+ if (MissileWars.getFightState() == FightState.WAITING && !enemy().getPlayers().isEmpty())
+ MissileWars.startRound();
+ }
+
+ public void leave (Player p) {
+ if(!players.contains(p))
+ return;
+
+ players.remove(p);
+ sbteam.removePlayer(p);
+ if (players.isEmpty())
+ MissileWars.end(WinReasons.NO_ENEMY, enemy());
+ }
+
+ public MWTeam enemy() {
+ if (this == MissileWars.getRedTeam())
+ return MissileWars.getBlueTeam();
+
+ return MissileWars.getRedTeam();
+ }
+
+ public String getPrefix(){
+ return "§" + color.getChar();
+ }
+
+ public boolean hasPlayer (Player p) {
+ return players.contains(p);
+ }
+
+ public String getColoredName() {
+ return color.toString() + teamName;
+ }
+}
diff --git a/src/de/steamwar/misslewars/MissileWars.java b/src/de/steamwar/misslewars/MissileWars.java
new file mode 100644
index 0000000..73cb991
--- /dev/null
+++ b/src/de/steamwar/misslewars/MissileWars.java
@@ -0,0 +1,119 @@
+package de.steamwar.misslewars;
+
+import de.steamwar.misslewars.listener.*;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Location;
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.bukkit.scheduler.BukkitRunnable;
+
+public class MissileWars extends JavaPlugin {
+ private static final int END_PHASE_TIME = 600; //gameticks (30s)
+
+ private static MissileWars plugin;
+ private static MWTeam redTeam; //red has South side -> spawns missles towards north
+ private static MWTeam blueTeam;
+ private static FightState fightState;
+ private static long startTime; //timestamp when the fight starts
+
+ /**
+ * create teams, ect
+ */
+ @Override
+ public void onLoad() {
+ plugin = this;
+ fightState = FightState.WAITING;
+ startTime = System.currentTimeMillis();
+
+ //TODO: Config
+ redTeam = new MWTeam(ChatColor.RED, new Location(Bukkit.getWorlds().get(0), 0, 0, 0), "Rot", -63);
+ blueTeam = new MWTeam(ChatColor.BLUE, new Location(Bukkit.getWorlds().get(0), 0, 0, 0), "Blau", 63);
+ MissleSpawnSystem.load();
+ }
+
+ @Override
+ public void onEnable() {
+ new DeathListener();
+ new EggClickListener();
+ new ArenaListener(arenaMinX, arenaMaxX, arenaMinZ, arenaMaxZ, arenaMinY);
+ new ConnectionListener();
+ new JoinListener();
+ new EndListener();
+ new PortalDestructListener();
+
+ //TODO: Wait for players/Auto termination
+ BasicListener.setupListeners(fightState);
+ }
+
+ /**
+ * call to change fightstate from WAITING to INGAME
+ */
+ public static void startRound() {
+ if (fightState != FightState.WAITING) // anti dual-call
+ return;
+ fightState = FightState.FIGHTING;
+ BasicListener.setupListeners(fightState);
+
+ startTime = System.currentTimeMillis();
+ }
+
+ /**
+ * Fight beenden
+ * @param reason Grund fürs ende
+ * @param winner Gewinner (oder null)
+ */
+ public static void end(WinReasons reason, MWTeam winner) {
+ if (fightState == FightState.END) //verhindern dass es mehrfach gecallt wird
+ return;
+ fightState = FightState.END;
+ BasicListener.setupListeners(fightState);
+
+ switch (reason) {
+ case NO_ENEMY:
+ Bukkit.getServer().broadcastMessage("Ohne Gegner kein Kampf - Team " + winner.getColoredName() + ChatColor.RESET + " hat gewonnen.");
+ break;
+ case PORTAL_DESTROYED:
+ Bukkit.getServer().broadcastMessage(winner.getColoredName() + ChatColor.RESET + " hat das gegnerische Portal zerst�rt.");
+ break;
+ }
+ new BukkitRunnable() {
+ public void run() {
+ Bukkit.getServer().shutdown();
+ }
+ }.runTaskLater(plugin, END_PHASE_TIME);
+ }
+
+
+
+ public static MissileWars getPlugin() {
+ return plugin;
+ }
+
+ public static FightState getFightState() {
+ return fightState;
+ }
+
+ public static MWTeam getRedTeam(){
+ return redTeam;
+ }
+
+ public static MWTeam getBlueTeam(){
+ return blueTeam;
+ }
+
+ public static MWTeam getTeam(Player p){
+ if(blueTeam.getPlayers().contains(p))
+ return blueTeam;
+ if(redTeam.getPlayers().contains(p))
+ return redTeam;
+ return null;
+ }
+
+ /**
+ * @return seconds since start
+ */
+ public static int getFightTime() {
+ return Math.floorDiv((int) (System.currentTimeMillis() - startTime), 60);
+ }
+}
diff --git a/src/de/steamwar/misslewars/MissleSpawnSystem.java b/src/de/steamwar/misslewars/MissleSpawnSystem.java
index bae3c31..cc94fbe 100644
--- a/src/de/steamwar/misslewars/MissleSpawnSystem.java
+++ b/src/de/steamwar/misslewars/MissleSpawnSystem.java
@@ -1,142 +1,143 @@
-package de.steamwar.misslewars;
-
-import java.io.File;
-import java.util.List;
-
-import org.bukkit.Location;
-import org.bukkit.Material;
-import org.bukkit.block.Block;
-import org.bukkit.block.BlockFace;
-import org.bukkit.block.data.type.Piston;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.configuration.file.YamlConfiguration;
-import org.bukkit.block.data.type.Observer;
-
-public class MissleSpawnSystem {
-
- public static Missle[] missles;
-
- /**
- * load Config, ect
- */
- @SuppressWarnings("unchecked")
- public static void load() {
- FileConfiguration c = YamlConfiguration.loadConfiguration(new File(MissleWars.path + "/missles.yml"));
- missles = ((List) c.get("missles")).toArray(new Missle[0]);
- }
-
- public static void paste(String missle, boolean red, Location l) {
- for (Missle m : missles) {
- if (m.name == missle)
- m.paste(l, red, red);
- }
- }
-
- /**
- * Missle-Schematic
- */
- @SuppressWarnings("unused")
- private class Missle{
- public String name;
- private byte height;
- private byte depth;
- private byte width;
- private MissleBlockTypes[] blocks;
-
- /**
- *
- * @param l Location of the spawning player
- * @param redTeam for Block-color blue / red
- * @param north facing north or south?
- */
- public void paste(Location l, boolean redTeam, boolean north) {
- byte a = 1;
- if (!north) a = -1;
- for (int x=0; x < width; x++) {
- for (int y=height; y > 0; y--) {
- for (int z=0; z < width; z++) {
- int i = x+y*width+z*height*width;
- if (i > blocks.length || i < 0) continue;
- setBlock(blocks[i], MissleWars.world.getBlockAt(l.getBlockX() + x, l.getBlockY() + y, l.getBlockZ() + z * a), north, redTeam);
- }
- }
- }
- }
-
- //bewusst mit blockupdate, damit observer, ect beim pasten triggern
- private void setBlock(MissleBlockTypes t, Block b, boolean n, boolean red) {
- if (t == MissleBlockTypes.GLASS) {
- if (red)
- b.setType(Material.RED_STAINED_GLASS);
- else
- b.setType(Material.BLUE_STAINED_GLASS);
- }else if (t == MissleBlockTypes.BLOCK) {
- if (red)
- b.setType(Material.RED_CONCRETE);
- else
- b.setType(Material.BLUE_CONCRETE);
- }else if (t == MissleBlockTypes.HONEY_BLOCK) {
- b.setType(Material.HONEY_BLOCK);
- }else if (t == MissleBlockTypes.PANE) {
- if (red)
- b.setType(Material.RED_STAINED_GLASS_PANE);
- else
- b.setType(Material.BLUE_STAINED_GLASS_PANE);
- }else if (t == MissleBlockTypes.TNT) {
- b.setType(Material.TNT);
- }else if (t == MissleBlockTypes.SLIME_BLOCK) {
- b.setType(Material.SLIME_BLOCK);
- }else if (t.toString().contains("STICKY_PISTON")) {
- b.setType(Material.STICKY_PISTON);
- ((Piston) b).setFacing(getFacing(t, n));
- }else if (t.toString().contains("PISTON")) {
- b.setType(Material.PISTON);
- ((Piston) b).setFacing(getFacing(t, n));
- }else if (t.toString().contains("OBSERVER")) {
- b.setType(Material.OBSERVER);
- ((Observer) b).setFacing(getFacing(t, n));
- }
- }
- }
-
- public BlockFace getFacing(MissleBlockTypes t, boolean north) {
- String s = t.toString();
- if (s.contains("UP")) return BlockFace.UP;
- if (s.contains("DOWN")) return BlockFace.DOWN;
- if ((s.contains("NORTH") && north) || (s.contains("SOUTH") && !north)) return BlockFace.NORTH;
- if ((s.contains("NORTH") && !north) || (s.contains("SOUTH") && north)) return BlockFace.SOUTH;
- if ((s.contains("WEST") && north) || (s.contains("EAST") && !north)) return BlockFace.WEST;
- return BlockFace.EAST;
- }
-
- /**
- * For Config & lowRAM save of missles
- */
- private enum MissleBlockTypes {
- PISTON_UP,
- PISTON_DOWN,
- PISTON_NORTH,
- PISTON_SOUTH,
- PISTON_EAST,
- PISTON_WEST,
- STICKY_PISTON_UP,
- STICKY_PISTON_DOWN,
- STICKY_PISTON_NORTH,
- STICKY_PISTON_SOUTH,
- STICKY_PISTON_WEST,
- STICKY_PISTON_EAST,
- GLASS, //teamcolored
- BLOCK, //normal block, teamcolored
- PANE, //teamcolored (glass-pane)
- REDSTONE_BLOCK,
- OBSERVER_UP,
- OBSERVER_DOWN,
- OBSERVER_NORTH,
- OBSERVER_SOUTH,
- OBSERVER_EAST,
- OBSERVER_WEST,
- SLIME_BLOCK,
- HONEY_BLOCK,
- TNT
- }
-}
+package de.steamwar.misslewars;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.block.BlockFace;
+import org.bukkit.block.data.type.Observer;
+import org.bukkit.block.data.type.Piston;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+
+import java.io.File;
+import java.util.ArrayList;
+
+public class MissleSpawnSystem {
+
+ public static Missile[] missiles;
+
+ /**
+ * load Config, ect
+ */
+ @SuppressWarnings("unchecked")
+ public static void load() {
+ FileConfiguration c = YamlConfiguration.loadConfiguration(new File(MissileWars.getPlugin().getDataFolder(), "missles.yml"));
+ missiles = (c.getList("missles", new ArrayList())).toArray();
+ }
+
+ public static void paste(String missle, boolean red, Location l) {
+ for (Missile m : missiles) {
+ if (m.name == missle)
+ m.paste(l, red, red);
+ }
+ }
+
+ /**
+ * Missle-Schematic
+ */
+ @SuppressWarnings("unused")
+ private class Missile {
+ public String name;
+ private byte height;
+ private byte depth;
+ private byte width;
+ private MissleBlockTypes[] blocks;
+
+ /**
+ *
+ * @param l Location of the spawning player
+ * @param redTeam for Block-color blue / red
+ * @param north facing north or south?
+ */
+ public void paste(Location l, boolean redTeam, boolean north) {
+ byte a = 1;
+ if (!north) a = -1;
+ for (int x=0; x < width; x++) {
+ for (int y=height; y > 0; y--) {
+ for (int z=0; z < width; z++) {
+ int i = x+y*width+z*height*width;
+ if (i > blocks.length || i < 0) continue;
+ setBlock(blocks[i], Bukkit.getWorlds().get(0).getBlockAt(l.getBlockX() + x, l.getBlockY() + y, l.getBlockZ() + z * a), north, redTeam);
+ }
+ }
+ }
+ }
+
+ //bewusst mit blockupdate, damit observer, ect beim pasten triggern
+ private void setBlock(MissleBlockTypes t, Block b, boolean n, boolean red) {
+ if (t == MissleBlockTypes.GLASS) {
+ if (red)
+ b.setType(Material.RED_STAINED_GLASS);
+ else
+ b.setType(Material.BLUE_STAINED_GLASS);
+ }else if (t == MissleBlockTypes.BLOCK) {
+ if (red)
+ b.setType(Material.RED_CONCRETE);
+ else
+ b.setType(Material.BLUE_CONCRETE);
+ }else if (t == MissleBlockTypes.HONEY_BLOCK) {
+ b.setType(Material.HONEY_BLOCK);
+ }else if (t == MissleBlockTypes.PANE) {
+ if (red)
+ b.setType(Material.RED_STAINED_GLASS_PANE);
+ else
+ b.setType(Material.BLUE_STAINED_GLASS_PANE);
+ }else if (t == MissleBlockTypes.TNT) {
+ b.setType(Material.TNT);
+ }else if (t == MissleBlockTypes.SLIME_BLOCK) {
+ b.setType(Material.SLIME_BLOCK);
+ }else if (t.toString().contains("STICKY_PISTON")) {
+ b.setType(Material.STICKY_PISTON);
+ ((Piston) b).setFacing(getFacing(t, n));
+ }else if (t.toString().contains("PISTON")) {
+ b.setType(Material.PISTON);
+ ((Piston) b).setFacing(getFacing(t, n));
+ }else if (t.toString().contains("OBSERVER")) {
+ b.setType(Material.OBSERVER);
+ ((Observer) b).setFacing(getFacing(t, n));
+ }
+ }
+ }
+
+ public BlockFace getFacing(MissleBlockTypes t, boolean north) {
+ String s = t.toString();
+ if (s.contains("UP")) return BlockFace.UP;
+ if (s.contains("DOWN")) return BlockFace.DOWN;
+ if ((s.contains("NORTH") && north) || (s.contains("SOUTH") && !north)) return BlockFace.NORTH;
+ if ((s.contains("NORTH") && !north) || (s.contains("SOUTH") && north)) return BlockFace.SOUTH;
+ if ((s.contains("WEST") && north) || (s.contains("EAST") && !north)) return BlockFace.WEST;
+ return BlockFace.EAST;
+ }
+
+ /**
+ * For Config & lowRAM save of missles
+ */
+ private enum MissleBlockTypes {
+ PISTON_UP,
+ PISTON_DOWN,
+ PISTON_NORTH,
+ PISTON_SOUTH,
+ PISTON_EAST,
+ PISTON_WEST,
+ STICKY_PISTON_UP,
+ STICKY_PISTON_DOWN,
+ STICKY_PISTON_NORTH,
+ STICKY_PISTON_SOUTH,
+ STICKY_PISTON_WEST,
+ STICKY_PISTON_EAST,
+ GLASS, //teamcolored
+ BLOCK, //normal block, teamcolored
+ PANE, //teamcolored (glass-pane)
+ REDSTONE_BLOCK,
+ OBSERVER_UP,
+ OBSERVER_DOWN,
+ OBSERVER_NORTH,
+ OBSERVER_SOUTH,
+ OBSERVER_EAST,
+ OBSERVER_WEST,
+ SLIME_BLOCK,
+ HONEY_BLOCK,
+ TNT
+ }
+}
diff --git a/src/de/steamwar/misslewars/MissleWars.java b/src/de/steamwar/misslewars/MissleWars.java
deleted file mode 100644
index 42d9479..0000000
--- a/src/de/steamwar/misslewars/MissleWars.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package de.steamwar.misslewars;
-
-import java.io.File;
-import java.util.Timer;
-
-import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
-import org.bukkit.World;
-import org.bukkit.entity.Player;
-import org.bukkit.plugin.java.JavaPlugin;
-import org.bukkit.scheduler.BukkitRunnable;
-
-public class MissleWars extends JavaPlugin {
- public static World world;
- private static MissleWars plugin;
- public static MWTeam redTeam; //red has South side -> spawns missles towards north
- public static MWTeam blueTeam;
- public static int redPortalZ;
- public static int bluePortalZ;
- private static FightState fightstate;
- private static long fightend; //timestamp when the fight ends
- private static int rundenLaenge = 108000; //millis (108000 = 30mins)
- private static int timeOut = 36000; //millis (36000 = 10min)
- private static EndTimer timerClass;
- private static int inspectionTime = 3600; //gameticks (3600 = 3min)
- public static File path;
-
- /**
- * create teams, ect
- */
- public void onLoad() {
- path = getDataFolder();
- plugin = this;
- redTeam = new MWTeam(ChatColor.RED, "Rot", "Rot");
- redTeam = new MWTeam(ChatColor.BLUE, "Blau", "Blau");
- fightstate = FightState.WAITING;
- fightend = System.currentTimeMillis() + timeOut;
- MissleSpawnSystem.load();
- }
-
- /**
- * start waiting for players timeout-timer
- */
- public void onEnable() {
- world = Bukkit.getServer().getWorlds().get(0);
- timerClass = new EndTimer(true);
- (new Timer()).schedule(timerClass, timeOut);
- fightend = System.currentTimeMillis() + timeOut;
- }
-
- /**
- * call to change fightstate from WAITING to INGAME
- */
- public static void startRound() {
- if (fightstate != FightState.WAITING) // anti dual-call
- return;
- if (timerClass != null) timerClass.cancel();
- timerClass = new EndTimer(false);
- (new Timer()).schedule(timerClass, rundenLaenge);
- fightend = System.currentTimeMillis() + rundenLaenge;
- }
-
- /**
- * @return how long did this round last so far
- */
- public static long getRoundLength() {
- return rundenLaenge - (fightend - System.currentTimeMillis());
- //pflicht-ende-zeit - zeit bis zum pflicht-ende (pflicht-ende-timestamp - current-timestamp)
- }
-
- public static MissleWars getPlugin() {
- return plugin;
- }
-
- public static FightState getFightState() {
- return fightstate;
- }
-
- /**
- * @return seconds left
- */
- public static int getFightTime() {
- return Math.floorDiv((int) (fightend - System.currentTimeMillis()), 60);
- }
-
- /**
- * get the corresponding MWPlayer Object for a Player (if Player is ingame, otherwise returns null)
- */
- public static MWPlayer getPlayer(Player p) {
- MWPlayer pe = redTeam.getPlayer(p);
- if (pe != null) return pe;
- return blueTeam.getPlayer(p);
- }
-
- /**
- * checks if a Bukkit-Player Object is in a team
- */
- public static boolean playerInGame(Player p) {
- return redTeam.hasPlayer(p) || blueTeam.hasPlayer(p);
- }
-
- /**
- * Fight beenden
- * @param reason Grund fürs ende
- * @param winner Gewinner (oder null)
- */
- public static void end(WinReasons reason, MWTeam winner) {
- if (fightstate == FightState.END) //verhindern dass es mehrfach gecallt wird
- return;
- fightstate = FightState.END;
- timerClass.cancel();
- String winnerName = "Null";
- if (winner == redTeam) winnerName = redTeam.getColoredName();
- if (winner == blueTeam) winnerName = blueTeam.getColoredName();
- switch (reason) {
- case NOENEMY:
- Bukkit.getServer().broadcastMessage("Ohne Gegner kein Kampf - Team " + winnerName + ChatColor.RESET + " hat gewonnen.");
- break;
- case PORTALDESTROYED:
- Bukkit.getServer().broadcastMessage(winnerName + ChatColor.RESET + " hat das gegnerische Portal zerstört.");
- break;
- case TIMEOUT:
- Bukkit.getServer().broadcastMessage("Kampf beendet: Unentschieden (Zeit abgelaufen).");
- break;
- default:
- Bukkit.getServer().broadcastMessage("Kampf beendet.");
- break;
- }
- new BukkitRunnable() {
- public void run() {
- Bukkit.getServer().shutdown();
- }
- }.runTaskLater(plugin, inspectionTime);
- }
-}
diff --git a/src/de/steamwar/misslewars/WinReasons.java b/src/de/steamwar/misslewars/WinReasons.java
index 3c10adf..5965f55 100644
--- a/src/de/steamwar/misslewars/WinReasons.java
+++ b/src/de/steamwar/misslewars/WinReasons.java
@@ -1,7 +1,6 @@
-package de.steamwar.misslewars;
-
-public enum WinReasons {
- NOENEMY,
- PORTALDESTROYED,
- TIMEOUT
-}
+package de.steamwar.misslewars;
+
+public enum WinReasons {
+ NO_ENEMY,
+ PORTAL_DESTROYED
+}
diff --git a/src/de/steamwar/misslewars/commands/JoinCommand.java b/src/de/steamwar/misslewars/commands/JoinCommand.java
deleted file mode 100644
index 2c05ee8..0000000
--- a/src/de/steamwar/misslewars/commands/JoinCommand.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package de.steamwar.misslewars.commands;
-
-public class JoinCommand {
-
-}
diff --git a/src/de/steamwar/misslewars/listener/ArenaListener.java b/src/de/steamwar/misslewars/listener/ArenaListener.java
new file mode 100644
index 0000000..1af16d9
--- /dev/null
+++ b/src/de/steamwar/misslewars/listener/ArenaListener.java
@@ -0,0 +1,48 @@
+package de.steamwar.misslewars.listener;
+
+import de.steamwar.misslewars.FightState;
+import org.bukkit.GameMode;
+import org.bukkit.Location;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.player.PlayerMoveEvent;
+
+import java.util.EnumSet;
+
+public class ArenaListener extends BasicListener {
+
+ private final int arenaMinX;
+ private final int arenaMaxX;
+ private final int arenaMinZ;
+ private final int arenaMaxZ;
+ private final int arenaMinY;
+
+ public ArenaListener(int arenaMinX, int arenaMaxX, int arenaMinZ, int arenaMaxZ, int arenaMinY) {
+ super(EnumSet.allOf(FightState.class));
+ this.arenaMinX = arenaMinX;
+ this.arenaMaxX = arenaMaxX;
+ this.arenaMinZ = arenaMinZ;
+ this.arenaMaxZ = arenaMaxZ;
+ this.arenaMinY = arenaMinY;
+ }
+
+ @EventHandler
+ public void onMove(PlayerMoveEvent e) {
+ Location location = e.getTo();
+ Player p = e.getPlayer();
+
+ assert location != null;
+ if(location.getY() < arenaMinY){
+ if(p.getGameMode() == GameMode.SPECTATOR)
+ p.teleport(e.getFrom());
+ else
+ p.damage(Double.MAX_VALUE);
+ }else if(
+ location.getX() < arenaMinX ||
+ location.getX() > arenaMaxX ||
+ location.getZ() < arenaMinZ ||
+ location.getZ() > arenaMaxZ){
+ p.teleport(e.getFrom());
+ }
+ }
+}
diff --git a/src/de/steamwar/misslewars/listener/BasicListener.java b/src/de/steamwar/misslewars/listener/BasicListener.java
new file mode 100644
index 0000000..27daa5b
--- /dev/null
+++ b/src/de/steamwar/misslewars/listener/BasicListener.java
@@ -0,0 +1,35 @@
+package de.steamwar.misslewars.listener;
+
+import de.steamwar.misslewars.FightState;
+import de.steamwar.misslewars.MissileWars;
+import org.bukkit.Bukkit;
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.Listener;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public abstract class BasicListener implements Listener {
+ private static Set listeners = new HashSet<>();
+
+ private final Set active;
+ private boolean running;
+
+ BasicListener(final Set active){
+ this.active = active;
+ running = false;
+ listeners.add(this);
+ }
+
+ public static void setupListeners(FightState state){
+ for(BasicListener listener : listeners){
+ if(listener.running && !listener.active.contains(state)){
+ HandlerList.unregisterAll(listener);
+ listener.running = false;
+ }else if(!listener.running && listener.active.contains(state)){
+ Bukkit.getPluginManager().registerEvents(listener, MissileWars.getPlugin());
+ listener.running = true;
+ }
+ }
+ }
+}
diff --git a/src/de/steamwar/misslewars/listener/ConnectionListener.java b/src/de/steamwar/misslewars/listener/ConnectionListener.java
new file mode 100644
index 0000000..5d7d91e
--- /dev/null
+++ b/src/de/steamwar/misslewars/listener/ConnectionListener.java
@@ -0,0 +1,32 @@
+package de.steamwar.misslewars.listener;
+
+import de.steamwar.misslewars.FightState;
+import de.steamwar.misslewars.MissileWars;
+import org.bukkit.GameMode;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+
+import java.util.EnumSet;
+
+public class ConnectionListener extends BasicListener{
+
+ public ConnectionListener(){
+ super(EnumSet.allOf(FightState.class));
+ }
+
+ @EventHandler
+ public void onJoin(PlayerJoinEvent e) {
+ e.getPlayer().setGameMode(GameMode.SPECTATOR);
+ }
+
+ @EventHandler
+ public void onLeave(PlayerQuitEvent e) {
+ e.setQuitMessage(null);
+ Player p = e.getPlayer();
+
+ MissileWars.getBlueTeam().leave(p);
+ MissileWars.getRedTeam().leave(p);
+ }
+}
diff --git a/src/de/steamwar/misslewars/listener/DeathListener.java b/src/de/steamwar/misslewars/listener/DeathListener.java
index 50bb25c..8767956 100644
--- a/src/de/steamwar/misslewars/listener/DeathListener.java
+++ b/src/de/steamwar/misslewars/listener/DeathListener.java
@@ -1,25 +1,33 @@
-package de.steamwar.misslewars.listener;
-
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-
-import de.steamwar.misslewars.MWPlayer;
-import de.steamwar.misslewars.MissleWars;
-
-import org.bukkit.event.entity.PlayerDeathEvent;
-
-public class DeathListener implements Listener {
- @EventHandler
- public void onDeath(PlayerDeathEvent e) {
- Player p = e.getEntity();
- if (!MissleWars.playerInGame(p)) {
- e.setDeathMessage("");
- return;
- }
- Player killer = p.getKiller();
- if (killer == null) return;
- MWPlayer mwKiller = MissleWars.getPlayer(killer);
- if (mwKiller != null) mwKiller.addKill();
- }
-}
+package de.steamwar.misslewars.listener;
+
+import de.steamwar.misslewars.FightState;
+import de.steamwar.misslewars.MWTeam;
+import de.steamwar.misslewars.MissileWars;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.entity.PlayerDeathEvent;
+import org.bukkit.event.player.PlayerRespawnEvent;
+
+import java.util.EnumSet;
+
+public class DeathListener extends BasicListener {
+
+ public DeathListener() {
+ super(EnumSet.allOf(FightState.class));
+ }
+
+ @EventHandler
+ public void onDeath(PlayerDeathEvent e) {
+ e.setDeathMessage(null);
+ }
+
+ @EventHandler
+ public void onRespawn(PlayerRespawnEvent e){
+ Player p = e.getPlayer();
+ MWTeam team = MissileWars.getTeam(p);
+ if(team == null)
+ return;
+
+ e.setRespawnLocation(team.getSpawn());
+ }
+}
diff --git a/src/de/steamwar/misslewars/listener/EggClickListener.java b/src/de/steamwar/misslewars/listener/EggClickListener.java
index f479d4f..e296e60 100644
--- a/src/de/steamwar/misslewars/listener/EggClickListener.java
+++ b/src/de/steamwar/misslewars/listener/EggClickListener.java
@@ -1,21 +1,24 @@
-package de.steamwar.misslewars.listener;
-
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.player.PlayerInteractEvent;
-
-import de.steamwar.misslewars.FightState;
-import de.steamwar.misslewars.MissleSpawnSystem;
-import de.steamwar.misslewars.MissleWars;
-
-public class EggClickListener implements Listener {
- @EventHandler
- public void onItemClick(PlayerInteractEvent e) {
- if (MissleWars.getFightState() != FightState.FIGHTING) return;
- if (!MissleWars.playerInGame(e.getPlayer())) return;
- if (!e.getItem().getType().toString().contains("SPAWN_EGG")) return;
- MissleSpawnSystem.paste(e.getItem().getItemMeta().getDisplayName() , MissleWars.redTeam.hasPlayer(e.getPlayer()), e.getPlayer().getLocation());
- e.getItem().setAmount(e.getItem().getAmount()-1);
- e.setCancelled(true);
- }
-}
+package de.steamwar.misslewars.listener;
+
+import de.steamwar.misslewars.FightState;
+import de.steamwar.misslewars.MissileWars;
+import de.steamwar.misslewars.MissleSpawnSystem;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.player.PlayerInteractEvent;
+
+import java.util.EnumSet;
+
+public class EggClickListener extends BasicListener {
+ public EggClickListener() {
+ super(EnumSet.of(FightState.FIGHTING));
+ }
+
+ @EventHandler
+ public void onItemClick(PlayerInteractEvent e) {
+ if (e.getItem() == null || !e.getItem().getType().toString().contains("SPAWN_EGG"))
+ return;
+ MissleSpawnSystem.paste(e.getItem().getItemMeta().getDisplayName() , MissileWars.getRedTeam().hasPlayer(e.getPlayer()), e.getPlayer().getLocation());
+ e.getItem().setAmount(e.getItem().getAmount()-1);
+ e.setCancelled(true);
+ }
+}
diff --git a/src/de/steamwar/misslewars/listener/EndListener.java b/src/de/steamwar/misslewars/listener/EndListener.java
new file mode 100644
index 0000000..c0d7bf8
--- /dev/null
+++ b/src/de/steamwar/misslewars/listener/EndListener.java
@@ -0,0 +1,21 @@
+package de.steamwar.misslewars.listener;
+
+import de.steamwar.misslewars.FightState;
+import org.bukkit.GameMode;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.player.PlayerJoinEvent;
+
+import java.util.EnumSet;
+
+public class EndListener extends BasicListener {
+
+ public EndListener(){
+ super(EnumSet.of(FightState.END));
+ }
+
+ @EventHandler
+ public void onJoin(PlayerJoinEvent e) {
+ e.setJoinMessage(null);
+ e.getPlayer().setGameMode(GameMode.SPECTATOR);
+ }
+}
diff --git a/src/de/steamwar/misslewars/listener/FallOutOfWorldListener.java b/src/de/steamwar/misslewars/listener/FallOutOfWorldListener.java
deleted file mode 100644
index 10f2452..0000000
--- a/src/de/steamwar/misslewars/listener/FallOutOfWorldListener.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package de.steamwar.misslewars.listener;
-
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.player.PlayerMoveEvent;
-
-import de.steamwar.misslewars.MissleWars;
-
-public class FallOutOfWorldListener implements Listener {
- @EventHandler
- public void onMove(PlayerMoveEvent e) {
- if (!MissleWars.playerInGame(e.getPlayer())) return;
- if (e.getPlayer().getEyeHeight() < 0) e.getPlayer().damage(Double.MAX_VALUE);
- }
-}
diff --git a/src/de/steamwar/misslewars/listener/JoinListener.java b/src/de/steamwar/misslewars/listener/JoinListener.java
index 20095b4..708f685 100644
--- a/src/de/steamwar/misslewars/listener/JoinListener.java
+++ b/src/de/steamwar/misslewars/listener/JoinListener.java
@@ -1,13 +1,23 @@
-package de.steamwar.misslewars.listener;
-
-import org.bukkit.GameMode;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.player.PlayerJoinEvent;
-
-public class JoinListener implements Listener{
- @EventHandler
- public void onJoin(PlayerJoinEvent e) {
- e.getPlayer().setGameMode(GameMode.SPECTATOR);
- }
-}
+package de.steamwar.misslewars.listener;
+
+import de.steamwar.misslewars.FightState;
+import de.steamwar.misslewars.MissileWars;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.player.PlayerJoinEvent;
+
+import java.util.EnumSet;
+
+public class JoinListener extends BasicListener {
+
+ public JoinListener(){
+ super(EnumSet.of(FightState.WAITING, FightState.FIGHTING));
+ }
+
+ @EventHandler
+ public void onJoin(PlayerJoinEvent e){
+ if(MissileWars.getRedTeam().getPlayers().size() < MissileWars.getBlueTeam().getPlayers().size())
+ MissileWars.getRedTeam().join(e.getPlayer());
+ else
+ MissileWars.getBlueTeam().join(e.getPlayer());
+ }
+}
diff --git a/src/de/steamwar/misslewars/listener/PortalDestructListener.java b/src/de/steamwar/misslewars/listener/PortalDestructListener.java
index 19822c1..1fa1096 100644
--- a/src/de/steamwar/misslewars/listener/PortalDestructListener.java
+++ b/src/de/steamwar/misslewars/listener/PortalDestructListener.java
@@ -1,22 +1,28 @@
-package de.steamwar.misslewars.listener;
-
-import org.bukkit.Material;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.block.BlockPhysicsEvent;
-
-import de.steamwar.misslewars.MissleWars;
-import de.steamwar.misslewars.WinReasons;
-
-public class PortalDestructListener implements Listener {
- @EventHandler
- public void onBlockupdate(BlockPhysicsEvent e) {
- if (e.getBlock().getType() != Material.NETHER_PORTAL)
- return;
- int z = e.getBlock().getZ();
- if (z == MissleWars.redPortalZ)
- MissleWars.end(WinReasons.PORTALDESTROYED, MissleWars.blueTeam);
- if (z == MissleWars.bluePortalZ)
- MissleWars.end(WinReasons.PORTALDESTROYED, MissleWars.blueTeam);
- }
-}
+package de.steamwar.misslewars.listener;
+
+import de.steamwar.misslewars.FightState;
+import de.steamwar.misslewars.MissileWars;
+import de.steamwar.misslewars.WinReasons;
+import org.bukkit.Material;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.block.BlockPhysicsEvent;
+
+import java.util.EnumSet;
+
+public class PortalDestructListener extends BasicListener {
+
+ public PortalDestructListener(){
+ super(EnumSet.of(FightState.FIGHTING));
+ }
+
+ @EventHandler
+ public void onBlockupdate(BlockPhysicsEvent e) {
+ if (e.getBlock().getType() != Material.NETHER_PORTAL)
+ return;
+ int z = e.getBlock().getZ();
+ if (z == MissileWars.getRedTeam().getPortalZ())
+ MissileWars.end(WinReasons.PORTAL_DESTROYED, MissileWars.getBlueTeam());
+ if (z == MissileWars.getBlueTeam().getPortalZ())
+ MissileWars.end(WinReasons.PORTAL_DESTROYED, MissileWars.getRedTeam());
+ }
+}
diff --git a/src/plugin.yml b/src/plugin.yml
index 5ce4837..124d00f 100644
--- a/src/plugin.yml
+++ b/src/plugin.yml
@@ -1,8 +1,8 @@
-name: MissleWars
-prefix: MW
-main: de.steamwar.misslewars
-authors: [Jan9103]
-version: 1.0
-commands:
- join:
- leave:
\ No newline at end of file
+name: MissleWars
+prefix: MW
+main: de.steamwar.misslewars.MissileWars
+authors:
+ - Jan9103
+ - Lixfel
+version: "1.0"
+api-version: "1.13"
\ No newline at end of file