Ir para conteúdo

[OFF] Um plugin em jasmin


leonardosc

Posts Recomendados

Eu não vou explicar oq é jasmin pq eu to com preguiça, só procurar no google.
 
Jasmin Download: https://sourceforge.net/projects/jasmin/files/(Se tu tiver interessado em compilar isso, e/ou editar)
 
O único proposito disso pra mim é pra conhecimento.
 
É simplesmente um código (em jasmin) que quando compilado e transformado em plugin (adicionado em um jar com plugin.yml)
vai simplesmente "adicionar" um comando (/jasmintest) que quando você executar você vai ganhar um diamante, gg ez
 
Código: (Eu comentei quase todas as instruções, só não comentei onde não achei necessário)

; ======================== ; 
;  Criado por leonardosnt  ;
;    Data: 27/09/2016      ;
; ======================== ;


.class public JasminTest
.super org/bukkit/plugin/java/JavaPlugin


; Construtor padrao
.method public <init>()V
   aload_0
   invokenonvirtual org/bukkit/plugin/java/JavaPlugin/<init>()V
   return
.end method


; Metodo onEnable
.method public onEnable()V
  .limit stack 3
  .limit locals 2

  aload_0                                                                              ; Carrega o this na stack
  invokevirtual JasminTest/getLogger()Ljava/util/logging/Logger;                       ; Chama o método getLogger e carrega na stack
  ldc "Iniciando plugin e.e"                                                           ; Carrega a string na stack
  invokevirtual java/util/logging/Logger/info(Ljava/lang/String;)V                     ; Chama o metodo Logger.info

  return
.end method

; Metodo onCommand
.method public onCommand(Lorg/bukkit/command/CommandSender;Lorg/bukkit/command/Command;Ljava/lang/String;[Ljava/lang/String;)Z
  .limit stack 10                                                                      ; Nao to afim de calcular o tamanho da stack/locals
  .limit locals 10                                                                     ; entao vou colocar em 10, pelo menos vai funcionar

  aload_1                                                                              ; Carrega o sender na stack
  instanceof org/bukkit/entity/Player                                                  ; Verifica se ele é um player (instanceof Player)
  ifeq console                                                                         ; Se nao for ele vai pra label console
                                                                                       
player: ; Label player                                                                 
  aload_1                                                                              ; Carrega o CommandSender na stack
  ldc "Vc quer um dima? Toma ai"                                                       ; Carrega a string na stack
  invokeinterface org/bukkit/command/CommandSender/sendMessage(Ljava/lang/String;)V 2  ; Chama o metodo CommandSender.sendMessage
                                                                                       
  aload_1                                                                              ; Carrega o sender na stack
  checkcast org/bukkit/entity/Player                                                   ; 'Faz' o cast pra player
  invokeinterface org/bukkit/entity/Player/getInventory()Lorg/bukkit/inventory/PlayerInventory; 1 ; Chama o metodo Player.getInventory

  iconst_1                                                                             ; Carrega o numero 1 na stack (tamanho do array)
  anewarray org/bukkit/inventory/ItemStack                                             ; Cria um novo array do tipo ItemStack
  dup                                                                                  
                                                                                       
  iconst_0                                                                             ; Carrega o numero 0 na stack (posicao que o item vai ser guardado no array)
  new org/bukkit/inventory/ItemStack                                                   ; Cria um novo ItemStack
  dup                                                                                  
  getstatic org/bukkit/Material/DIAMOND Lorg/bukkit/Material;                          ; Carrega o Material.DIAMOND na stack
  invokespecial org/bukkit/inventory/ItemStack/<init>(Lorg/bukkit/Material;)V          ; Chama o construtor do ItemStack
  aastore                                                                              ; Guarda o item no array

  invokeinterface org/bukkit/inventory/PlayerInventory/addItem([Lorg/bukkit/inventory/ItemStack;)Ljava/util/HashMap; 2  ; Chama o método PlayerInventory.addItem
  pop                                                                                  ; Remove, o retorno desse método que foi chamado acima, da stack
  goto end                                                                             ; Vai pra label end
                                                                                       
console: ; Label console                                                               
  aload_1                                                                              ; Carrega o CommandSender na stack
  ldc "Vc eh apenas um console, nao tem dima pra vc"                                   ; Carrega a string na stack
  invokeinterface org/bukkit/command/CommandSender/sendMessage(Ljava/lang/String;)V 2  ; Chama o metodo CommandSender.sendMessage
                                                                                       
end:                                                                                   
  iconst_1                                                                             ; Carrega 1 (true) na stack
  ireturn                                                                              ; Retorna
.end method 

 
Código com highlight: https://gist.github.com/leonardosnt/465d60d458dce13fa0a2278814aaa9a8
 
O código em java seria mais ou menos assim

import org.bukkit.plugin.java.*;
import org.bukkit.*;
import org.bukkit.entity.*;
import org.bukkit.inventory.*;
import org.bukkit.command.*;

public class Foo extends JavaPlugin {
  
  @Override
  public void onEnable() {
    getLogger().info("Iniciando plugin e.e");
  }
  
  @Override
  public boolean onCommand(CommandSender sender, Command command, String label, String ... args) {

    if (sender instanceof Player) {
      sender.sendMessage("Vc quer um dima? Toma ai");
      ((Player) sender).getInventory().addItem(new ItemStack(Material.DIAMOND));
    } else {
      sender.sendMessage("Vc eh apenas um console, nao tem dima pra vc");
    }
    
    return true;
  }
  
} 

 
Plugin.yml

name: JasminTest
main: JasminTest
version: 1.0.0
author: leonardosnt

commands:
  jasmintest:

 
Comando pra compilar:

REM Compila
java -jar jasmin.jar JasminTest.j

REM Cria um jar e adiiciona a classe e o plugin.yml
jar cvf JasminTest.jar plugin.yml JasminTest.class
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...