diff --git a/src/main/java/gent/zeus/mc13dtl/MC13DTL.java b/src/main/java/gent/zeus/mc13dtl/MC13DTL.java index 3fa2e7a..5bccc9b 100644 --- a/src/main/java/gent/zeus/mc13dtl/MC13DTL.java +++ b/src/main/java/gent/zeus/mc13dtl/MC13DTL.java @@ -1,6 +1,25 @@ package gent.zeus.mc13dtl; +import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; +import gent.zeus.mc13dtl.gamestate.GameStateCommand; +import gent.zeus.mc13dtl.gamestate.GameStateHandler; +import io.papermc.paper.command.brigadier.Commands; +import io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager; +import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; + public class MC13DTL extends JavaPlugin { + public static MC13DTL instance; + + @Override + public void onEnable() { + instance = this; + getServer().getPluginManager().registerEvents(new GameStateHandler(), this); + LifecycleEventManager manager = this.getLifecycleManager(); + manager.registerEventHandler(LifecycleEvents.COMMANDS, event -> { + Commands commands = event.registrar(); + commands.register("start-game", "Start a game of 13 days to live", new GameStateCommand()); + }); + } } diff --git a/src/main/java/gent/zeus/mc13dtl/gamestate/GameStateCommand.java b/src/main/java/gent/zeus/mc13dtl/gamestate/GameStateCommand.java new file mode 100644 index 0000000..4896039 --- /dev/null +++ b/src/main/java/gent/zeus/mc13dtl/gamestate/GameStateCommand.java @@ -0,0 +1,38 @@ +package gent.zeus.mc13dtl.gamestate; + +import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.persistence.PersistentDataType; +import org.bukkit.potion.PotionEffect; + +import gent.zeus.mc13dtl.MC13DTL; +import io.papermc.paper.command.brigadier.BasicCommand; +import io.papermc.paper.command.brigadier.CommandSourceStack; + +public class GameStateCommand implements BasicCommand { + @Override + public void execute(CommandSourceStack stack, String[] args) { + World world = Bukkit.getWorld("world"); + NamespacedKey key = new NamespacedKey(MC13DTL.instance, "game-state"); + world.getPersistentDataContainer().set(key, PersistentDataType.STRING, "active"); + GameStateUtil.loadWorld(world); + for (OfflinePlayer i : Bukkit.getOfflinePlayers()) { + Player player = i.getPlayer(); + player.getInventory().clear(); + player.heal(100); + player.getActivePotionEffects().clear(); + for (PotionEffect effect : player.getActivePotionEffects()) { + player.removePotionEffect(effect.getType()); + } + GameStateUtil.loadPlayer(player); + } + } + + @Override + public String permission() { + return "13dtl.manage-game"; + } +} diff --git a/src/main/java/gent/zeus/mc13dtl/gamestate/GameStateHandler.java b/src/main/java/gent/zeus/mc13dtl/gamestate/GameStateHandler.java new file mode 100644 index 0000000..54fe22f --- /dev/null +++ b/src/main/java/gent/zeus/mc13dtl/gamestate/GameStateHandler.java @@ -0,0 +1,23 @@ +package gent.zeus.mc13dtl.gamestate; + +import org.bukkit.World; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.world.WorldLoadEvent; + +public class GameStateHandler implements Listener { + @EventHandler + void onPlayerJoin(PlayerJoinEvent event) { + GameStateUtil.loadPlayer(event.getPlayer()); + } + + @EventHandler + void onWorldLoad(WorldLoadEvent event) { + World world = event.getWorld(); + if (!world.getName().equals("world")) { + return; + } + GameStateUtil.loadWorld(world); + } +} diff --git a/src/main/java/gent/zeus/mc13dtl/gamestate/GameStateUtil.java b/src/main/java/gent/zeus/mc13dtl/gamestate/GameStateUtil.java new file mode 100644 index 0000000..e16b1bf --- /dev/null +++ b/src/main/java/gent/zeus/mc13dtl/gamestate/GameStateUtil.java @@ -0,0 +1,49 @@ +package gent.zeus.mc13dtl.gamestate; + +import org.bukkit.Bukkit; +import org.bukkit.Difficulty; +import org.bukkit.GameMode; +import org.bukkit.GameRule; +import org.bukkit.NamespacedKey; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.persistence.PersistentDataType; + +import gent.zeus.mc13dtl.MC13DTL; +import net.md_5.bungee.api.ChatColor; + +public class GameStateUtil { + static void loadWorld(World world) { + NamespacedKey key = new NamespacedKey(MC13DTL.instance, "game-state"); + if (!world.getPersistentDataContainer().has(key)) { + world.getPersistentDataContainer().set(key, PersistentDataType.STRING, "lobby"); + } + String gameState = world.getPersistentDataContainer().get(key, PersistentDataType.STRING); + if (gameState.equals("lobby")) { + world.setDifficulty(Difficulty.PEACEFUL); + world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false); + world.setFullTime(0); + world.getWorldBorder().setSize(200); + } + if (gameState.equals("active")) { + world.setDifficulty(Difficulty.NORMAL); + world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, true); + world.getWorldBorder().setSize(10000); + } + } + + static void loadPlayer(Player player) { + NamespacedKey key = new NamespacedKey(MC13DTL.instance, "game-state"); + String gameState = Bukkit.getWorld("world").getPersistentDataContainer().get(key, PersistentDataType.STRING); + if (gameState.equals("lobby")) { + player.setGameMode(GameMode.ADVENTURE); + player.setInvulnerable(true); + player.sendMessage(ChatColor.DARK_PURPLE + "Game hasn't started yet, please wait..."); + } + if (gameState.equals("active")) { + player.setGameMode(GameMode.SURVIVAL); + player.setInvulnerable(false); + player.sendMessage(ChatColor.DARK_PURPLE + "Game is active, have fun!"); + } + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index b31584b..8a8caab 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -2,3 +2,4 @@ name: 13DTL version: 0.0.1 main: gent.zeus.mc13dtl.MC13DTL api-version: '1.21.1' +load: STARTUP