Ir para conteúdo

abidux

Desenvolvedores(as)
  • Total de itens

    761
  • Registro em

  • Última visita

Tudo que abidux postou

  1. top dmss o cara é dono dos plugins mais bonitos
  2. Bom dia, rapaz. @EventHandler void grow(BlockGrowEvent event) { Material blockType = event.getNewState().getType(); if (blockType == Material.CACTUS || blockType == Material.SUGAR_CANE_BLOCK) { event.getBlock().getWorld().dropItemNaturally(event.getBlock().getLocation(), blockType == Material.CACTUS ? new ItemStack(Material.CACTUS) : new ItemStack(Material.SUGAR_CANE)); event.setCancelled(true); } } Isso aqui resolve seu problema. O evento é disparado antes do bloco crescer. Sendo assim, você precisa pegar o newState para saber o tipo. Depois, cancele o evento e drope o item normalmente.
  3. abidux

    INATIVOEncantamento

    se quiser encomendar um, chama no discord: abidux
  4. top, top foi complicado fazer a integração com mercado pago? tentei recentemente fazer algo nesse sentido e deu maior rolo
  5. me chama no discord, posso tentar fazer um para você
  6. Me chama no discord. Podemos conversar sobre o que você precisa.
  7. me chama no discord que eu te dou uma ajuda, é meio complicado explicar por texto, mas dando uma ideia geral... você pode usar um for dentro de um for, tipo: String pre = chunk.getWorld().getName().toLowerCase() + " "; for (int x = chunk.getX()-1; x <= chunk.getX()+1; x++) { for (int z = chunk.getZ()-1; z <= chunk.getZ()+1; z++) { if (Main.claims.containsKey(pre + x + " " + z) return true; } } return false; na teoria deve funcionar, mas não testei
  8. Aqui está um código que pode te ajudar: private static final char PROGRESS_CHAR = '|'; // mude para o character que quiser private static final int TOTAL_SECONDS = 3600; // coloque o tempo total aqui private static String generateBar(int secondsPassed, int totalCharacters) { float percentage = (float)secondsPassed / TOTAL_SECONDS; int paintedCharacters = (int)(percentage * totalCharacters); StringBuilder builder = new StringBuilder("§a"); // cor preenchida for (int i = 1; i <= totalCharacters; i++) { builder.append(PROGRESS_CHAR); if (paintedCharacters != totalCharacters && i == paintedCharacters) builder.append("§7"); // cor vazia } return builder.toString(); } Caso tenha dúvidas, pode me contatar via discord. Aqui está um exemplo de uso: int secondsPassed = // coloque aqui um código para pegar os segundos que se passaram String holograma = generateBar(secondsPassed, 10);
  9. INTRODUÇÃO Bom dia. Durante o desenvolvimento do meu servidor (duxnation) eu estou tendo que criar um formatador de dinheiro. Eu tinha um método antigo que funcionava bem, mas eu queria melhorar a performance. Consegui criar um algoritmo que faz isso numa média de 3900ns (0,0039ms) a partir da segunda execução. Nesse post vou compartilhar o processo para a criação desse algoritmo. Se você só quiser o código, tem um título bem grande no final do post com ele. ANTES DE COMEÇAR Alguns algoritmos compartilham essas variáveis: private static final DecimalFormat formatter = new DecimalFormat("#,##0.00", DecimalFormatSymbols.getInstance(Locale.forLanguageTag("pt"))); private static final String[] SUFFIXES = {"K", "M", "B", "T", "Q", "Qq", "Sx", "Sp", "Oc", "N", "D", "Un", "DD"}; Não vou comentar muito sobre elas, até porque não usei o formatter no final e uma array é bem tranquilo de compreender. PRIMEIRO ALGORITMO (~22800ns) private static String format1(double number) { String formatted = formatter.format(number); if (number < 1000) return formatted; String[] sp = formatted.split("\\."); return sp[0] + "." + sp[1].substring(0, 2) + SUFFIXES[sp.length - 2]; } Esse algoritmo é bem simples: Formate o número. Se for menor que mil, retorne o valor formatado (já está pronto) Se não for, divida esse valor formatado a cada "\\." (ponto final colocado pelo formatador a cada três números) Retorne o primeiro pedaço, mais um ponto final, mais os dois primeiros caracteres do segundo pedaço, mais o sufixo necessário. Pronto. É só isso. Esse algoritmo roda em 0,0228ms e você pode usar ele se não for formatar muitos números. Eu poderia ter parado aí, mas queria tentar acelerar. SEGUNDO ALGORITMO (~24000ns) private static String format2(double number) { String formatted = formatter.format(number); if (number < 1000) return formatted; String[] sp = formatted.split("\\."); return new StringBuilder(sp[0]).append(".").append(sp[1].substring(0, 2)).append(SUFFIXES[sp.length - 2]).toString(); } Esse algoritmo funciona mais ou menos como o primeiro, mas eu tentei adicionar um StringBuilder para ver se agilizava o processo. Como deu para perceber, não deu muito certo. Eles rodam mais ou menos no mesmo tempo, mas, na média, esse ficou com 24000ns (0,024ms) TERCEIRO ALGORITMO (~5300ns) private static String format3(double number) { if (number < 1000) return formatter.format(number); char[] chars = String.valueOf((int)number).toCharArray(); int suffix = (chars.length - 1) / 3 - 1; int n = chars.length % 3; if (n == 0) n = 3; StringBuilder builder = new StringBuilder(); for (int i = 0; i < n; i++) builder.append(chars[i]); return builder.append(".").append(chars[n]).append(chars[n + 1]).append(SUFFIXES[suffix]).toString(); } Você pode ver que aqui eu ainda estou usando o formatter para números menores que mil. Então isso é igual ao primeiro. Se o número não for menor que mil, eu dou cast nele para int (lembre-se disso para depois), transformo-o numa String e depois num char[] Depois eu faço alguns cálculos para pegar o índice do sufixo (na variável suffix) e quantos números teriam antes da vírgula (na variável n) Em seguida, monto tudo, como no segundo algoritmo. Esse algoritmo é bem rapidinho. Eu ia parar nele, porque estava satisfeito com a velocidade. Entretanto, se eu executar com um número maior que 2147483647 (valor máximo do Integer), ele quebra, porque eu dei cast. QUARTO ALGORITMO (~11600ns) private static String format4(double number) { if (number < 1000) return String.valueOf(number - number % .01); double n = number - number % 1; long length = length(n); long p = length%3; if (p == 0) p = 3; double base = n / Math.pow(10, length-p); int suffix = (int)((length - 1) / 3 - 1); return new StringBuilder().append(base - base % .01).append(SUFFIXES[suffix]).toString(); } private static long length(double number) { for (long i = 0;;i++) { if (number / Math.pow(10, i) < 10) return i+1; } } Você pode reparar que eu usei uma técnica diferente para limitar as casas decimais dessa vez. Estou usando uma expressão matemática: f(x) = x - x % 0,01 (Caso não saiba "%" significa resto da divisão) Essa função tira todos os números depois da segunda casa decimal. Por que eu decidi fazer dessa forma? Sempre que você puder usar uma função matemática na programação, use. Elas costumam ser absurdamente mais rápidas, principalmente quanto competem com uma função como "split" ou "format" do formatter. Continuando... Se o número for menor que mil, volto o valor limitando as casas decimais. Senão, salvo o número sem as casas decimais numa variável n Depois usa função length que eu criei. Ela retorna a quantidade de algarismos antes da vírgula. Na variável p eu defino quantos números eu quero antes da vírgula no número formatado. Na variável base eu divido n por 10^(length-p) Em seguida, calculo o sufixo necessário e junto tudo, limitando as casas decimais no final. ÚLTIMO ALGORITMO (~3900ns) [FIX 26-01-2023] public static String format5(double number) { StringBuilder builder = new StringBuilder(); int suffix = -1; if (number >= 1000) { double n = number - number % 1; long length = length(n); long p = length%3; if (p == 0) p = 3; number = n / Math.pow(10, length-p); suffix = (int)((length - 1) / 3 - 1); } int base = (int) number; int decimals = (int)((number - base)*100); builder.append(base).append("."); if (decimals < 10) builder.append("0"); builder.append(decimals); if (suffix != -1 && suffix < SUFFIXES.length) builder.append(SUFFIXES[suffix]); return builder.toString(); } private static long length(double number) { for (long i = 0;;i++) { if (number / Math.pow(10, i) < 10) return i+1; } } Esse algoritmo é grandinho. Bom, vamos lá... Primeiro, eu crio um StringBuilder para montar minha String depois. Também inicio a variável suffix com o valor -1 Se o número for maior ou igual a mil, eu vou fazer o processo para ajustar e colocar o sufixo Para isso, pego só a parte inteira do número. Por algum motivo, isso faz o algoritmo ser alguns ns mais rápido. Depois, uso a função length para calcular os algarismos antes da vírgula no número original. Em seguida, calculo o p, para mover a vírgula. Movo a vírgula como no último algoritmo, usando: n / 10^(length-p) Por final, calculo o sufixo necessário. Depois disso vem a mágica. Separei o double em dois int. O processo de transformar int em String é muito mais rápido do que double para String. No final do algoritmo, junto tudo usando o builder. CONCLUSÃO É importante dizer que os algoritmos não são 100% precisos porque matemática não é tão precisa quando se trata de números decimais, mas os erros são mínimos. Foi um processo muito divertido fazer esses algoritmos e espero que gostem desse "tutorial" que mais foi um jeito de eu compartilhar meu hobby com vocês! Espero que tenham aprendido algo novo hoje e, se gostaram, considerem clicar no amei/gostei no post :) Se quiser acompanhar meus projetos, você pode entrar no discord do meu servidor, onde posto minhas novas criações: https://discord.gg/R3dDARsRR4 Até mais!
  10. Agradeço! Sim, eu sei que os jogadores não se importam muito com como funciona debaixo dos panos. Eu estou fazendo tudo meu porque era um dos meus objetivos quando comecei a fazer plugins. É mais pela realização pessoal do que qualquer outra coisa. Esse é um projeto que será feito com muito carinho. Tenha um bom dia!
  11. pode me chamar no discord? queria te fazer uma pergunta mais técnica sobre teu projeto
  12. Olá. Alguns de vocês podem me conhecer, já que estou na comunidade há algum tempo. Sou um desenvolvedor com alguns anos de experiência. Sempre tive a vontade de ter um servidor, mas nunca tinha dinheiro para isso. Finalmente tenho idade para trabalhar e vou conseguir investir nesse sonho. Atualmente estou desenvolvendo um servidor de RankUP do zero. Já terminei o plugin de plots e estou desenvolvendo o de login. No entanto, como estou fazendo tudo sozinho, preciso de opiniões dos outros para muitas coisas. Por isso, venho convidar vocês a entrar no servidor do discord que criei para isso. Nele, você pode ver como está o progresso, opinar nas votações (ou nos chats, quando quiser) e ainda vai ganhar uma tag especial (beta) quando o servidor abrir. Claro, ainda não posso garantir que vou conseguir terminar o projeto, mas já tenho tudo encaminhado! Link para o discord: https://discord.gg/R3dDARsRR4 Obrigado por ler!
  13. abidux

    Cenário de Servidores Survival

    Gostaria de saber como estão os servidores voltados ao survival hoje em dia. Sinceramente, estou entediado de jogar Minecraft normalmente e queria ver o quanto eu poderia mudar o jogo de forma que continuasse divertido de se jogar. Eu tive algumas ideias interessantes, mas realmente não quero jogar com essas ideias sozinho. O servidor teria uma pegada mais de exploração e combate, deixando a mineração e construção um pouco mais opcionais. Pretendo, se possível, adicionar um sistema que se assemelharia com MMORPG, mas não haveria uma história principal, apenas side quests. Só gostaria de saber como estão servidores do tipo e se acreditam que valeria a pena fazer algo assim. Obrigado desde já.
  14. Dá uma olhada nas configurações recomendadas desses jogos, eu acredito que mine e roblox vão rodar sem problemas, quanto aos outros, nem ideia. A pior coisa do computador mesmo é a placa de vídeo, mas acho que ela roda bastante coisa, até. Vai ser bem difícil achar um computador com uma ótima placa de vídeo em conta hoje em dia, já que estão bem caras.
  15. abidux

    Plugin de máquinas

    Ficou daora. Só implementaria um sistema de mostrar as pessoas próximas por GUI para facilitar a adição de amigos. Seria um diferencial legal.
  16. Feliz natal, pessoal. Boas festas!
  17. entra em contato comigo no discord, posso tentar fazer um pra ti
×
×
  • Criar Novo...