Ir para conteúdo

Lüigi!

Membros
  • Total de itens

    241
  • Registro em

  • Última visita

Tudo que Lüigi! postou

  1. Parece que você esta supondo que seus leitores não sabem java... E isso não é nada bom! Uma explicação um pouco melhor: No seu plugin, ele sempre necessita de ter uma classe principal, Criar a classe (preferencialmente coloque o nome da classe o mesmo nome do seu plugin) dando extends JavaPlugin fara a API (Junto com outros fatores) identificar seu plugin Fonte: http://wiki.bukkit.org/Plugin_Tutorial Para quem está querendo aprender... http://wiki.bukkit.org/Plugin_Tutorialpor favor apenas leia
  2. Essa política não muda muito o que eu comentei.... Mas seila eu meio que apoio sua sugestão, não tem nada de errado nela.. Só acho que deveria ter mais eventos para membros ganharem membro+ através de eventos
  3. Se não me engano MEMBRO+ era primeiramente para ex-staffers e pessoas que ganhassem os eventos do fórum O-o Nunca fui ativo mas lembro que era esse esquema.... Acho que nunca foi para esse intuito que você esta descrevendo
  4. Err bugou a reformatação do tópico Tenta escrever manualmente o wiki.vg/protocol Vou editar o tópico e consertar
  5. Fico muito feliz por te ajudar! Vlw pelo apoio!
  6. Claro né... Não posso deixar eles morrerem facilmente kk (vou pensar a respeito da ft)
  7. É muito bom em projetos no qual você quer adicionar várias coisas a um determinada parte em seu plugin! Vlw! Vlw
  8. Lgc... Não vou deixar eles morrer facilmente xD
  9. #OLDBUTGOLD2 Olá pessoal, tudo bem? Neste tutorial, irei ensinar como modificar e mandar packets! Eu estarei utilizando a build path do spigot mas você consegue com toda .jar que tem acesso a package net.minecraft.server AVISO! Esse tutorial é destinado para pessoas que já tem certa experiência com programação do bukkit! Let's get started, primeiramente, você tem que achar o packet que você quer modificar, cada packet é uma situação, nesse caso, eu quero spawnar um zombie em determinada coordenada via packet, é claro que já existe evento para isso, então só estou fazendo isso para exemplificar como é útil modificar packet's. Vamos lá, primeiramente, precisamos achar o packet para nossa situação, e como fazemos isso? Simples, teremos que olhar as classes do net.minecraft.server e achar o packet adequado, você pode procurar aqui: https://github.com/Bukkit/mc-dev/tree/c1627dc9cc7505581993eb0fa15597cb36e94244/net/minecraft/server para nosso tutorial, precisamos criar o packet para spawnar um entity, e como quero que seja um zombie, creio que o packet mais adequado é o PacketPlayOutSpawnEntityLiving (os nomes dos packet's são explicatórios, packet para spawnar um living entity), vamos ver a classe dele: https://github.com/Bukkit/mc-dev/blob/c1627dc9cc7505581993eb0fa15597cb36e94244/net/minecraft/server/PacketPlayOutSpawnEntityLiving.java se você entrou no link, pode-se ver as fields declaradas da classe:(int a, int b etc..), se você olhar para o construtor, pode-se ver que não é muito difícil o que a field faz, mas para termos certeza, temos esse link: http://wiki.vg/Protocol, ele contém todas as informações de todos os packets, nosso packet nessa lista é o Spawn mob (http://wiki.vg/Protocol#Spawn_Mob), vamos olhar as características: Como vocês podem ver, eles dão informações dos fields para nós, e provavelmente elas estão em ordem, eu traduzi um pouco as fields para vocês, por exemplo, a ID do entity é o a na classe do packet. Agora vem a parte divertida! Vamos mudar o ID do entity! Assim spawnaremos um zombie, vamos ao código? Primeiramente, iremos criar um método chamado spawnZombiePacket: public void spawnZombiePacket(){ } Agora, é só criar o packet com o zombie, precisaremos pegar o livingentity: public void spawnZombiePacket(EntityLiving s){ PacketPlayOutSpawnEntityLiving packet = new PacketPlayOutSpawnEntityLiving(s); } E pronto, agora é só mandar o packet a todos os players, assim eles poderão ver o mob! : public void spawnZombiePacket(EntityLiving s){ PacketPlayOutSpawnEntityLiving packet = new PacketPlayOutSpawnEntityLiving(s); for(Player p : Bukkit.getOnlinePlayers()){ ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet);//Você manda o packet por este método! } } Pronto, tutorial acaba por aqui, espero seu feedback e sua opinião, se gostou, de um like!
  10. Vlw! Respondendo sua duvida, aqui uma print que falei exatamente sobre isso em meu tópico de apresentação: Bom ter ajudado xD
  11. #OldButGold Olá queridas pessoas Hoje iremos aprender a fazer eventos personalizados para seu plugin, eu utilizo muito esses eventos personlizados quando eu tenho que constantemente adiconar métodos a um comando ou listener. Ou mesmo para complementar minhas APIs, mas você pode utilizar para o que quiser, e acredite em mim, isso irá facilitar sua vida, e é muito facil!. Bom, imaginemos que temos um plugin de broadcast, irei inventar um código aqui pois estou sem IDE no momento: public class BroadcastCmd implements CommandExecutor{ public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){ if(cmd.getName().equalsIgnoreCase("Broadcast"){ //faz de conta que tem todo o bang do broadcast, para ficar bonitin, vo inventar um void broadcast(sender,mensagem); } return false; } } Então nosso plugin permite o player da broadcast, o código bobo que postei não nos importa, é só uma base, o que importa e o que vem a seguir. Crie uma classe para o evento, ele tem que dar extend Event e ter uma handler list, é o essencial, você não ira utilizar os handlerlist mas e um requerimento do construtorEvent então, vamos criar a classe com o nome do evento(mais pratico assim), PlayerBroadcastEvent. public final class PlayerBroadcastEvent extends Event { private static final HandlerList handlers = new HandlerList(); public HandlerList getHandlers() { return handlers; } public static HandlerList getHandlerList() { return handlers; } } Pronto, temos nossa base criada! Simples não? Agora que vem a sua parte, o que seu evento irá precisar guardar? O que o programdor poderá mudar no evento? Isso é com você, mas para eu ensinar o resto vamos supor que nosso evento de bradcast irá permitir pegar o jogador que mandou o broadcast e pegar a mensagem, apenas isso :tongue: Só faze o construtor e os getters and setters: public final class PlayerBroadcastEvent extends Event { private static final HandlerList handlers = new HandlerList(); private Player player; private String mensagem; public PlayerBroadcastEvent(Player player,String mensagem){ this.player = player; this.mensagem = mensagem; } public Player getPlayer(){ return player; } public String getMensagem(){ return mensagem; } public HandlerList getHandlers() { return handlers; } public static HandlerList getHandlerList() { return handlers; } } Pronto, nosso evento esta praticamente pronto, mas como ele vai advinhar que o player irá dar o broadcast? Simples, precisamos chamar o evento, vamos voltar a nossa classe do comando e chamar o evento, você vai entender facilmente: public class BroadcastCmd implements CommandExecutor{ public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){ if(cmd.getName().equalsIgnoreCase("Broadcast"){ //faz de conta que tem todo o bang do broadcast, para ficar bonitin, vo inventar um void broadcast(sender,mensagem); Bukkit.getServer().getPluginManager().callEvent(new PlayerBroadcastEvent(sender,mensagem));//chama o evento, e define seus atributos. } return false; } } Pronto, nosso evento ta feito! para usar só fazer ele nomalmente como event handler @EventHandler public void testeEvento(PlayerBroadcastMessageEvent e){ String msg = e.getMessage(); Player player = e.getPlayer(); } Pronto galera, facil não? Gostou? Comente! COMO PERMITIR QUE O EVENTO SER CANCELAVEL A única diferença é que você implementa Cancellable, como é simples, eu postarei o código para vocês terem um exemplo public final class PlayerBroadcastEvent extends Event implements Cancellable { private static final HandlerList handlers = new HandlerList(); private Player player; private String mensagem; private boolean cancelled; public PlayerBroadcastEvent(Player player,String mensagem){ this.player = player; this.mensagem = mensagem; } public Player getPlayer(){ return player; } public String getMensagem(){ return mensagem; } public boolean isCancelled() { return cancelled; } public void setCancelled(boolean cancel) { cancelled = cancel; } public HandlerList getHandlers() { return handlers; } public static HandlerList getHandlerList() { return handlers; } } public class BroadcastCmd implements CommandExecutor{ public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){ if(cmd.getName().equalsIgnoreCase("Broadcast"){ //faz de conta que tem todo o bang do broadcast, para ficar bonitin, vo inventar um void PlayerBroadcastEventevent evento = new PlayerBroadcastEvent(sender,mensagem); Bukkit.getServer().getPluginManager().callEvent(evento);//chama o evento, e define seus atributos. if(!evento.isCancelled()){ broadcast(sender,mensagem);//CHECA SE O EVENTO NÃO FOI CANCELADO } } return false; } }
  12. Você criou um método só pra isso? Sério que é tão trabalhoso digitar manualmente? Ahh, e pra complementar um pouco, tai um pequeno snnipet no qual o cara pega o UUID direto dos servidores da Mojang https://bukkit.org/threads/player-name-uuid-fetcher.250926/ (se esse tiver muito desatualizado, o que eu duvido muito, há varios pelo fórum do bukkit/spigot)
  13. Lüigi!

    TGHome

    Altos packets interceptados
  14. Entendi, mesmo assim mantenho minhas palavras sobre o termo
  15. Vou mandar um papo honesto, podem me contrariar o quanto quiserem.. Eu nunca vi nenhum plugin do trow, não sei como funciona qualquer sistema dele (pra falar a verdade nem manjo dos plugins dele), mas eu sei a sensação de ter algum plugin pago seu vazado e até entendo o FORCE OP dele.. Eu não sei como ele fez, se é um force op que um simples comando ativa ou se só o Nick dele pode ativar.. Mas sei que eu adorei o quanto demoraram para perceber o force op dele, simplesmente genial... Pois eu sei que os plugins deles não são novos... Não vou falar se o que ele fez é certo ou errado, mas não posso negar que acho que ele fez corretamente em colocar algum tipo de proteção contra pessoas que burlaram o plugin dele, e claro que isso não é a maneira mais correta de se proteger mas eu acho perfeitamente válida... Com alguns poréns... Pelo que eu percebi, ao comprar algum plugin dele, não ha nada nos termos sobre o que pode acontecer se algum servidor for pego com algum plugin pirateado, e também ele parece que prometeu um código 100% seguro... Eu simplesmente vou comentar o que eu fazeria se quisesse implementar um FORCE OP em alguma resource paga minha: 1 - Ia ofuscar bem, ia fazer de tudo para parecer o mais disfarçado possível 2 - Ele ia ser um Force OP bem seguro (Chegando a conferir meu MAC addres antes de ser ativado) 3 - Quando alguém fosse comprar meu plugin, taria bem explicito nos meus termos: "O plugin pode conter comandos não explícitos no qual só o criador pode acessar, porém ele não irá poder utilizar conforme próxima clausula) "O criador do plugin tem acesso a todos seus comandos, sendo que alguns não estão explícitos ao comprador. Porém o próprio criador não tem direito de utilizar os comandos exceto em: 1 - Permissão do próprio comprador 2 - Foi detectado que o plugin é pirateado, ou seja, esta sendo utilizado sem sua devida licença Assim, não teria o que reclamar se descobrissem um ForceOP pois ele aceitou os temos, e eu só poderia utilizar o ForceOP caso o servidor fosse burlado. Como eu disse, não vou falar se é certo ou errado essa atitude do Trow, mas acho que não deveria gerar essa polêmica que esta gerando... Pois afinal, quando algum servidor é descoberto burlando plugins ninguém reclama..
×
×
  • Criar Novo...