fixed various bugs, added flight speed changer
This commit is contained in:
parent
139ff42250
commit
969178366e
@ -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();
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user