diff --git a/pom.xml b/pom.xml
index 8528282..cc96aca 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,15 +10,11 @@
-
- gitea
- http://heimserver.local:36107/api/packages/minecraft/maven
-
-
-
- gitea
- http://heimserver.local:36107/api/packages/minecraft/maven
-
+
+ forgejo
+ Forgejo Maven
+ http://heimserver.local:36107/api/packages/minecraft/maven
+
21
diff --git a/src/main/java/com/softwarerat/API/builder/SpigotItem.java b/src/main/java/com/softwarerat/API/builder/SpigotItem.java
index 8007b92..e28f3ab 100644
--- a/src/main/java/com/softwarerat/API/builder/SpigotItem.java
+++ b/src/main/java/com/softwarerat/API/builder/SpigotItem.java
@@ -1,14 +1,5 @@
package com.softwarerat.API.builder;
-import org.bukkit.enchantments.Enchantment;
-import org.bukkit.inventory.ItemFlag;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.FireworkEffectMeta;
-import org.bukkit.inventory.meta.ItemMeta;
-import org.bukkit.inventory.meta.LeatherArmorMeta;
-import org.bukkit.inventory.meta.SkullMeta;
-
-import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -17,11 +8,20 @@ import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
+import javax.annotation.Nonnull;
+
import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.DyeColor;
import org.bukkit.FireworkEffect;
import org.bukkit.Material;
+import org.bukkit.enchantments.Enchantment;
+import org.bukkit.inventory.ItemFlag;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.FireworkEffectMeta;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.bukkit.inventory.meta.LeatherArmorMeta;
+import org.bukkit.inventory.meta.SkullMeta;
// Another Item Builder
public class SpigotItem {
private ItemStack itemStack;
@@ -29,7 +29,7 @@ public class SpigotItem {
private String colorCode(@Nonnull String message) { return ChatColor.translateAlternateColorCodes('&', message); }
- public SpigotItem(@Nonnull Material material, @Nonnull int amount) {
+ public SpigotItem(@Nonnull Material material, int amount) {
this.itemStack = new ItemStack(material, amount);
diff --git a/src/main/java/com/softwarerat/API/commands/Navigator.java b/src/main/java/com/softwarerat/API/commands/Navigator.java
index 60f59eb..8cf3f75 100644
--- a/src/main/java/com/softwarerat/API/commands/Navigator.java
+++ b/src/main/java/com/softwarerat/API/commands/Navigator.java
@@ -1,12 +1,5 @@
package com.softwarerat.API.commands;
-import com.google.common.io.ByteArrayDataOutput;
-import com.google.common.io.ByteStreams;
-import com.softwarerat.API.builder.SpigotInventory;
-import com.softwarerat.API.builder.SpigotItem;
-import com.softwarerat.API.builder.SpigotUI;
-import com.softwarerat.GameAPI;
-import lombok.AllArgsConstructor;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.command.Command;
@@ -16,6 +9,12 @@ import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
+import com.google.common.io.ByteArrayDataOutput;
+import com.google.common.io.ByteStreams;
+import com.softwarerat.API.builder.SpigotInventory;
+import com.softwarerat.API.builder.SpigotItem;
+import com.softwarerat.API.builder.SpigotUI;
+
//Default Navigator
public class Navigator implements CommandExecutor {
JavaPlugin javaPlugin;
diff --git a/src/main/java/com/softwarerat/API/data/GameData.java b/src/main/java/com/softwarerat/API/data/GameData.java
index 6a86f58..809fe31 100644
--- a/src/main/java/com/softwarerat/API/data/GameData.java
+++ b/src/main/java/com/softwarerat/API/data/GameData.java
@@ -1,19 +1,19 @@
package com.softwarerat.API.data;
-import com.softwarerat.API.gameState.GameState;
-import com.softwarerat.API.gameType.GameType;
-import com.softwarerat.API.location.PlayerSpawnLocation;
-import com.softwarerat.GameAPI;
-import lombok.Getter;
-import lombok.Setter;
+import java.util.List;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scoreboard.Scoreboard;
-import org.bukkit.scoreboard.Team;
-import java.util.List;
+import com.softwarerat.API.data.gameState.GameStateManager;
+import com.softwarerat.API.data.gameType.GameType;
+import com.softwarerat.API.data.location.PlayerSpawnLocation;
+import com.softwarerat.GameAPI;
+
+import lombok.Getter;
+import lombok.Setter;
// Server related Data
// made possible with Lombok
@Getter
@@ -22,7 +22,7 @@ public class GameData {
List spawnLocations;
PlayerSpawnLocation defaultSpawnLocation;
GameAPI gameapi;
- GameState currentGameState;
+ GameStateManager gameStateManager;
Location mapLocation;
String primaryKit;
String secondaryKit;
@@ -33,6 +33,7 @@ public class GameData {
Scoreboard scoreboard;
public GameData(GameAPI gameapi) {
this.gameapi = gameapi;
+ this.gameStateManager = new GameStateManager();
}
public String getGameHost(JavaPlugin javaPlugin){
diff --git a/src/main/java/com/softwarerat/API/data/gameState/GameStateManager.java b/src/main/java/com/softwarerat/API/data/gameState/GameStateManager.java
new file mode 100644
index 0000000..6c7280c
--- /dev/null
+++ b/src/main/java/com/softwarerat/API/data/gameState/GameStateManager.java
@@ -0,0 +1,39 @@
+package com.softwarerat.API.data.gameState;
+
+import java.util.Arrays;
+
+public class GameStateManager {
+
+
+
+ private final IGameState[] gameStates;
+
+ private int currentStateId;
+
+ public GameStateManager(IGameState... gameStates) {
+ this.gameStates = gameStates;
+ }
+
+ public IGameState getCurrentState() {
+ if (this.currentStateId < 0 || this.currentStateId >= this.gameStates.length)
+ return null;
+ return this.gameStates[this.currentStateId];
+ }
+
+ public IGameState nextState() {
+ if (this.currentStateId + 1 == this.gameStates.length)
+ throw new IllegalStateException("No states remaining");
+
+ IGameState oldState = getCurrentState();
+ this.currentStateId++;
+ IGameState newState = getCurrentState();
+ oldState.Stop();
+ newState.Start(this);
+ return newState;
+ }
+
+ @SafeVarargs
+ public final boolean isCurrentGameState(Class extends IGameState>... states) {
+ return Arrays.>stream(states).anyMatch(state -> state.isInstance(getCurrentState()));
+ }
+}
diff --git a/src/main/java/com/softwarerat/API/data/gameState/IGameState.java b/src/main/java/com/softwarerat/API/data/gameState/IGameState.java
new file mode 100644
index 0000000..91f1ade
--- /dev/null
+++ b/src/main/java/com/softwarerat/API/data/gameState/IGameState.java
@@ -0,0 +1,8 @@
+package com.softwarerat.API.data.gameState;
+
+public interface IGameState {
+
+public void Start(GameStateManager manager);
+public void Stop();
+
+}
diff --git a/src/main/java/com/softwarerat/API/gameType/GameType.java b/src/main/java/com/softwarerat/API/data/gameType/GameType.java
similarity index 70%
rename from src/main/java/com/softwarerat/API/gameType/GameType.java
rename to src/main/java/com/softwarerat/API/data/gameType/GameType.java
index 7a66449..ec13745 100644
--- a/src/main/java/com/softwarerat/API/gameType/GameType.java
+++ b/src/main/java/com/softwarerat/API/data/gameType/GameType.java
@@ -1,4 +1,4 @@
-package com.softwarerat.API.gameType;
+package com.softwarerat.API.data.gameType;
public enum GameType {
GAME_TYPE_MINIGAME,
diff --git a/src/main/java/com/softwarerat/API/location/LocationAPI.java b/src/main/java/com/softwarerat/API/data/location/LocationAPI.java
similarity index 95%
rename from src/main/java/com/softwarerat/API/location/LocationAPI.java
rename to src/main/java/com/softwarerat/API/data/location/LocationAPI.java
index 5e70b5d..6c8ff04 100644
--- a/src/main/java/com/softwarerat/API/location/LocationAPI.java
+++ b/src/main/java/com/softwarerat/API/data/location/LocationAPI.java
@@ -1,4 +1,4 @@
-package com.softwarerat.API.location;
+package com.softwarerat.API.data.location;
import com.softwarerat.API.data.GameData;
import lombok.AllArgsConstructor;
diff --git a/src/main/java/com/softwarerat/API/location/PlayerSpawnLocation.java b/src/main/java/com/softwarerat/API/data/location/PlayerSpawnLocation.java
similarity index 73%
rename from src/main/java/com/softwarerat/API/location/PlayerSpawnLocation.java
rename to src/main/java/com/softwarerat/API/data/location/PlayerSpawnLocation.java
index 01f3e75..b5ba078 100644
--- a/src/main/java/com/softwarerat/API/location/PlayerSpawnLocation.java
+++ b/src/main/java/com/softwarerat/API/data/location/PlayerSpawnLocation.java
@@ -1,12 +1,14 @@
-package com.softwarerat.API.location;
-
-import com.softwarerat.API.gameType.GameType;
-import lombok.Getter;
-import lombok.Setter;
-import org.bukkit.Location;
+package com.softwarerat.API.data.location;
import java.util.UUID;
+import org.bukkit.Location;
+
+import com.softwarerat.API.data.gameType.GameType;
+
+import lombok.Getter;
+import lombok.Setter;
+
// Game related Player spawn Location
@Getter
diff --git a/src/main/java/com/softwarerat/API/data/player/GamePlayer.java b/src/main/java/com/softwarerat/API/data/player/GamePlayer.java
new file mode 100644
index 0000000..824e66b
--- /dev/null
+++ b/src/main/java/com/softwarerat/API/data/player/GamePlayer.java
@@ -0,0 +1,83 @@
+package com.softwarerat.API.data.player;
+
+import java.util.Arrays;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.jetbrains.annotations.Nullable;
+
+import com.softwarerat.API.data.store.CacheManager;
+import com.softwarerat.API.data.store.FlagManager;
+import com.softwarerat.API.event.PlayerFlagUpdateEvent;
+
+
+
+public class GamePlayer extends CacheManager implements FlagManager {
+ private static final String FLAG_KEY = "__flag__";
+
+ private final org.bukkit.entity.Player bukkitPlayer;
+
+ private Location enterSpectateLocation;
+
+ private Location leaveSpectateLocation;
+
+ GamePlayer(org.bukkit.entity.Player bukkitPlayer, Location enterSpectateLocation, Location leaveSpectateLocation) {
+ this.bukkitPlayer = bukkitPlayer;
+ this.enterSpectateLocation = enterSpectateLocation;
+ this.leaveSpectateLocation = leaveSpectateLocation;
+ }
+
+ public void setFlag(PlayerFlag flag) {
+ PlayerFlag currentFlag = getCurrentFlag();
+ PlayerFlagUpdateEvent event = new PlayerFlagUpdateEvent(this, currentFlag, flag);
+ Bukkit.getServer().getPluginManager().callEvent(event);
+ if (event.isCancelled()) {
+ removeFromCache("__flag__");
+ addToCache("__flag__", flag.getInt());
+ }
+ }
+
+ public void removeFlag(PlayerFlag flag) {
+ setFlag(PlayerFlags.PLAYER);
+ }
+
+ public boolean hasFlag(PlayerFlag... flag) {
+ return ((Boolean)Arrays.stream(flag)
+ .map(playerFlag -> Boolean.valueOf(getValueFromCache("__flag__").equals(playerFlag.getInt())))
+ .filter(aBoolean -> aBoolean.booleanValue())
+ .findFirst()
+ .orElse(Boolean.valueOf(false))).booleanValue();
+ }
+
+ public boolean isSpectator() {
+ return hasFlag(new PlayerFlag[] { PlayerFlags.SPECTATOR, PlayerFlags.SPECTATOR_TARGET });
+ }
+
+ public org.bukkit.entity.Player getBukkitPlayer() {
+ return this.bukkitPlayer;
+ }
+
+ public void setEnterSpectateLocation(Location enterSpectateLocation) {
+ this.enterSpectateLocation = enterSpectateLocation;
+ }
+
+ public void setLeaveSpectateLocation(Location leaveSpectateLocation) {
+ this.leaveSpectateLocation = leaveSpectateLocation;
+ }
+
+ public Location getEnterSpectateLocation() {
+ return this.enterSpectateLocation;
+ }
+
+ public Location getLeaveSpectateLocation() {
+ return this.leaveSpectateLocation;
+ }
+
+ @Nullable
+ private PlayerFlag getCurrentFlag() {
+ return Arrays.stream((PlayerFlag[])PlayerFlags.values())
+ .filter(playerFlag -> !getValueFromCache("__flag__").equals(playerFlag.getInt()))
+ .findFirst()
+ .orElse(null);
+ }
+}
diff --git a/src/main/java/com/softwarerat/API/player/PlayerAPI.java b/src/main/java/com/softwarerat/API/data/player/PlayerAPI.java
similarity index 91%
rename from src/main/java/com/softwarerat/API/player/PlayerAPI.java
rename to src/main/java/com/softwarerat/API/data/player/PlayerAPI.java
index f7116ec..870c187 100644
--- a/src/main/java/com/softwarerat/API/player/PlayerAPI.java
+++ b/src/main/java/com/softwarerat/API/data/player/PlayerAPI.java
@@ -1,9 +1,10 @@
-package com.softwarerat.API.player;
+package com.softwarerat.API.data.player;
+
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.java.JavaPlugin;
import com.softwarerat.API.data.GameData;
import com.softwarerat.GameAPI;
-import org.bukkit.entity.Player;
-import org.bukkit.plugin.java.JavaPlugin;
// Game related PlayerAPI for checking if a player is the GameHost
diff --git a/src/main/java/com/softwarerat/API/data/player/PlayerFlag.java b/src/main/java/com/softwarerat/API/data/player/PlayerFlag.java
new file mode 100644
index 0000000..56b56da
--- /dev/null
+++ b/src/main/java/com/softwarerat/API/data/player/PlayerFlag.java
@@ -0,0 +1,7 @@
+package com.softwarerat.API.data.player;
+
+import com.softwarerat.API.data.store.Flag;
+
+public interface PlayerFlag extends Flag {
+
+}
diff --git a/src/main/java/com/softwarerat/API/data/player/PlayerFlags.java b/src/main/java/com/softwarerat/API/data/player/PlayerFlags.java
new file mode 100644
index 0000000..55dc347
--- /dev/null
+++ b/src/main/java/com/softwarerat/API/data/player/PlayerFlags.java
@@ -0,0 +1,26 @@
+package com.softwarerat.API.data.player;
+
+public enum PlayerFlags implements PlayerFlag {
+ PLAYER("default flag for players", Integer.valueOf(1)),
+ SPECTATOR("if player is spectator", Integer.valueOf(2)),
+ SPECTATOR_TARGET("if player is spectator and views player", Integer.valueOf(3));
+
+ private final String description;
+
+ private final Integer number;
+
+ PlayerFlags(String description, Integer number) {
+ this.description = description;
+ this.number = number;
+ }
+
+ @Override
+ public String getDescription() {
+ return this.description;
+ }
+
+ @Override
+ public Integer getInt() {
+ return this.number;
+ }
+}
diff --git a/src/main/java/com/softwarerat/API/data/player/PlayerManager.java b/src/main/java/com/softwarerat/API/data/player/PlayerManager.java
new file mode 100644
index 0000000..a28a71f
--- /dev/null
+++ b/src/main/java/com/softwarerat/API/data/player/PlayerManager.java
@@ -0,0 +1,74 @@
+package com.softwarerat.API.data.player;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.bukkit.Location;
+import org.bukkit.entity.Player;
+
+public class PlayerManager {
+
+ private final List playerList = new ArrayList<>();
+ private final Location enterSpectateLocation;
+ private final Location leaveSpectateLocation;
+
+ public PlayerManager(Location enterSpectateLocation, Location leaveSpectateLocation) {
+ this.enterSpectateLocation = enterSpectateLocation;
+ this.leaveSpectateLocation = leaveSpectateLocation;
+ }
+
+ protected void addPlayer(Player bukkitPlayer) {
+ if (getPlayer(bukkitPlayer) != null)
+ return;
+
+ GamePlayer player = new GamePlayer(bukkitPlayer, enterSpectateLocation, leaveSpectateLocation);
+ player.setFlag(PlayerFlags.PLAYER);
+ playerList.add(player);
+ }
+
+ protected void removePlayer(Player bukkitPlayer) {
+ GamePlayer player = getPlayer(bukkitPlayer);
+ if (player != null)
+ playerList.remove(player);
+ }
+
+ public GamePlayer getPlayer(Player bukkitPlayer) {
+ return playerList.stream()
+ .filter(player -> player.getBukkitPlayer().getUniqueId()
+ .equals(bukkitPlayer.getUniqueId()))
+ .findFirst()
+ .orElse(null);
+ }
+
+ public List players() {
+ return Collections.unmodifiableList(playerList);
+ }
+
+ public List playersWithFlag(PlayerFlag... flags) {
+ return playerList.stream()
+ .filter(player -> player.hasFlag(flags))
+ .collect(Collectors.toList());
+ }
+
+ public List bukkitPlayersWithFlag(PlayerFlag... flags) {
+ return playerList.stream()
+ .filter(player -> player.hasFlag(flags))
+ .map(GamePlayer::getBukkitPlayer)
+ .collect(Collectors.toList());
+ }
+
+ public List playersWithNoFlag(PlayerFlag... flags) {
+ return playerList.stream()
+ .filter(player -> !player.hasFlag(flags))
+ .collect(Collectors.toList());
+ }
+
+ public List bukkitPlayersWithNoFlag(PlayerFlag... flags) {
+ return playerList.stream()
+ .filter(player -> !player.hasFlag(flags))
+ .map(GamePlayer::getBukkitPlayer)
+ .collect(Collectors.toList());
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/softwarerat/API/prefix/PrefixAPI.java b/src/main/java/com/softwarerat/API/data/prefix/PrefixAPI.java
similarity index 94%
rename from src/main/java/com/softwarerat/API/prefix/PrefixAPI.java
rename to src/main/java/com/softwarerat/API/data/prefix/PrefixAPI.java
index 49479fd..6bb4c8d 100644
--- a/src/main/java/com/softwarerat/API/prefix/PrefixAPI.java
+++ b/src/main/java/com/softwarerat/API/data/prefix/PrefixAPI.java
@@ -1,12 +1,9 @@
-package com.softwarerat.API.prefix;
+package com.softwarerat.API.data.prefix;
-import com.softwarerat.API.data.GameData;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.Team;
-import java.util.List;
-
public class PrefixAPI {
/* PrefixSystem of the whole Network
* this will be the future way to add Tablist Prefixes, and will depend on GameData Settings like wich GameType and
diff --git a/src/main/java/com/softwarerat/API/scoreboard/ScoreAPI.java b/src/main/java/com/softwarerat/API/data/scoreboard/ScoreAPI.java
similarity index 70%
rename from src/main/java/com/softwarerat/API/scoreboard/ScoreAPI.java
rename to src/main/java/com/softwarerat/API/data/scoreboard/ScoreAPI.java
index 0978b7b..46354fe 100644
--- a/src/main/java/com/softwarerat/API/scoreboard/ScoreAPI.java
+++ b/src/main/java/com/softwarerat/API/data/scoreboard/ScoreAPI.java
@@ -1,9 +1,11 @@
-package com.softwarerat.API.scoreboard;
+package com.softwarerat.API.data.scoreboard;
import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import org.bukkit.scoreboard.*;
+import org.bukkit.scoreboard.DisplaySlot;
+import org.bukkit.scoreboard.Objective;
+import org.bukkit.scoreboard.Scoreboard;
+import org.bukkit.scoreboard.ScoreboardManager;
public class ScoreAPI {
diff --git a/src/main/java/com/softwarerat/API/data/store/CacheManager.java b/src/main/java/com/softwarerat/API/data/store/CacheManager.java
new file mode 100644
index 0000000..d2764e5
--- /dev/null
+++ b/src/main/java/com/softwarerat/API/data/store/CacheManager.java
@@ -0,0 +1,27 @@
+package com.softwarerat.API.data.store;
+
+import java.util.LinkedHashMap;
+
+public class CacheManager {
+ private final LinkedHashMap cache = new LinkedHashMap<>();
+
+ public void addToCache(String key, Object value) {
+ this.cache.put(key, value);
+ }
+
+ public void removeFromCache(String key) {
+ this.cache.remove(key);
+ }
+
+ public void changeValueFromCache(String key, Object value) {
+ this.cache.replace(key, value);
+ }
+
+ public Object getValueFromCache(String key) {
+ return this.cache.getOrDefault(key, (Object)null);
+ }
+
+ public boolean containsCache(String key) {
+ return this.cache.containsKey(key);
+ }
+}
diff --git a/src/main/java/com/softwarerat/API/data/store/Flag.java b/src/main/java/com/softwarerat/API/data/store/Flag.java
new file mode 100644
index 0000000..a62d0f8
--- /dev/null
+++ b/src/main/java/com/softwarerat/API/data/store/Flag.java
@@ -0,0 +1,6 @@
+package com.softwarerat.API.data.store;
+
+public interface Flag {
+ String getDescription();
+ Integer getInt();
+}
diff --git a/src/main/java/com/softwarerat/API/data/store/FlagManager.java b/src/main/java/com/softwarerat/API/data/store/FlagManager.java
new file mode 100644
index 0000000..b88f46c
--- /dev/null
+++ b/src/main/java/com/softwarerat/API/data/store/FlagManager.java
@@ -0,0 +1,9 @@
+package com.softwarerat.API.data.store;
+
+public interface FlagManager {
+ void setFlag(T paramT);
+
+ void removeFlag(T paramT);
+
+ boolean hasFlag(T... paramVarArgs);
+}
diff --git a/src/main/java/com/softwarerat/API/world/WorldAPI.java b/src/main/java/com/softwarerat/API/data/world/WorldAPI.java
similarity index 93%
rename from src/main/java/com/softwarerat/API/world/WorldAPI.java
rename to src/main/java/com/softwarerat/API/data/world/WorldAPI.java
index f0039b6..4da22e1 100644
--- a/src/main/java/com/softwarerat/API/world/WorldAPI.java
+++ b/src/main/java/com/softwarerat/API/data/world/WorldAPI.java
@@ -1,4 +1,4 @@
-package com.softwarerat.API.world;
+package com.softwarerat.API.data.world;
import org.bukkit.Bukkit;
import org.bukkit.Location;
diff --git a/src/main/java/com/softwarerat/API/event/PlayerFlagUpdateEvent.java b/src/main/java/com/softwarerat/API/event/PlayerFlagUpdateEvent.java
new file mode 100644
index 0000000..21acccc
--- /dev/null
+++ b/src/main/java/com/softwarerat/API/event/PlayerFlagUpdateEvent.java
@@ -0,0 +1,58 @@
+package com.softwarerat.API.event;
+
+
+
+import org.bukkit.event.Cancellable;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.NotNull;
+
+import com.softwarerat.API.data.player.GamePlayer;
+import com.softwarerat.API.data.player.PlayerFlag;
+
+public final class PlayerFlagUpdateEvent extends Event implements Cancellable {
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
+ private final GamePlayer player;
+
+ private final PlayerFlag previousFlag;
+
+ private final PlayerFlag newFlag;
+
+ private boolean cancelled;
+
+ public PlayerFlagUpdateEvent(GamePlayer player, PlayerFlag previousFlag, PlayerFlag newFlag) {
+ this.player = player;
+ this.previousFlag = previousFlag;
+ this.newFlag = newFlag;
+ }
+
+ public boolean isCancelled() {
+ return this.cancelled;
+ }
+
+ public void setCancelled(boolean cancel) {
+ this.cancelled = cancel;
+ }
+
+ public GamePlayer getPlayer() {
+ return this.player;
+ }
+
+ public PlayerFlag getNewFlag() {
+ return this.newFlag;
+ }
+
+ public PlayerFlag getPreviousFlag() {
+ return this.previousFlag;
+ }
+
+ @NotNull
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
+}
diff --git a/src/main/java/com/softwarerat/API/listener/BuildBreakListener.java b/src/main/java/com/softwarerat/API/event/listener/BuildBreakListener.java
similarity index 92%
rename from src/main/java/com/softwarerat/API/listener/BuildBreakListener.java
rename to src/main/java/com/softwarerat/API/event/listener/BuildBreakListener.java
index fc86572..cf935ae 100644
--- a/src/main/java/com/softwarerat/API/listener/BuildBreakListener.java
+++ b/src/main/java/com/softwarerat/API/event/listener/BuildBreakListener.java
@@ -1,4 +1,4 @@
-package com.softwarerat.API.listener;
+package com.softwarerat.API.event.listener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
diff --git a/src/main/java/com/softwarerat/API/listener/ChatListener.java b/src/main/java/com/softwarerat/API/event/listener/ChatListener.java
similarity index 54%
rename from src/main/java/com/softwarerat/API/listener/ChatListener.java
rename to src/main/java/com/softwarerat/API/event/listener/ChatListener.java
index a651bd9..05c470b 100644
--- a/src/main/java/com/softwarerat/API/listener/ChatListener.java
+++ b/src/main/java/com/softwarerat/API/event/listener/ChatListener.java
@@ -1,4 +1,4 @@
-package com.softwarerat.API.listener;
+package com.softwarerat.API.event.listener;
// Chat Listener
public class ChatListener {
diff --git a/src/main/java/com/softwarerat/API/listener/JoinListener.java b/src/main/java/com/softwarerat/API/event/listener/JoinListener.java
similarity index 52%
rename from src/main/java/com/softwarerat/API/listener/JoinListener.java
rename to src/main/java/com/softwarerat/API/event/listener/JoinListener.java
index ff79e95..8b01b5c 100644
--- a/src/main/java/com/softwarerat/API/listener/JoinListener.java
+++ b/src/main/java/com/softwarerat/API/event/listener/JoinListener.java
@@ -1,4 +1,4 @@
-package com.softwarerat.API.listener;
+package com.softwarerat.API.event.listener;
// Join Listener
public class JoinListener {
diff --git a/src/main/java/com/softwarerat/API/listener/LobbyInventoryClickListener.java b/src/main/java/com/softwarerat/API/event/listener/LobbyInventoryClickListener.java
similarity index 89%
rename from src/main/java/com/softwarerat/API/listener/LobbyInventoryClickListener.java
rename to src/main/java/com/softwarerat/API/event/listener/LobbyInventoryClickListener.java
index 0713894..cc5b474 100644
--- a/src/main/java/com/softwarerat/API/listener/LobbyInventoryClickListener.java
+++ b/src/main/java/com/softwarerat/API/event/listener/LobbyInventoryClickListener.java
@@ -1,4 +1,4 @@
-package com.softwarerat.API.listener;
+package com.softwarerat.API.event.listener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
diff --git a/src/main/java/com/softwarerat/API/listener/LobbyJoinListener.java b/src/main/java/com/softwarerat/API/event/listener/LobbyJoinListener.java
similarity index 97%
rename from src/main/java/com/softwarerat/API/listener/LobbyJoinListener.java
rename to src/main/java/com/softwarerat/API/event/listener/LobbyJoinListener.java
index 00512ca..eb4b635 100644
--- a/src/main/java/com/softwarerat/API/listener/LobbyJoinListener.java
+++ b/src/main/java/com/softwarerat/API/event/listener/LobbyJoinListener.java
@@ -1,16 +1,17 @@
-package com.softwarerat.API.listener;
-import com.google.common.io.ByteArrayDataOutput;
-import com.google.common.io.ByteStreams;
-import com.softwarerat.API.builder.SpigotInventory;
-import com.softwarerat.API.builder.SpigotItem;
-import com.softwarerat.API.builder.SpigotUI;
+package com.softwarerat.API.event.listener;
+import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;
-import org.bukkit.ChatColor;
+
+import com.google.common.io.ByteArrayDataOutput;
+import com.google.common.io.ByteStreams;
+import com.softwarerat.API.builder.SpigotInventory;
+import com.softwarerat.API.builder.SpigotItem;
+import com.softwarerat.API.builder.SpigotUI;
// Lobby join magic including the navigator
public class LobbyJoinListener implements Listener{
diff --git a/src/main/java/com/softwarerat/API/event/listener/QuitListener.java b/src/main/java/com/softwarerat/API/event/listener/QuitListener.java
new file mode 100644
index 0000000..2999892
--- /dev/null
+++ b/src/main/java/com/softwarerat/API/event/listener/QuitListener.java
@@ -0,0 +1,4 @@
+package com.softwarerat.API.event.listener;
+
+public class QuitListener {
+}
diff --git a/src/main/java/com/softwarerat/API/event/listener/spectator/SpectatorFoodLevelChangeListener.java b/src/main/java/com/softwarerat/API/event/listener/spectator/SpectatorFoodLevelChangeListener.java
new file mode 100644
index 0000000..423c34f
--- /dev/null
+++ b/src/main/java/com/softwarerat/API/event/listener/spectator/SpectatorFoodLevelChangeListener.java
@@ -0,0 +1,42 @@
+package com.softwarerat.API.event.listener.spectator;
+
+import org.bukkit.entity.HumanEntity;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.entity.FoodLevelChangeEvent;
+
+import com.softwarerat.API.data.player.PlayerManager;
+
+
+
+public class SpectatorFoodLevelChangeListener {
+
+
+ private final PlayerManager playerManager;
+
+
+ public SpectatorFoodLevelChangeListener(PlayerManager playerManager) {
+ this.playerManager = playerManager;
+ }
+
+
+ public PlayerManager playerManager() {
+ return this.playerManager;
+ }
+
+ @EventHandler
+ public void onSpectatorFoodLevelChange(FoodLevelChangeEvent event) {
+ Player player;
+ HumanEntity humanEntity = event.getEntity();
+ if (humanEntity instanceof Player) {
+ player = (Player)humanEntity;
+ } else {
+ return;
+ }
+ if (!this.playerManager.getPlayer(player).isSpectator())
+ return;
+ event.setFoodLevel(20);
+ event.setCancelled(true);
+ }
+
+}
diff --git a/src/main/java/com/softwarerat/API/gameState/GameState.java b/src/main/java/com/softwarerat/API/gameState/GameState.java
deleted file mode 100644
index 5e57a0d..0000000
--- a/src/main/java/com/softwarerat/API/gameState/GameState.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.softwarerat.API.gameState;
-
-
-public enum GameState {
- GAME_STATE_LOBBY,
- GAME_STATE_INGAME;
-}
diff --git a/src/main/java/com/softwarerat/API/gameState/IGameState.java b/src/main/java/com/softwarerat/API/gameState/IGameState.java
deleted file mode 100644
index 04ae079..0000000
--- a/src/main/java/com/softwarerat/API/gameState/IGameState.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.softwarerat.API.gameState;
-
-public interface IGameState {
-
-public void Start();
-public void Stop();
-
-}
diff --git a/src/main/java/com/softwarerat/API/listener/QuitListener.java b/src/main/java/com/softwarerat/API/listener/QuitListener.java
deleted file mode 100644
index 9cee962..0000000
--- a/src/main/java/com/softwarerat/API/listener/QuitListener.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.softwarerat.API.listener;
-
-public class QuitListener {
-}
diff --git a/src/main/java/com/softwarerat/GameAPI.java b/src/main/java/com/softwarerat/GameAPI.java
index 69205b7..6f10536 100644
--- a/src/main/java/com/softwarerat/GameAPI.java
+++ b/src/main/java/com/softwarerat/GameAPI.java
@@ -1,16 +1,17 @@
package com.softwarerat;
-import com.softwarerat.API.commands.Navigator;
-import com.softwarerat.API.data.GameData;
-import com.softwarerat.API.location.LocationAPI;
-import com.softwarerat.API.prefix.PrefixAPI;
-import lombok.Getter;
-import lombok.Setter;
import org.bukkit.Bukkit;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
-import com.softwarerat.API.world.WorldAPI;
+
+import com.softwarerat.API.data.GameData;
+import com.softwarerat.API.data.location.LocationAPI;
+import com.softwarerat.API.data.prefix.PrefixAPI;
+import com.softwarerat.API.data.world.WorldAPI;
+
+import lombok.Getter;
+import lombok.Setter;
@Getter
@Setter