added more infrastructure and basic functionality

This commit is contained in:
Elias Müller 2024-08-30 07:28:46 +02:00
parent 45a4349c2d
commit 36bbd5ef97
12 changed files with 194 additions and 21 deletions

1
.idea/gradle.xml generated
View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,3 +1,4 @@
bungee:
enabled: true
enabled: false
returnToServer: 'server'
returnOnSelectExit: true