Advertisement
Guest User

getNearbyEntities #2 - Error

a guest
May 26th, 2020
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 25.91 KB | None | 0 0
  1. package razec.spawners;
  2.  
  3. import com.google.common.collect.Lists;
  4. import com.google.common.collect.Maps;
  5. import me.kasta.mobspawner.commands.Spawners;
  6. import me.kasta.mobspawner.utils.Util;
  7. import org.bukkit.Bukkit;
  8. import org.bukkit.Chunk;
  9. import org.bukkit.Location;
  10. import org.bukkit.Material;
  11. import org.bukkit.World;
  12. import org.bukkit.block.BlockState;
  13. import org.bukkit.entity.ArmorStand;
  14. import org.bukkit.entity.Entity;
  15. import org.bukkit.entity.EntityType;
  16. import org.bukkit.entity.Item;
  17. import org.bukkit.entity.LivingEntity;
  18. import org.bukkit.entity.Player;
  19. import org.bukkit.event.EventHandler;
  20. import org.bukkit.event.EventPriority;
  21. import org.bukkit.event.entity.ItemSpawnEvent;
  22. import org.bukkit.event.entity.SpawnerSpawnEvent;
  23. import org.bukkit.event.player.PlayerCommandPreprocessEvent;
  24. import org.bukkit.event.world.ChunkLoadEvent;
  25. import org.bukkit.event.world.ChunkUnloadEvent;
  26. import org.bukkit.scheduler.BukkitRunnable;
  27.  
  28. import razec.spawners.Spawner;
  29. import razec.spawners.SpawnerListener;
  30. import razec.spawners.SpawnerUtil;
  31. import razec.spawners.TranslatedEntityName;
  32. import rcore.command.RCommand;
  33. import rcore.inventory.Inv;
  34. import rcore.plugin.RPlugin;
  35. import rcore.specificutils.MapUtil;
  36. import rcore.util.Cooldown;
  37. import rcore.util.GsonManager;
  38. import rcore.util.MakeItem;
  39. import rcore.util.TXT;
  40.  
  41. import java.util.List;
  42. import java.util.Map;
  43.  
  44. public class StorySpawners extends RPlugin {
  45.  
  46. public StorySpawners() {
  47. super("StorySpawners", "Razec");
  48. }
  49.  
  50. public Map<String, List<Spawner>> cache = Maps.newHashMap();
  51. public Map<Location, Spawner> cacheByLocation = Maps.newHashMap();
  52. public Map<Chunk, List<Spawner>> cacheByChunk = Maps.newHashMap();
  53.  
  54. public List<Spawner> getCachedSpawners(String owner) {
  55. owner = owner.toLowerCase();
  56. if (!cache.containsKey(owner)) return Lists.newArrayList();
  57. return Lists.newArrayList(cache.get(owner));
  58. }
  59. public void cacheSpawner(Spawner spawner) {
  60. String owner = spawner.ownerNick.toLowerCase();
  61. List<Spawner> cached;
  62. if (cache.containsKey(owner)) cached = cache.get(owner);
  63. else cached = Lists.newArrayList();
  64. if (!cached.isEmpty()) {
  65. for (Spawner spawner1 : cached) {
  66. if (spawner1 != null) if (spawner1.spawnerLocation != null && spawner.spawnerLocation != null) if (spawner1.spawnerLocation == spawner.spawnerLocation) return;
  67. }
  68. }
  69. cached.add(spawner);
  70. cache.put(owner, cached);
  71. cacheByLocation.put(spawner.spawnerLocation, spawner);
  72. List<Spawner> curSpawners = cacheByChunk.containsKey(spawner.spawnerLocation.getChunk()) ? cacheByChunk.get(spawner.spawnerLocation.getChunk()) : Lists.newArrayList();
  73. curSpawners.add(spawner);
  74. cacheByChunk.put(spawner.spawnerLocation.getChunk(), curSpawners);
  75. }
  76. public void uncacheSpawner(Chunk chunk, Spawner spawner) {
  77. String owner = spawner.ownerNick.toLowerCase();
  78. if (!cache.containsKey(owner)) return;
  79. List<Spawner> cached = cache.get(owner);
  80. cached.remove(spawner);
  81. cacheByLocation.remove(spawner.spawnerLocation);
  82. if (cacheByChunk.containsKey(chunk)) {
  83. List<Spawner> spawners = cacheByChunk.get(chunk);
  84. spawners.remove(spawner);
  85. if (!spawners.isEmpty()) cacheByChunk.put(chunk, spawners);
  86. else cacheByChunk.remove(chunk);
  87. }
  88. if (cached.isEmpty()) cache.remove(owner);
  89. else cache.put(owner, cached);
  90. }
  91. @EventHandler(priority = EventPriority.HIGHEST)
  92. public void onChunkLoad(ChunkLoadEvent e) {
  93. BlockState[] tileEntities = e.getChunk().getTileEntities();
  94. for (BlockState tileEntity : tileEntities)
  95. if (tileEntity.getType() == Material.MOB_SPAWNER) {
  96. tryLoadSpawner(tileEntity.getLocation());
  97. }
  98. }
  99. @EventHandler(priority = EventPriority.LOWEST)
  100. public void onChunkUnload(ChunkUnloadEvent e) {
  101. if (cacheByChunk.containsKey(e.getChunk())) {
  102. Chunk chunk = e.getChunk();
  103. List<Spawner> spawners = Lists.newArrayList(cacheByChunk.get(chunk));
  104. cacheByChunk.remove(chunk);
  105. spawners.forEach(spawner -> {
  106. spawner.curDelay = spawner.delay;
  107. spawner.spawned = null;
  108. if (spawner.unloadedAt <= 0 && spawner.isEnabled) {
  109. spawner.unloadedAt = Cooldown.getCurrentTime();
  110. spawner.queueAsyncSave();
  111. }
  112. uncacheSpawner(chunk, spawner);
  113. });
  114. }
  115. }
  116. @EventHandler public void onItemSpawn(ItemSpawnEvent e) {
  117. if (e.getEntity().getItemStack().getType() == Material.EGG) e.setCancelled(true);
  118. }
  119. public void tryLoadSpawner(Location loc) {
  120. if (cacheByLocation.containsKey(loc)) return;
  121. String serializedLocation = GsonManager.serealizeLocationFull(loc).replace(".0", "");
  122. String path = "spawner." + getSerializedChunkLocation(loc.getChunk()) + "." + serializedLocation + ".";
  123. if (loc.getBlock().getType() != Material.MOB_SPAWNER) {
  124. gson.removeAll(path);
  125. return;
  126. }
  127. try {
  128. List<String> allowedToInteract = gson.getStringList(path + "allowedToInteract");
  129. String ownerNick = gson.getOr(path + "ownerNick", "AnonyDEV");
  130. double amount = gson.getDoubleOr(path + "amount", 1d);
  131. int delay = gson.getIntOr(path + "delay", 30);
  132. String typeName = gson.getOr(path + "type", "CHICKEN");
  133. if (typeName.equals("null")) typeName = "CHICKEN";
  134. EntityType type = EntityType.valueOf(typeName);
  135. boolean enabled = gson.getBooleanOr(path + "enabled", false);
  136. long unloadedAt = gson.contains(path + "unloadedAt") ? gson.get(path + "unloadedAt").asLong() : 0;
  137. int unloadedStackPercentage = gson.getIntOr(path + "unloadedStackPercentage", 5);
  138.  
  139. Spawner spawner = new Spawner(allowedToInteract, ownerNick, loc, amount, delay, type, enabled, unloadedAt, unloadedStackPercentage);
  140. spawner.serializedChunkLocation = getSerializedChunkLocation(loc.getChunk());
  141. spawner.serializedSpawnerLocation = serializedLocation;
  142. } catch (Exception ex) {
  143. ex.printStackTrace();
  144. }
  145. }
  146.  
  147. public Inv spawnerTop;
  148.  
  149. public void updateSpawnerTop() {
  150. if (spawnerTop == null) spawnerTop = new Inv(4 * 9, "TOP Geradores");
  151. else spawnerTop.clearInventory();
  152. try {
  153. Map<String, Double> onlySpawnersAmount = Maps.newHashMap();
  154. Map<String, Map<EntityType, Double>> spawners = Maps.newHashMap();
  155. for (String serializedChunkLocation : gson.getSection("spawner")) {
  156. for (String serializedLocation : gson.getSection("spawner." + serializedChunkLocation)) {
  157. try {
  158. String path = "spawner." + serializedChunkLocation + "." + serializedLocation + ".";
  159. String ownerNick = gson.getOr(path + "ownerNick", "AnonyDEV");
  160. String typeName = gson.getOr(path+"type", "CHICKEN");
  161. if (typeName.equals("null")) typeName = "CHICKEN";
  162. EntityType type = EntityType.valueOf(typeName);
  163. double amount = gson.getDoubleOr(path + "amount", 1d);
  164. Map<EntityType, Double> curMap = spawners.containsKey(ownerNick) ? spawners.get(ownerNick) : Maps.newHashMap();
  165. double curAmount = curMap.containsKey(type) ? curMap.get(type) : 0;
  166. curAmount += amount;
  167. onlySpawnersAmount.put(ownerNick,
  168. onlySpawnersAmount.containsKey(ownerNick) ? onlySpawnersAmount.get(ownerNick) + curAmount : curAmount
  169. );
  170. curMap.put(type, curAmount);
  171. spawners.put(ownerNick, curMap);
  172. } catch (Exception e) {
  173. e.printStackTrace();
  174. }
  175. }
  176. }
  177. onlySpawnersAmount = MapUtil.orderByValueDouble(onlySpawnersAmount);
  178. int curIndex = 0;
  179. int maxIndex = Math.min(spawners.size() - 1, 10);
  180. List<Integer> middle = Lists.newArrayList();
  181. for (int i : spawnerTop.getMiddle()) middle.add(i);
  182. middle.remove(new Integer(10));
  183. middle.remove(new Integer(11));
  184. middle.remove(new Integer(15));
  185. middle.remove(new Integer(16));
  186. while (curIndex < maxIndex) {
  187. try {
  188. int curMiddle = middle.get(0);
  189. String ownerNick = Lists.newArrayList(onlySpawnersAmount.keySet()).get(curIndex);
  190. double amount = onlySpawnersAmount.get(ownerNick);
  191. Map<EntityType, Double> spawnerAmount = spawners.get(ownerNick);
  192. double invested = 0;
  193. for (Map.Entry<EntityType, Double> entry : spawnerAmount.entrySet()) {
  194. EntityType type = entry.getKey();
  195. Double value = entry.getValue();
  196. invested += value * getPrice(type);
  197. }
  198. spawnerTop.setItem(curMiddle, new MakeItem(ownerNick).setName(
  199. "<a>"+(curIndex + 1)+"º <f>" + ownerNick
  200. ).addLoreList(
  201. "",
  202. " <f>Quantidade: <e>" + Util.format(amount) + " ",
  203. " <f>Investimento: <2>$<a>" + Util.format(invested)+" ",
  204. ""
  205. ).build());
  206.  
  207. middle.remove(new Integer(curMiddle));
  208. } catch (Exception e) { }
  209. curIndex++;
  210. }
  211.  
  212. if (spawnerTop.getInventory().getContents().length <= 0 && onlySpawnersAmount.size() > 0) updateSpawnerTop();
  213. } catch (Exception e) { }
  214.  
  215. }
  216.  
  217. private double getPrice(EntityType type) {
  218. double amount = Spawners.getPriceItem(type);
  219. return amount <= 0.0d ? 1 : amount;
  220. }
  221. @EventHandler(priority = EventPriority.LOWEST) public void onPreCommand(PlayerCommandPreprocessEvent e) {
  222. String cmd = e.getMessage().toLowerCase();
  223. if (cmd.startsWith("/spawners top") || cmd.startsWith("/spawner top")) {
  224. e.setCancelled(true);
  225. if (spawnerTop == null) {
  226. e.getPlayer().sendMessage(TXT.parse("<c>TOP Geradores está atualizando..."));
  227. return;
  228. }
  229. spawnerTop.open(e.getPlayer());
  230. }
  231. }
  232. public void avisarItemsEntitys() {
  233. new BukkitRunnable() {
  234. public void run() {
  235. for (World world : Bukkit.getWorlds()){
  236. for (Entity entity : world.getEntities()){
  237. if (entity instanceof LivingEntity || entity instanceof Item){
  238. if (!(entity instanceof ArmorStand) && !(entity instanceof Player)){
  239. entity.remove();
  240. }
  241. }
  242. }
  243. }
  244. Bukkit.broadcastMessage("");
  245. Bukkit.broadcastMessage("§6§lLIXEIRO §7Removendo todos os §6mobs §7e §6itens§7.");
  246. Bukkit.broadcastMessage("");
  247. }
  248. }.runTaskLater(this, 400L);
  249. }
  250. public static StorySpawners instance; @Override public void onPreStart() { instance = this; }
  251. public GsonManager gson;
  252. public List<Spawner> queueAsyncSave = Lists.newArrayList();
  253. public List<Spawner> queueAsyncDelete = Lists.newArrayList();
  254. public Map<String, Double> entityTypeDropValue;
  255. public interface Run { void run(); }
  256. public void runAsynchronously(Run run) { this.runAsynchronously.add(run); }
  257. private List<Run> runAsynchronously = Lists.newArrayList();
  258. public boolean near(Location l) {
  259. double a = 9;
  260. double b = 5;
  261. double c = 9;
  262. for (Entity entity : l.getWorld().getNearbyEntities(l, a, b, c)){
  263. if (entity instanceof Player)
  264. return true;
  265. }
  266. return false;
  267. }
  268.  
  269. @Override public void onStart() {
  270. TXT.runAsynchronously(this, 1, 1, () -> {
  271. Lists.newArrayList(runAsynchronously).forEach(Run::run);
  272. runAsynchronously.clear();
  273. });
  274. TXT.runAsynchronously(this, 20, 4800, () -> {
  275. Bukkit.broadcastMessage("");
  276. Bukkit.broadcastMessage("§6§lLIXEIRO §7Removendo todos os §6mobs §7e §6itens§7.");
  277. Bukkit.broadcastMessage("§6§lLIXEIRO §7Tempo restante: §f20 segundos§7.");
  278. Bukkit.broadcastMessage("");
  279. avisarItemsEntitys();
  280. });
  281. gson = new GsonManager(getDefaultPluginFolderPath(), "data").prepareGson();
  282. entityTypeDropValue = gson.getOr("entityTypeDropValue", Maps.newHashMap());
  283. setListener(new SpawnerListener());
  284. TXT.runAsynchronously(this, 20, 400, () -> {
  285. boolean saveGson = false;
  286. if (!queueAsyncSave.isEmpty()) {
  287. saveGson = true;
  288. Lists.newArrayList(queueAsyncSave).forEach(save -> {
  289. try {
  290. save.save();
  291. } catch (Exception e) {}
  292. });
  293. queueAsyncSave.clear();
  294. }
  295. if (!queueAsyncDelete.isEmpty()) {
  296. saveGson = true;
  297. Lists.newArrayList(queueAsyncDelete).forEach(delete -> {
  298. try {
  299. delete.delete();
  300. } catch (Exception e) {}
  301. });
  302. queueAsyncDelete.clear();
  303. }
  304. if (saveGson) gson.save();
  305. });
  306. TXT.runAsynchronously(this, 20, 24000, () -> {
  307. updateSpawnerTop();
  308. });
  309. TXT.runAsynchronously(this, 20, 20, () ->
  310. {
  311. for (Spawner spawner : Maps.newHashMap(cacheByLocation).values()) {
  312. try {
  313. if (spawner.isEnabled) {
  314. if (near(spawner.spawnerLocation)) {
  315. spawner.curDelay--;
  316. if (spawner.curDelay <= 0) {
  317. spawner.curDelay = spawner.delay;
  318. TXT.run(this, spawner::spawn);
  319. }
  320. spawner.updateTimeSpawnerInv();
  321. }
  322. }
  323. } catch (Exception e) {}
  324.  
  325. }
  326. });
  327. registerCommand(new RCommand() {
  328. @Override public List<Object> getHelpPages() { return null; }
  329. @Override public int getHelpPageSize() { return 0; }
  330. @Override public String getNextHelpPageCommand() { return null; }
  331. @Override public String getPreviousHelpPageCommand() { return null; }
  332. @Override public List<Object> getDescription() { return null; }
  333. @Override public List<String> getAliases() { return getList("gspi"); }
  334. @Override public String getCommand() { return "givespawnerpercentageincreaser"; }
  335. @Override public String getPermission() { return "storyspawners.command.givespawnerpercentageincreaser"; }
  336. @Override public boolean canConsolePerform() { return true; }
  337. @Override public void perform() {
  338.  
  339. if (isArgsLength(2)) {
  340.  
  341. Player toGive = getPlayer(argAt(0));
  342. if (toGive == null || !toGive.isOnline()) {
  343. warnPlayerOffline(argAt(0));
  344. return;
  345. }
  346. if (isInventoryFull(toGive)) {
  347. warnInventoryFull(toGive);
  348. return;
  349. }
  350.  
  351. if (!isValidInt(argAt(1))) {
  352. warnNotValidNumber(argAt(1));
  353. return;
  354. }
  355. int amount = getInt(argAt(1));
  356. if (amount <= 0) {
  357. sendMessage("<c>A quantidade não pode ser menor ou igual a zero.");
  358. return;
  359. }
  360. if (amount > 64) {
  361. sendMessage("<c>A quantidade não pode ser maior que sessenta e quatro.");
  362. return;
  363. }
  364.  
  365. toGive.getInventory().addItem(new MakeItem(Material.NETHER_STAR).setAmout(amount).setName(
  366. "<a>Aumentador de Porcentagem"
  367. ).addLoreList(
  368. "<7>Use para aumentar <f>5% <7>de porcentagem ",
  369. "<7>de quantos mobs podem ser stackados quando ",
  370. "<7>o gerador estiver descarregado. "
  371. ).build());
  372. toGive.updateInventory();
  373. return;
  374.  
  375. }
  376.  
  377. sendMessage("<c>Uso: <f>/gspi <jogador> <quantidade>");
  378.  
  379. }
  380. @Override public List<String> tabComplete() { return null; }
  381. });
  382. registerCommand(new RCommand() {
  383. @Override public List<Object> getHelpPages() { return null; }
  384. @Override public int getHelpPageSize() { return 0; }
  385. @Override public String getNextHelpPageCommand() { return null; }
  386. @Override public String getPreviousHelpPageCommand() { return null; }
  387. @Override public List<Object> getDescription() { return null; }
  388. @Override public List<String> getAliases() { return null; }
  389. @Override public String getCommand() { return "kille"; }
  390. @Override public String getPermission() { return "storyspawners.command.kille"; }
  391. @Override public boolean canConsolePerform() { return true; }
  392. @Override public void perform() {
  393. Bukkit.broadcastMessage("");
  394. Bukkit.broadcastMessage("§6§lLIXEIRO §7Removendo todos os §6mobs §7e §6itens§7.");
  395. Bukkit.broadcastMessage("§6§lLIXEIRO §7Tempo restante: §f20 segundos§7.");
  396. Bukkit.broadcastMessage("");
  397. avisarItemsEntitys();
  398. }
  399. @Override public List<String> tabComplete() { return null; }
  400. });
  401. registerCommand(new RCommand() {
  402. @Override public List<Object> getHelpPages() { return null; }
  403. @Override public int getHelpPageSize() { return 0; }
  404. @Override public String getNextHelpPageCommand() { return null; }
  405. @Override public String getPreviousHelpPageCommand() { return null; }
  406. @Override public List<Object> getDescription() { return null; }
  407. @Override public List<String> getAliases() { return null; }
  408. @Override public String getCommand() { return "setdropvalue"; }
  409. @Override public String getPermission() { return "storyspawners.command.setdropvalue"; }
  410. @Override public boolean canConsolePerform() { return true; }
  411. @Override public void perform() {
  412. if (isArgsLength(2)) {
  413. EntityType type = tryGetEntityType(argAt(0));
  414. if (type == null) {
  415. sendMessage("%s <c> não é um tipo válido de entidade.", argAt(0));
  416. return;
  417. }
  418. try {
  419. TranslatedEntityName.valueOf(argAt(0).toUpperCase());
  420. } catch (Exception e) {
  421. sendMessage("%s <c> não é um tipo válido de entidade.", argAt(0));
  422. return;
  423. }
  424.  
  425. if (!isValidDouble(argAt(1))) {
  426. warnNotValidNumber(argAt(1));
  427. return;
  428. }
  429. double value = getDouble(argAt(1));
  430. if (value <= 0) {
  431. sendMessage("<c>O valor não pode ser menor ou igual a zero.");
  432. return;
  433. }
  434. sendMessage("<a>Valor dos drops do tipo %s definido para %s.", TranslatedEntityName.valueOf(type).getName(), value);
  435. entityTypeDropValue.put(type.name(), value);
  436. gson.put("entityTypeDropValue", entityTypeDropValue);
  437. return;
  438. }
  439. sendMessage("<c>Uso: <f>/setdropvalue <tipo> <valor>");
  440. }
  441. @Override public List<String> tabComplete() { return null; }
  442. });
  443.  
  444. registerCommand(new RCommand() {
  445. @Override public List<Object> getHelpPages() { return null; }
  446. @Override public int getHelpPageSize() { return 0; }
  447. @Override public String getNextHelpPageCommand() { return null; }
  448. @Override public String getPreviousHelpPageCommand() { return null; }
  449. @Override public List<Object> getDescription() { return null; }
  450. @Override public List<String> getAliases() { return getList("sgive", "spawnergive", "gspawner"); }
  451. @Override public String getCommand() { return "givespawner"; }
  452. @Override public String getPermission() { return "storyspawners.command.givespawner"; }
  453. @Override public boolean canConsolePerform() { return true; }
  454. @Override public void perform() {
  455.  
  456. if (isArgsLength(6)) {
  457.  
  458. Player toGive = getPlayer(argAt(0));
  459. if (toGive == null || !toGive.isOnline()) {
  460. warnPlayerOffline(argAt(0));
  461. return;
  462. }
  463. if (isInventoryFull(toGive)) {
  464. warnInventoryFull(toGive);
  465. return;
  466. }
  467.  
  468. if (!isValidInt(argAt(1))) {
  469. warnNotValidNumber(argAt(1));
  470. return;
  471. }
  472. int amount = getInt(argAt(1));
  473. if (amount <= 0) {
  474. sendMessage("<c>A quantidade não pode ser menor ou igual a zero.");
  475. return;
  476. }
  477. if (amount > 64) {
  478. sendMessage("<c>A quantidade não pode ser maior que sessenta e quatro.");
  479. return;
  480. }
  481.  
  482. EntityType type = tryGetEntityType(argAt(2));
  483. if (type == null) {
  484. sendMessage("%s <c> não é um tipo válido de entidade.", argAt(0));
  485. return;
  486. }
  487. try {
  488. TranslatedEntityName.valueOf(argAt(2).toUpperCase());
  489. } catch (Exception e) {
  490. sendMessage("%s <c> não é um tipo válido de entidade.", argAt(0));
  491. return;
  492. }
  493.  
  494. if (!isValidDouble(argAt(3))) {
  495. warnNotValidNumber(argAt(3));
  496. return;
  497. }
  498. double stack = getDouble(argAt(3));
  499. if (stack <= 0) {
  500. sendMessage("<c>O número não pode ser menor ou igual a zero.");
  501. return;
  502. }
  503.  
  504. if (!isValidInt(argAt(4))) {
  505. warnNotValidNumber(argAt(4));
  506. return;
  507. }
  508. int delay = getInt(argAt(4));
  509. if (delay <= 0) {
  510. sendMessage("<c>O número não pode ser menor ou igual a zero.");
  511. return;
  512. }
  513.  
  514. if (!isValidInt(argAt(5))) {
  515. warnNotValidNumber(argAt(5));
  516. return;
  517. }
  518. int stackOffline = getInt(argAt(5));
  519. if (stackOffline <= 0) {
  520. sendMessage("<c>O número não pode ser menor ou igual a zero.");
  521. return;
  522. }
  523.  
  524. toGive.getInventory().addItem(SpawnerUtil.getItemStack(
  525. Lists.newArrayList(),
  526. type,
  527. "?",
  528. amount,
  529. stack,
  530. delay,
  531. stackOffline
  532. ));
  533. toGive.updateInventory();
  534. return;
  535.  
  536. }
  537. sendMessage("<c>Uso: <f>/sgive <jogador> <quantidade> <tipo> <stack> <delay> <porcentagem stack offline>");
  538. }
  539. @Override public List<String> tabComplete() { return getPlayersTabComplete(argAt(argsLength() - 1), Bukkit.getOnlinePlayers()); }
  540. });
  541.  
  542. }
  543. @Override public void onStop() { }
  544.  
  545. @EventHandler(priority = EventPriority.LOWEST) public void onSpawnerSpawn(SpawnerSpawnEvent e) { e.setCancelled(true); }
  546.  
  547. public String getSerializedChunkLocation(Chunk chunk) {
  548. return chunk.getWorld().getName()+"@"+chunk.getX()+"@"+chunk.getZ();
  549. }
  550. public String getSerializedChunkLocation(Location loc) {
  551. Chunk chunk = loc.getChunk();
  552. return chunk.getWorld().getName()+"@"+chunk.getX()+"@"+chunk.getZ();
  553. }
  554. public Chunk deserializeChunkLocation(String loc) {
  555. String[] split = loc.split("@");
  556. return Bukkit.getWorld(split[0]).getChunkAt(Integer.valueOf(split[1]), Integer.valueOf(split[2]));
  557. }
  558.  
  559. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement