ParticleNativeAPI [1.7+]
Szybkie API cząsteczek kompatybilne z różnymi wersjami dla serwerów Spigot i Bukkit.
- Dostępne pliki
- 22
- Obsługiwane wersje
- 14
- Najnowszy plik
- 22.12.2024
Szczegóły dotyczące wersji 3.x.x tej biblioteki znajdziesz w sekcji Migracja z 3.x.x na 4.x.x.
ParticleNativeAPI
ParticleNativeAPI to API do tworzenia cząstek dla serwerów Spigot i Bukkit, zaprojektowane tak, aby:
- szybkie (porównywalne z natywnym kodem Java!),
- kompatybilne w dół do MC 1.7 (zawiera usunięte cząstki!),
- elastyczne w użyciu,
- stosunkowo proste i wygodne w użyciu.
Ponadto to API cząstek obsługuje tworzenie niektórych cząstek:
- z bloków,
- z przedmiotów,
- z kolorem (tylko 1 cząstka na pakiet),
- z kolorem i rozmiarem,
- z efektem przejścia koloru i rozmiaru,
- z określonym ruchem (tylko 1 cząstka na pakiet),
- z kątem,
- ze opóźnieniem,
... i nadal być szybkim oraz kompatybilnym między wersjami Minecrafta.

Cała struktura API ma na celu odzwierciedlenie tego, jak Minecraft obsługuje wysyłanie pakietów, jednak jest silnie typowana i nie używa refleksji do tego!
Jak używać
Tworzenie cząstek odbywa się w bardzo prostym łańcuchu metod:
- z API -> pobierz listę cząstek -> pobierz cząstkę
- wybierz właściwości cząstki
- utwórz pakiet cząstki
- wyślij go, używając list cząstek.
To wszystko.
// get API from plugin instance
ParticleNativeAPI api = ParticleNativePlugin.getAPI();
// ... or generate it using core module ("this" is Your plugin instance)
particleApi = ParticleNativeCore.loadAPI(this);
Player player = ...;
Location loc = player.getLocation();
// as simple as that
particleApi.LIST_1_8.FLAME // from desired list get particle
.packet(true, loc) // make particle packet
.sendTo(player); // send it to certain player(s)
Wysyłanie tego pakietu oraz warunki, na jakich to robisz, zależą od Ciebie. Aby przeczytać więcej na temat powyższych list cząstek, zachęcam do przeczytania szczegółowego tutorialu w moim repozytorium na GitHubie tutaj.
Dlaczego jest szybki
Wewnętrznie używa biblioteki ObjectWeb's ASM do generowania kodu Java zależnego od wersji, zamiast użycia refleksji.
Refleksja jest używana wyłącznie do rozpoznania dla której wersji Minecraft API powinno być generowane, na etapie uruchamiania serwera.
Prosty benchmark
Znaczące środowisko:
- localhost server MC 1.17
- JDK 17
- Intel i5-12600
- 32 GB RAM DDR4
Jednak to nadal prosty benchmark (nie JMH ani coś podobnego), więc wyniki powinny być traktowane z odrobiną ostrożności.
Wszystkie kody użyte do testów znajdują się w moim repozytorium tutaj.
Testy składają się z 4 metod wysyłania cząstek:
- nms - używa bezpośrednio NMS i OBC do wysyłania pakietu,
- particle_native_api - używa tego API do wysyłania cząstek prostą metodą,
- spigot_api - używa metody spawnParticle API Spigot (dla gracza) do wysyłania efektu,
- reflection - używa klas uzyskanych za pomocą refleksji (z dostępnością ustawioną na true) do wysyłania cząstek. Te klasy/metody/pola są buforowane do wielokrotnego użycia.

Jak widać, przynajmniej na moim komputerze, ParticleNativeAPI jest porównywalny do Spigot API i bardzo zbliżony pod względem szybkości do implementacji zależnej od wersji.
Minimalny przegląd przykładu użycia
public class PluginName extends JavaPlugin {
// loaded particle API
private ParticleNativeAPI particleApi;
@Override
public void onEnable() {
// load API and store it for later use
particleApi = ParticleNativeCore.loadAPI(this);
// or get it from running plugin api instance
// check if everything is fine with it
// if (ParticelNativePlugin.isValid()) {
// particleApi = ParticleNativePlugin.getAPI();
// }
// else {
// getLogger().log(Level.SEVERE, "Error occurred while loading dependency.");
// this.setEnabled(false);
// return;
// }
}
// example usage
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!command.getName().equalsIgnoreCase("somecmd")) return true;
if (!(sender instanceof Player)) {
sender.sendMessage(ChatColor.RED + "You must be player to use this command!");
return true;
}
Player pSender = (Player) sender;
Location loc = pSender.getLocation();
// particle spawning
particleApi.LIST_1_8.FLAME // select particle from list
.packet(true, loc) // create particle packet
.sendInRadiusTo(player, 30D); // send it to player if in 30 block radius
return true;
}
}
Dla właścicieli serwerów
Jeśli zostałeś przekierowany tutaj przez inną wtyczkę, po prostu umieść jar w folderze plugins.
Ta biblioteka sama w sobie nic nie robi poza fazą uruchamiania. Może być używana jako zależność przez inne wtyczki.
Dla twórców wtyczek
Szczegółowy samouczek z różnymi przykładami można znaleźć w moim repozytorium na GitHubie tutaj.
Maven dla core API z przykładową konfiguracją (oficjalne repozytorium):
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<!-- replace shaded version with main artifact -->
<shadedArtifactAttached>false</shadedArtifactAttached>
<!-- relocate API classes to avoid same-classpath-conflicts -->
<!-- with other plugins using this core API -->
<relocations>
<relocation>
<pattern>com.github.fierioziy.particlenativeapi</pattern>
<shadedPattern>me.yourpluginpackage.particleapi</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
<!-- other plugins ... -->
</plugins>
<!-- other build config ... -->
</build>
<dependencies>
<dependency>
<groupId>com.github.fierioziy.particlenativeapi</groupId>
<artifactId>ParticleNativeAPI-core</artifactId>
<version>4.2.0</version>
<scope>compile</scope>
</dependency>
<!-- other dependencies -->
</dependencies>
Maven dla konfiguracji referencyjnej pluginu (oficjalne repozytorium):
<dependencies>
<dependency>
<groupId>com.github.fierioziy.particlenativeapi</groupId>
<artifactId>ParticleNativeAPI-plugin</artifactId>
<version>4.2.0</version>
<scope>provided</scope>
</dependency>
<!-- other dependencies -->
</dependencies>
Poproś o funkcję lub zgłoś problem
Jeśli znalazłeś błąd lub po prostu chcesz zgłosić funkcję, użyj tracker’a issue na moim GitHubie tutaj.
Kod źródłowy
Cały kod źródłowy wtyczki jest dostępny w moim repozytorium na GitHubie tutaj.
Dla wersji 3.x.x aktualne źródła znajdują się na gałęzi master-v3 tutaj.
Kompatybilność
Testowane wersje Spigota: 1.7.10, 1.8.8, 1.12, 1.14.3, 1.15.2, 1.16.5, 1.17, 1.18, 1.19, 1.19.3, 1.20.2, 1.20.6, 1.21.1, 1.21.3, 1.21.4.
Testowane wersje Paper-Spigot (od 1.20.6 wewnętrzne rozbieżności z Spigot): 1.20.6, 1.21.3, 1.21.4.
Wtyczka powinna być kompatybilna przynajmniej między MC 1.7 a MC 1.20.6 na ten moment.
Powinno działać także na Bukkit (CraftBukkit).
Będzie wymagać aktualizacji tylko wtedy, gdy dodano nową funkcję/naprawę błędu lub nastąpiły zmiany w obsłudze pakietów w przyszłych wersjach Minecrafta.
Pamiętaj, że ta API będzie faworyzować kompatybilność wsteczną
wraz z zakresem obsługiwanych wersji MC zamiast kompatybilności w przód samej API.
Najczęściej będzie to ogłaszane jako nowa wersja główna (np. z 3.x.x na 4.x.x)
That said, next API updates might sometimes force some changes
in Your code to again be compatible with newer API version.
Opis projektu pochodzi z CurseForge i został udostępniony po polsku. Szczegóły konfiguracji, zależności oraz aktualne komunikaty autora sprawdź na w źródłowym katalogu CurseForge.
ParticleNativeAPI.jar 22.12.2024 728 KB
ParticleNativeAPI.jar 28.05.2024 318 KB
ParticleNativeAPI.jar 13.05.2024 315 KB
ParticleNativeAPI.jar 14.10.2023 306 KB
ParticleNativeAPI.jar 29.12.2022 304 KB
ParticleNativeAPI.jar 28.12.2022 263 KB
ParticleNativeAPI.jar 03.07.2022 255 KB
ParticleNativeAPI.jar 19.06.2022 244 KB
ParticleNativeAPI.jar 10.05.2022 235 KB
ParticleNativeAPI.jar 26.12.2021 235 KB
ParticleNativeAPI.jar 20.06.2021 231 KB
ParticleNativeAPI.jar 04.09.2020 178 KB
ParticleNativeAPI.jar 20.07.2020 212 KB
ParticleNativeAPI.jar 26.06.2020 215 KB
Jak bezpiecznie sprawdzić ten plugin
Wybierz zgodny plik
Oznaczenia wersji pochodzą z metadanych autora. Dobierz również właściwe oprogramowanie serwera i Javę.
Zachowaj kopię
Przed pierwszym startem skopiuj świat, konfigurację oraz dane pozostałych pluginów.
Przeczytaj log
Po uruchomieniu sprawdź brakujące zależności i pierwszy błąd związany z nazwą pluginu.