• Řešení problémů, diskuze a jiné problémy přesunuty na Discord
    Fórum již není tak aktivní jako dříve, a tak jsme přesunuli skoro veškerou aktivitu na náš Discord. Může se tedy stát, že zde nedostaneš odpověď a budeš zcela ignorován. Discord invite link: Odkaz
Status
Uzamknuto, nelze přidávat odpovědi.

Dop1

Aktivní člen
Úvod:

Zdravím Vás u mých návodů v programování Spigot/Bukkit pluginů!
Doufám, že jsem tě mým návodem zaujmul a budeš mě sledovat i nadále. Budu se Vás snažit naučit programovat na profesionální úrovni.


Instalace Eclipse:

Stáhneme si program Eclipse z tohoto odkazu:
Zdrojový kód:
https://www.eclipse.org/downloads/download.php?file=/oomph/epp/oxygen/R/eclipse-inst-win64.exe
Eclipse nainstalujeme jako Eclipse Neon.


Začátky:

V našem prvním kódu si popíšeme základní metody Spigotu a uděláme si také první příkaz. Co budeme potřebovat? Budeme potřebovat importovat knihovny Spigotu do našeho projektu. Čím začneme? Založíme si nový projekt pod názvem Test, zvolíme si Javu 8 či 7. Doporučuji dát nejnovější Javu.

Máme založený projekt a dalším krokem bude:
Klikneme pravým na projekt Test, zvolíme možnost Properties, zobrazí se nám okno v tomto okně přejdeme na Java
Build Path.

V poslední řadě nahoře přejdeme na Libraries, po pravé straně se nachází Add External JARs.
Otevře se nám adresář, my zvolíme API Spigotu, který si stáhneme ze stránky http://getspigotmc.org/ .
Skvěle, dáme OK a máme v našem projektu k dispozici API Spigotu (knihovny).

My postoupíme dál a vytvoříme si package v adresáři SRC a pojmenujeme si ho, jak se nám zachce (doporučuji pojmenovávat ,,cz.jméno.jménopluginu.main"). Do tohoto balíčku si vytvoříme třídu, kterou si opět pojmenujeme podle nás. Já jí vždy dávám název Main nebo Core, protože má vyjadřovat hlavní třídu. Máme tedy něco takového:

Zdrojový kód:
package cz.dop.test.main;
 
public class Main {
 
}
Potřebujeme dědit metody Spigotu a říci pluginu, že právě toto je hlavní třída. Uděláme to jednoduše:

Zdrojový kód:
package cz.dop.test.main;
 
public class Main extends JavaPlugin {
 
}
Ano, uděláme to pomocí třídy JavaPlugin (třída od Spigotu) a to tím že jí zdědíme. Nyní bychom určitě chtěli, aby to něco dělalo, že? Co takhle zkusit něco vypsat do konzole, když zapneme a vypneme server? Taktéž to uděláme jednoduše a to ve dvou krocích, prvně si napíšeme jednu povinnou a jednu nepovinnou metodu to této třídy:

Zdrojový kód:
package cz.dop.test.main;
 
public class Main extends JavaPlugin {
 
		public void onEnable() {
 
		}
 
		public void onDisable() {
 
		}
}
Metoda onEnable() se volá, když se server zapíná a tato metoda je pro plugin povinná, tedy nesmíme jí vynechat, jelikož by nám server plugin nespustil. Metoda onDisable() se volá, když se server vypíná a tato metoda je nepovinná. Nyní si zorganizujeme zprávy, které budeme chtít vypisovat při zapnutí a vypnutí do konzole.

Zdrojový kód:
package cz.dop.test.main;
 
public class Main extends JavaPlugin {
 
		public void onEnable() {
				Bukkit.getServer().getLogger().info("Plugin Test se zapnul!");
		}
 
		public void onDisable() {
				Bukkit.getServer().getLogger().info("Plugin Test se vypnul!");
		}
}
Ano, jak jste zjistili, je to velice jednoduché! Pro koho ne, tak to tedy vysvětlím. Voláme metodu info(), které má svůj argument typu String. Tímto řetězcem je právě zpráva, která se vypíše při spuštění. Není to zatím nic těžkého, co myslíte? Nyní bychom mohli vytvořit nějaký příkaz. Příkaz se dělá pomocí metody, která má 4 argumenty. Je to opět naprosto jednoduché. Samozřejmě u obtížnějších příkazu to už tak lehké nebude... K tomu ale až v dalších dílech
Zdrojový kód:
package cz.dop.test.main;
 
public class Main extends JavaPlugin {
 
		public void onEnable() {
				Bukkit.getServer().getLogger().info("Plugin Test se zapnul!");
		}
 
		public void onDisable() {
				Bukkit.getServer().getLogger().info("Plugin Test se vypnul!");
		}
 
		public boolean onCommand(CommandSender sender, Command cmd, String labels, String[] args) {
				return false;
		}
}
Návratová hodnota je boolean z toho důvodu, že se může vykonat, ale také nemusí a argumenty jsou z důvodu, aby se vám dobře definoval hráč. Příklad: send message Dop zpráva
Tento příkaz obsahuje 3 argumenty, nezapočítávám samotný příkaz send. Tomuto se tedy říká argumenty v příkazu. V naší metodě je to pod názvem args. Zatím máme pouze metodu, která příkaz vyvolá, my musíme vymyslet samotné jádro příkazu (co to udělá). Nyní potřebujeme ověřit, jestli příkaz neposílá někdo jiný než hráč. Samozřejmě to může být naopak nebo také vůbec, ale my to prozatím chceme takhle:
Zdrojový kód:
package cz.dop.test.main;
 
public class Main extends JavaPlugin {
 
		public void onEnable() {
				Bukkit.getServer().getLogger().info("Plugin Test se zapnul!");
		}
 
		public void onDisable() {
				Bukkit.getServer().getLogger().info("Plugin Test se vypnul!");
		}
 
		public boolean onCommand(CommandSender sender, Command cmd, String labels, String[] args) {
				if (!(sender instanceof Player)) {
						sender.sendMessage("Konzole nemůže vykonat tento příkaz!");
						return true;
				}
 
				return false;
		}
}
Takto napíšeme podmínku, jestli sender (odesílatel) není instancí hráče. Pokud toto platí, vypíše se nám zpráva o tom, že konzole nemůže vykonat tento příkaz. Konzole píšu rovnou, protože nikdo jiný než konzole nebo hráč ani příkaz odeslat nemůže. Podmínku máme hotovu, ale pořád nemáme samotný příkaz:
Zdrojový kód:
package cz.dop.test.main;
 
public class Main extends JavaPlugin {
 
		public void onEnable() {
				Bukkit.getServer().getLogger().info("Plugin Test se zapnul!");
		}
 
		public void onDisable() {
				Bukkit.getServer().getLogger().info("Plugin Test se vypnul!");
		}
 
		public boolean onCommand(CommandSender sender, Command cmd, String labels, String[] args) {
				if (!(sender instanceof Player)) {
						sender.sendMessage("Konzole nemůže vykonat tento příkaz!");
						return true;
				}
 
				Player player = (Player) sender;
 
				if (cmd.getName().equalsIgnoreCase("test")) {
						player.sendMessage("Toto se vykoná, když hráč napíše příkaz test!");
				}
 
				return false;
		}
}
Ano předposlední fáze, než plugin půjde spustit na reálném serveru. Nadefinovali jsme si proměnnou player, instanci třídy Player. Nyní máme podmínku, která prostě takhle bude a nikdo ji nemůže nějak ovlivnit (samozřejmě kromě vývojářů Spigotu ). Musíme si jí zapamatovat. Tato podmínka značí to, že pokud hráč napíše příkaz test, vykoná se nějaká akce. V tomto případě tou akcí je, že proměnné player se odešle zpráva.
Plugin máme hotový! Ale pozor, nesmíme ještě zapomenout na jeden soubor jménem plugin.yml, který nám udává informace o pluginu (jméno, příkazy, verzi, hlavní třídu, ...). Vytvoříme si ho a naše podoba bude následující:
Zdrojový kód:
name: Test
main: cz.dop.test.main.Main
version: 1.0
 
commands:
  test:
Plugin zkompilujeme. Uděláme to následujícím způsobem:
Klikneme pravým na náš projekt
2. Zvolíme možnost Export
3. Otevřeme okno, kde zvolíme možnost Java a JAR File
4. Nyní pouze zvolíme cestu, kde se nám soubor JAR uloží
5. Klikneme Finish

Gratuluji! Máte vyhráno!

Nahrání pluginu na server:

Máme-li zkompilovaný plugin, chceme ho určitě někde nahrát. Počítám s tím, že máte již připravený server. Pokud nemáte, na internetu jsou o tom stovky návodů. Po zapnutí serveru máme v hlavním adresáři složku plugins, do této složky přejdeme a přetáhneme zde náš JAR soubor. Když už máme plugin nahrán do této složky, resetujeme server nebo napíšeme do chatu/konzole příkaz /reload. Doporučuji resetovat server, je to bezpečnější.

Pokud server nemáte, plugin si spustťe pomocí terminálu, pokud někdo bude chtít, tak napíšu, jak.

Závěr:

Dnes jsme se naučili první příkaz a zprávu. Omlouvám se za chyby, které jsem tam neopatrností napsal :).
U dalšího návodu, ahoj!
 

Dop1

Aktivní člen
Skoro celé zkopírované od z této stránky. Tak hlavně, že si musíš hrát na chytrého...
Ano, inspirováno, zítra napíšu kompletně svoje pokračování, jen jsem nevěděl, jak začít.
EDIT: Pokud si myslíš, že si jen hraji na chytrého a programovat neumím, tak ti do sz klidně pošlu moje pluginy ;)
 

DadOswk

Aktivní člen
Nebolo by jednoduchšie na to spraviť aj video? :) Bolo by to praktickejšie podľa môjho návodu.

Skopírované neskopírované. Mohol si tam hodiť ako zdroj tamtú stránku z ktorej si sa inšpiroval.

Ja sa do toho nerozumiem ale ked tu máme toľko talentov na programovanie pluginov, naskytá sa otázka "Kde je nejaký prevratný plugin z naších končín ktorý by nejak ovplivnil väčšinu väčších serverov?" :)
 

iJuhan

Velmi známý člen
Nebolo by jednoduchšie na to spraviť aj video?
Ono to už možná někoho napadlo



P.S.: Tvůj kód jsem si četl jenom zletma a nikde nevidím registraci eventů v onEnable(), takže by mě zajímalo, jak ti to v tom případě funguje..
 

iJuhan

Velmi známý člen
P.S.: Tvůj kód jsem si četl jenom zletma a nikde nevidím registraci eventů v onEnable(), takže by mě zajímalo, jak ti to v tom případě funguje..
Taky pokud se nepletu, měl bys implementovat listener a chybí ti tam @EventHandler před onCommand()
 

Burák

̿’ ̿’\̵͇̿̿\з=( ͡ °_̯͡° )=ε/̵͇̿̿/’̿’̿ ̿ ༼☉ɷ⊙༽
Jako dobrý návod, hodil by se mi tak před rokem xD
 

Dop1

Aktivní člen
Taky pokud se nepletu, měl bys implementovat listener a chybí ti tam @EventHandler před onCommand()
EventHandler se píše před event, ne před boolean. Listener se dává, pokud je potřeba Event.
Večer napíšu ten další díl.

Nebolo by jednoduchšie na to spraviť aj video? Bolo by to praktickejšie podľa môjho návodu.

Skopírované neskopírované. Mohol si tam hodiť ako zdroj tamtú stránku z ktorej si sa inšpiroval.

Ja sa do toho nerozumiem ale ked tu máme toľko talentov na programovanie pluginov, naskytá sa otázka "Kde je nejaký prevratný plugin z naších končín ktorý by nejak ovplivnil väčšinu väčších serverov?"
Videa na svém kanálu mám. Developeři z Čech celkově pluginy na spigot nedávají. Znám jednoho z forum FH, který napsal AntiBot, který vyfiltruje všechny boty, ale na spigot ho nedal. :)
 

Burák

̿’ ̿’\̵͇̿̿\з=( ͡ °_̯͡° )=ε/̵͇̿̿/’̿’̿ ̿ ༼☉ɷ⊙༽
Já si programuju už asi týden hacky na 1.8. Jsou vyvíjené podle anticheatu GejTýmu. Mám hack např. na to jejich trapné CS:GO nebo co to má být :D Přidávám screenshot hlavního menu a ze hry :D
 

MrGopes

dunno wat to put here
Pisat to sem je podla mna zbytocne. Pokial to nikto nepripne tak to upadne do zabudnutia. Neviem ako ostatný, ale ja by som skor hladal zahranicne tutorialy kedze su lepsie a urcite kazdy kto chce programovat musi aspon trochu rozumiet anglicky.
 
Status
Uzamknuto, nelze přidávat odpovědi.
Top