added more infrastructure and basic functionality
This commit is contained in:
parent
45a4349c2d
commit
36bbd5ef97
1
.idea/gradle.xml
generated
1
.idea/gradle.xml
generated
@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="GradleMigrationSettings" migrationVersion="1" />
|
||||
<component name="GradleSettings">
|
||||
<option name="linkedExternalProjectsSettings">
|
||||
<GradleProjectSettings>
|
||||
|
@ -12,6 +12,7 @@ repositories {
|
||||
|
||||
dependencies {
|
||||
compileOnly("io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT")
|
||||
compileOnly("com.google.guava:guava:33.3.0-jre")
|
||||
|
||||
testImplementation(platform("org.junit:junit-bom:5.10.0"))
|
||||
testImplementation("org.junit.jupiter:junit-jupiter")
|
||||
|
@ -1,12 +0,0 @@
|
||||
package eu.mhsl.minecraft.WorldMuseum;
|
||||
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.BlockRedstoneEvent;
|
||||
|
||||
public class CancelListener implements Listener {
|
||||
@EventHandler
|
||||
public void disableRedstone(BlockRedstoneEvent event) {
|
||||
event.setNewCurrent(0);
|
||||
}
|
||||
}
|
@ -1,5 +1,9 @@
|
||||
package eu.mhsl.minecraft.WorldMuseum;
|
||||
|
||||
import eu.mhsl.minecraft.WorldMuseum.listener.ChatListener;
|
||||
import eu.mhsl.minecraft.WorldMuseum.listener.PlayerListener;
|
||||
import eu.mhsl.minecraft.WorldMuseum.viewableWorld.ViewableWorld;
|
||||
import eu.mhsl.minecraft.WorldMuseum.viewableWorld.ViewableWorldListener;
|
||||
import eu.mhsl.minecraft.WorldMuseum.worldSelector.WorldSelectListener;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.event.Listener;
|
||||
@ -21,9 +25,13 @@ public class Main extends JavaPlugin {
|
||||
Main.instance = this;
|
||||
this.saveDefaultConfig();
|
||||
|
||||
getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
|
||||
|
||||
List<Listener> listeners = List.of(
|
||||
new PlayerListener(),
|
||||
new ChatListener(),
|
||||
new WorldSelectListener(),
|
||||
new CancelListener()
|
||||
new ViewableWorldListener()
|
||||
);
|
||||
listeners.forEach(listener -> Bukkit.getPluginManager().registerEvents(listener, this));
|
||||
|
||||
@ -32,10 +40,13 @@ public class Main extends JavaPlugin {
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
this.worlds.forEach(ViewableWorld::unloadWorld);
|
||||
}
|
||||
|
||||
private void loadWorlds() {
|
||||
File worldFolder = new File(getDataFolder().getAbsolutePath() + "/worlds");
|
||||
if(!worldFolder.setReadOnly()) throw new RuntimeException("Could not set Worlds to readonly. Be careful!");
|
||||
|
||||
//noinspection ResultOfMethodCallIgnored
|
||||
worldFolder.mkdirs();
|
||||
Arrays.stream(Objects.requireNonNull(worldFolder.listFiles())).forEach(file -> this.worlds.add(new ViewableWorld(file)));
|
||||
|
@ -0,0 +1,24 @@
|
||||
package eu.mhsl.minecraft.WorldMuseum.listener;
|
||||
|
||||
import io.papermc.paper.event.player.AsyncChatEvent;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
|
||||
public class ChatListener implements Listener {
|
||||
@EventHandler
|
||||
public void onJoin(PlayerJoinEvent event) {
|
||||
event.joinMessage(null);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onLeave(PlayerQuitEvent event) {
|
||||
event.quitMessage(null);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onChat(AsyncChatEvent event) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
package eu.mhsl.minecraft.WorldMuseum.listener;
|
||||
|
||||
import eu.mhsl.minecraft.WorldMuseum.Main;
|
||||
import net.kyori.adventure.util.Ticks;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.BlockBreakEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.potion.PotionEffect;
|
||||
import org.bukkit.potion.PotionEffectType;
|
||||
|
||||
public class PlayerListener implements Listener {
|
||||
@EventHandler
|
||||
public void onJoin(PlayerJoinEvent event) {
|
||||
event.getPlayer().setGameMode(GameMode.SURVIVAL);
|
||||
event.getPlayer().addPotionEffect(
|
||||
new PotionEffect(PotionEffectType.HASTE, PotionEffect.INFINITE_DURATION, 15, false, false, false)
|
||||
);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onBreak(BlockBreakEvent event) {
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(
|
||||
Main.instance(),
|
||||
() -> event.getBlock().getWorld().getBlockAt(event.getBlock().getLocation()).setType(event.getBlock().getType()),
|
||||
Ticks.TICKS_PER_SECOND * 5
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package eu.mhsl.minecraft.WorldMuseum.util;
|
||||
|
||||
import com.google.common.io.ByteArrayDataOutput;
|
||||
import com.google.common.io.ByteStreams;
|
||||
import eu.mhsl.minecraft.WorldMuseum.Main;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.util.Ticks;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class BungeeCord {
|
||||
public static void connect(Player player, String server) {
|
||||
Main.instance().getLogger().log(Level.INFO, String.format("Bungeecord: Sending %s to %s", player.getName(), server));
|
||||
ByteArrayDataOutput output = ByteStreams.newDataOutput();
|
||||
output.writeUTF("Connect");
|
||||
output.writeUTF(server);
|
||||
player.sendPluginMessage(Main.instance(), "BungeeCord", output.toByteArray());
|
||||
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(
|
||||
Main.instance(),
|
||||
() -> player.kick(Component.text("connect timeout")),
|
||||
Ticks.TICKS_PER_SECOND * 10
|
||||
);
|
||||
}
|
||||
}
|
@ -1,10 +1,8 @@
|
||||
package eu.mhsl.minecraft.WorldMuseum;
|
||||
package eu.mhsl.minecraft.WorldMuseum.viewableWorld;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.util.TriState;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.WorldCreator;
|
||||
import org.bukkit.*;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -13,6 +11,7 @@ import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Objects;
|
||||
|
||||
public class ViewableWorld {
|
||||
private final File worldLocation;
|
||||
@ -40,9 +39,16 @@ public class ViewableWorld {
|
||||
worldCreator.keepSpawnLoaded(TriState.FALSE);
|
||||
worldCreator.generator(new ChunkGenerator() {});
|
||||
this.world = worldCreator.createWorld();
|
||||
Objects.requireNonNull(this.world);
|
||||
this.world.setAutoSave(false);
|
||||
}
|
||||
|
||||
public void unloadWorld() {
|
||||
Bukkit.unloadWorld(this.world, false);
|
||||
}
|
||||
|
||||
public void addViewer(Player player) {
|
||||
player.setAllowFlight(true);
|
||||
player.teleport(world.getSpawnLocation());
|
||||
}
|
||||
|
@ -0,0 +1,32 @@
|
||||
package eu.mhsl.minecraft.WorldMuseum.viewableWorld;
|
||||
|
||||
import io.papermc.paper.event.entity.EntityMoveEvent;
|
||||
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.EntitySpawnEvent;
|
||||
|
||||
public class ViewableWorldListener implements Listener {
|
||||
@EventHandler
|
||||
public void disableRedstone(BlockRedstoneEvent event) {
|
||||
event.setNewCurrent(0);
|
||||
}
|
||||
@EventHandler
|
||||
public void disableEntitySpawn(EntitySpawnEvent event) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
@EventHandler
|
||||
public void preventEntityMove(EntityMoveEvent event) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
@EventHandler
|
||||
public void preventBlockFromTo(BlockFromToEvent event) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
@EventHandler
|
||||
public void preventGrowth(BlockGrowEvent event) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
@ -1,21 +1,41 @@
|
||||
package eu.mhsl.minecraft.WorldMuseum.worldSelector;
|
||||
|
||||
import eu.mhsl.minecraft.WorldMuseum.Main;
|
||||
import eu.mhsl.minecraft.WorldMuseum.ViewableWorld;
|
||||
import eu.mhsl.minecraft.WorldMuseum.viewableWorld.ViewableWorld;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class WorldSelectInventory {
|
||||
public static ItemStack exitItem() {
|
||||
ItemStack stack = ItemStack.of(Material.OAK_DOOR);
|
||||
ItemMeta meta = stack.getItemMeta();
|
||||
meta.displayName(Component.text("Zurück zum Server"));
|
||||
meta.setEnchantmentGlintOverride(true);
|
||||
stack.setItemMeta(meta);
|
||||
return stack;
|
||||
}
|
||||
|
||||
public static Inventory generateInventory() {
|
||||
List<ViewableWorld> worlds = Main.instance().getWorlds();
|
||||
Inventory inventory = Bukkit.createInventory(null, Math.max(worlds.size() / 9, 1) * 9);
|
||||
|
||||
int itemCount = worlds.size() + 1;
|
||||
int inventoryRows = Math.max(itemCount / 9, 1);
|
||||
int inventorySize = inventoryRows * 9;
|
||||
Inventory inventory = Bukkit.createInventory(null, inventorySize, Component.text("Weltenmuseum"));
|
||||
|
||||
worlds.stream()
|
||||
.filter(ViewableWorld::isEnabled)
|
||||
.forEach(viewableWorld -> inventory.addItem(viewableWorld.getItem()));
|
||||
|
||||
boolean canExit = Main.instance().getConfig().getBoolean("bungee.enabled");
|
||||
if(canExit) inventory.setItem(inventorySize - 1, exitItem());
|
||||
|
||||
return inventory;
|
||||
}
|
||||
}
|
||||
|
@ -1,18 +1,49 @@
|
||||
package eu.mhsl.minecraft.WorldMuseum.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()
|
||||
|
@ -1,3 +1,4 @@
|
||||
bungee:
|
||||
enabled: true
|
||||
enabled: false
|
||||
returnToServer: 'server'
|
||||
returnOnSelectExit: true
|
Loading…
x
Reference in New Issue
Block a user