diff --git a/pom.xml b/pom.xml index e91939c..488bea1 100644 --- a/pom.xml +++ b/pom.xml @@ -27,6 +27,10 @@ https://repo.codemc.org/repository/maven-public/ default + + viaversion-repo + https://repo.viaversion.com + @@ -100,6 +104,12 @@ 2.10.0-SNAPSHOT provided + + com.viaversion + viaversion-api + 4.5.2-SNAPSHOT + provided + diff --git a/src/main/java/de/fanta/challengesjoinentities/ChallengesJoinEntities.java b/src/main/java/de/fanta/challengesjoinentities/ChallengesJoinEntities.java index a798f25..5fcf289 100644 --- a/src/main/java/de/fanta/challengesjoinentities/ChallengesJoinEntities.java +++ b/src/main/java/de/fanta/challengesjoinentities/ChallengesJoinEntities.java @@ -45,6 +45,7 @@ import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.Nullable; import java.util.HashMap; import java.util.HashSet; @@ -149,11 +150,11 @@ getPluginConfig().getAdventureServers().forEach(Server::despawnPiglin); } - public void spawnPiglin(Location location, String serverName, String gpLocationName, String serverDisplayName) { - spawnPiglin(location, serverName, gpLocationName, serverDisplayName, true); + public void spawnPiglin(Location location, String serverName, @Nullable Integer serverVersion, String gpLocationName, String serverDisplayName) { + spawnPiglin(location, serverName, serverVersion, gpLocationName, serverDisplayName, true); } - public void spawnPiglin(Location location, String serverName, String gpLocationName, String serverDisplayName, boolean saveToConfig) { + public void spawnPiglin(Location location, String serverName, @Nullable Integer serverVersion, String gpLocationName, String serverDisplayName, boolean saveToConfig) { if (entityData.containsKey(serverName)) { despawnPiglin(entityData.get(serverName).getEntityUUID(), serverName); } @@ -163,7 +164,7 @@ piglin.setRemoveWhenFarAway(false); piglin.setPersistent(true); piglin.setCustomNameVisible(true); - addPiglin(piglin.getUniqueId(), serverName, gpLocationName, serverDisplayName, saveToConfig); + addPiglin(piglin.getUniqueId(), serverName, serverVersion, gpLocationName, serverDisplayName, saveToConfig); globalDataHelper.requestInitialData(serverName); } @@ -209,7 +210,10 @@ } public void addPiglin(UUID piglinUUID, String serverName, String gpLocationName, String serverDisplayName, boolean saveToConfig) { - JoinEntityData entityData = new JoinEntityData(serverName, piglinUUID, gpLocationName, serverDisplayName, JoinEntityData.ServerStatus.OFFLINE, JoinEntityData.EventStatus.NORMAL, 0, 0); + addPiglin(piglinUUID, serverName, null, gpLocationName, serverDisplayName, saveToConfig); + } + public void addPiglin(UUID piglinUUID, String serverName, @Nullable Integer mapVersion, String gpLocationName, String serverDisplayName, boolean saveToConfig) { + JoinEntityData entityData = new JoinEntityData(serverName, mapVersion, piglinUUID, gpLocationName, serverDisplayName, JoinEntityData.ServerStatus.OFFLINE, JoinEntityData.EventStatus.NORMAL, 0, 0); this.entityData.put(serverName, entityData); this.entityServerMapping.put(piglinUUID, serverName); diff --git a/src/main/java/de/fanta/challengesjoinentities/Config.java b/src/main/java/de/fanta/challengesjoinentities/Config.java index 47dfee4..2e793aa 100644 --- a/src/main/java/de/fanta/challengesjoinentities/Config.java +++ b/src/main/java/de/fanta/challengesjoinentities/Config.java @@ -54,7 +54,7 @@ float yaw = (float) locSection.getDouble("yaw"); Location location = new Location(world, x, y, z, yaw, 0.0F); - challengeServers.add(new Server(serverName, server.getString("gpLocation"), server.getString("dir"), ServerType.CHALLENGES, plugin, location)); + challengeServers.add(new Server(serverName, null, server.getString("gpLocation"), server.getString("dir"), ServerType.CHALLENGES, plugin, location)); } } @@ -71,7 +71,7 @@ float yaw = (float) locSection.getDouble("yaw"); Location location = new Location(world, x, y, z, yaw, 0.0F); - adventureServers.add(new Server(serverName, server.getString("gpLocation"), server.getString("dir"), ServerType.ADVENTURE, plugin, location)); + adventureServers.add(new Server(serverName, null, server.getString("gpLocation"), server.getString("dir"), ServerType.ADVENTURE, plugin, location)); } } diff --git a/src/main/java/de/fanta/challengesjoinentities/JoinEntityData.java b/src/main/java/de/fanta/challengesjoinentities/JoinEntityData.java index 38d7576..421e8ec 100644 --- a/src/main/java/de/fanta/challengesjoinentities/JoinEntityData.java +++ b/src/main/java/de/fanta/challengesjoinentities/JoinEntityData.java @@ -1,6 +1,7 @@ package de.fanta.challengesjoinentities; import net.md_5.bungee.api.ChatColor; +import org.jetbrains.annotations.Nullable; import java.util.UUID; @@ -15,8 +16,11 @@ private int playerCount; private int maxPlayers; - public JoinEntityData(String serverName, UUID entityUUID, String globalPortLocationName, String serverDisplayName, ServerStatus serverStatus, EventStatus eventStatus, int playerCount, int maxPlayers) { + private final int mapVersion; + + public JoinEntityData(String serverName, @Nullable Integer mapVersion, UUID entityUUID, String globalPortLocationName, String serverDisplayName, ServerStatus serverStatus, EventStatus eventStatus, int playerCount, int maxPlayers) { this.serverName = serverName; + this.mapVersion = mapVersion == null ? 0 : mapVersion; this.entityUUID = entityUUID; this.globalPortLocationName = globalPortLocationName; this.serverDisplayName = serverDisplayName; @@ -74,6 +78,10 @@ this.maxPlayers = maxPlayers; } + public int getMapVersion() { + return mapVersion; + } + public String createCustomEntityName() { String statusString = serverStatus == ServerStatus.ONLINE ? ChatUtil.GREEN + "ONLINE" : serverStatus == ServerStatus.OFFLINE ? ChatUtil.RED + "OFFLINE" : serverStatus == ServerStatus.RUNNING ? ChatUtil.ORANGE + "RUNNING" : ""; String playerCountString = ChatUtil.BLUE + "(" + playerCount + "/" + maxPlayers + ")"; diff --git a/src/main/java/de/fanta/challengesjoinentities/Server.java b/src/main/java/de/fanta/challengesjoinentities/Server.java index b60d69d..0961c2d 100644 --- a/src/main/java/de/fanta/challengesjoinentities/Server.java +++ b/src/main/java/de/fanta/challengesjoinentities/Server.java @@ -1,11 +1,14 @@ package de.fanta.challengesjoinentities; +import com.viaversion.viaversion.api.Via; +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import org.apache.commons.io.FileUtils; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; @@ -20,6 +23,8 @@ private final String name; + private int serverVersion; + private final String gPLocation; private final String dir; @@ -30,8 +35,9 @@ private boolean online; - public Server(String name, String gPLocation, String dir, ServerType serverType, ChallengesJoinEntities plugin, Location piglinLocation) { + public Server(String name, @Nullable Integer serverVersion, String gPLocation, String dir, ServerType serverType, ChallengesJoinEntities plugin, Location piglinLocation) { this.name = name; + this.serverVersion = serverVersion == null ? 0 : serverVersion; this.gPLocation = gPLocation; this.dir = dir; this.serverType = serverType; @@ -66,6 +72,10 @@ return this.gPLocation; } + public void setServerVersion(int serverVersion) { + this.serverVersion = serverVersion; + } + public void loadSaved(Player p, String slot) { this.online = true; serverPlayers.put(this, p.getUniqueId()); @@ -99,20 +109,27 @@ serverPlayers.remove(this); return; } - load(p, this.serverType.getDir(), path, getMapVersion(new File(dir + "/Challenges/serverconfig.yml"))); //TODO LOAD VERSION FROM ADVENTURE CONFIG + load(p, this.serverType.getDir(), path, getMapVersion(new File(dir + "/Challenges/serverconfig.yml"))); } - public void loadNewAdventure(Player player, String category, String map) { - this.online = true; - serverPlayers.put(this, player.getUniqueId()); - File dir = new File("/home/minecraft/Adventure-Maps", category + "/" + map); - if (!dir.isDirectory()) { - ChatUtil.sendErrorMessage(player, "Map " + map + " nicht gefunden!"); - this.online = false; - serverPlayers.remove(this); - return; + public void loadNewAdventure(Player player, String category, String map, String mapVersion) { + int playerVersion = Via.getAPI().getPlayerVersion(player.getUniqueId()); + int mapProtocolVersion = ProtocolVersion.getClosest(mapVersion).getVersion(); + if (playerVersion >= mapProtocolVersion) { + this.online = true; + serverPlayers.put(this, player.getUniqueId()); + File dir = new File("/home/minecraft/Adventure-Maps", category + "/" + map); + if (!dir.isDirectory()) { + ChatUtil.sendErrorMessage(player, "Map " + map + " nicht gefunden!"); + this.online = false; + serverPlayers.remove(this); + return; + } + + load(player, "Adventure-Maps", category + "/" + map, getMapVersion(new File(dir + "/Challenges/serverconfig.yml"))); + } else { + ChatUtil.sendErrorMessage(player, "Du brauchst mindestens die Version " + ChatUtil.BLUE + mapVersion + ChatUtil.RED + " um die Map zu starten!"); } - load(player, "Adventure-Maps", category + "/" + map, getMapVersion(new File(dir + "/Challenges/serverconfig.yml"))); //TODO LOAD VERSION FROM ADVENTURE CONFIG } public void load(Player p, String serverTypeDir, String targetDir, String ServerVersion) { @@ -151,6 +168,7 @@ File serverConfigFile = new File("/home/minecraft/Server/" + this.dir + "/plugins/Challenges/serverconfig.yml"); YamlConfiguration serverConfig = new YamlConfiguration(); serverConfig.load(serverConfigFile); + String tempServerType = serverConfig.getString("servertype"); if (tempServerType == null || tempServerType.equals("CHALLENGE")) { serverConfig.set("servertype", "CHALLENGE_LOAD"); @@ -158,6 +176,10 @@ Bukkit.getLogger().info(serverConfigFile.getAbsolutePath()); } + if (tempServerType != null || tempServerType.equals("ADVENTURE")) { + setServerVersion(ProtocolVersion.getClosest(serverConfig.getString("serverversion")).getVersion()); + } + } catch (IOException | InvalidConfigurationException e) { e.printStackTrace(); ChatUtil.sendErrorMessage(p, "Map konnte nicht geladen werden!"); @@ -182,7 +204,7 @@ } public void spawnPiglin(Player player) { - this.plugin.spawnPiglin(this.piglinLocation, this.name, this.gPLocation, player.getName(), false); + this.plugin.spawnPiglin(this.piglinLocation, this.name, this.serverVersion, this.gPLocation, player.getName(), false); } public void despawnPiglin() { diff --git a/src/main/java/de/fanta/challengesjoinentities/adventure/ui/AdventureMapsUI.java b/src/main/java/de/fanta/challengesjoinentities/adventure/ui/AdventureMapsUI.java index dd4c2dc..2aba922 100644 --- a/src/main/java/de/fanta/challengesjoinentities/adventure/ui/AdventureMapsUI.java +++ b/src/main/java/de/fanta/challengesjoinentities/adventure/ui/AdventureMapsUI.java @@ -6,7 +6,6 @@ import de.fanta.challengesjoinentities.adventure.AdventureMap; import de.fanta.challengesjoinentities.adventure.Category; import de.fanta.challengesjoinentities.utils.ui.AbstractWindow; -import de.fanta.challengesjoinentities.utils.ui.ItemUtil; import de.iani.cubesideutils.bukkit.items.CustomHeads; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; @@ -22,9 +21,7 @@ import java.util.ArrayList; import java.util.Comparator; -import java.util.HashMap; import java.util.List; -import java.util.Map; public class AdventureMapsUI extends AbstractWindow { private final ChallengesJoinEntities plugin; @@ -120,8 +117,7 @@ return; } - int shopItemIndex = (slot - (slot / NUM_OF_COLUMNS)) - + this.scrollAmount * NUM_OF_ITEM_COLUMNS; + int shopItemIndex = (slot - (slot / NUM_OF_COLUMNS)) + this.scrollAmount * NUM_OF_ITEM_COLUMNS; if (shopItemIndex >= this.maps.size()) { return; } @@ -134,7 +130,7 @@ getPlayer().sendMessage(ChallengesJoinEntities.PREFIX_COMPONENT.append(Component.text("MapLink: klick mich :)", TextColor.color(Color.YELLOW.asRGB())).clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, map.getWebLink())))); } else if (!Server.serverPlayers.containsValue(p.getUniqueId())) { getPlayer().closeInventory(); - this.plugin.getPluginConfig().getOnlineAdventureServer().ifPresentOrElse(server -> server.loadNewAdventure(p, category.getName(), map.getName()), () -> ChatUtil.sendErrorMessage(p, "Aktuell ist kein Server Frei!")); + this.plugin.getPluginConfig().getOnlineAdventureServer().ifPresentOrElse(server -> server.loadNewAdventure(p, category.getName(), map.getName(), map.getVersion()), () -> ChatUtil.sendErrorMessage(p, "Aktuell ist kein Server Frei!")); } else { ChatUtil.sendErrorMessage(p, "Du kannst nur einen Server starten!"); } diff --git a/src/main/java/de/fanta/challengesjoinentities/adventure/ui/AdventureSearchGUI.java b/src/main/java/de/fanta/challengesjoinentities/adventure/ui/AdventureSearchGUI.java index a9877dc..3c18cb4 100644 --- a/src/main/java/de/fanta/challengesjoinentities/adventure/ui/AdventureSearchGUI.java +++ b/src/main/java/de/fanta/challengesjoinentities/adventure/ui/AdventureSearchGUI.java @@ -146,7 +146,7 @@ getPlayer().sendMessage(ChallengesJoinEntities.PREFIX_COMPONENT.append(Component.text("MapLink: klick mich :)", TextColor.color(Color.YELLOW.asRGB())).clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, map.getWebLink())))); } else if (!Server.serverPlayers.containsValue(p.getUniqueId())) { getPlayer().closeInventory(); - this.plugin.getPluginConfig().getOnlineAdventureServer().ifPresentOrElse(server -> server.loadNewAdventure(p, category.getName(), map.getName()), () -> ChatUtil.sendErrorMessage(p, "Aktuell ist kein Server Frei!")); + this.plugin.getPluginConfig().getOnlineAdventureServer().ifPresentOrElse(server -> server.loadNewAdventure(p, category.getName(), map.getName(), map.getVersion()), () -> ChatUtil.sendErrorMessage(p, "Aktuell ist kein Server Frei!")); } else { ChatUtil.sendErrorMessage(p, "Du kannst nur einen Server starten!"); } diff --git a/src/main/java/de/fanta/challengesjoinentities/commands/AdventureCommand/AdventureTestMapCommand.java b/src/main/java/de/fanta/challengesjoinentities/commands/AdventureCommand/AdventureTestMapCommand.java index 56b8a00..d993264 100644 --- a/src/main/java/de/fanta/challengesjoinentities/commands/AdventureCommand/AdventureTestMapCommand.java +++ b/src/main/java/de/fanta/challengesjoinentities/commands/AdventureCommand/AdventureTestMapCommand.java @@ -3,6 +3,7 @@ import de.fanta.challengesjoinentities.ChallengesJoinEntities; import de.fanta.challengesjoinentities.ChatUtil; import de.fanta.challengesjoinentities.Server; +import de.fanta.challengesjoinentities.adventure.AdventureMap; import de.iani.cubesideutils.bukkit.commands.SubCommand; import de.iani.cubesideutils.commands.ArgsParser; import org.bukkit.command.Command; @@ -27,7 +28,7 @@ if (args.hasNext()) { String map = args.getNext(); if (!Server.serverPlayers.containsValue(p.getUniqueId())) { - this.plugin.getPluginConfig().getOnlineAdventureServer().ifPresentOrElse(server -> server.loadNewAdventure(p, category, map), () -> ChatUtil.sendErrorMessage(p, "Aktuell ist kein Server Frei!")); + this.plugin.getPluginConfig().getOnlineAdventureServer().ifPresentOrElse(server -> server.loadNewAdventure(p, category, map, plugin.getAdventureMapsConfig().getMap(map).getVersion()), () -> ChatUtil.sendErrorMessage(p, "Aktuell ist kein Server Frei!")); } else { ChatUtil.sendErrorMessage(p, "Du kannst nur einen Server starten!"); } diff --git a/src/main/java/de/fanta/challengesjoinentities/commands/PiglinCommand/AddEntityCommand.java b/src/main/java/de/fanta/challengesjoinentities/commands/PiglinCommand/AddEntityCommand.java index 9cf45b2..ba21215 100644 --- a/src/main/java/de/fanta/challengesjoinentities/commands/PiglinCommand/AddEntityCommand.java +++ b/src/main/java/de/fanta/challengesjoinentities/commands/PiglinCommand/AddEntityCommand.java @@ -47,7 +47,7 @@ if (plugin.getGlobalDataHelper().getServer(serverName) != null) { String serverDisplayName = StringUtil.convertColors(args.getAll(serverName)); - plugin.spawnPiglin(((Player) sender).getLocation(), serverName, locationName, serverDisplayName); + plugin.spawnPiglin(((Player) sender).getLocation(), serverName, null, locationName, serverDisplayName); ChatUtil.sendNormalMessage(sender, "Piglin hinzugefügt! *grunz*"); } else { ChatUtil.sendErrorMessage(sender, "Server nicht gefunden!"); diff --git a/src/main/java/de/fanta/challengesjoinentities/listeners/EntityListener.java b/src/main/java/de/fanta/challengesjoinentities/listeners/EntityListener.java index d3621ff..6a738b7 100644 --- a/src/main/java/de/fanta/challengesjoinentities/listeners/EntityListener.java +++ b/src/main/java/de/fanta/challengesjoinentities/listeners/EntityListener.java @@ -1,5 +1,7 @@ package de.fanta.challengesjoinentities.listeners; +import com.viaversion.viaversion.api.Via; +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import de.fanta.challengesjoinentities.ChallengesJoinEntities; import de.fanta.challengesjoinentities.ChatUtil; import de.fanta.challengesjoinentities.JoinEntityData; @@ -82,7 +84,13 @@ ChatUtil.sendWarningMessage(player, "Der erste Spieler muss VIP haben!"); ChatUtil.sendWarningMessage(player, "Um VIP zu bekommen musst du im Freebuild (/tt) /voteshop eingeben!"); } else { - GlobalApi.portOnlinePlayerToLocation(player.getName(), data.getGlobalPortLocationName()); + int playerVersion = Via.getAPI().getPlayerVersion(player.getUniqueId()); + int mapProtocolVersion = data.getMapVersion(); + if (playerVersion >= mapProtocolVersion) { + GlobalApi.portOnlinePlayerToLocation(player.getName(), data.getGlobalPortLocationName()); + } else { + ChatUtil.sendErrorMessage(player, "Du brauchst mindestens die Version " + ChatUtil.BLUE + ProtocolVersion.getProtocol(data.getMapVersion()).getName() + ChatUtil.RED + " um die Map zu betreten!"); + } } } else { ChatUtil.sendErrorMessage(player, "Der Server ist bereits voll!"); diff --git a/src/main/java/de/fanta/challengesjoinentities/listeners/PlayerListener.java b/src/main/java/de/fanta/challengesjoinentities/listeners/PlayerListener.java index 59b8a45..c365464 100644 --- a/src/main/java/de/fanta/challengesjoinentities/listeners/PlayerListener.java +++ b/src/main/java/de/fanta/challengesjoinentities/listeners/PlayerListener.java @@ -64,7 +64,7 @@ Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { PlayerData data = UtilsApiBukkit.getInstance().getPlayerData(e.getPlayer()); - if (data.getLastJoin() + (5 * 1000) > System.currentTimeMillis()) { + if (data.getLastJoin() + (10 * 1000) > System.currentTimeMillis()) { String hosteName = CubesideUtilsBukkit.getInstance().getPlayerData(e.getPlayer()).getHostName().toLowerCase(); if (hosteName.startsWith("challenge")) { GlobalApi.portOnlinePlayerToLocation(e.getPlayer().getName(), "challenge"); diff --git a/src/main/java/de/fanta/challengesjoinentities/loadgui/AdventureLoadGUI.java b/src/main/java/de/fanta/challengesjoinentities/loadgui/AdventureLoadGUI.java index 40ffae6..e55c6d5 100644 --- a/src/main/java/de/fanta/challengesjoinentities/loadgui/AdventureLoadGUI.java +++ b/src/main/java/de/fanta/challengesjoinentities/loadgui/AdventureLoadGUI.java @@ -175,8 +175,8 @@ File mapConfig = new File(save, "/Challenges/serverconfig.yml"); Material displayItem = null; String displayName = null; + YamlConfiguration serverConfig = new YamlConfiguration(); try { - YamlConfiguration serverConfig = new YamlConfiguration(); serverConfig.load(mapConfig); String itemType = serverConfig.getString("displayItem.item"); String itemName = serverConfig.getString("displayItem.name"); @@ -196,7 +196,7 @@ ItemStack stack = new ItemStack(displayItem != null ? displayItem : Material.MAP); ItemMeta meta = stack.getItemMeta(); meta.setDisplayName(displayName != null ? displayName : ChatUtil.GREEN + "Save " + saveSlot.getSlot()); - meta.setLore(List.of(ChatUtil.GREEN + "Gespeichert am " + getFileDate(save))); + meta.setLore(List.of(ChatUtil.GREEN + "Version: " + ChatUtil.BLUE + serverConfig.getString("serverversion"), ChatUtil.GREEN + "Gespeichert am: " + ChatUtil.BLUE + getFileDate(save))); stack.setItemMeta(meta); item = stack; diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 533be69..73017e4 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -5,7 +5,7 @@ api-version: 1.13 depend: [GlobalClient, CubesideUtils, GlobalPort, CubesideNMSUtils, CubesideStatistics] -softdepend: [Challenges, CubesideNPCs, SignGUI] +softdepend: [Challenges, CubesideNPCs, SignGUI, ViaVersion] commands: piglins: