Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package razec.spawners;
- import com.google.common.collect.Lists;
- import com.google.common.collect.Maps;
- import me.kasta.mobspawner.commands.Spawners;
- import me.kasta.mobspawner.utils.Util;
- import org.bukkit.Bukkit;
- import org.bukkit.Chunk;
- import org.bukkit.Location;
- import org.bukkit.Material;
- import org.bukkit.World;
- import org.bukkit.block.BlockState;
- import org.bukkit.entity.ArmorStand;
- import org.bukkit.entity.Entity;
- import org.bukkit.entity.EntityType;
- import org.bukkit.entity.Item;
- import org.bukkit.entity.LivingEntity;
- import org.bukkit.entity.Player;
- import org.bukkit.event.EventHandler;
- import org.bukkit.event.EventPriority;
- import org.bukkit.event.entity.ItemSpawnEvent;
- import org.bukkit.event.entity.SpawnerSpawnEvent;
- import org.bukkit.event.player.PlayerCommandPreprocessEvent;
- import org.bukkit.event.world.ChunkLoadEvent;
- import org.bukkit.event.world.ChunkUnloadEvent;
- import org.bukkit.scheduler.BukkitRunnable;
- import razec.spawners.Spawner;
- import razec.spawners.SpawnerListener;
- import razec.spawners.SpawnerUtil;
- import razec.spawners.TranslatedEntityName;
- import rcore.command.RCommand;
- import rcore.inventory.Inv;
- import rcore.plugin.RPlugin;
- import rcore.specificutils.MapUtil;
- import rcore.util.Cooldown;
- import rcore.util.GsonManager;
- import rcore.util.MakeItem;
- import rcore.util.TXT;
- import java.util.List;
- import java.util.Map;
- public class StorySpawners extends RPlugin {
- public StorySpawners() {
- super("StorySpawners", "Razec");
- }
- public Map<String, List<Spawner>> cache = Maps.newHashMap();
- public Map<Location, Spawner> cacheByLocation = Maps.newHashMap();
- public Map<Chunk, List<Spawner>> cacheByChunk = Maps.newHashMap();
- public List<Spawner> getCachedSpawners(String owner) {
- owner = owner.toLowerCase();
- if (!cache.containsKey(owner)) return Lists.newArrayList();
- return Lists.newArrayList(cache.get(owner));
- }
- public void cacheSpawner(Spawner spawner) {
- String owner = spawner.ownerNick.toLowerCase();
- List<Spawner> cached;
- if (cache.containsKey(owner)) cached = cache.get(owner);
- else cached = Lists.newArrayList();
- if (!cached.isEmpty()) {
- for (Spawner spawner1 : cached) {
- if (spawner1 != null) if (spawner1.spawnerLocation != null && spawner.spawnerLocation != null) if (spawner1.spawnerLocation == spawner.spawnerLocation) return;
- }
- }
- cached.add(spawner);
- cache.put(owner, cached);
- cacheByLocation.put(spawner.spawnerLocation, spawner);
- List<Spawner> curSpawners = cacheByChunk.containsKey(spawner.spawnerLocation.getChunk()) ? cacheByChunk.get(spawner.spawnerLocation.getChunk()) : Lists.newArrayList();
- curSpawners.add(spawner);
- cacheByChunk.put(spawner.spawnerLocation.getChunk(), curSpawners);
- }
- public void uncacheSpawner(Chunk chunk, Spawner spawner) {
- String owner = spawner.ownerNick.toLowerCase();
- if (!cache.containsKey(owner)) return;
- List<Spawner> cached = cache.get(owner);
- cached.remove(spawner);
- cacheByLocation.remove(spawner.spawnerLocation);
- if (cacheByChunk.containsKey(chunk)) {
- List<Spawner> spawners = cacheByChunk.get(chunk);
- spawners.remove(spawner);
- if (!spawners.isEmpty()) cacheByChunk.put(chunk, spawners);
- else cacheByChunk.remove(chunk);
- }
- if (cached.isEmpty()) cache.remove(owner);
- else cache.put(owner, cached);
- }
- @EventHandler(priority = EventPriority.HIGHEST)
- public void onChunkLoad(ChunkLoadEvent e) {
- BlockState[] tileEntities = e.getChunk().getTileEntities();
- for (BlockState tileEntity : tileEntities)
- if (tileEntity.getType() == Material.MOB_SPAWNER) {
- tryLoadSpawner(tileEntity.getLocation());
- }
- }
- @EventHandler(priority = EventPriority.LOWEST)
- public void onChunkUnload(ChunkUnloadEvent e) {
- if (cacheByChunk.containsKey(e.getChunk())) {
- Chunk chunk = e.getChunk();
- List<Spawner> spawners = Lists.newArrayList(cacheByChunk.get(chunk));
- cacheByChunk.remove(chunk);
- spawners.forEach(spawner -> {
- spawner.curDelay = spawner.delay;
- spawner.spawned = null;
- if (spawner.unloadedAt <= 0 && spawner.isEnabled) {
- spawner.unloadedAt = Cooldown.getCurrentTime();
- spawner.queueAsyncSave();
- }
- uncacheSpawner(chunk, spawner);
- });
- }
- }
- @EventHandler public void onItemSpawn(ItemSpawnEvent e) {
- if (e.getEntity().getItemStack().getType() == Material.EGG) e.setCancelled(true);
- }
- public void tryLoadSpawner(Location loc) {
- if (cacheByLocation.containsKey(loc)) return;
- String serializedLocation = GsonManager.serealizeLocationFull(loc).replace(".0", "");
- String path = "spawner." + getSerializedChunkLocation(loc.getChunk()) + "." + serializedLocation + ".";
- if (loc.getBlock().getType() != Material.MOB_SPAWNER) {
- gson.removeAll(path);
- return;
- }
- try {
- List<String> allowedToInteract = gson.getStringList(path + "allowedToInteract");
- String ownerNick = gson.getOr(path + "ownerNick", "AnonyDEV");
- double amount = gson.getDoubleOr(path + "amount", 1d);
- int delay = gson.getIntOr(path + "delay", 30);
- String typeName = gson.getOr(path + "type", "CHICKEN");
- if (typeName.equals("null")) typeName = "CHICKEN";
- EntityType type = EntityType.valueOf(typeName);
- boolean enabled = gson.getBooleanOr(path + "enabled", false);
- long unloadedAt = gson.contains(path + "unloadedAt") ? gson.get(path + "unloadedAt").asLong() : 0;
- int unloadedStackPercentage = gson.getIntOr(path + "unloadedStackPercentage", 5);
- Spawner spawner = new Spawner(allowedToInteract, ownerNick, loc, amount, delay, type, enabled, unloadedAt, unloadedStackPercentage);
- spawner.serializedChunkLocation = getSerializedChunkLocation(loc.getChunk());
- spawner.serializedSpawnerLocation = serializedLocation;
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- }
- public Inv spawnerTop;
- public void updateSpawnerTop() {
- if (spawnerTop == null) spawnerTop = new Inv(4 * 9, "TOP Geradores");
- else spawnerTop.clearInventory();
- try {
- Map<String, Double> onlySpawnersAmount = Maps.newHashMap();
- Map<String, Map<EntityType, Double>> spawners = Maps.newHashMap();
- for (String serializedChunkLocation : gson.getSection("spawner")) {
- for (String serializedLocation : gson.getSection("spawner." + serializedChunkLocation)) {
- try {
- String path = "spawner." + serializedChunkLocation + "." + serializedLocation + ".";
- String ownerNick = gson.getOr(path + "ownerNick", "AnonyDEV");
- String typeName = gson.getOr(path+"type", "CHICKEN");
- if (typeName.equals("null")) typeName = "CHICKEN";
- EntityType type = EntityType.valueOf(typeName);
- double amount = gson.getDoubleOr(path + "amount", 1d);
- Map<EntityType, Double> curMap = spawners.containsKey(ownerNick) ? spawners.get(ownerNick) : Maps.newHashMap();
- double curAmount = curMap.containsKey(type) ? curMap.get(type) : 0;
- curAmount += amount;
- onlySpawnersAmount.put(ownerNick,
- onlySpawnersAmount.containsKey(ownerNick) ? onlySpawnersAmount.get(ownerNick) + curAmount : curAmount
- );
- curMap.put(type, curAmount);
- spawners.put(ownerNick, curMap);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- onlySpawnersAmount = MapUtil.orderByValueDouble(onlySpawnersAmount);
- int curIndex = 0;
- int maxIndex = Math.min(spawners.size() - 1, 10);
- List<Integer> middle = Lists.newArrayList();
- for (int i : spawnerTop.getMiddle()) middle.add(i);
- middle.remove(new Integer(10));
- middle.remove(new Integer(11));
- middle.remove(new Integer(15));
- middle.remove(new Integer(16));
- while (curIndex < maxIndex) {
- try {
- int curMiddle = middle.get(0);
- String ownerNick = Lists.newArrayList(onlySpawnersAmount.keySet()).get(curIndex);
- double amount = onlySpawnersAmount.get(ownerNick);
- Map<EntityType, Double> spawnerAmount = spawners.get(ownerNick);
- double invested = 0;
- for (Map.Entry<EntityType, Double> entry : spawnerAmount.entrySet()) {
- EntityType type = entry.getKey();
- Double value = entry.getValue();
- invested += value * getPrice(type);
- }
- spawnerTop.setItem(curMiddle, new MakeItem(ownerNick).setName(
- "<a>"+(curIndex + 1)+"º <f>" + ownerNick
- ).addLoreList(
- "",
- " <f>Quantidade: <e>" + Util.format(amount) + " ",
- " <f>Investimento: <2>$<a>" + Util.format(invested)+" ",
- ""
- ).build());
- middle.remove(new Integer(curMiddle));
- } catch (Exception e) { }
- curIndex++;
- }
- if (spawnerTop.getInventory().getContents().length <= 0 && onlySpawnersAmount.size() > 0) updateSpawnerTop();
- } catch (Exception e) { }
- }
- private double getPrice(EntityType type) {
- double amount = Spawners.getPriceItem(type);
- return amount <= 0.0d ? 1 : amount;
- }
- @EventHandler(priority = EventPriority.LOWEST) public void onPreCommand(PlayerCommandPreprocessEvent e) {
- String cmd = e.getMessage().toLowerCase();
- if (cmd.startsWith("/spawners top") || cmd.startsWith("/spawner top")) {
- e.setCancelled(true);
- if (spawnerTop == null) {
- e.getPlayer().sendMessage(TXT.parse("<c>TOP Geradores está atualizando..."));
- return;
- }
- spawnerTop.open(e.getPlayer());
- }
- }
- public void avisarItemsEntitys() {
- new BukkitRunnable() {
- public void run() {
- for (World world : Bukkit.getWorlds()){
- for (Entity entity : world.getEntities()){
- if (entity instanceof LivingEntity || entity instanceof Item){
- if (!(entity instanceof ArmorStand) && !(entity instanceof Player)){
- entity.remove();
- }
- }
- }
- }
- Bukkit.broadcastMessage("");
- Bukkit.broadcastMessage("§6§lLIXEIRO §7Removendo todos os §6mobs §7e §6itens§7.");
- Bukkit.broadcastMessage("");
- }
- }.runTaskLater(this, 400L);
- }
- public static StorySpawners instance; @Override public void onPreStart() { instance = this; }
- public GsonManager gson;
- public List<Spawner> queueAsyncSave = Lists.newArrayList();
- public List<Spawner> queueAsyncDelete = Lists.newArrayList();
- public Map<String, Double> entityTypeDropValue;
- public interface Run { void run(); }
- public void runAsynchronously(Run run) { this.runAsynchronously.add(run); }
- private List<Run> runAsynchronously = Lists.newArrayList();
- public boolean near(Location l) {
- for (Entity entity : l.getWorld().getNearbyEntities(l, 9, 5, 9)){
- if (entity instanceof Player)
- return true;
- }
- return false;
- }
- @Override public void onStart() {
- TXT.runAsynchronously(this, 1, 1, () -> {
- Lists.newArrayList(runAsynchronously).forEach(Run::run);
- runAsynchronously.clear();
- });
- TXT.runAsynchronously(this, 20, 4800, () -> {
- Bukkit.broadcastMessage("");
- Bukkit.broadcastMessage("§6§lLIXEIRO §7Removendo todos os §6mobs §7e §6itens§7.");
- Bukkit.broadcastMessage("§6§lLIXEIRO §7Tempo restante: §f20 segundos§7.");
- Bukkit.broadcastMessage("");
- avisarItemsEntitys();
- });
- gson = new GsonManager(getDefaultPluginFolderPath(), "data").prepareGson();
- entityTypeDropValue = gson.getOr("entityTypeDropValue", Maps.newHashMap());
- setListener(new SpawnerListener());
- TXT.runAsynchronously(this, 20, 400, () -> {
- boolean saveGson = false;
- if (!queueAsyncSave.isEmpty()) {
- saveGson = true;
- Lists.newArrayList(queueAsyncSave).forEach(save -> {
- try {
- save.save();
- } catch (Exception e) {}
- });
- queueAsyncSave.clear();
- }
- if (!queueAsyncDelete.isEmpty()) {
- saveGson = true;
- Lists.newArrayList(queueAsyncDelete).forEach(delete -> {
- try {
- delete.delete();
- } catch (Exception e) {}
- });
- queueAsyncDelete.clear();
- }
- if (saveGson) gson.save();
- });
- TXT.runAsynchronously(this, 20, 24000, () -> {
- updateSpawnerTop();
- });
- TXT.runAsynchronously(this, 20, 20, () ->
- {
- for (Spawner spawner : Maps.newHashMap(cacheByLocation).values()) {
- try {
- if (spawner.isEnabled) {
- if (near(spawner.spawnerLocation)) {
- spawner.curDelay--;
- if (spawner.curDelay <= 0) {
- spawner.curDelay = spawner.delay;
- TXT.run(this, spawner::spawn);
- }
- spawner.updateTimeSpawnerInv();
- }
- }
- } catch (Exception e) {}
- }
- });
- registerCommand(new RCommand() {
- @Override public List<Object> getHelpPages() { return null; }
- @Override public int getHelpPageSize() { return 0; }
- @Override public String getNextHelpPageCommand() { return null; }
- @Override public String getPreviousHelpPageCommand() { return null; }
- @Override public List<Object> getDescription() { return null; }
- @Override public List<String> getAliases() { return getList("gspi"); }
- @Override public String getCommand() { return "givespawnerpercentageincreaser"; }
- @Override public String getPermission() { return "storyspawners.command.givespawnerpercentageincreaser"; }
- @Override public boolean canConsolePerform() { return true; }
- @Override public void perform() {
- if (isArgsLength(2)) {
- Player toGive = getPlayer(argAt(0));
- if (toGive == null || !toGive.isOnline()) {
- warnPlayerOffline(argAt(0));
- return;
- }
- if (isInventoryFull(toGive)) {
- warnInventoryFull(toGive);
- return;
- }
- if (!isValidInt(argAt(1))) {
- warnNotValidNumber(argAt(1));
- return;
- }
- int amount = getInt(argAt(1));
- if (amount <= 0) {
- sendMessage("<c>A quantidade não pode ser menor ou igual a zero.");
- return;
- }
- if (amount > 64) {
- sendMessage("<c>A quantidade não pode ser maior que sessenta e quatro.");
- return;
- }
- toGive.getInventory().addItem(new MakeItem(Material.NETHER_STAR).setAmout(amount).setName(
- "<a>Aumentador de Porcentagem"
- ).addLoreList(
- "<7>Use para aumentar <f>5% <7>de porcentagem ",
- "<7>de quantos mobs podem ser stackados quando ",
- "<7>o gerador estiver descarregado. "
- ).build());
- toGive.updateInventory();
- return;
- }
- sendMessage("<c>Uso: <f>/gspi <jogador> <quantidade>");
- }
- @Override public List<String> tabComplete() { return null; }
- });
- registerCommand(new RCommand() {
- @Override public List<Object> getHelpPages() { return null; }
- @Override public int getHelpPageSize() { return 0; }
- @Override public String getNextHelpPageCommand() { return null; }
- @Override public String getPreviousHelpPageCommand() { return null; }
- @Override public List<Object> getDescription() { return null; }
- @Override public List<String> getAliases() { return null; }
- @Override public String getCommand() { return "kille"; }
- @Override public String getPermission() { return "storyspawners.command.kille"; }
- @Override public boolean canConsolePerform() { return true; }
- @Override public void perform() {
- Bukkit.broadcastMessage("");
- Bukkit.broadcastMessage("§6§lLIXEIRO §7Removendo todos os §6mobs §7e §6itens§7.");
- Bukkit.broadcastMessage("§6§lLIXEIRO §7Tempo restante: §f20 segundos§7.");
- Bukkit.broadcastMessage("");
- avisarItemsEntitys();
- }
- @Override public List<String> tabComplete() { return null; }
- });
- registerCommand(new RCommand() {
- @Override public List<Object> getHelpPages() { return null; }
- @Override public int getHelpPageSize() { return 0; }
- @Override public String getNextHelpPageCommand() { return null; }
- @Override public String getPreviousHelpPageCommand() { return null; }
- @Override public List<Object> getDescription() { return null; }
- @Override public List<String> getAliases() { return null; }
- @Override public String getCommand() { return "setdropvalue"; }
- @Override public String getPermission() { return "storyspawners.command.setdropvalue"; }
- @Override public boolean canConsolePerform() { return true; }
- @Override public void perform() {
- if (isArgsLength(2)) {
- EntityType type = tryGetEntityType(argAt(0));
- if (type == null) {
- sendMessage("%s <c> não é um tipo válido de entidade.", argAt(0));
- return;
- }
- try {
- TranslatedEntityName.valueOf(argAt(0).toUpperCase());
- } catch (Exception e) {
- sendMessage("%s <c> não é um tipo válido de entidade.", argAt(0));
- return;
- }
- if (!isValidDouble(argAt(1))) {
- warnNotValidNumber(argAt(1));
- return;
- }
- double value = getDouble(argAt(1));
- if (value <= 0) {
- sendMessage("<c>O valor não pode ser menor ou igual a zero.");
- return;
- }
- sendMessage("<a>Valor dos drops do tipo %s definido para %s.", TranslatedEntityName.valueOf(type).getName(), value);
- entityTypeDropValue.put(type.name(), value);
- gson.put("entityTypeDropValue", entityTypeDropValue);
- return;
- }
- sendMessage("<c>Uso: <f>/setdropvalue <tipo> <valor>");
- }
- @Override public List<String> tabComplete() { return null; }
- });
- registerCommand(new RCommand() {
- @Override public List<Object> getHelpPages() { return null; }
- @Override public int getHelpPageSize() { return 0; }
- @Override public String getNextHelpPageCommand() { return null; }
- @Override public String getPreviousHelpPageCommand() { return null; }
- @Override public List<Object> getDescription() { return null; }
- @Override public List<String> getAliases() { return getList("sgive", "spawnergive", "gspawner"); }
- @Override public String getCommand() { return "givespawner"; }
- @Override public String getPermission() { return "storyspawners.command.givespawner"; }
- @Override public boolean canConsolePerform() { return true; }
- @Override public void perform() {
- if (isArgsLength(6)) {
- Player toGive = getPlayer(argAt(0));
- if (toGive == null || !toGive.isOnline()) {
- warnPlayerOffline(argAt(0));
- return;
- }
- if (isInventoryFull(toGive)) {
- warnInventoryFull(toGive);
- return;
- }
- if (!isValidInt(argAt(1))) {
- warnNotValidNumber(argAt(1));
- return;
- }
- int amount = getInt(argAt(1));
- if (amount <= 0) {
- sendMessage("<c>A quantidade não pode ser menor ou igual a zero.");
- return;
- }
- if (amount > 64) {
- sendMessage("<c>A quantidade não pode ser maior que sessenta e quatro.");
- return;
- }
- EntityType type = tryGetEntityType(argAt(2));
- if (type == null) {
- sendMessage("%s <c> não é um tipo válido de entidade.", argAt(0));
- return;
- }
- try {
- TranslatedEntityName.valueOf(argAt(2).toUpperCase());
- } catch (Exception e) {
- sendMessage("%s <c> não é um tipo válido de entidade.", argAt(0));
- return;
- }
- if (!isValidDouble(argAt(3))) {
- warnNotValidNumber(argAt(3));
- return;
- }
- double stack = getDouble(argAt(3));
- if (stack <= 0) {
- sendMessage("<c>O número não pode ser menor ou igual a zero.");
- return;
- }
- if (!isValidInt(argAt(4))) {
- warnNotValidNumber(argAt(4));
- return;
- }
- int delay = getInt(argAt(4));
- if (delay <= 0) {
- sendMessage("<c>O número não pode ser menor ou igual a zero.");
- return;
- }
- if (!isValidInt(argAt(5))) {
- warnNotValidNumber(argAt(5));
- return;
- }
- int stackOffline = getInt(argAt(5));
- if (stackOffline <= 0) {
- sendMessage("<c>O número não pode ser menor ou igual a zero.");
- return;
- }
- toGive.getInventory().addItem(SpawnerUtil.getItemStack(
- Lists.newArrayList(),
- type,
- "?",
- amount,
- stack,
- delay,
- stackOffline
- ));
- toGive.updateInventory();
- return;
- }
- sendMessage("<c>Uso: <f>/sgive <jogador> <quantidade> <tipo> <stack> <delay> <porcentagem stack offline>");
- }
- @Override public List<String> tabComplete() { return getPlayersTabComplete(argAt(argsLength() - 1), Bukkit.getOnlinePlayers()); }
- });
- }
- @Override public void onStop() { }
- @EventHandler(priority = EventPriority.LOWEST) public void onSpawnerSpawn(SpawnerSpawnEvent e) { e.setCancelled(true); }
- public String getSerializedChunkLocation(Chunk chunk) {
- return chunk.getWorld().getName()+"@"+chunk.getX()+"@"+chunk.getZ();
- }
- public String getSerializedChunkLocation(Location loc) {
- Chunk chunk = loc.getChunk();
- return chunk.getWorld().getName()+"@"+chunk.getX()+"@"+chunk.getZ();
- }
- public Chunk deserializeChunkLocation(String loc) {
- String[] split = loc.split("@");
- return Bukkit.getWorld(split[0]).getChunkAt(Integer.valueOf(split[1]), Integer.valueOf(split[2]));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement