From 969178366ee702300caa86ae2fb6033c8235d6ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 21 Sep 2024 21:06:04 +0200 Subject: [PATCH] fixed various bugs, added flight speed changer --- .../eu/mhsl/minecraft/WorldMuseum/Main.java | 13 ++--- .../WorldMuseum/items/ActionItemManager.java | 30 ++++++----- .../items/actionItems/FlightChanger.java | 7 ++- .../items/actionItems/IActionItem.java | 3 +- .../items/actionItems/LeaveItem.java | 4 +- .../items/actionItems/SpawnTeleport.java | 4 +- .../items/actionItems/SpeedChanger.java | 47 ++++++++++++++++ .../items/actionItems/WorldSelector.java | 28 ++++------ .../WorldMuseum/listener/PlayerListener.java | 45 ++++++++++++---- .../viewableWorld/ViewableWorld.java | 6 +-- .../viewableWorld/ViewableWorldListener.java | 53 ++++++++++++++++++- 11 files changed, 176 insertions(+), 64 deletions(-) create mode 100644 src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/SpeedChanger.java diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/Main.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/Main.java index c5152f9..c438dcb 100644 --- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/Main.java +++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/Main.java @@ -1,6 +1,5 @@ package eu.mhsl.minecraft.WorldMuseum; -import eu.mhsl.minecraft.WorldMuseum.items.actionItems.WorldSelector; import eu.mhsl.minecraft.WorldMuseum.listener.ChatListener; import eu.mhsl.minecraft.WorldMuseum.listener.PlayerListener; import eu.mhsl.minecraft.WorldMuseum.viewableWorld.ViewableWorld; @@ -20,14 +19,12 @@ import java.util.logging.Logger; public class Main extends JavaPlugin { private static Main instance; - private static Logger logger; private final List worlds = new ArrayList<>(); @Override public void onEnable() { Main.instance = this; - logger = logger(); this.saveDefaultConfig(); getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); @@ -35,8 +32,7 @@ public class Main extends JavaPlugin { List listeners = List.of( new PlayerListener(), new ChatListener(), - new ViewableWorldListener(), - new WorldSelector() + new ViewableWorldListener() ); listeners.forEach(listener -> Bukkit.getPluginManager().registerEvents(listener, this)); @@ -60,11 +56,11 @@ public class Main extends JavaPlugin { //noinspection ResultOfMethodCallIgnored worldFolder.mkdirs(); Arrays.stream(Objects.requireNonNull(worldFolder.listFiles())).forEach(file -> { - logger.info("[Worldmuseum] Loading world " + file.getName()); if (file.isDirectory()) { + getLogger().info("Loading world " + file.getName()); this.worlds.add(new ViewableWorld(file)); } else { - logger.info( "[Worldmuseum] " + file.getName() + " is not a directory and therefore not a valid world!"); + getLogger().info( file.getName() + " is not a directory and therefore not a valid world!"); } }); this.worlds.forEach(ViewableWorld::loadWorld); @@ -79,7 +75,6 @@ public class Main extends JavaPlugin { } public static Logger logger() { - if(logger == null) throw new RuntimeException("Plugin not initialized yet"); - return logger; + return Main.instance().getLogger(); } } \ No newline at end of file diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/ActionItemManager.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/ActionItemManager.java index 0ce4636..a555963 100644 --- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/ActionItemManager.java +++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/ActionItemManager.java @@ -1,35 +1,39 @@ package eu.mhsl.minecraft.WorldMuseum.items; +import eu.mhsl.minecraft.WorldMuseum.Main; import eu.mhsl.minecraft.WorldMuseum.items.actionItems.*; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; public class ActionItemManager { - private static ActionItemManager INSTANCE; + private static ActionItemManager instance; private final List actionObjects = new ArrayList<>(); - public ActionItemManager() { - initItems(); - } + private ActionItemManager() { + List actionItems = List.of( + new WorldSelector(), + new LeaveItem(), + new FlightChanger(), + new SpawnTeleport(), + new SpeedChanger() + ); - private void initItems() { - actionObjects.add(new WorldSelector()); - actionObjects.add(new LeaveItem()); - actionObjects.add(new FlightChanger()); - actionObjects.add(new SpawnTeleport()); - } + actionItems.forEach(actionItem -> Bukkit.getPluginManager().registerEvents(actionItem, Main.instance())); + actionObjects.addAll(actionItems); } public static ActionItemManager getInstance() { - if (INSTANCE == null) INSTANCE = new ActionItemManager(); - return INSTANCE; + if (instance == null) instance = new ActionItemManager(); + return instance; } + public void givePlayerItems(Player p) { actionObjects.forEach(actionObject -> p.getInventory().setItem(actionObject.getItemLocation(), actionObject.getItem())); } - public List getActionObjects() { + public List getActionItems() { return actionObjects; } } diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/FlightChanger.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/FlightChanger.java index 046b8ee..cf9760f 100644 --- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/FlightChanger.java +++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/FlightChanger.java @@ -7,20 +7,20 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; -public class FlightChanger implements IActionItem{ +public class FlightChanger implements IActionItem { private final ItemStack item = generateItem(); private ItemStack generateItem() { ItemStack item = new ItemStack(Material.ELYTRA); ItemMeta meta = item.getItemMeta(); - meta.displayName(Component.text("Enable/Disable Flight ")); + meta.displayName(Component.text("Aktiviere/Deaktiviere Fliegen")); item.setItemMeta(meta); return item; } @Override public void action(@NotNull Player player) { - player.setAllowFlight(!player.getAllowFlight()); + player.setFlying(!player.isFlying()); } @Override @@ -30,7 +30,6 @@ public class FlightChanger implements IActionItem{ @Override public int getItemLocation() { - // Item will be placed in the second hotbar slot return 1; } } diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/IActionItem.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/IActionItem.java index 057ab39..62a37e7 100644 --- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/IActionItem.java +++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/IActionItem.java @@ -1,10 +1,11 @@ package eu.mhsl.minecraft.WorldMuseum.items.actionItems; import org.bukkit.entity.Player; +import org.bukkit.event.Listener; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; -public interface IActionItem { +public interface IActionItem extends Listener { void action(@NotNull Player player); ItemStack getItem(); int getItemLocation(); diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/LeaveItem.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/LeaveItem.java index 7c62f5d..74f5ccd 100644 --- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/LeaveItem.java +++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/LeaveItem.java @@ -6,14 +6,13 @@ import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; -import org.bukkit.event.Listener; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; import java.util.Objects; -public class LeaveItem implements Listener, IActionItem { +public class LeaveItem implements IActionItem { private final ItemStack item = generateItem(); private ItemStack generateItem() { @@ -48,7 +47,6 @@ public class LeaveItem implements Listener, IActionItem { @Override public int getItemLocation() { - //Item will be placed in the last hotbar slot return 8; } } diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/SpawnTeleport.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/SpawnTeleport.java index 0dfdfa2..20a3fe4 100644 --- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/SpawnTeleport.java +++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/SpawnTeleport.java @@ -1,6 +1,7 @@ package eu.mhsl.minecraft.WorldMuseum.items.actionItems; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -13,7 +14,7 @@ public class SpawnTeleport implements IActionItem { private ItemStack generateItem() { ItemStack item = new ItemStack(Material.ENDER_PEARL); ItemMeta meta = item.getItemMeta(); - meta.displayName(Component.text("Teleport back to spawn")); + meta.displayName(Component.text("Zum Spawn", NamedTextColor.GOLD)); item.setItemMeta(meta); return item; } @@ -30,7 +31,6 @@ public class SpawnTeleport implements IActionItem { @Override public int getItemLocation() { - // Item will be placed in the second last hotbar slot return 7; } } diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/SpeedChanger.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/SpeedChanger.java new file mode 100644 index 0000000..cd0975c --- /dev/null +++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/SpeedChanger.java @@ -0,0 +1,47 @@ +package eu.mhsl.minecraft.WorldMuseum.items.actionItems; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.stream.IntStream; + +public class SpeedChanger implements IActionItem { + List flySpeeds = List.of(0.2f, 0.4f, 0.6f, 0.8f); + + @Override + public void action(@NotNull Player player) { + IntStream.range(0, flySpeeds.size()) + .filter(i -> flySpeeds.get(i).equals(player.getFlySpeed())) + .findFirst() + .ifPresentOrElse( + newFlyMode -> setFlySpeed(player, (newFlyMode + 1) % flySpeeds.size()), + () -> setFlySpeed(player, 0) + ); + + } + + public void setFlySpeed(Player player, int mode) { + player.setFlySpeed(flySpeeds.get(mode)); + player.sendActionBar(Component.text(String.format("Fluggeschwindigkeit: %s", mode), NamedTextColor.GOLD)); + } + + @Override + public ItemStack getItem() { + ItemStack item = new ItemStack(Material.FEATHER); + ItemMeta meta = item.getItemMeta(); + meta.displayName(Component.text("Fluggeschwindigkeit")); + item.setItemMeta(meta); + return item; + } + + @Override + public int getItemLocation() { + return 2; + } +} diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/WorldSelector.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/WorldSelector.java index e23d33a..a13677c 100644 --- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/WorldSelector.java +++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/items/actionItems/WorldSelector.java @@ -3,11 +3,11 @@ package eu.mhsl.minecraft.WorldMuseum.items.actionItems; import eu.mhsl.minecraft.WorldMuseum.Main; import eu.mhsl.minecraft.WorldMuseum.viewableWorld.ViewableWorld; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -16,18 +16,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; -public class WorldSelector implements Listener, IActionItem { - private final ItemStack ITEM = generateWorldSelectorItem(); - private final Inventory INVENTORY = generateWorldSelectorInventory(); - - private ItemStack generateWorldSelectorItem() { - ItemStack item = new ItemStack(Material.GRASS_BLOCK); - ItemMeta meta = item.getItemMeta(); - meta.displayName(Component.text("Worldselector")); - item.setItemMeta(meta); - return item; - } - +public class WorldSelector implements IActionItem { private Inventory generateWorldSelectorInventory() { List worlds = Main.instance().getWorlds(); @@ -57,11 +46,13 @@ public class WorldSelector implements Listener, IActionItem { @Override public void action(@NotNull Player player) { - player.openInventory(INVENTORY); + player.openInventory(generateWorldSelectorInventory()); } @EventHandler public void onInteract(InventoryClickEvent event) { + List worldItems = Main.instance().getWorlds().stream().map(ViewableWorld::getItem).toList(); + if(!worldItems.contains(event.getCurrentItem())) return; event.setCancelled(true); Main.instance().getWorlds().stream() @@ -72,13 +63,16 @@ public class WorldSelector implements Listener, IActionItem { @Override public ItemStack getItem() { - return ITEM; + ItemStack item = new ItemStack(Material.GRASS_BLOCK); + ItemMeta meta = item.getItemMeta(); + meta.displayName(Component.text("Weltenliste", NamedTextColor.GOLD)); + item.setItemMeta(meta); + return item; } @Override public int getItemLocation() { - int itemLocation = 0; // Item will be placed into the first hotbar slot - return itemLocation; + return 0; } } diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/listener/PlayerListener.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/listener/PlayerListener.java index bdab3b2..513b1b0 100644 --- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/listener/PlayerListener.java +++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/listener/PlayerListener.java @@ -2,16 +2,19 @@ package eu.mhsl.minecraft.WorldMuseum.listener; import eu.mhsl.minecraft.WorldMuseum.Main; import eu.mhsl.minecraft.WorldMuseum.items.ActionItemManager; +import eu.mhsl.minecraft.WorldMuseum.viewableWorld.ViewableWorld; import net.kyori.adventure.util.Ticks; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Material; +import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; @@ -19,19 +22,30 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +import java.util.List; + public class PlayerListener implements Listener { @EventHandler public void onJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); + player.setGameMode(GameMode.SURVIVAL); player.setAllowFlight(true); player.setInvulnerable(true); - Main.instance().getWorlds().forEach(world -> { - if (world.isDefaultWorld()) world.addViewer(event.getPlayer()); - }); + player.setFoodLevel(20); + player.setHealth(20); + player.setAllowFlight(true); + + Main.instance().getWorlds().stream() + .filter(ViewableWorld::isDefaultWorld) + .findFirst() + .orElseGet(() -> Main.instance().getWorlds().stream().findFirst().orElseThrow()) + .addViewer(player); + event.getPlayer().addPotionEffect( new PotionEffect(PotionEffectType.HASTE, PotionEffect.INFINITE_DURATION, 15, false, false, false) ); + ActionItemManager.getInstance().givePlayerItems(event.getPlayer()); } @@ -39,9 +53,13 @@ public class PlayerListener implements Listener { public void onBreak(BlockBreakEvent event) { event.setDropItems(false); Material material = event.getBlock().getType(); + BlockData blockData = event.getBlock().getBlockData(); Bukkit.getScheduler().scheduleSyncDelayedTask( Main.instance(), - () -> event.getBlock().getWorld().setType(event.getBlock().getLocation(), material), + () -> { + event.getBlock().setType(material); + event.getBlock().setBlockData(blockData); + }, Ticks.TICKS_PER_SECOND * 5 ); } @@ -60,14 +78,21 @@ public class PlayerListener implements Listener { public void onInteract(PlayerInteractEvent event) { ActionItemManager actionItemManager = ActionItemManager.getInstance(); - event.setCancelled(true); + if(event.getItem() == null) return; + if(!List.of(Action.RIGHT_CLICK_BLOCK, Action.RIGHT_CLICK_AIR).contains(event.getAction())) return; + Player p = event.getPlayer(); - Action a = event.getAction(); ItemStack item = event.getItem(); - if ((a != Action.RIGHT_CLICK_AIR) || (event.getItem() == null)) return; - actionItemManager.getActionObjects().forEach(object -> { - assert item != null; - if (item.equals(object.getItem())) object.action(p); + + actionItemManager.getActionItems().forEach(actionItem -> { + if (!item.equals(actionItem.getItem())) return; + event.setCancelled(true); + actionItem.action(p); }); } + + @EventHandler + public void onItemMove(InventoryClickEvent event) { + event.setCancelled(true); + } } diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/viewableWorld/ViewableWorld.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/viewableWorld/ViewableWorld.java index fc65143..f18151a 100644 --- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/viewableWorld/ViewableWorld.java +++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/viewableWorld/ViewableWorld.java @@ -36,15 +36,15 @@ public class ViewableWorld { this.icon = Material.valueOf(config.getString("icon")); this.isDefaultWorld = config.getBoolean("isDefaultWorld"); } else { - System.out.println("[WorldMuseum] Could not find config.yml"); + System.out.println("Could not find config.yml"); try { //noinspection ResultOfMethodCallIgnored configFile.createNewFile(); FileConfiguration data = YamlConfiguration.loadConfiguration(configFile); - data.set("enabled", false); + data.set("enabled", this.enabled); data.set("name", this.name); data.set("icon", this.icon.name()); - data.set("isDefaultWorld", false); + data.set("isDefaultWorld", this.isDefaultWorld); data.save(configFile); } catch (IOException e) { diff --git a/src/main/java/eu/mhsl/minecraft/WorldMuseum/viewableWorld/ViewableWorldListener.java b/src/main/java/eu/mhsl/minecraft/WorldMuseum/viewableWorld/ViewableWorldListener.java index 9a4e4bf..e0de892 100644 --- a/src/main/java/eu/mhsl/minecraft/WorldMuseum/viewableWorld/ViewableWorldListener.java +++ b/src/main/java/eu/mhsl/minecraft/WorldMuseum/viewableWorld/ViewableWorldListener.java @@ -1,16 +1,23 @@ package eu.mhsl.minecraft.WorldMuseum.viewableWorld; +import com.destroystokyo.paper.event.player.PlayerTeleportEndGatewayEvent; import io.papermc.paper.event.entity.EntityMoveEvent; +import io.papermc.paper.event.player.PlayerOpenSignEvent; +import org.bukkit.Material; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.block.BlockGrowEvent; import org.bukkit.event.block.BlockRedstoneEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntitySpawnEvent; +import org.bukkit.event.entity.*; +import org.bukkit.event.player.PlayerBedEnterEvent; +import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerPortalEvent; +import org.bukkit.event.player.PlayerUnleashEntityEvent; import org.bukkit.event.world.ChunkUnloadEvent; +import java.util.List; + public class ViewableWorldListener implements Listener { @EventHandler public void disableRedstone(BlockRedstoneEvent event) { @@ -44,4 +51,46 @@ public class ViewableWorldListener implements Listener { public void preventPortal(PlayerPortalEvent event) { event.setCancelled(true); } + @EventHandler + public void preventEntityPortal(EntityPortalEvent event) { + event.setCancelled(true); + } + @EventHandler + public void noSleep(PlayerBedEnterEvent event) { + event.setCancelled(true); + } + @EventHandler + public void noHunger(FoodLevelChangeEvent event) { + event.setCancelled(true); + } + @EventHandler + public void noItemPickup(EntityPickupItemEvent event) { + event.setCancelled(true); + } + @EventHandler + public void noTnt(ExplosionPrimeEvent event) { + event.setCancelled(true); + } + @EventHandler + public void noCreeper(EntityExplodeEvent event) { + event.setCancelled(true); + } + @EventHandler + public void noSignEdit(PlayerOpenSignEvent event) { + event.setCancelled(true); + } + @EventHandler + public void noUnleash(PlayerUnleashEntityEvent event) { + event.setCancelled(true); + } + @EventHandler + public void noEndGateway(PlayerTeleportEndGatewayEvent event) { + event.setCancelled(true); + } + @EventHandler + public void noInteract(PlayerInteractEvent event) { + if(event.getClickedBlock() == null) return; + if(!List.of(Material.CHEST, Material.SHULKER_BOX).contains(event.getClickedBlock().getType())) return; + event.setCancelled(true); + } }