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;
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<ViewableWorld> 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<Listener> 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();
}
}

View File

@ -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<IActionItem> actionObjects = new ArrayList<>();
public ActionItemManager() {
initItems();
}
private ActionItemManager() {
List<IActionItem> 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<IActionItem> getActionObjects() {
public List<IActionItem> getActionItems() {
return actionObjects;
}
}

View File

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

View File

@ -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();

View File

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

View File

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

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.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<ViewableWorld> 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<ItemStack> 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;
}
}

View File

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

View File

@ -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) {

View File

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