Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Jak řešit problémy

Jak řešit základní problémy na serveru se dočtete na následujícím odkaze: https://docs.papermc.io/paper/basic-troubleshooting a níže.

V případě, kdy se potýkáte s problémem se serverem, pluginem (připadně módem), příčina problému lze téměř vždy vyčíst z logu serveru. Pokud ani po projevení dostatečné (nebo alespoň minimální/základní) snahy nejste schopni obsahu logu porozumět,můžete si nechat poradit.

Pokud z logu příčina vyčíst nelze, vypnutím všech pluginů zjistěte, zda problém způsobuje plugin, nebo samotná platforma (pokud po vypnutí všech pluginů problém zmizí, logicky jej způsobuje plugin).

V případě, kdy problém způsobuje plugin, pomocí binárního hledání zjistěte jaký (a případně plugin aktualizujte/chybu nahlašte).

Pokud chybu způsobuje samotná platforma serveru, rovněž ji aktualizujte a případnou chybu nahlašte.

Pokud se nejedná vyloženě o problém (chybu), ale nevíte si rady s určitým chováním/nastavením pluginu, vše potřebné se téměř vždy dočtete v dokumentaci platformy/pluginu, případně to lze vyčíst z konfigurace, eventuelně se můžete obrátit na autora/podporu pluginu. Pokud chcete nastavit určitá práva, naučte se pracovat s permisemi.

V případě, kdy nevíte, jaký plugin (nebo mód) problém způsobuje, ale víte, že jej způsobuje plugin, nejefektivnější metodou, jak takový plugin najít, je pomocí metody binárního hledání. Jak tato metoda funguje a jak ji provést naleznete na následujícím odkaze: https://docs.papermc.io/paper/basic-troubleshooting#binary-search

U módovaných serverů může být binární hledání zdlouhavější, jelikož se server v případě chybějící závislosti (dependency) pravděpodobně zhroutí (vypne). V takovém případě je zapotřebí chybějící závislost pomocí logu najít a přemístit zpět do aktivních módů (a neodstraňovat jej do doby, než mód, který jej vyžaduje, bude v aktivních módech). Zároveň server může vyžadovat seznam módů na serveru synchronizovaný s klientem, a tak bude zapotřebí módy odebrat nejen ze serveru, ale i klienta.

Metoda binárního hledání je pro hledání ve větších listech o mnoho rychlejší, než procházet pluginy jeden po druhém. Například kdyby bylo na serveru 100 pluginů, v případě, kdy byste vypínali plugin jeden po druhém, a vadný plugin byl na 73. místě, potřebujete 73 pokusů. Pokud však využijete metody binárního hledání, potřebujete maximálně 8 pokusů (100 -> 50 -> 25 -> 12 -> 6 -> 3 -> 2 -> 1).

Vizualizace binárního hledání

Jak udělat XY/Jaká je permise pro XY/Jaký je placeholder pro XY/Jaký je příkaz pro XY

Jak je popsáno v této části, různé funkce, permise, placeholdery i příkazy jsou vždy specifické pro daný plugin. Ačkoli pluginy sdílejí napříč mnoho společných principů, tyto věci je vždy nutné dohledat v dokumentaci daného pluginu, případně platformy.

Princip akce a reakce

Když přidáte plugin, provedete příkaz, a server se začne automaticky vypínat, crashovat, něco přestane fungovat apod., logicky se prvně zamyslím a zkontroluji, zda daná akce není příčinou daného problému.

Pokud tedy nastane problém po provedení určité akce, podezření byste měli prvně mít na právě tuto akci.

Pro pokročilejší

Hledání ve zdrojovém kódu

V případě, kdy rozumíte programování, v určitých případech se může hodit přečíst zdrojový kód.

Pokud je projekt open-source na GitHubu, můžete v URL projektu přepsat ’github“ na ’github1s“ a po zmáčknutí klávesy Enter se Vám projekt otevře ve webovém editoru. Toho stejného můžete docílit přepsáním github.com na github.dev, nebo zmáčknutím znaku . (tečka) v GitHub repozitáři, což Vás na repozitář v github.dev editoru přesměruje. github1s.com i github.dev mají totožné funkce, github.dev je oficiální GitHub platforma (já osobně preferuji github1s, jelikož mi přijde svižnější).

V tomto textovém editoru můžete jednoduše vyhledávat napříč všemi soubory projektu (vlevo nahoře 3 vertikální čáry pod GitHub logem -> Edit -> Find in Files).

V případě, kdy plugin open-source není, můžete plugin dekompilovat pomocí Java decompileru, jako JD-GUI, což ale u některých pluginů (zejména placených) může porušovat TOS (podmínky používání).

Hledání konfiguračních souborů ve zdrojovém kódu

Konfigurační soubory se ve zdrojovém kódu nachází v /src/main/resources/, tedy např. pro EssentialsX je naleznete zde.

Pokud plugin podporuje více platforem, obvykle jsou tyto soubory ve sdílené složce, které všechny tyto verze pluginu využívají, jak je tomu u pluginu TAB (by NEZNAMY), kde se tyto soubory nachází ve složce shared (často se ale nazývá i jinak, například common) viz https://github.com/NEZNAMY/TAB/tree/master/shared/src/main/resources/config

Někdy však plugin takové soubory neobsahuje, nebo tomu tak není u všech souborů. Například u tohoto pluginu je základní konfigurace v kódu místo externího souboru.

Changelog

V changelogu je popsán seznam změn, tedy nové funkce, opravy chyb, zranitelností a ostatní změny. Z toho důvodu je dobré při aktualizaci pluginu changelog zkontrolovat, aby Vám důležité věci neutekly. Changelog se však může hodit i při řešení různých problémů. Případů, kdy se changelog hodí je mnoho. Jedním takovým konkrétním příkladem může být například u pluginu Citizens, které podporují pouze poslední subverzi (tedy při vydání podpory pro 1.20.2 již není podporována 1.20.1). Pokud byste tedy chtěli použít verzi podporující 1.20.1, je zapotřebí v changelogu najít build, kdy vyšla verze podporující 1.20.2, a tím pádem stáhnout poslední build vydaný před touto verzí (podporující 1.20.2).

Na každé platformě, kde je plugin zveřejňován, changelog najdete jinde, ale téměř vždy jej někde najdete, například:

Pokud se změny serverových platforem nenachází na stránce platformy, jako například u Paperu, změny byste měli nalézt alespoň v GitHub Releases (např. zde, nebo Git commitech na platformě, kde je vyvíjena (to je pro Paper GitHub, pro Spigot Jira, pro někoho to může být GitLab).

Pokud je software open-source, v commitech na platformě, kde je projekt vyvíjen (GitHub, GitLab, Jira, Gitea, …), najdete veškeré změny, nehledě na to, zda se jedná o platformu, plugin, nebo mód (jelikož je takto obecně vyvíjen software).

Ať už hledáte jak udělat, docílit nějaké věci, určitý plugin, mód, příčinu specifické chyby či zdroj (config/část v dokumentaci/…) apod., obvykle ideální způsob, jak najít to, co potřebujete, je pomocí Google.

Dalším pomocníkem může být Discord vyhledávání. Na aktivních Discord serverech existuje spousta zpráv, a tak šance, že se už někdo na stejný dotaz ptal, je vysoká. Proto než se v Discord kanálu na něco zeptáte, je vhodné zkontrolovat, jestli už zprávu s podobným dotazem/problémem nenajdete.

Níže naleznete obecné začátečnické tipy, které Vám můžou pomoci.

Při vyhledávání určité chyby kopírujte pouze relevantní část, tedy text, který je pro všechny stejný, tzn. u chyby pouze samotnou error zprávu bez času, log levelu apod., zkrátka pouze relevantní část chyby.

Pokud hledáte specifickou věc jako např. plugin, jeho určité nastavení nebo config, jednoduše vyhledávejte pomocí klíčových slov jako např. “<jméno pluginu> config.yml”, “minecraft ban plugin” apod. (viz hledání pluginů)

#### Přesné vyhledávání {#google-strict-search} Pokud chcete, aby Google vrátil výsledky pouze s přesnou shodou hledaného textu, jednoduše hledaný text uzavřete do uvozovek.

V případě, kdy vyhledáváte v textových kanálech na Discordu, vyhledávejte dle klíčových slov, které mohly být v dotazu/při popisu problému použity. Samozřejmě slova můžou být použita v různých tvarech, což je dobré mít na paměti.

Je dobré mít na paměti, že při použití klíčových slov ve vyhledávání nemusí být daná slova vedle sebe, ale záleží na jejich pořadí.

V Discord vyhledávání záleží na diakritice.

Samozřejmě čím víc relevantní k problému (tj. pokud máte problém s pluginem a daný plugin má Discord server, je ideální začít hledat právě tam) daný Discord server je, a čím více zpráv obsahuje, tím lépe.

Překladač

V případě, kdy je text v cizím jazyce, kterému nerozumíte, použijte překladač, jako DeepL, nebo klasický Google Translate.

Když do Google překladače vložíte URL (odkaz), tuto URL můžete následně rozkliknout a přeloží se celá stránka (případně existují rozšíření do prohlížeče, které stránku přeloží). Eventuelně může mít Váš prohlížeč tuto funkci zabudovanou.

Ať se jedná o textový editor, nebo prohlížeč, téměř vždy můžete v programu vyhledávat v textu pomocí klávesové zkratky Ctrl + F (klávesu F3 nepoužívejte).

V případě, kdy hledáte určitou věc, ale nevíte, jak přesně se nazývá, zkuste vyhledávat pomocí klíčových slov.

V konfiguračních souborech si při vyhledávání v textu dávejte pozor na barvy a proměnné.

Když kopírujete určitý text z internetu, dejte si pozor, abyste nezkopírovali mezeru na konci, případně začatku textu, což se někdy děje při označení textu dvojklikem. V takovém případě nezapomeňte mezeru/y z hledaného textu odstranit, jinak nemusíte v textu najít nic, i když se hledaný text bez mezer v daném textu nachází.

Čtení stacktrace

Co je to stacktrace se dočtete zde. Při čtení stacktraců se hodí základní znalost Javy. Všechny pojmy použité v této části naleznete právě v kapitole o základních znalostech Javy.

Níže jsou uvedeny konkrétní příklady stacktrace a jak by mohl vypadat myšlenkový pochod při jeho čtení. Schopnost vyřešit problém za pomoci stacktrace záleží Vašich zkušenostech a znalostech, postupně se v tomto ohledu pravděpodobně budete zlepšovat.

Příklady

1. příklad

[16:55:29] [Server thread/ERROR]: Encountered an unexpected exception
org.spongepowered.configurate.serialize.SerializationException: [entities, spawning, monster-spawn-max-light-level] of type java.lang.Integer: java.lang.NumberFormatException: For input string: "default"
    at org.spongepowered.configurate.serialize.NumericSerializers.parseNumber(NumericSerializers.java:346) ~[configurate-core-4.1.2.jar:?]
    at org.spongepowered.configurate.serialize.NumericSerializers.lambda$static$9(NumericSerializers.java:254) ~[configurate-core-4.1.2.jar:?]
    at org.spongepowered.configurate.serialize.FunctionScalarSerializer.deserialize(FunctionScalarSerializer.java:40) ~[configurate-core-4.1.2.jar:?]
    at org.spongepowered.configurate.serialize.ScalarSerializer.deserialize(ScalarSerializer.java:115) ~[configurate-core-4.1.2.jar:?]
    at org.spongepowered.configurate.objectmapping.ObjectMapperImpl.load0(ObjectMapperImpl.java:64) ~[configurate-core-4.1.2.jar:?]
    ....
    at io.papermc.paper.configuration.Configurations.initializeWorldDefaultsConfiguration(Configurations.java:154) ~[paper-1.20.1.jar:git-Paper-196]
    at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:210) ~[paper-1.20.1.jar:git-Paper-196]
    at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1100) ~[paper-1.20.1.jar:git-Paper-196]
    at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:317) ~[paper-1.20.1.jar:git-Paper-196]
    at java.lang.Thread.run(Thread.java:833) ~[?:?]

Tento stacktrace začíná exceptionem, který hází Configurate. A co to ten Configurate je? To můžete jednoduše zjistit pomocí vygooglení názvu softwaru/knihovny a názvu projektu/autora (obě tyto věci vyčtete z package, v tomto případě org.spongepowered.configurate). V tomto případě tedy stačí pomocí Google stačí vyhledat “spongepowered configurate”. Dočtete se, že: “Configurate is a simple configuration library”. Jedná se tedy o knihovnu pro práci s konfiguračními soubory.

Název exceptionu SerializationException tedy značí, že nastala chyba při serializaci konfigurace, tedy zjednodušeně řečeno jejího načítání. Konkrétně nastala chyba při serializaci hodnoty entities.spawning.monster-spawn-max-light-level (zapsáno pomocí tečkové notace).

Tato chyba nastala, jelikož nastal NumberFormatException, jelikož byl očekáván Integer (číslo), avšak hodnota pole byla “default” (což je String).

Nyní už teda víte, že hodnota nějakého pole je default, i když bylo očekáváno číslo.

Jak ale teď zjistit, o jaký konfigurační soubor se jedná? V tomto případě to lze jednoduše zjistit dvěma způsoby:

  1. ze stacktrace
at io.papermc.paper.configuration.Configurations.initializeWorldDefaultsConfiguration(Configurations.java:154)...
  1. pomocí Google

když pomocí Google vyhledáte “monster-spawn-max-light-level” (s uvozovkami pro přesnou shodu, bez ní byste pravděpodobně narazili na spoustu nerelevantních výsledků), vyskočí na Vás následující stránka: https://docs.papermc.io/paper/reference/world-configuration

Obě tyto informace nám říkají, že se pole entities.spawning.monster-spawn-max-light-level s hodnotou default nachází v Paper world configu, jehož lokace je /config/paper-world-defaults.yml.

Dobře, teď víte, že hodnota pole entities.spawning.monster-spawn-max-light-level je default, i když je očekáváno číslo. Proč se ale tak stalo? Prakticky to může znamenat dvě možnosti:

  1. Někdo manuálně nastavil hodnotu tohoto pole na default - to se nejspíš nestalo
  2. Hodnota polí default byla nastavena automaticky, nikdo ji manuálně nenastavoval

Prakticky vždy byla příčina této chyby možnost číslo 2. Dělo se tak při downgradu serveru, kdy Paper config byl vygenerován na novější verzi, který hodnotu default podporuje, avšak uživatel používal starší verzi, která ještě ne, tím pádem jediná validní hodnota byla číslo.

(eventuelně by Paper mohl obsahovat chybu, ale to je velmi nepravděpodobné)

Super, teď i víte, proč problém nastal, ale jak jej vyřešit? Logicky z této situace vyplývají dvě řešení:

a) Manuální nastavení hodnoty entities.spawning.monster-spawn-max-light-level (resp. všech polí s hodnotou default) z default na číslo (výchozí hodnotu pole byste nalezli v PaperMC dokumentaci).

b) Config smazat a nechat vygenerovat nový (výchozí).

Řešením je tedy resetování Paper configů nebo nastavení polí s hodnotou “default” na validní (číselné) hodnoty.

2. příklad

.....
[12:32:13] [Server thread/INFO]: [HeadDatabase] Loading HeadDatabase v1.2.0
.....
[12:32:21] [Server thread/ERROR]: [DeluxeHub] Plugin DeluxeHub v3.5.5 has failed to register events for class fun.lewisdev.deluxehub.hook.hooks.head.DatabaseHead because me/arcaniax/hdb/api/DatabaseLoadEvent does not exist.
[12:32:21] [Server thread/ERROR]: Error occurred while enabling DeluxeHub v3.5.5 (Is it up to date?)
java.lang.NoClassDefFoundError: me/arcaniax/hdb/api/HeadDatabaseAPI
	at fun.lewisdev.deluxehub.hook.hooks.head.DatabaseHead.onEnable(DatabaseHead.java:20) ~[DeluxeHub-3.5.5.jar:?]
	at fun.lewisdev.deluxehub.hook.HooksManager.lambda$new$0(HooksManager.java:35) ~[DeluxeHub-3.5.5.jar:?]
	at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source) ~[?:?]
	at java.util.stream.ReferencePipeline$2$1.accept(Unknown Source) ~[?:?]
	..........
	at java.lang.Thread.run(Unknown Source) ~[?:?]
Caused by: java.lang.ClassNotFoundException: me.arcaniax.hdb.api.HeadDatabaseAPI
	at org.bukkit.plugin.java.PluginClassLoader.loadClass0(PluginClassLoader.java:153) ~[server.jar:git-Purpur-1428]
	at org.bukkit.plugin.java.PluginClassLoader.loadClass(PluginClassLoader.java:105) ~[server.jar:git-Purpur-1428]
	at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:?]
	... 23 more
[12:32:21] [Server thread/INFO]: [DeluxeHub] Disabling DeluxeHub v3.5.5

V tomto logu se setkáte se stacktracem s chybou NoClassDefFound. Plugin DeluxeHub se snaží pracovat s pluginem HeadDatabase, konkrétně jeho class (třídou) me/arcaniax/hdb/api/HeadDatabaseAPI. V logu se dále dočtete, že plugin HeadDatabase na serveru nainstalovaný a zaplý je, tím pádem problémem nemůže být chybějící plugin.

DeluxeHub se tedy snaží pracovat s class pluginu, který na serveru je, ale konkrétní class nemá. To může znamenat následující:

  1. DeluxeHub pracuje s jinou verzí pluginu

Toto bývá u pluginů nejčastější příčina, avšak tomu tak v tomto případě není.

  1. Nejedná se o plugin s názvem HeadDatabase, s kterým DH pracuje

Typicky by měly závislosti a odkazy na ně uvedeny na stránce pluginu. U DeluxeHub tomu tak není, ale s jakým pluginem se DeluxeHub snaží pracovat lze jednoduše vyčíst ze stacktrace. Konkrétní plugin dohledáte pomocí Google pomocí názvu pluginu a názvu package.

Díky tomu dokážete dohledat, že se jedná konkrétně o tento plugin: https://www.spigotmc.org/resources/head-database.14280/, avšak na serveru je úplně jiný plugin s názvem HeadDatabase, konkrétně tento https://www.spigotmc.org/resources/headdatabase.95118/, což dokážete zjistit za pomoci Google vyhledáním “HeadDatabase 1.2.0”.

Jaké je v tomto případě řešení? Prvně bych se podíval do konfigurace pluginu, zda nejde hook na HeadDatabase vypnout (zkrátka aby se DH nesnažil pracovat s HeadDatabase). DeluxeHub takovou možnost nemá, a tak lze pouze tuto skutečnost nahlásit vývojáři DeluxeHub a doufat, že tuto chybu vyřeší, nebo plugin odstranit (což by v tomto konkrétním případě byla nejrozumnější varianta, jelikož se jedná o zastaralý, neudržovaný plugin, který pravděpodobně ani používat nechcete a máte jej na serveru “omylem”) (případně díky tomu že je HeadDatabase plugin open-source, eventuelně byste mohli změnit název plugin, pokud jste toho schopni. Chyba by tak nenastala, jelikož by DeluxeHub nesnažil pracovat s pluginem “HeadDatabase”, jelikož by plugin s takovým názvem na serveru nebyl).

3. příklad

[19:37:03] [Server thread/ERROR]: Could not load 'plugins/UltraStaffChat-5.2.2.jar' in folder 'plugins'
org.bukkit.plugin.InvalidDescriptionException: Invalid plugin.yml
	at org.bukkit.plugin.java.JavaPluginLoader.getPluginDescription(JavaPluginLoader.java:178) ~[paper-api-1.18.2-R0.1-SNAPSHOT.jar:?]
	at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:159) ~[paper-api-1.18.2-R0.1-SNAPSHOT.jar:?]
	at org.bukkit.craftbukkit.v1_18_R2.CraftServer.loadPlugins(CraftServer.java:418) ~[paper-1.18.2.jar:git-Paper-388]
	at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:288) ~[paper-1.18.2.jar:git-Paper-388]
	at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1164) ~[paper-1.18.2.jar:git-Paper-388]
	at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:316) ~[paper-1.18.2.jar:git-Paper-388]
	at java.lang.Thread.run(Unknown Source) ~[?:?]
Caused by: java.io.FileNotFoundException: Jar does not contain plugin.yml
	... 7 more

V tomto stacktracu se setkáte s chybou “Invalid plugin.yml”. Příčina chyby je přímo uvedena: “Jar does not contain plugin.yml”. Proč tato chyba nastene se dočtete zde (případně stačí chybu zadat do Google a naleznete spoustu příspěvků na toto téma).

V tomto příkladu se jedná o BungeeCord plugin.