diff --git a/BauSystem_Main/src/BauSystem.properties b/BauSystem_Main/src/BauSystem.properties index e67d5551..2451aca1 100644 --- a/BauSystem_Main/src/BauSystem.properties +++ b/BauSystem_Main/src/BauSystem.properties @@ -525,16 +525,13 @@ REGION_TNT_ON=§aTNT-Schaden aktiviert REGION_TNT_OFF=§cTNT-Schaden deaktiviert REGION_TNT_TB=§aTNT-Schaden außerhalb Baurahmen aktiviert REGION_TNT_BUILD=§cEine Explosion hätte Blöcke im Baubereich zerstört - # Unsign Book UNSIGN_HELP_1=§8/§eunsign §8- §7Mache ein Buch beschreibbar - # Team LOCK_SCHEM_NO_USER=§7Dieser Spieler existiert nicht! LOCK_SCHEM_NO_SCHEM=§7Dieser Spieler besitzt keine Schematic mit diesem Namen! LOCK_SCHEM_LOCKED=§e{0} §7von §e{1} §7wurde von §e{2} §7auf §eNORMAL §7zurück gesetz. §f§lGrund: §f{3} LOCK_SCHEM_HELP=§8/§eschemlock §8[§7Owner§8] [§7Schematic§8] [§7Grund§8] - §7Sperre eine Schematic - AFK_KICK_MESSAGE=§cAuf diesem Server ist seit 5 Minuten nichts passiert. AFK_WARNING_MESSAGE=§cDieser Server wird bei weiterer Inaktivität in einer Minute gestoppt @@ -547,4 +544,32 @@ PANZERN_PREPARE4 = §74. Innerhalb der zu panzernden Region zu stehen, beim Befe PANZERN_NO_PERM = §cDu darfst hier nicht das Panzern System verwenden PANZERN_NO_WORLDEDIT = §cDu hast keine WorldEdit Selection PANZERN_PROGRESS = §e{0} §7Blöcke übrig, §e{1} §7Blöcke pro Sekunde, §e{2} §7Block Delta -PANZERN_DONE = §aZuende gepanzert \ No newline at end of file +PANZERN_DONE = §aZuende gepanzert + +# Warp +WARP_DISALLOWED = §cDu darfst hier nicht das Warp System nutzen +WARP_LOC_X = §7X§8: §e{0} +WARP_LOC_Y = §7Y§8: §e{0} +WARP_LOC_Z = §7Z§8: §e{0} +WARP_EXISTS=§7Der Warp mit dem namen §e{0} §7existiert bereits +WARP_NAME_RESERVED=§7Du kannst nicht §c{0} §7als name für einen Warp nutzen +WARP_CREATED=§7Der Warp §e{0} §7wurde erstellt +WARP_DELETE_HOVER=§e{0} §7löschen +WARP_DELETED=§e{0} §7wurde gelöcht +WARP_TELEPORT_HOVER=§7Zu §e{0} §7teleportieren +WARP_MATERIAL_CHOOSE=Material auswählen +WARP_GUI_NAME=Warps +WARP_GUI_NO=§cHier giebt es noch keine Warps +WARP_GUI_DISTANCE=§7Distanz: §e{0} §7Blöcke +WARP_GUI_LCLICK=§7Links klicken zum teleportieren +WARP_GUI_RCLICK=§7Rechts klicken zum editieren +WARP_LIST_PREVIOUS_PAGE=§eVorherige Seite +WARP_LIST_PAGE=§e Seite ({0}/{1}) »» +WARP_LIST_NEXT_PAGE=§eNächste Seite +WARP_INFO_NAME=§7Name: §e{0} +WARP_HELP_1=§8/§ewarp add §8[§7Name§8] - §7Erstelle einen neuen Warp Punkt +WARP_HELP_2=§8/§ewarp §8[§7Name§8] - §7Teleportiere dich zu einen Warp-Punkt +WARP_HELP_3=§8/§ewarp info §8[§7Name§8] - §7Infos zu einem Punkt +WARP_HELP_4=§8/§ewarp delete §8[§7Name§8] - §7Lösche einen Warp +WARP_HELP_5=§8/§ewarp gui - §7Öffne die Warp-GUI +WARP_HELP_6=§8/§ewarp list - §7Liste alle Warp-Punkt auf diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/warp/Moon.java b/BauSystem_Main/src/de/steamwar/bausystem/features/warp/Moon.java new file mode 100644 index 00000000..02ed15e0 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/warp/Moon.java @@ -0,0 +1,59 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2021 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.features.warp; + +import de.steamwar.bausystem.BauSystem; +import de.steamwar.inventory.SWItem; +import lombok.experimental.UtilityClass; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.util.Vector; + +import java.util.concurrent.atomic.AtomicInteger; + +@UtilityClass +public class Moon { + + public static void startMoon(Player player) { + player.getInventory().setHelmet(new SWItem(Material.GLASS, "§3Atemkugel").getItemStack()); + AtomicInteger countDown = new AtomicInteger(5); + Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), bukkitTask -> { + if (countDown.get() == 0) { + AtomicInteger iter = new AtomicInteger(1000); + Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), bukkitTask1 -> { + if (player.getLocation().getY() > 300 || iter.getAndDecrement() <= 0) { + player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW_FALLING, 60 * 5 * 20, 1, false, false)); + bukkitTask1.cancel(); + } else { + player.setVelocity(player.getVelocity().add(new Vector(0, 0.2, 0))); + player.getWorld().spawnParticle(Particle.FLAME, player.getLocation(), 5); + } + }, 0, 1); + bukkitTask.cancel(); + } else { + player.sendMessage("§7Noch §e§l" + countDown.getAndDecrement() + " §7Sekunden!"); + } + }, 0, 20); + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/warp/Warp.java b/BauSystem_Main/src/de/steamwar/bausystem/features/warp/Warp.java new file mode 100644 index 00000000..c163c03a --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/warp/Warp.java @@ -0,0 +1,100 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2021 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.features.warp; + +import de.steamwar.bausystem.worlddata.WorldData; +import lombok.Getter; +import org.bukkit.*; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerTeleportEvent; +import yapion.hierarchy.types.YAPIONObject; + +import java.util.*; + +// TODO: Rewrite! +@Getter +public class Warp { + + private static Map warpMap = new HashMap<>(); + + private String name; + private Location location; + private Material mat; + + public Warp(String name, Player player) { + this.name = name; + this.location = player.getLocation(); + this.mat = Material.COMPASS; + warpMap.put(name, this); + } + + public Warp(String name, YAPIONObject object) { + this.name = name; + double x = object.getPlainValue("x"); + double y = object.getPlainValue("y"); + double z = object.getPlainValue("z"); + float yaw = object.getPlainValue("yaw"); + float pitch = object.getPlainValue("pitch"); + location = new Location(Bukkit.getWorlds().get(0), x, y, z, yaw, pitch); + mat = Material.getMaterial(object.getPlainValue("material")); + warpMap.put(name, this); + } + + public YAPIONObject output() { + YAPIONObject yapionObject = new YAPIONObject(); + yapionObject.add("x", location.getX()); + yapionObject.add("y", location.getY()); + yapionObject.add("z", location.getZ()); + yapionObject.add("yaw", location.getYaw()); + yapionObject.add("pitch", location.getPitch()); + yapionObject.add("material", mat.toString()); + return yapionObject; + } + + public static Set getWarpNames() { + return warpMap.keySet(); + } + + public static List getWarps() { + return new ArrayList<>(warpMap.values()); + } + + public static Warp getWarp(String name) { + return warpMap.get(name); + } + + public void setMat(Material mat) { + this.mat = mat; + } + + public void setLocation(Location location) { + this.location = location; + } + + public void delete() { + warpMap.remove(name); + WorldData.getWarpData().remove(name); + } + + public void teleport(Player player) { + player.teleport(location, PlayerTeleportEvent.TeleportCause.PLUGIN); + player.playSound(location, Sound.ENTITY_ENDERMAN_TELEPORT, SoundCategory.PLAYERS, 1, 1); + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/warp/WarpCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/warp/WarpCommand.java new file mode 100644 index 00000000..3629d620 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/warp/WarpCommand.java @@ -0,0 +1,201 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2021 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.features.warp; + +import de.steamwar.bausystem.BauSystem; +import de.steamwar.bausystem.Permission; +import de.steamwar.bausystem.linkage.Disable; +import de.steamwar.bausystem.linkage.Enable; +import de.steamwar.bausystem.linkage.LinkageType; +import de.steamwar.bausystem.linkage.Linked; +import de.steamwar.bausystem.worlddata.WorldData; +import de.steamwar.command.SWCommand; +import de.steamwar.command.SWCommandUtils; +import de.steamwar.command.TypeMapper; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import yapion.hierarchy.types.YAPIONArray; +import yapion.hierarchy.types.YAPIONObject; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Linked(LinkageType.COMMAND) +@Linked(LinkageType.DISABLE_LINK) +@Linked(LinkageType.ENABLE_LINK) +public class WarpCommand extends SWCommand implements Disable, Enable { + + private static final String[] FORBIDDEN_NAMES = new String[]{ + "add", "create", "delete", "list", "info", "gui" + }; + + protected WarpCommand() { + super("warp"); + } + + @ClassMapper(Warp.class) + public static TypeMapper getWarpMapper() { + return SWCommandUtils.createMapper(Warp::getWarp, (commandSender, s) -> new ArrayList<>(Warp.getWarpNames())); + } + + @Register(help = true) + public void genericHelp(Player player, String... args) { + if (args.length > 0 && args[0].equals("moon")) { + Moon.startMoon(player); + return; + } + BauSystem.MESSAGE.sendPrefixless("COMMAND_HELP_HEAD", player, "Warp"); + BauSystem.MESSAGE.sendPrefixless("WARP_HELP_1", player); + BauSystem.MESSAGE.sendPrefixless("WARP_HELP_2", player); + BauSystem.MESSAGE.sendPrefixless("WARP_HELP_3", player); + BauSystem.MESSAGE.sendPrefixless("WARP_HELP_4", player); + BauSystem.MESSAGE.sendPrefixless("WARP_HELP_5", player); + BauSystem.MESSAGE.sendPrefixless("WARP_HELP_6", player); + } + + @Register("add") + @Register("create") + public void addWarp(Player player, String name) { + if (!permissionCheck(player)) return; + for (String forbiddenName : FORBIDDEN_NAMES) { + if (name.equalsIgnoreCase(forbiddenName)) { + BauSystem.MESSAGE.send("WARP_NAME_RESERVED", player, name); + return; + } + } + if (Warp.getWarp(name) != null) { + BauSystem.MESSAGE.send("WARP_EXISTS", player, name); + return; + } + new Warp(name, player); + BauSystem.MESSAGE.send("WARP_CREATED", player, name); + } + + @Register + public void tpWarp(Player player, Warp warp) { + warp.teleport(player); + } + + @Register("delete") + public void deleteWarp(Player player, Warp warp) { + if (permissionCheck(player)) return; + warp.delete(); + BauSystem.MESSAGE.send("WARP_DELETED", player, warp.getName()); + } + + @Register("gui") + public void gui(Player player) { + WarpGui.openGui(player); + } + + @Register("list") + public void listWarps(Player player) { + listWarps(player, 0); + } + + @Register("list") + public void listWarps(Player player, int page) { + List warps = Warp.getWarps(); + int pageCount = (int) Math.ceil(warps.size() / 18d); + for (int i = page * 18; i < warps.size() && i < (page + 1) * 18; i++) { + Warp warp = warps.get(i); + TextComponent component = new TextComponent(); + component.setText(warp.getName()); + component.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/warp " + warp.getName())); + component.setColor(ChatColor.YELLOW); + component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(BauSystem.MESSAGE.parse("WARP_TELEPORT_HOVER", player, warp.getName())))); + player.spigot().sendMessage(component); + } + + TextComponent beforePage = new TextComponent("««"); + if (page > 0) { + beforePage.setColor(ChatColor.YELLOW); + beforePage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(BauSystem.MESSAGE.parse("WARP_LIST_PREVIOUS_PAGE", player)).create())); + beforePage.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/warp list " + (page - 1))); + } else { + beforePage.setColor(ChatColor.RED); + } + + TextComponent nextPage = new TextComponent(BauSystem.MESSAGE.parse("WARP_LIST_PAGE", player, page + 1, Math.max(pageCount, 1))); + if (page < pageCount - 1) { + nextPage.setColor(ChatColor.YELLOW); + nextPage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(BauSystem.MESSAGE.parse("WARP_LIST_NEXT_PAGE", player)).create())); + nextPage.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/warp list " + (page + 1))); + } else { + nextPage.setColor(ChatColor.RED); + } + + beforePage.addExtra(nextPage); + player.spigot().sendMessage(beforePage); + } + + @Register("info") + public void warpInfo(Player player, Warp warp) { + BauSystem.MESSAGE.send("COMMAND_HELP_HEAD", player, warp.getName()); + BauSystem.MESSAGE.sendPrefixless("WARP_INFO_NAME", player, warp.getName()); + BauSystem.MESSAGE.sendPrefixless("WARP_LOC_X", player, warp.getLocation().getX()); + BauSystem.MESSAGE.sendPrefixless("WARP_LOC_Y", player, warp.getLocation().getY()); + BauSystem.MESSAGE.sendPrefixless("WARP_LOC_Z", player, warp.getLocation().getZ()); + BauSystem.MESSAGE.sendPrefixless("WARP_GUI_DISTANCE", player, warp.getLocation().distance(player.getLocation())); + } + + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + private boolean permissionCheck(Player player) { + if (!Permission.hasPermission(player, Permission.WORLD)) { + BauSystem.MESSAGE.send("WARP_DISALLOWED", player); + return false; + } + return true; + } + + @Linked(LinkageType.COMMAND) + public static class WarpsLink extends SWCommand { + + protected WarpsLink() { + super("warps"); + } + + @Register(help = true) + public void genericCommand(Player player, String... args) { + player.performCommand("warp list " + String.join(" ", args)); + } + } + + @Override + public void enable() { + WorldData.getWarpData().forEach((name, yapionAnyType) -> { + new Warp(name, (YAPIONObject) yapionAnyType); + }); + } + + @Override + public void disable() { + YAPIONObject yapionObject = WorldData.getWarpData(); + for (Warp warp : Warp.getWarps()) { + yapionObject.add(warp.getName(), warp.output()); + } + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/warp/WarpGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/warp/WarpGui.java new file mode 100644 index 00000000..7c5c87a6 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/warp/WarpGui.java @@ -0,0 +1,103 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2021 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.features.warp; + +import de.steamwar.bausystem.BauSystem; +import de.steamwar.bausystem.Permission; +import de.steamwar.inventory.SWInventory; +import de.steamwar.inventory.SWItem; +import de.steamwar.inventory.SWListInv; +import lombok.experimental.UtilityClass; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@UtilityClass +public class WarpGui { + + public static void openGui(Player player) { + List> entries = new ArrayList<>(); + Warp.getWarps().forEach(warp -> entries.add(new SWListInv.SWListEntry<>(new SWItem( + warp.getMat(), + "§e" + warp.getName(), + Arrays.asList( + BauSystem.MESSAGE.parse("WARP_LOC_X", player, (int) warp.getLocation().getX()), + BauSystem.MESSAGE.parse("WARP_LOC_Y", player, (int) warp.getLocation().getY()), + BauSystem.MESSAGE.parse("WARP_LOC_Z", player, (int) warp.getLocation().getZ()), + BauSystem.MESSAGE.parse("WARP_GUI_DISTANCE", player, (int) warp.getLocation().distance(player.getLocation())), + "", + BauSystem.MESSAGE.parse("WARP_GUI_LCLICK", player), + BauSystem.MESSAGE.parse("WARP_GUI_RCLICK", player) + ), + false, + clickType -> { + } + ), warp))); + + SWListInv inv = new SWListInv<>(player, BauSystem.MESSAGE.parse("WARP_GUI_NAME", player), false, entries, (clickType, warp) -> { + if (clickType.isRightClick() && Permission.hasPermission(player, Permission.WORLD)) { + openWarpGui(player, warp); + } else { + warp.teleport(player); + } + }); + + if (entries.isEmpty()) { + inv.setItem(22, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("WARP_GUI_NO", player), clickType -> { + })); + } + + inv.open(); + } + + public static void openWarpGui(Player player, Warp warp) { + SWInventory inv = new SWInventory(player, 9, warp.getName()); + inv.setItem(0, new SWItem(Material.ENDER_PEARL, BauSystem.MESSAGE.parse("WARP_TELEPORT_HOVER", player, warp.getName()), clickType -> { + player.closeInventory(); + warp.teleport(player); + })); + + inv.setItem(2, new SWItem(warp.getMat(), "§e" + warp.getMat().name(), clickType -> changeMaterial(player, warp))); + + inv.setItem(8, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("WARP_DELETE_HOVER", player, warp.getName()), clickType -> { + player.closeInventory(); + warp.delete(); + })); + + inv.open(); + } + + public static void changeMaterial(Player player, Warp warp) { + List> materials = new ArrayList<>(); + for (Material value : Material.values()) { + if (value.isLegacy() || value.isAir() || !value.isBlock() || !value.isItem()) continue; + materials.add(new SWListInv.SWListEntry<>(new SWItem(value, "§e" + value.name()), value)); + } + + SWListInv inv = new SWListInv<>(player, BauSystem.MESSAGE.parse("WARP_MATERIAL_CHOOSE", player), materials, (clickType, material) -> { + player.closeInventory(); + warp.setMat(material); + }); + inv.open(); + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/linkage/LinkageType.java b/BauSystem_Main/src/de/steamwar/bausystem/linkage/LinkageType.java index 30c1d5b5..7d033602 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/linkage/LinkageType.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/linkage/LinkageType.java @@ -47,8 +47,8 @@ public enum LinkageType { // NORMAL COMMAND(-1, false, SWCommand.class::isAssignableFrom), - ENABLE_LINK(0, false, Enable.class::isInstance, o -> ((Enable) o).enable()), - DISABLE_LINK(0, true, Disable.class::isInstance, o -> ((Disable) o).disable()), + ENABLE_LINK(0, false, Enable.class::isAssignableFrom, o -> ((Enable) o).enable()), + DISABLE_LINK(0, true, Disable.class::isAssignableFrom, o -> ((Disable) o).disable()), PLAIN(1, false, clazz -> true), LISTENER(2, false, Listener.class::isAssignableFrom, o -> Bukkit.getPluginManager().registerEvents((Listener) o, BauSystem.getInstance())), UNLINK_LISTENER(2, true, Listener.class::isAssignableFrom, o -> HandlerList.unregisterAll((Listener) o)), diff --git a/BauSystem_Main/src/de/steamwar/bausystem/worlddata/WorldData.java b/BauSystem_Main/src/de/steamwar/bausystem/worlddata/WorldData.java index f320d894..a07729e0 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/worlddata/WorldData.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/worlddata/WorldData.java @@ -22,6 +22,7 @@ package de.steamwar.bausystem.worlddata; import lombok.experimental.UtilityClass; import org.bukkit.Bukkit; import yapion.hierarchy.output.FileOutput; +import yapion.hierarchy.types.YAPIONArray; import yapion.hierarchy.types.YAPIONObject; import yapion.parser.YAPIONParser; @@ -33,7 +34,7 @@ import java.io.IOException; @UtilityClass public class WorldData { - private File optionsFile = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "options.yapion"); + private final File optionsFile = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "options.yapion"); private YAPIONObject worldData; public YAPIONObject getWorldData() { @@ -47,6 +48,10 @@ public class WorldData { return getWorldData().getYAPIONObjectOrSetDefault("regions", new YAPIONObject()); } + public YAPIONObject getWarpData() { + return getWorldData().getYAPIONObjectOrSetDefault("warps", new YAPIONObject()); + } + public YAPIONObject getSimulatorData() { return getWorldData().getYAPIONObjectOrSetDefault("simulators", new YAPIONObject()); }