added LeaveItem and restructured code

This commit is contained in:
Martin Olischläger 2024-09-21 14:18:12 +02:00
parent d405c3f233
commit eaccdec4a8
8 changed files with 117 additions and 81 deletions

View File

@ -1,5 +1,6 @@
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;
@ -32,7 +33,8 @@ public class Main extends JavaPlugin {
new PlayerListener(), new PlayerListener(),
new ChatListener(), new ChatListener(),
// new WorldSelectListener(), // new WorldSelectListener(),
new ViewableWorldListener() new ViewableWorldListener(),
new WorldSelector()
); );
listeners.forEach(listener -> Bukkit.getPluginManager().registerEvents(listener, this)); listeners.forEach(listener -> Bukkit.getPluginManager().registerEvents(listener, this));

View File

@ -1,33 +1,35 @@
package eu.mhsl.minecraft.WorldMuseum.items; package eu.mhsl.minecraft.WorldMuseum.items;
import eu.mhsl.minecraft.WorldMuseum.items.actionItems.IActionItem;
import eu.mhsl.minecraft.WorldMuseum.items.actionItems.LeaveItem;
import eu.mhsl.minecraft.WorldMuseum.items.actionItems.WorldSelector; import eu.mhsl.minecraft.WorldMuseum.items.actionItems.WorldSelector;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class ActionItemManager { public class ActionItemManager {
private static ActionItemManager INSTANCE; private static ActionItemManager INSTANCE;
private WorldSelector worldSelector; private final List<IActionItem> actionObjects = new ArrayList<>();
public ActionItemManager() { public ActionItemManager() {
initItems(); initItems();
} }
private void initItems() { private void initItems() {
worldSelector = new WorldSelector(); actionObjects.add(new WorldSelector());
actionObjects.add(new LeaveItem());
} }
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) {
p.getInventory().setItem(0, worldSelector.getITEM()); actionObjects.forEach(actionObject -> p.getInventory().setItem(actionObject.getItemLocation(), actionObject.getItem()));
} }
public List<IActionItem> getActionObjects() {
public WorldSelector getWorldSelector() { return actionObjects;
return worldSelector;
} }
} }

View File

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

View File

@ -0,0 +1,53 @@
package eu.mhsl.minecraft.WorldMuseum.items.actionItems;
import eu.mhsl.minecraft.WorldMuseum.Main;
import eu.mhsl.minecraft.WorldMuseum.util.BungeeCord;
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 {
private final ItemStack item = generateItem();
private ItemStack generateItem() {
ItemStack item = new ItemStack(Material.RED_BED);
ItemMeta meta = item.getItemMeta();
meta.displayName(Component.text("Leave World Museum"));
item.setItemMeta(meta);
return item;
}
@Override
public void action(@NotNull Player player) {
ConfigurationSection bungeeSettings = Main.instance().getConfig().getConfigurationSection("bungee");
Objects.requireNonNull(bungeeSettings);
if(!(bungeeSettings.getBoolean("enabled", false))) {
player.sendMessage(Component.text("Bungeecord is not enabled. You can't be transpered "));
}
if(!bungeeSettings.getBoolean("returnOnSelectExit")) return;
sendPlayerToExit(player);
}
private void sendPlayerToExit(Player player) {
BungeeCord.connect(player, Main.instance().getConfig().getString("bungee.returnToServer"));
}
@Override
public ItemStack getItem() {
return item;
}
@Override
public int getItemLocation() {
int itemLocation = 8; //Item will be placed in the last hotbar slot
return itemLocation;
}
}

View File

@ -6,6 +6,9 @@ import net.kyori.adventure.text.Component;
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.Listener;
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;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
@ -13,7 +16,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
public class WorldSelector { public class WorldSelector implements Listener, IActionItem {
private final ItemStack ITEM = generateWorldSelectorItem(); private final ItemStack ITEM = generateWorldSelectorItem();
private final Inventory INVENTORY = generateWorldSelectorInventory(); private final Inventory INVENTORY = generateWorldSelectorInventory();
@ -52,11 +55,30 @@ public class WorldSelector {
return stack; return stack;
} }
public ItemStack getITEM() { @Override
return ITEM;
}
public void action(@NotNull Player player) { public void action(@NotNull Player player) {
player.openInventory(INVENTORY); player.openInventory(INVENTORY);
} }
@EventHandler
public void onInteract(InventoryClickEvent event) {
event.setCancelled(true);
Main.instance().getWorlds().stream()
.filter(viewableWorld -> viewableWorld.getItem().equals(event.getCurrentItem()))
.findFirst()
.ifPresent(viewableWorld -> viewableWorld.addViewer((Player) event.getWhoClicked()));
}
@Override
public ItemStack getItem() {
return ITEM;
}
@Override
public int getItemLocation() {
int itemLocation = 0; // Item will be placed into the first hotbar slot
return itemLocation;
}
} }

View File

@ -1,62 +0,0 @@
package eu.mhsl.minecraft.WorldMuseum.items.worldSelector;
import eu.mhsl.minecraft.WorldMuseum.Main;
import eu.mhsl.minecraft.WorldMuseum.util.BungeeCord;
import org.bukkit.Bukkit;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import java.util.Objects;
public class WorldSelectListener implements Listener {
private void sendPlayerToExit(Player player) {
BungeeCord.connect(player, Main.instance().getConfig().getString("bungee.returnToServer"));
}
@EventHandler
public void onExit(InventoryCloseEvent event) {
if(event.getReason().equals(InventoryCloseEvent.Reason.TELEPORT)) return;
Bukkit.getScheduler().scheduleSyncDelayedTask(
Main.instance(),
() -> event.getPlayer().openInventory(WorldSelectInventory.generateInventory()),
1
);
ConfigurationSection bungeeSettings = Main.instance().getConfig().getConfigurationSection("bungee");
Objects.requireNonNull(bungeeSettings);
if(!event.getReason().equals(InventoryCloseEvent.Reason.PLAYER)) return;
if(!(bungeeSettings.getBoolean("enabled", false))) return;
if(!bungeeSettings.getBoolean("returnOnSelectExit")) return;
sendPlayerToExit((Player) event.getPlayer());
}
@EventHandler
public void onInteract(InventoryClickEvent event) {
event.setCancelled(true);
if(Objects.equals(event.getCurrentItem(), WorldSelectInventory.exitItem()))
sendPlayerToExit((Player) event.getWhoClicked());
Main.instance().getWorlds().stream()
.filter(viewableWorld -> viewableWorld.getItem().equals(event.getCurrentItem()))
.findFirst()
.ifPresent(viewableWorld -> viewableWorld.addViewer((Player) event.getWhoClicked()));
}
@EventHandler
public void onJoin(PlayerJoinEvent event) {
Bukkit.getScheduler().scheduleSyncDelayedTask(
Main.instance(),
() -> event.getPlayer().openInventory(
WorldSelectInventory.generateInventory()
)
);
}
}

View File

@ -15,6 +15,7 @@ import org.bukkit.event.block.BlockPlaceEvent;
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;
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;
@ -23,7 +24,10 @@ import java.util.Objects;
public class PlayerListener implements Listener { public class PlayerListener implements Listener {
@EventHandler @EventHandler
public void onJoin(PlayerJoinEvent event) { public void onJoin(PlayerJoinEvent event) {
event.getPlayer().setGameMode(GameMode.SURVIVAL); Player player = event.getPlayer();
player.setGameMode(GameMode.SURVIVAL);
player.setAllowFlight(true);
player.setInvulnerable(true);
Main.instance().getWorlds().forEach(world -> { Main.instance().getWorlds().forEach(world -> {
if (world.isDefaultWorld()) world.addViewer(event.getPlayer()); if (world.isDefaultWorld()) world.addViewer(event.getPlayer());
}); });
@ -55,12 +59,16 @@ public class PlayerListener implements Listener {
@EventHandler @EventHandler
public void onInteract(PlayerInteractEvent event) { public void onInteract(PlayerInteractEvent event) {
ActionItemManager actionItems = ActionItemManager.getInstance(); ActionItemManager actionItemManager = ActionItemManager.getInstance();
event.setCancelled(true); event.setCancelled(true);
Player p = event.getPlayer(); Player p = event.getPlayer();
Action a = event.getAction(); Action a = event.getAction();
ItemStack item = event.getItem();
if ((a != Action.RIGHT_CLICK_AIR) || (event.getItem() == null)) return; if ((a != Action.RIGHT_CLICK_AIR) || (event.getItem() == null)) return;
if (event.getItem().equals(actionItems.getWorldSelector().getITEM())) actionItems.getWorldSelector().action(p); actionItemManager.getActionObjects().forEach(object -> {
assert item != null;
if (item.equals(object.getItem())) object.action(p);
});
} }
} }

View File

@ -64,8 +64,8 @@ public class ViewableWorld {
} }
public void addViewer(Player player) { public void addViewer(Player player) {
player.setAllowFlight(true);
player.teleport(world.getSpawnLocation()); player.teleport(world.getSpawnLocation());
player.setAllowFlight(true);
} }
public ItemStack getItem() { public ItemStack getItem() {