Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Intellij - Szablony klas, które ułatwią ci tworzenie pluginów.


GotoFinal

Rekomendowane odpowiedzi

Opublikowano

Zrobiłem sobie z nudów kilka szablonów do IDE Intellij (Inne IDE od Javy niż Eclipse czy NetBeans, jak dla mnie znacznie lepsze), zawsze mnie wkurzało robienie tych głównych klas, klasy od komend, listenerów, zawsze ta sama scenka, to samo trzeba pisać itd...

Stworzyłem więc kilka szablonów które to delikatnie ułatwiają, może się komuś przydadzą :D

 

(na samym dole jest tez wyjaśnione jak je dodawać)

 

Plugin.yml

 

 

name: ${Plugin_name}
main: ${Main_class}
author: ${author}
#if ($authors.trim().length() > 0)
authors: [${authors}]
#end
version: 0.1
#if ($depend.trim().length() > 0)
depend: [${depend}]
#end
#if ($softdepend.trim().length() > 0)
softdepend: [${softdepend}]
#end
#set( $cmds = $commands.split(",") )
#set( $cmd = "invalid")
#if($commands.trim().length() > 0)
commands:
#foreach( $cmd in $cmds )
#set( $cmd = $cmd.trim() )
  ${cmd}:
    aliases: []
    description: ''
#end
#end

Po dodaniu takiego szablonu, podczas tworzenia nowego pliku możemy go sobie wybrać z listy:

3448814155415241277633.png

 

Widać tam na dole "Plugin.yml", klikamy i mamy takie okienko:

3472214155415241277633.png

w File Name musimy wpisać te "plugin.yml"

A resztę uzupełniamy wedle potrzeb.

Nie musicie uzupełniać wszystkich pół, jak nie wpiszecie nic do pół authors/depend/softdepend czy commands to te pola nie wygenerują się w pliku ;)

 

Przykładowe uzupełnienie:

(PS: Plugin.yml powinno być z małej, ale nie chce mi się poprawiać :D)

9919414155415251277633.png

 

I pliczek po kliknięciu OK:

name: MyFirstPlugin
main: com.gmail.email.myfirstplugin.Main
author: Steve
authors: [Maciek, Monika]
version: 0.1
softdepend: [Vault]
commands:
  heal:
    aliases: []
    description: ''
  stop:
    aliases: []
    description: ''
  lag:
    aliases: []
    description: ''
  tps:
    aliases: []
    description: ''

Możemy oczywiście edytować szablon, tak by zawsze podawało nas jako autora, a nie pytało :)

wystarczy zmienić 3 linijkę

author: Steve

 

 

 

 

BukkitPlugin [java]

 

 

Tworzy nam główną klasę pluginu z gotową metodą getInstance ;)

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end

import org.bukkit.plugin.java.JavaPlugin;

#parse("File Header.java")
public class ${NAME} extends JavaPlugin 
{
    private static ${NAME} instance;
    
    public static ${NAME} getInstance()
    {
        return instance;
    }
    
    @Override
    public void onLoad()
    {
        ${NAME}.instance = this;
    }

    @Override
    public void onEnable()
    {
        
    }

    @Override
    public void onDisable()
    {
        
    }
}

Jak chcemy stworzyć główną klasę, klikamy na naszą paczuszkę, dajemy new -> Class i wtedy z okienka niżej wybieramy nasz typ: 

1978414155415251277633.png

I wynik:

package test;

import org.bukkit.plugin.java.JavaPlugin;

/**
 * Created by Admin on 2014-11-09.
 */
public class MyPlugin extends JavaPlugin
{
    private static MyPlugin instance;

    public static MyPlugin getInstance()
    {
        return instance;
    }

    @Override
    public void onLoad()
    {
        MyPlugin.instance = this;
    }

    @Override
    public void onEnable()
    {

    }

    @Override
    public void onDisable()
    {

    }
}

PS: używam onLoad bo wykonuje się szybciej od onEnable więc zmienna jest szybciej gotowa do użycia i mamy mniejszą szansę że ją niechcący usuniemy ;)

 

 

 

 

CommandExecutor [java]

 

 

Prawie najprostszy z tych wszystkich:

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end

import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;

#parse("File Header.java")
public class ${NAME} implements CommandExecutor
{
  @Override
  public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args)
  {
    return true;
  }
}

Jak chcemy stworzyć nowego executora, klikamy na naszą paczuszkę, dajemy new -> Class i wtedy z okienka niżej wybieramy nasz typ:

7213114155415251277633.png

I wynik:

package test;

import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;

/**
 * Created by Admin on 2014-11-09.
 */
public class HomeCmd implements CommandExecutor
{
    @Override
    public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args)
    {
        return true;
    }
}

wszystko pięknie się zgadza, nie zapomnij zarejestrować :D

 

 

 

 

UtilsClass [java]

 

 

Najprostsza z klas:

Tworzy nam klase przystosowaną do takich "utils", zgodnie z niektórymi standardami powinny być one finalne i posiadać prywatny konstruktor, po co? By ktoś przypadkiem nie tworzył instancji takiej klasy, lub jej nie rozszerzał, bo obie te rzeczy nie mają tutaj żadnego sensu, bo klasa posiada same statyczne metody. 

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
public final class ${NAME}
{
    private ${NAME}() {}
}

Tworzenie:

2541214155415251277633.png

Wynik:

package test;

/**
 * Created by Admin on 2014-11-09.
 */
public final class MyUtils
{
    private MyUtils()
    {
    }
}

 

 

 

 

EventListener [java]

 

 

Moja ulubiona, tworzy gotowy listener danego eventu, ważne jest tutaj nazewnictwo klasy, kiedy tworzymy listener eventu "PlayerJoinEvent" to klasę nazywamy "PlayerJoinListener"

Niestety podczas tworzenia trzeba podawać nazwę głównej klasy, bo nie dało się tego sensownie ominąć, chyba że ma się nazwę głównej klasy taką sama jak projektu (nie modułu) to wtedy można użyć zmiennej {PROJECT_NAME}

 

By szablon działał sprawniej, warto mieć włączoną opcje automatycznych importów (na samym dolę opiszę jak to włączyć)

 

Klasa posiada też metodę "init" której wykonanie rejestruje nam event, czyli w głównej klasie, zamiast typowej rejestracji wykonujemy:

NaszListener.init();

 

 

Kod:

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end

import org.bukkit.Bukkit;
import org.bukkit.event.Listener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;

#parse("File Header.java")
public class ${NAME} implements Listener
{
    public static void init()
    {
        Bukkit.getPluginManager().registerEvents(new ${NAME}(), ${MAIN_CLASS}.getInstance());
    }

    @EventHandler(priority=EventPriority.NORMAL, ignoreCancelled=false)
    public void on$NAME.replace("Listener", "")(final $NAME.replace("Listener", "Event") event)
    {
        
    }
}

Użycie:

5377014155415251277633.png1398814155415251277633.png

Wynik:

package test;

import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;

import test.main.MyMainClass;

/**
 * Created by Admin on 2014-11-09.
 */
public class PlayerJoinListener implements Listener
{
    public static void init()
    {
        Bukkit.getPluginManager().registerEvents(new PlayerJoinListener(), MyMainClass.getInstance());
    }

    @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = false)
    public void onPlayerJoin(final PlayerJoinEvent event)
    {

    }
}

Prawda że piękne? :D

PS: wartości w EventHandlerze są domyślne, czyli tak samo działa @EventHandler bez żadnych argumentów.

 

 

 

 

MultipleEventListener [java]

 

 

Jeszcze ciekawsza wersja szablonu EventListenera, tutaj możemy tworzyć 1 listener z wieloma nasłuchiwanymi eventami ;)

 

Zasada działania podobna jak wyżej, też przydają się automatyczne importy itd.

Ale tutaj możemy nazwać już klasę jak tylko chcemy ;)

Podczas tworzenia wyskoczy okienko z pytaniem o glówną klasę oraz o eventy jakie chcemy nasłuchiwać, można podawać nazwę z lub bez końcówki "Event"

Czyli możemy podać PlayerJoinEvent lub PlayerJoin

Eventy oddzielamy przecinkiem.

 

Kod:

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end

import org.bukkit.Bukkit;
import org.bukkit.event.Listener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;

#parse("File Header.java")
public class ${NAME} implements Listener
{
    public static void init()
    {
        Bukkit.getPluginManager().registerEvents(new ${NAME}(), ${MAIN_CLASS}.getInstance());
    }
    

#set( $EVENTS_ARRAY = $EVENTS.split(",") )
#set( $eventUnTrimed = "invalid")

#foreach( $eventUnTrimed in $EVENTS_ARRAY )
  #set( $event = $eventUnTrimed.trim() )
  #set( $event = $event.replace("Event", "") )
  
    @EventHandler(priority=EventPriority.NORMAL, ignoreCancelled=false)
    public void on$event(final ${event}Event event)
    {
        
    }
    
#end
}

Użycie:

8925514155415251277633.png4338414155415251277633.png

 

Wynik:

package test;

import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRespawnEvent;

import test.main.MyMainClass;

/**
 * Created by Admin on 2014-11-09.
 */
public class MyListener implements Listener
{
    public static void init()
    {
        Bukkit.getPluginManager().registerEvents(new MyListener(), MyMainClass.getInstance());
    }


    @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = false)
    public void onPlayerJoin(final PlayerJoinEvent event)
    {

    }


    @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = false)
    public void onPlayerQuit(final PlayerQuitEvent event)
    {

    }


    @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = false)
    public void onPlayerRespawn(final PlayerRespawnEvent event)
    {

    }


    @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = false)
    public void onPlayerDeath(final PlayerDeathEvent event)
    {

    }

}

Czy to nie jest znacznie wygodniejsze? ;)

 

PS: wartości w EventHandlerze są domyślne, czyli tak samo działa @EventHandler bez żadnych argumentów.

 

 

 

 

 

 

I to co obiecywałem, uruchamianie automatycznych importów:

 

 

 

wchodzimy w zakładkę File -> Settings  (CTRL + ALT + S)

Wpisujemy w wyszukiwarkę "Auto Imports"

8570014155415251277633.png

I zaznaczamy:

7173114155415251277633.png

Tak jak widać na ss'ie, to dodaje tylko te importy których jest pewien, czyli jak znajdzie 2 klasy z taka samą nazwą, to nie zaimportuje.

 

 

 

 

No i na koniec dodawanie szablonów:

 

 

Możemy tam dostać się przez opcje, jak wyżej, jest tam zakładka "File and code templates" lub klikamy tak jak byśmy chcieli stworzyć nową klasę, ale zamiast kliknąć "Class" wybieramy "Edit File Templates..."

8848014155415251277633.png

 

Wtedy klikamy znaczek plusa, uzupełniamy nazwę i "Extension" (rozszerzenie) (we wszystkich po za plugin.yml ustaw tutaj "java", a w plugin.yml "yml" ale to i tak chyba nic tam nie zmienia :D)

Wklejamy nasz kodzik do dużego okienka i... gotowe ;)

2944614155415251277633.png

 

 

1438614356923701010629.png

 

  • Odpowiedzi 61
  • Dodano
  • Ostatniej odpowiedzi
Opublikowano

Świetne! Od teraz wygodniej mi się pisze :)

Dzięki, może potem dodam więcej, ale jak na razie nie widzę żadnych innych co by mogły się przydać, i były wykonalne bez pisania pluginu do Intellij :D

 

Chyba że wy macie jakieś propozycje? To zobaczę czy wykminię jak to zrobić, i dodam do listy i może mi też się przyda :)

1438614356923701010629.png

 

Opublikowano

Fajny pomysł, podoba mi się, sugerowałbym tylko jeżeli się da tam w tych schematach w schemacie od listenera zrobić na odwrót tj. pisałoby się samo "PlayerJoin", a do schemat nazywałby event "PlayerJoin", a do klasy dodawał "Listener", zdaje mi się żeby było tak lepiej.

Opublikowano

Fajny pomysł, podoba mi się, sugerowałbym tylko jeżeli się da tam w tych schematach w schemacie od listenera zrobić na odwrót tj. pisałoby się samo "PlayerJoin", a do schemat nazywałby event "PlayerJoin", a do klasy dodawał "Listener", zdaje mi się żeby było tak lepiej.

Na pewno nie nazwę eventu "PlayerJoin" metody nie powinny zaczynać się z małej litery ;)

 

A co do samego nazywania, niestety ale z tego co widzę (a starałem się pobawić zmiennymi) nie da się zmienić nazwy pliku :( musi być taki jak podaje się podczas tworzenia.

Mogę co najwyżej zmienić public class ..., ale nie zmienię samej nazwy pliku ;/ Więc klasa będzie niezbyt poprawna :D

1438614356923701010629.png

 

Opublikowano

Gratulacje !

Wreszcie wpadł ktoś na tak prosty lecz genialny pomysł :)

Dziękuję autorowi sam chętnie nie raz z tego skorzystam.

70569024104149212669.png

Opublikowano

Przydało by się jeszcze ogarnąć szablon do poma od mavena ;]

I5 4690 3.5GHz | GeForce GTX 970 | Crucial Ballistix 8GB 1600MHz | SSD Transcend 370 128GB & HDD Seagate 5.4k 500GB | MSI B85-G43 | Corsair CX 500W | Zalman Z3 PLUS

Opublikowano

Przydało by się jeszcze ogarnąć szablon do poma od mavena ;]

możliwości tych szablonów nie są dość zaawansowane, nawet robienie listy wymaga dziwnych obejść

#set( $cmds = $commands.split(",") )
#set( $cmd = "invalid")
#if($commands.trim().length() > 0)
commands:
#foreach( $cmd in $cmds )
#set( $cmd = $cmd.trim() )
  ${cmd}:
    aliases: []
    description: ''

np jak nie dodam tego:

#set( $cmd = "invalid")

to po jakiegoś uja będzie też kazało podać tę zmienną bo uzna że jest potrzeba.

 

+ nie ma żadnych fajnych możliwości tworzenia okienek, jak natrafi na zmienną która nie jest nigdzie do niczego przypisana, to walnie okienko żeby ją podać.

 

 

chyba że to był by bardzoooo podstawowy config mavena... wręcz pusty :D ale o jakiś ciekawszych opcjach to nie ma mowy.

Więc niezbyt widzę tu sens

1438614356923701010629.png

 

Opublikowano

Z tym mavenem chodziło mi głównie o sztywne ustawienie sekcji build, bo jak ja próbuję to zrobić to pom jest pusty :/

I5 4690 3.5GHz | GeForce GTX 970 | Crucial Ballistix 8GB 1600MHz | SSD Transcend 370 128GB & HDD Seagate 5.4k 500GB | MSI B85-G43 | Corsair CX 500W | Zalman Z3 PLUS

Opublikowano

Co Wy macie znowu z tym final? Każdy argument jest metodach final...

Taki styl, masa ludzi tego używa, znacznie szybciej ogarnia się wtedy kod, jak się go długi czas nie widzi lub to kod innej osoby, nawet jak nie ma komentarzy :D

 

Bo od razu widzisz czy zmienna jest gdzieś ponownie przypisywana, czy może zostaje tak jak jest.

 

A drugi znacznie ciekawszy powód, to w ten sposób dajesz kompilatorowi i JVM i programom typu ProGuard jasno do zrozumienia, że ta zmienna nie będzie się zmieniać i może on dzięki temu jakoś zoptymalizować wykonywanie się tego kodu.

 

 

No ale każdy ma własny styl ;) byle tylko nie łamać tych podstawowych zasad :P

 

 

 

Z tym mavenem chodziło mi głównie o sztywne ustawienie sekcji build, bo jak ja próbuję to zrobić to pom jest pusty :/

To sobie raczej sam musisz naskrobać, tak by pasowało pod ciebie.

1438614356923701010629.png

 

  • 2 tygodnie później...
  • 1 miesiąc temu...
  • 3 tygodnie później...
Opublikowano

Dobry pomysł na takie coś. Nowym użytkownikom bądź bardziej zaawansowanym się sprzyda to :)

Nm2aWDv.png

Pomogłem? Zostaw "Lubię to" pod postem!

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...