fixed various bugs, added flight speed changer

This commit is contained in:
Elias Müller 2024-09-21 21:06:04 +02:00
parent 139ff42250
commit 969178366e
11 changed files with 176 additions and 64 deletions

View File

@ -1,6 +1,5 @@
package eu.mhsl.minecraft.WorldMuseum; 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.ChatListener;
import eu.mhsl.minecraft.WorldMuseum.listener.PlayerListener; import eu.mhsl.minecraft.WorldMuseum.listener.PlayerListener;
import eu.mhsl.minecraft.WorldMuseum.viewableWorld.ViewableWorld; import eu.mhsl.minecraft.WorldMuseum.viewableWorld.ViewableWorld;
@ -20,14 +19,12 @@ import java.util.logging.Logger;
public class Main extends JavaPlugin { public class Main extends JavaPlugin {
private static Main instance; private static Main instance;
private static Logger logger;
private final List<ViewableWorld> worlds = new ArrayList<>(); private final List<ViewableWorld> worlds = new ArrayList<>();
@Override @Override
public void onEnable() { public void onEnable() {
Main.instance = this; Main.instance = this;
logger = logger();
this.saveDefaultConfig(); this.saveDefaultConfig();
getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
@ -35,8 +32,7 @@ public class Main extends JavaPlugin {
List<Listener> listeners = List.of( List<Listener> listeners = List.of(
new PlayerListener(), new PlayerListener(),
new ChatListener(), new ChatListener(),
new ViewableWorldListener(), new ViewableWorldListener()
new WorldSelector()
); );
listeners.forEach(listener -> Bukkit.getPluginManager().registerEvents(listener, this)); listeners.forEach(listener -> Bukkit.getPluginManager().registerEvents(listener, this));
@ -60,11 +56,11 @@ public class Main extends JavaPlugin {
//noinspection ResultOfMethodCallIgnored //noinspection ResultOfMethodCallIgnored
worldFolder.mkdirs(); worldFolder.mkdirs();
Arrays.stream(Objects.requireNonNull(worldFolder.listFiles())).forEach(file -> { Arrays.stream(Objects.requireNonNull(worldFolder.listFiles())).forEach(file -> {
logger.info("[Worldmuseum] Loading world " + file.getName());
if (file.isDirectory()) { if (file.isDirectory()) {
getLogger().info("Loading world " + file.getName());
this.worlds.add(new ViewableWorld(file)); this.worlds.add(new ViewableWorld(file));
} else { } 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); this.worlds.forEach(ViewableWorld::loadWorld);
@ -79,7 +75,6 @@ public class Main extends JavaPlugin {
} }
public static Logger logger() { public static Logger logger() {
if(logger == null) throw new RuntimeException("Plugin not initialized yet"); return Main.instance().getLogger();
return logger;
} }
} }

View File

@ -1,35 +1,39 @@
package eu.mhsl.minecraft.WorldMuseum.items; package eu.mhsl.minecraft.WorldMuseum.items;
import eu.mhsl.minecraft.WorldMuseum.Main;
import eu.mhsl.minecraft.WorldMuseum.items.actionItems.*; import eu.mhsl.minecraft.WorldMuseum.items.actionItems.*;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class ActionItemManager { public class ActionItemManager {
private static ActionItemManager INSTANCE; private static ActionItemManager instance;
private final List<IActionItem> actionObjects = new ArrayList<>(); private final List<IActionItem> actionObjects = new ArrayList<>();
public ActionItemManager() { private ActionItemManager() {
initItems(); List<IActionItem> actionItems = List.of(
} new WorldSelector(),
new LeaveItem(),
new FlightChanger(),
new SpawnTeleport(),
new SpeedChanger()
);
private void initItems() { actionItems.forEach(actionItem -> Bukkit.getPluginManager().registerEvents(actionItem, Main.instance()));
actionObjects.add(new WorldSelector()); actionObjects.addAll(actionItems); }
actionObjects.add(new LeaveItem());
actionObjects.add(new FlightChanger());
actionObjects.add(new SpawnTeleport());
}
public static ActionItemManager getInstance() { public static ActionItemManager getInstance() {
if (INSTANCE == null) INSTANCE = new ActionItemManager(); if (instance == null) instance = new ActionItemManager();
return INSTANCE; return instance;
} }
public void givePlayerItems(Player p) { public void givePlayerItems(Player p) {
actionObjects.forEach(actionObject -> p.getInventory().setItem(actionObject.getItemLocation(), actionObject.getItem())); actionObjects.forEach(actionObject -> p.getInventory().setItem(actionObject.getItemLocation(), actionObject.getItem()));
} }
public List<IActionItem> getActionObjects() { public List<IActionItem> getActionItems() {
return actionObjects; return actionObjects;
} }
} }

View File

@ -7,20 +7,20 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class FlightChanger implements IActionItem{ public class FlightChanger implements IActionItem {
private final ItemStack item = generateItem(); private final ItemStack item = generateItem();
private ItemStack generateItem() { private ItemStack generateItem() {
ItemStack item = new ItemStack(Material.ELYTRA); ItemStack item = new ItemStack(Material.ELYTRA);
ItemMeta meta = item.getItemMeta(); ItemMeta meta = item.getItemMeta();
meta.displayName(Component.text("Enable/Disable Flight ")); meta.displayName(Component.text("Aktiviere/Deaktiviere Fliegen"));
item.setItemMeta(meta); item.setItemMeta(meta);
return item; return item;
} }
@Override @Override
public void action(@NotNull Player player) { public void action(@NotNull Player player) {
player.setAllowFlight(!player.getAllowFlight()); player.setFlying(!player.isFlying());
} }
@Override @Override
@ -30,7 +30,6 @@ public class FlightChanger implements IActionItem{
@Override @Override
public int getItemLocation() { public int getItemLocation() {
// Item will be placed in the second hotbar slot
return 1; return 1;
} }
} }

View File

@ -1,10 +1,11 @@
package eu.mhsl.minecraft.WorldMuseum.items.actionItems; package eu.mhsl.minecraft.WorldMuseum.items.actionItems;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public interface IActionItem { public interface IActionItem extends Listener {
void action(@NotNull Player player); void action(@NotNull Player player);
ItemStack getItem(); ItemStack getItem();
int getItemLocation(); int getItemLocation();

View File

@ -6,14 +6,13 @@ import net.kyori.adventure.text.Component;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Objects; import java.util.Objects;
public class LeaveItem implements Listener, IActionItem { public class LeaveItem implements IActionItem {
private final ItemStack item = generateItem(); private final ItemStack item = generateItem();
private ItemStack generateItem() { private ItemStack generateItem() {
@ -48,7 +47,6 @@ public class LeaveItem implements Listener, IActionItem {
@Override @Override
public int getItemLocation() { public int getItemLocation() {
//Item will be placed in the last hotbar slot
return 8; return 8;
} }
} }

View File

@ -1,6 +1,7 @@
package eu.mhsl.minecraft.WorldMuseum.items.actionItems; package eu.mhsl.minecraft.WorldMuseum.items.actionItems;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@ -13,7 +14,7 @@ public class SpawnTeleport implements IActionItem {
private ItemStack generateItem() { private ItemStack generateItem() {
ItemStack item = new ItemStack(Material.ENDER_PEARL); ItemStack item = new ItemStack(Material.ENDER_PEARL);
ItemMeta meta = item.getItemMeta(); ItemMeta meta = item.getItemMeta();
meta.displayName(Component.text("Teleport back to spawn")); meta.displayName(Component.text("Zum Spawn", NamedTextColor.GOLD));
item.setItemMeta(meta); item.setItemMeta(meta);
return item; return item;
} }
@ -30,7 +31,6 @@ public class SpawnTeleport implements IActionItem {
@Override @Override
public int getItemLocation() { public int getItemLocation() {
// Item will be placed in the second last hotbar slot
return 7; return 7;
} }
} }

View File

@ -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<Float> 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;
}
}

View File

@ -3,11 +3,11 @@ package eu.mhsl.minecraft.WorldMuseum.items.actionItems;
import eu.mhsl.minecraft.WorldMuseum.Main; import eu.mhsl.minecraft.WorldMuseum.Main;
import eu.mhsl.minecraft.WorldMuseum.viewableWorld.ViewableWorld; import eu.mhsl.minecraft.WorldMuseum.viewableWorld.ViewableWorld;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@ -16,18 +16,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
public class WorldSelector implements Listener, IActionItem { public class WorldSelector implements 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;
}
private Inventory generateWorldSelectorInventory() { private Inventory generateWorldSelectorInventory() {
List<ViewableWorld> worlds = Main.instance().getWorlds(); List<ViewableWorld> worlds = Main.instance().getWorlds();
@ -57,11 +46,13 @@ public class WorldSelector implements Listener, IActionItem {
@Override @Override
public void action(@NotNull Player player) { public void action(@NotNull Player player) {
player.openInventory(INVENTORY); player.openInventory(generateWorldSelectorInventory());
} }
@EventHandler @EventHandler
public void onInteract(InventoryClickEvent event) { public void onInteract(InventoryClickEvent event) {
List<ItemStack> worldItems = Main.instance().getWorlds().stream().map(ViewableWorld::getItem).toList();
if(!worldItems.contains(event.getCurrentItem())) return;
event.setCancelled(true); event.setCancelled(true);
Main.instance().getWorlds().stream() Main.instance().getWorlds().stream()
@ -72,13 +63,16 @@ public class WorldSelector implements Listener, IActionItem {
@Override @Override
public ItemStack getItem() { 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 @Override
public int getItemLocation() { public int getItemLocation() {
int itemLocation = 0; // Item will be placed into the first hotbar slot return 0;
return itemLocation;
} }
} }

View File

@ -2,16 +2,19 @@ package eu.mhsl.minecraft.WorldMuseum.listener;
import eu.mhsl.minecraft.WorldMuseum.Main; import eu.mhsl.minecraft.WorldMuseum.Main;
import eu.mhsl.minecraft.WorldMuseum.items.ActionItemManager; import eu.mhsl.minecraft.WorldMuseum.items.ActionItemManager;
import eu.mhsl.minecraft.WorldMuseum.viewableWorld.ViewableWorld;
import net.kyori.adventure.util.Ticks; import net.kyori.adventure.util.Ticks;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.block.Action; import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
@ -19,19 +22,30 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionEffectType;
import java.util.List;
public class PlayerListener implements Listener { public class PlayerListener implements Listener {
@EventHandler @EventHandler
public void onJoin(PlayerJoinEvent event) { public void onJoin(PlayerJoinEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
player.setGameMode(GameMode.SURVIVAL); player.setGameMode(GameMode.SURVIVAL);
player.setAllowFlight(true); player.setAllowFlight(true);
player.setInvulnerable(true); player.setInvulnerable(true);
Main.instance().getWorlds().forEach(world -> { player.setFoodLevel(20);
if (world.isDefaultWorld()) world.addViewer(event.getPlayer()); 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( event.getPlayer().addPotionEffect(
new PotionEffect(PotionEffectType.HASTE, PotionEffect.INFINITE_DURATION, 15, false, false, false) new PotionEffect(PotionEffectType.HASTE, PotionEffect.INFINITE_DURATION, 15, false, false, false)
); );
ActionItemManager.getInstance().givePlayerItems(event.getPlayer()); ActionItemManager.getInstance().givePlayerItems(event.getPlayer());
} }
@ -39,9 +53,13 @@ public class PlayerListener implements Listener {
public void onBreak(BlockBreakEvent event) { public void onBreak(BlockBreakEvent event) {
event.setDropItems(false); event.setDropItems(false);
Material material = event.getBlock().getType(); Material material = event.getBlock().getType();
BlockData blockData = event.getBlock().getBlockData();
Bukkit.getScheduler().scheduleSyncDelayedTask( Bukkit.getScheduler().scheduleSyncDelayedTask(
Main.instance(), Main.instance(),
() -> event.getBlock().getWorld().setType(event.getBlock().getLocation(), material), () -> {
event.getBlock().setType(material);
event.getBlock().setBlockData(blockData);
},
Ticks.TICKS_PER_SECOND * 5 Ticks.TICKS_PER_SECOND * 5
); );
} }
@ -60,14 +78,21 @@ public class PlayerListener implements Listener {
public void onInteract(PlayerInteractEvent event) { public void onInteract(PlayerInteractEvent event) {
ActionItemManager actionItemManager = ActionItemManager.getInstance(); 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(); Player p = event.getPlayer();
Action a = event.getAction();
ItemStack item = event.getItem(); ItemStack item = event.getItem();
if ((a != Action.RIGHT_CLICK_AIR) || (event.getItem() == null)) return;
actionItemManager.getActionObjects().forEach(object -> { actionItemManager.getActionItems().forEach(actionItem -> {
assert item != null; if (!item.equals(actionItem.getItem())) return;
if (item.equals(object.getItem())) object.action(p); event.setCancelled(true);
actionItem.action(p);
}); });
} }
@EventHandler
public void onItemMove(InventoryClickEvent event) {
event.setCancelled(true);
}
} }

View File

@ -36,15 +36,15 @@ public class ViewableWorld {
this.icon = Material.valueOf(config.getString("icon")); this.icon = Material.valueOf(config.getString("icon"));
this.isDefaultWorld = config.getBoolean("isDefaultWorld"); this.isDefaultWorld = config.getBoolean("isDefaultWorld");
} else { } else {
System.out.println("[WorldMuseum] Could not find config.yml"); System.out.println("Could not find config.yml");
try { try {
//noinspection ResultOfMethodCallIgnored //noinspection ResultOfMethodCallIgnored
configFile.createNewFile(); configFile.createNewFile();
FileConfiguration data = YamlConfiguration.loadConfiguration(configFile); FileConfiguration data = YamlConfiguration.loadConfiguration(configFile);
data.set("enabled", false); data.set("enabled", this.enabled);
data.set("name", this.name); data.set("name", this.name);
data.set("icon", this.icon.name()); data.set("icon", this.icon.name());
data.set("isDefaultWorld", false); data.set("isDefaultWorld", this.isDefaultWorld);
data.save(configFile); data.save(configFile);
} catch (IOException e) { } catch (IOException e) {

View File

@ -1,16 +1,23 @@
package eu.mhsl.minecraft.WorldMuseum.viewableWorld; 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.entity.EntityMoveEvent;
import io.papermc.paper.event.player.PlayerOpenSignEvent;
import org.bukkit.Material;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.block.BlockFromToEvent;
import org.bukkit.event.block.BlockGrowEvent; import org.bukkit.event.block.BlockGrowEvent;
import org.bukkit.event.block.BlockRedstoneEvent; import org.bukkit.event.block.BlockRedstoneEvent;
import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.*;
import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerPortalEvent; import org.bukkit.event.player.PlayerPortalEvent;
import org.bukkit.event.player.PlayerUnleashEntityEvent;
import org.bukkit.event.world.ChunkUnloadEvent; import org.bukkit.event.world.ChunkUnloadEvent;
import java.util.List;
public class ViewableWorldListener implements Listener { public class ViewableWorldListener implements Listener {
@EventHandler @EventHandler
public void disableRedstone(BlockRedstoneEvent event) { public void disableRedstone(BlockRedstoneEvent event) {
@ -44,4 +51,46 @@ public class ViewableWorldListener implements Listener {
public void preventPortal(PlayerPortalEvent event) { public void preventPortal(PlayerPortalEvent event) {
event.setCancelled(true); 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);
}
} }