denfry

test

Mar 4th, 2025
511
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 25.25 KB | None | 0 0
  1. package org.alvindimas05.lagassist.chunks;
  2.  
  3. import java.util.*;
  4. import java.util.stream.Collectors;
  5. import java.util.stream.Stream;
  6.  
  7. import org.alvindimas05.lagassist.Main;
  8. import org.alvindimas05.lagassist.utils.ServerType;
  9. import org.bukkit.*;
  10. import org.bukkit.block.BlockState;
  11. import org.bukkit.command.CommandSender;
  12. import org.bukkit.entity.Entity;
  13. import org.bukkit.entity.Player;
  14.  
  15. public class ChkAnalyse {
  16.  
  17.     protected static final int ammoshow = Main.config.getInt("chunkanalyse.ammount");
  18.     protected static final Map<String, Integer> values = new HashMap<>();
  19.     private static final List<ChkStats> scores = new ArrayList<>();
  20.  
  21.     public static void Enabler() {
  22.         Bukkit.getLogger().info("    §e[§a✔§e] §fChunk Analyser.");
  23.  
  24.         Set<String> slist = Objects.requireNonNull(Main.config.getConfigurationSection("chunkanalyse.values")).getKeys(false);
  25.         for (String s : slist) {
  26.             values.put(s.toLowerCase(), Main.config.getInt("chunkanalyse.values." + s));
  27.         }
  28.     }
  29.  
  30.     public static void analyseChunks(Player p) {
  31.         scores.clear();
  32.         List<Chunk> loadedChunks = new ArrayList<>();
  33.  
  34.         for (World w : Bukkit.getWorlds()) {
  35.             loadedChunks.addAll(Arrays.asList(w.getLoadedChunks()));
  36.         }
  37.  
  38.         if (ServerType.isFolia()) {
  39.             for (Chunk ch : loadedChunks) {
  40.                 World w = ch.getWorld();
  41.                 Bukkit.getRegionScheduler().execute(Main.p, w, ch.getX(), ch.getZ(), () -> {
  42.                     scores.add(new ChkStats(ch, false));
  43.                     if (scores.size() == loadedChunks.size()) {
  44.                         sendResultsToPlayer(p);
  45.                     }
  46.                 });
  47.             }
  48.         } else {
  49.             for (Chunk ch : loadedChunks) {
  50.                 scores.add(new ChkStats(ch, false));
  51.             }
  52.             sendResultsToPlayer(p);
  53.         }
  54.     }
  55.  
  56.     private static void sendResultsToPlayer(Player p) {
  57.         scores.sort(Collections.reverseOrder());
  58.  
  59.         p.sendMessage("");
  60.         p.sendMessage("§2§l⬛⬛⬛⬛⬛⬛ §f§lCHUNKANALYSER §2§l⬛⬛⬛⬛⬛⬛");
  61.         p.sendMessage("");
  62.  
  63.         for (int i = 0; i < ammoshow && i < scores.size(); i++) {
  64.             ChkStats cs = scores.get(i);
  65.             p.spigot().sendMessage(cs.genText());
  66.         }
  67.  
  68.         p.sendMessage("");
  69.         p.sendMessage("§2§l⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛");
  70.     }
  71.  
  72.     public static void analyseChunks(CommandSender p) {
  73.         Map<Chunk, Integer> chunkscore = new HashMap<>();
  74.         List<Chunk> loadedChunks = new ArrayList<>();
  75.  
  76.         for (World w : Bukkit.getWorlds()) {
  77.             loadedChunks.addAll(Arrays.asList(w.getLoadedChunks()));
  78.         }
  79.  
  80.         if (ServerType.isFolia()) {
  81.             for (Chunk ch : loadedChunks) {
  82.                 World w = ch.getWorld();
  83.                 Bukkit.getRegionScheduler().execute(Main.p, w, ch.getX(), ch.getZ(), () -> {
  84.                     processChunk(ch, chunkscore);
  85.                     if (chunkscore.size() == loadedChunks.size()) {
  86.                         sendResultsToSender(p, chunkscore);
  87.                     }
  88.                 });
  89.             }
  90.         } else {
  91.             for (Chunk ch : loadedChunks) {
  92.                 processChunk(ch, chunkscore);
  93.             }
  94.             sendResultsToSender(p, chunkscore);
  95.         }
  96.     }
  97.  
  98.     private static void processChunk(Chunk ch, Map<Chunk, Integer> chunkscore) {
  99.         chunkscore.putIfAbsent(ch, 0);
  100.  
  101.         for (BlockState blkst : ch.getTileEntities()) {
  102.             String m = blkst.getType().toString().toLowerCase();
  103.             if (values.containsKey(m)) {
  104.                 chunkscore.put(ch, chunkscore.get(ch) + values.get(m));
  105.             }
  106.         }
  107.  
  108.         for (Entity e : ch.getEntities()) {
  109.             String et = e.getType().toString().toLowerCase();
  110.             if (values.containsKey(et)) {
  111.                 chunkscore.put(ch, chunkscore.get(ch) + values.get(et));
  112.             }
  113.         }
  114.     }
  115.  
  116.     private static void sendResultsToSender(CommandSender p, Map<Chunk, Integer> chunkscore) {
  117.         p.sendMessage("");
  118.         p.sendMessage("⬛⬛⬛⬛⬛⬛ §f§lCHUNKANALYSER ⬛⬛⬛⬛⬛⬛");
  119.         p.sendMessage("");
  120.  
  121.         Stream<Map.Entry<Chunk, Integer>> sorted = chunkscore.entrySet().stream()
  122.                 .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()));
  123.  
  124.         Map<Chunk, Integer> topChunks = sorted.limit(ammoshow)
  125.                 .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
  126.  
  127.         for (Chunk ch : topChunks.keySet()) {
  128.             p.sendMessage("  ✸ Chunk (" + ch.getX() + " " + ch.getZ() + ") - Score " + chunkscore.get(ch));
  129.         }
  130.  
  131.         p.sendMessage("");
  132.         p.sendMessage("⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛");
  133.     }
  134.  
  135.     public static void analyseCurrentChunk(CommandSender s) {
  136.         if (!(s instanceof Player p)) {
  137.             s.sendMessage(Main.PREFIX + "You cannot analyse the current chunk from console.");
  138.             return;
  139.         }
  140.  
  141.         Location l = p.getLocation();
  142.         Chunk chunk = l.getChunk();
  143.  
  144.         if (ServerType.isFolia()) {
  145.             Bukkit.getRegionScheduler().execute(Main.p, l.getWorld(), chunk.getX(), chunk.getZ(), () -> {
  146.                 sendChunkStats(p, chunk);
  147.             });
  148.         } else {
  149.             sendChunkStats(p, chunk);
  150.         }
  151.     }
  152.  
  153.     private static void sendChunkStats(Player p, Chunk chunk) {
  154.         ChkStats stats = new ChkStats(chunk, true);
  155.  
  156.         String crds = stats.getCoords()[0] + " " + stats.getCoords()[1];
  157.         String cmd = "lagassist tpchunk " + p.getWorld().getName() + " " + crds;
  158.  
  159.         p.sendMessage("§2§l⬛⬛⬛⬛⬛⬛ §f§lCHUNK STATS §2§l⬛⬛⬛⬛⬛⬛");
  160.         p.sendMessage("");
  161.         p.sendMessage("  §2✸ §fChunk coordinates: §7" + crds);
  162.         p.sendMessage("");
  163.         p.sendMessage("  §2✸ §fEntity Amount: §7" + stats.getEnts().length);
  164.         p.sendMessage("  §2✸ §fTiles Amount: §7" + stats.getTiles().length);
  165.         p.sendMessage("");
  166.         p.spigot().sendMessage(stats.genMobCount("  §2✸ §fDetailed Info §7(HOVER)", cmd));
  167.         p.sendMessage("");
  168.         p.sendMessage("§2§l⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛");
  169.     }
  170. }
  171. package org.alvindimas05.lagassist.chunks;
  172.  
  173. import java.util.HashMap;
  174. import java.util.Map;
  175.  
  176. import org.alvindimas05.lagassist.Main;
  177. import org.alvindimas05.lagassist.utils.Cache;
  178. import org.alvindimas05.lagassist.utils.ServerType;
  179. import org.bukkit.Bukkit;
  180. import org.bukkit.Chunk;
  181. import org.bukkit.World;
  182. import org.bukkit.block.Block;
  183. import org.bukkit.block.BlockState;
  184. import org.bukkit.entity.Entity;
  185. import org.bukkit.entity.EntityType;
  186. import org.bukkit.entity.Vehicle;
  187. import org.bukkit.event.EventHandler;
  188. import org.bukkit.event.EventPriority;
  189. import org.bukkit.event.Listener;
  190. import org.bukkit.event.block.BlockPlaceEvent;
  191. import org.bukkit.event.entity.EntitySpawnEvent;
  192. import org.bukkit.event.vehicle.VehicleCreateEvent;
  193. import org.bukkit.scheduler.BukkitRunnable;
  194.  
  195. public class ChkLimiter implements Listener {
  196.  
  197.     private static final Cache<Chunk, Entity[]> entcache = new Cache<>(30);
  198.     private static final Cache<Chunk, BlockState[]> tilecache = new Cache<>(100);
  199.     private static int moblimit = -1;
  200.     private static int tilelimit = -1;
  201.  
  202.     public static void Enabler(boolean reload) {
  203.         if (!reload) {
  204.             Main.p.getServer().getPluginManager().registerEvents(new ChkLimiter(), Main.p);
  205.             runTask();
  206.         }
  207.         Bukkit.getLogger().info("    §e[§a✔§e] §fChunk Limiter.");
  208.  
  209.         moblimit = Main.config.getInt("limiter.mobs.total-limit");
  210.         tilelimit = Main.config.getInt("limiter.tiles.total-limit");
  211.     }
  212.  
  213.     private static void runTask() {
  214.         long delay = 1L;
  215.         long period = 1L;
  216.  
  217.         if (ServerType.isFolia()) {
  218.             Bukkit.getGlobalRegionScheduler().runAtFixedRate(Main.p, task -> executeTask(), delay, period);
  219.         } else {
  220.             new BukkitRunnable() {
  221.                 @Override
  222.                 public void run() {
  223.                     executeTask();
  224.                 }
  225.             }.runTaskTimer(Main.p, delay, period);
  226.         }
  227.     }
  228.  
  229.     private static void executeTask() {
  230.         for (World w : Bukkit.getWorlds()) {
  231.             for (Chunk chk : w.getLoadedChunks()) {
  232.                 Map<EntityType, Integer> counts = new HashMap<>();
  233.  
  234.                 for (Entity ent : chk.getEntities()) {
  235.                     if (Main.config.getBoolean("limiter.ignore-named-mobs") && ent.getCustomName() != null) {
  236.                         continue;
  237.                     }
  238.  
  239.                     EntityType type = ent.getType();
  240.                     int allowed = getMobMaxHard(type);
  241.  
  242.                     if (allowed == -1) {
  243.                         continue;
  244.                     }
  245.  
  246.                     int count = counts.getOrDefault(type, 0);
  247.  
  248.                     if (count < allowed) {
  249.                         counts.put(type, count + 1);
  250.                         continue;
  251.                     }
  252.  
  253.                     ent.remove();
  254.                 }
  255.             }
  256.         }
  257.  
  258.         tilecache.tick();
  259.         entcache.tick();
  260.     }
  261.  
  262.     private static int getMobMaxHard(EntityType entype) {
  263.         String location = "limiter.mobs.hard-limit." + entype.toString().toLowerCase();
  264.         return Main.config.contains(location) ? Main.config.getInt(location) : -1;
  265.     }
  266.  
  267.     private static int getTileMax(Class<?> cls) {
  268.         String location = "limiter.tiles.per-limit." + cls.getSimpleName().toLowerCase();
  269.         return Main.config.contains(location) ? Main.config.getInt(location) : -1;
  270.     }
  271.  
  272.     private static int getTileMax(Block b) {
  273.         return getTileMax(b.getState().getClass());
  274.     }
  275.  
  276.     private static int getMobCount(Chunk chk, EntityType entype) {
  277.         int ents = 0;
  278.  
  279.         if (!entcache.isCached(chk)) {
  280.             entcache.putCached(chk, chk.getEntities());
  281.         }
  282.  
  283.         for (Entity ent : entcache.getCached(chk)) {
  284.             if (ent != null && ent.getType() == entype) {
  285.                 ents++;
  286.             }
  287.         }
  288.         return ents;
  289.     }
  290.  
  291.     private static int getTileCount(Chunk chk, Class<?> type) {
  292.         int tls = 0;
  293.  
  294.         if (!tilecache.isCached(chk)) {
  295.             tilecache.putCached(chk, chk.getTileEntities());
  296.         }
  297.  
  298.         for (BlockState tle : tilecache.getCached(chk)) {
  299.             if (tle != null && tle.getClass().equals(type)) {
  300.                 tls++;
  301.             }
  302.         }
  303.         return tls;
  304.     }
  305.  
  306.     private static boolean isDeniedMob(Entity ent) {
  307.         if (Main.config.getBoolean("limiter.ignore-named-mobs") && ent.getCustomName() != null) {
  308.             return false;
  309.         }
  310.  
  311.         if (ent.getType() == EntityType.PLAYER) {
  312.             return false;
  313.         }
  314.  
  315.         Chunk chk = ent.getLocation().getChunk();
  316.         int current = getMobCount(chk, ent.getType());
  317.         int maximum = getMobMaxHard(ent.getType());
  318.  
  319.         if (maximum < 0) {
  320.             return false;
  321.         }
  322.  
  323.         return current >= maximum;
  324.     }
  325.  
  326.     private static boolean isDeniedTile(Block b) {
  327.         Chunk chk = b.getLocation().getChunk();
  328.         int current = getTileCount(chk, b.getState().getClass());
  329.         int maximum = getTileMax(b);
  330.  
  331.         if (maximum < 0) {
  332.             return false;
  333.         }
  334.  
  335.         return current >= maximum;
  336.     }
  337.  
  338.     @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
  339.     public void onVehicleSpawn(VehicleCreateEvent e) {
  340.         if (isDeniedMob(e.getVehicle())) {
  341.             e.getVehicle().remove();
  342.         }
  343.     }
  344.  
  345.     @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
  346.     public void onSpawn(EntitySpawnEvent e) {
  347.         if (isDeniedMob(e.getEntity())) {
  348.             e.setCancelled(true);
  349.         }
  350.     }
  351.  
  352.     @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
  353.     public void onPlace(BlockPlaceEvent e) {
  354.         if (isDeniedTile(e.getBlock())) {
  355.             e.setCancelled(true);
  356.         }
  357.     }
  358. }
  359. package org.alvindimas05.lagassist.chunks;
  360.  
  361. import java.util.Collections;
  362. import java.util.HashMap;
  363. import java.util.LinkedHashMap;
  364. import java.util.Map;
  365. import java.util.stream.Collectors;
  366. import java.util.stream.Stream;
  367.  
  368. import org.alvindimas05.lagassist.Main;
  369. import org.alvindimas05.lagassist.utils.Chat;
  370. import org.alvindimas05.lagassist.utils.ServerType;
  371. import org.bukkit.Bukkit;
  372. import org.bukkit.Chunk;
  373. import org.bukkit.block.BlockState;
  374. import org.bukkit.entity.Entity;
  375.  
  376. import net.md_5.bungee.api.chat.TextComponent;
  377.  
  378. public class ChkStats implements Comparable<ChkStats> {
  379.  
  380.     private int score = 0;
  381.     private final int[] coords = new int[2];
  382.  
  383.     private BlockState[] tiles;
  384.     private Entity[] ents;
  385.     private final String world;
  386.  
  387.     private final Map<String, Integer> amount = new HashMap<>();
  388.  
  389.     public ChkStats(Chunk ch, boolean genscores) {
  390.         world = ch.getWorld().getName();
  391.         coords[0] = ch.getX();
  392.         coords[1] = ch.getZ();
  393.  
  394.         if (ServerType.isFolia()) {
  395.             Bukkit.getRegionScheduler().execute(Main.p, ch.getWorld(), ch.getX(), ch.getZ(), () -> {
  396.                 tiles = ch.getTileEntities();
  397.                 ents = ch.getEntities();
  398.                 if (genscores) {
  399.                     genScores();
  400.                 }
  401.             });
  402.         } else {
  403.             tiles = ch.getTileEntities();
  404.             ents = ch.getEntities();
  405.             if (genscores) {
  406.                 genScores();
  407.             }
  408.         }
  409.     }
  410.  
  411.     public void genScores() {
  412.         Bukkit.getLogger().info("🔍 Calculating score for chunk [" + coords[0] + ", " + coords[1] + "] in world " + world);
  413.  
  414.         for (BlockState blkst : tiles) {
  415.             String m = blkst.getType().toString().toLowerCase();
  416.             if (ChkAnalyse.values.containsKey(m)) {
  417.                 score += ChkAnalyse.values.get(m);
  418.                 amount.put(m, amount.getOrDefault(m, 0) + 1);
  419.             }
  420.         }
  421.  
  422.         for (Entity ent : ents) {
  423.             String m = ent.getType().toString().toLowerCase();
  424.             if (ChkAnalyse.values.containsKey(m)) {
  425.                 score += ChkAnalyse.values.get(m);
  426.                 amount.put(m, amount.getOrDefault(m, 0) + 1);
  427.             }
  428.         }
  429.  
  430.         Bukkit.getLogger().info("✅ Score for chunk [" + coords[0] + ", " + coords[1] + "] = " + score);
  431.     }
  432.  
  433.     public int getScore() {
  434.         return score;
  435.     }
  436.  
  437.     public int getX() {
  438.         return coords[0];
  439.     }
  440.  
  441.     public int getZ() {
  442.         return coords[1];
  443.     }
  444.  
  445.     public int[] getCoords() {
  446.         return coords;
  447.     }
  448.  
  449.     public Entity[] getEnts() {
  450.         return ents;
  451.     }
  452.  
  453.     public BlockState[] getTiles() {
  454.         return tiles;
  455.     }
  456.  
  457.     public TextComponent genMobCount(String s, String click) {
  458.         Stream<Map.Entry<String, Integer>> sorted = amount.entrySet().stream()
  459.                 .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()));
  460.  
  461.         Map<String, Integer> tops = sorted.limit(ChkAnalyse.ammoshow)
  462.                 .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
  463.  
  464.         String regionfile = "r." + (coords[0] >> 5) + "." + (coords[1] >> 5) + ".mca";
  465.  
  466.         String empt = "\n§2✸ §fClick to teleport!\n\n§fChunk Information:\n  §2✸ §fWorld:§e "
  467.                 + Chat.capitalize(world.toLowerCase()) + "\n  §2✸ §fRegion File:§e " + regionfile
  468.                 + "\n\n§fMost often appearances:";
  469.         for (String stg : tops.keySet()) {
  470.             empt = empt + "\n" + "  §2✸ §f" + Chat.capitalize(stg.replace('_', ' ')) + ": §e" + tops.get(stg);
  471.         }
  472.         empt = empt + "\n";
  473.  
  474.         return Chat.genHoverAndRunCommandTextComponent(s, empt, click);
  475.     }
  476.  
  477.     public TextComponent genText() {
  478.         String name = "  §2✸ §fChunk §2(" + coords[0] + " " + coords[1] + ")§f Score: §e" + score;
  479.         String cmd = "lagassist tpchunk " + world + " " + coords[0] + " " + coords[1];
  480.         return genMobCount(name, cmd);
  481.     }
  482.  
  483.     @Override
  484.     public int compareTo(ChkStats from) {
  485.         return from.getScore() - score;
  486.     }
  487. }
  488. package org.alvindimas05.lagassist.chunks;
  489.  
  490. import java.util.ArrayList;
  491. import java.util.List;
  492.  
  493. import org.alvindimas05.lagassist.Main;
  494. import org.alvindimas05.lagassist.Reflection;
  495. import org.alvindimas05.lagassist.utils.Chat;
  496. import org.alvindimas05.lagassist.utils.MathUtils;
  497. import org.bukkit.Bukkit;
  498. import org.bukkit.Chunk;
  499. import org.bukkit.Location;
  500. import org.bukkit.World;
  501. import org.bukkit.WorldBorder;
  502. import org.bukkit.command.CommandSender;
  503. import org.bukkit.entity.Player;
  504. import org.bukkit.scheduler.BukkitTask;
  505.  
  506. import org.alvindimas05.lagassist.utils.VersionMgr;
  507.  
  508. public class ChunkGenerator {
  509.  
  510.     private static Object chunkProvider;
  511.     private static World world;
  512.     private static BukkitTask gentask;
  513.  
  514.     // WORLDBORDER VALUES
  515.     private static int maxx;
  516.     private static int maxz;
  517.  
  518.     private static int minx;
  519.     private static int minz;
  520.  
  521.     // WORLDBORDER VALUES END
  522.  
  523.     private static int currenti;
  524.  
  525.     public static void pregenWorld(CommandSender s, String[] args) {
  526.         if (!(s instanceof Player p)) {
  527.             s.sendMessage(Main.PREFIX + "You need to execute this command as a player");
  528.             return;
  529.         }
  530.  
  531.         if (args.length != 2) {
  532.             s.sendMessage(Main.PREFIX + "Correct usage: §2/lagassist pregench [Max-Millis-Per-Tick]");
  533.             return;
  534.         }
  535.  
  536.         if (!MathUtils.isInt(args[1])) {
  537.             s.sendMessage(Main.PREFIX + "Please input a correct ammount of milliseconds.");
  538.             return;
  539.         }
  540.  
  541.         if (gentask != null) {
  542.             s.sendMessage(
  543.                     Main.PREFIX + "The world is already pregenerating. Please wait for it to finish or cancel it.");
  544.             return;
  545.         }
  546.  
  547.         int millis = Integer.parseInt(args[1]);
  548.  
  549.         World w = p.getWorld();
  550.  
  551.         if (w.getWorldBorder().getSize() > 50000) {
  552.             s.sendMessage(Main.PREFIX + "The max worldborder size is 50k.");
  553.             return;
  554.         }
  555.  
  556.         pregenWorld(w, millis);
  557.     }
  558.  
  559.     public static void stopGen(CommandSender s) {
  560.         if (gentask == null) {
  561.             s.sendMessage(Main.PREFIX + "There is no active world pregeneration.");
  562.             return;
  563.         }
  564.         gentask.cancel();
  565.         gentask = null;
  566.         s.sendMessage(Main.PREFIX + "Pregeneration task cancelled.");
  567.  
  568.     }
  569.  
  570.     private static void pregenWorld(World w, int millis) {
  571.  
  572.         // PREPARING ENVIRONMENT
  573.         if (!VersionMgr.isNewMaterials()) {
  574.             chunkProvider = Reflection.getChunkProvider(Reflection.getWorldServer(Reflection.getCraftWorld(w)));
  575.         }
  576.         world = w;
  577.  
  578.         // PREPARING WORLDBORDER CHECK
  579.         WorldBorder wb = w.getWorldBorder();
  580.         Location center = wb.getCenter();
  581.         double radius = wb.getSize() / 2;
  582.  
  583.         maxx = (int) ((center.getX() + radius) / 16);
  584.         maxz = (int) ((center.getZ() + radius) / 16);
  585.  
  586.         minx = (int) ((center.getX() - radius) / 16);
  587.         minz = (int) ((center.getZ() - radius) / 16);
  588.  
  589.         Chunk spawn = world.getSpawnLocation().getChunk();
  590.         int xfin = spawn.getX();
  591.         int zfin = spawn.getZ();
  592.  
  593.         // Prepare list of chunks to pregenerate. It will further be used to pregenerate
  594.         // the world.
  595.  
  596.         Bukkit.getScheduler().runTaskAsynchronously(Main.p, new Runnable() {
  597.             @Override
  598.             public void run() {
  599.                 List<int[]> chunks = new ArrayList<int[]>();
  600.  
  601.                 int x = xfin;
  602.                 int z = zfin;
  603.                 int i = 1;
  604.  
  605.                 while (isInside(x, z)) {
  606.                     for (int temp = x + 1; temp <= x + i; temp++) {
  607.                         chunks.add(new int[]{x, z});
  608.                     }
  609.                     x += i;
  610.                     for (int temp = z - 1; temp >= z - i; temp--) {
  611.                         chunks.add(new int[]{x, temp});
  612.                     }
  613.                     z -= i;
  614.                     i++;
  615.                     for (int temp = x - 1; temp >= x - i; temp--) {
  616.                         chunks.add(new int[]{temp, z});
  617.                     }
  618.                     x -= i;
  619.                     for (int temp = z + 1; temp <= z + i; temp++) {
  620.                         chunks.add(new int[]{x, temp});
  621.                     }
  622.                     z += i;
  623.                     i++;
  624.                 }
  625.                 startGen(chunks, millis);
  626.             }
  627.         });
  628.     }
  629.  
  630.     private static void startGen(List<int[]> chunks, int millis) {
  631.         currenti = 0;
  632.         gentask = Bukkit.getScheduler().runTaskTimer(Main.p, new Runnable() {
  633.             @Override
  634.             public void run() {
  635.                 long time = System.currentTimeMillis();
  636.                 for (int i = currenti; i < chunks.size(); i++) {
  637.                     pregenChunk(chunks.get(i));
  638.                     if (i % 300 == 0 && i != 0) {
  639.                         int percent = (int) ((double) i / chunks.size() * 100);
  640.                         Bukkit.getLogger()
  641.                                 .info("§e[§a✪§e] §fThe pregeneration of the §2"
  642.                                         + Chat.capitalize(world.getName()) + " §fworld is at §a" + percent
  643.                                         + "% completion.");
  644.                     }
  645.                     if (i % 20 == 0 && i != 0) {
  646.                         long curr = System.currentTimeMillis();
  647.                         if (time + millis < curr) {
  648.                             currenti = i;
  649.                             return;
  650.                         }
  651.                     }
  652.                 }
  653.                 gentask.cancel();
  654.                 gentask = null;
  655.                 Bukkit.getLogger()
  656.                         .info("§e[§a✪§e] §fThe pregeneration of the §2" + Chat.capitalize(world.getName())
  657.                                 + " §fworld is finished. Thank you for your patience.");
  658.  
  659.             }
  660.         }, 1L, 1L);
  661.     }
  662.  
  663.     private static void pregenChunk(int[] cords) {
  664.  
  665.         pregenChunk(cords[0], cords[1]);
  666.  
  667.     }
  668.  
  669.     private static void pregenChunk(int x, int z) {
  670.         if (VersionMgr.isChunkGenerated(world, chunkProvider, x, z)) {
  671.             return;
  672.         }
  673.  
  674.         VersionMgr.loadChunk(world, x, z);
  675.     }
  676.  
  677.     private static boolean isInside(int x, int z) {
  678.  
  679.         if (x < minx || x > maxx) {
  680.             return false;
  681.         }
  682.         return z >= minz && z <= maxz;
  683.     }
  684.  
  685. }
  686. package org.alvindimas05.lagassist.chunks;
  687.  
  688. import org.alvindimas05.lagassist.Main;
  689. import org.alvindimas05.lagassist.utils.PaperOnly;
  690. import org.alvindimas05.lagassist.utils.WorldMgr;
  691. import org.bukkit.Bukkit;
  692. import org.bukkit.World;
  693. import org.bukkit.entity.Player;
  694. import org.bukkit.event.EventHandler;
  695. import org.bukkit.event.EventPriority;
  696. import org.bukkit.event.Listener;
  697. import org.bukkit.event.player.PlayerJoinEvent;
  698.  
  699. import org.alvindimas05.lagassist.utils.VersionMgr;
  700.  
  701. public class DynViewer implements Listener {
  702.  
  703.     private static int maxChunks;
  704.     private static int maxView;
  705.  
  706.     private static int currChunks = 0;
  707.  
  708.     public static void Enabler(boolean reload) {
  709.  
  710.         boolean enabled = Main.config.getBoolean("chunk-manager.enabled");
  711.  
  712.         if (!enabled) {
  713.             return;
  714.         }
  715.  
  716.         if (!Main.paper) {
  717.             Bukkit.getLogger().info("    §e[§a✖§e] §fChunkManager - No PaperSpigot found");
  718.             return;
  719.         }
  720.  
  721.         maxChunks = Main.config.getInt("chunk-manager.max-chunks");
  722.         maxView = Main.config.getInt("chunk-manager.max-view");
  723.  
  724.         if (!reload) {
  725.             Main.p.getServer().getPluginManager().registerEvents(new DynViewer(), Main.p);
  726.  
  727.             runTask();
  728.         }
  729.  
  730.         Bukkit.getLogger().info("    §e[§a✔§e] §fChunkManager.");
  731.  
  732.     }
  733.  
  734.     private static void runTask() {
  735.         Bukkit.getScheduler().runTaskTimer(Main.p, DynViewer::setViews, 0, 600);
  736.     }
  737.  
  738.     public static void setViews() {
  739.  
  740.         Main.sendDebug("Attempting to set dynamic view distance...", 1);
  741.        
  742.         // Get a value that is at least the minimum view distance and at max the spigot
  743.         // view distance.
  744.  
  745.         int pl = Bukkit.getOnlinePlayers().size();
  746.  
  747.         if (pl == 0) {
  748.             return;
  749.         }
  750.  
  751.         int vd = (int) Math.sqrt((double) maxChunks / pl / 4);
  752.  
  753.         int newchunks = Math.max(Math.min(maxView, vd), Bukkit.getViewDistance());
  754.  
  755.         if (currChunks == newchunks) {
  756.             return;
  757.         }
  758.  
  759.         currChunks = newchunks;
  760.  
  761.         for (World w : Bukkit.getWorlds()) {
  762.             if (WorldMgr.blacklist.contains(w.getName())) {
  763.                 continue;
  764.             }
  765.            
  766.             PaperOnly.setViewDistance(w, currChunks);
  767.         }
  768.     }
  769.  
  770.     @EventHandler(priority = EventPriority.LOWEST)
  771.     private void onJoin(PlayerJoinEvent e) {
  772.         Player p = e.getPlayer();
  773.  
  774.         Main.sendDebug("Join detected for " + p.getName(), 1);
  775.        
  776.         if (VersionMgr.isNewMaterials()) {
  777.             Main.sendDebug("Is new materials in dynviewer for " + p.getName() + ". Returning... ", 1);
  778.             return;
  779.         }
  780.        
  781.         // TODO: FIX Dynamic view
  782.         Bukkit.getScheduler().runTaskLater(Main.p, () -> PaperOnly.setViewDistance(p, currChunks), 25);
  783.  
  784.     }
  785.  
  786. }
  787.  
Advertisement
Add Comment
Please, Sign In to add comment