Ranking
Popularna zawartość
Treść z najwyższą reputacją w 06/27/20 uwzględniając wszystkie działy
-
Kanały bungeecord - Teleportacja między serwerami
MocSwiatla320 i 2 innych przyznał(a) reputację patryk96 za temat
Witam wszystkich bardzo serdecznie! W tym poradniku przedstawię wam jak tworzyć polecenia pod bungeecord do komunikacji między serwerem proxy a serwerami bukkit. Bungeecord oferuje wysyłanie danych między serwerami więc polecenie typu /gtp <nick> które teleportuję gracza na inny serwer w jego dokładną lokalizację jest możliwe. Wszystko działa na zasadzie kanałów tzw. "Plugin Messaging Channel" które tworzymy w wtyczce pod bungeecord oraz bukkit. A następnie wysyłamy treść do serwera bukkit. Następnie na serwerze bukkit odbieramy ową treść i wykonujemy ją. Repozytoria maven: Bungeecord: https://www.spigotmc.org/wiki/create-your-first-bungeecord-plugin-proxy-spigotmc/ Spigot: https://www.spigotmc.org/wiki/spigot-maven/ Dla przykładu nazwiemy wtyczke: BungeeTolls Najlepiej jest stworzyć 1 projekt w którym będzie wtyczka pod bungeecord jak i pod bukkita. Już tłumaczę jak to zrobić. Tworzymy dwa package np.: me.patryk.bungetolls.bungee, me.patryk.bungetolls.bukkit. Następnie tworzymy klasy głowne np.: MainBungee, MainBukkit. Pamiętaj klasę MainBungee rozszerzasz o Plugin(net.md_5.bungee.api.plugin.Plugin) natomiast klasę MainBukkit o JavaPlugin(org.bukkit.plugin.java.JavaPlugin) Bungeecord: Klasa MainBungee import net.md_5.bungee.api.plugin.Plugin; public class MainBungee extends Plugin { private static MainBungee bungeePlugin; @Override public void onEnable(){ //Tworzenie instancji klasy głównej bungeePlugin = this; } public static MainBungee bungeePlugin(){ return bungeePlugin; } } Teraz możemy się zająć tworzeniem kanału dla bungeecord stwórz nową klasę o nazwie TeleportChannel. import net.md_5.bungee.api.plugin.Plugin; public class TeleportChannel { //Nazwa kanału private String channel; public TeleportChannel(Plugin plugin){ //Ustawienie nazwy kanału channel = "namespace:tp"; //Rejestracja kanału plugin.getProxy().registerChannel(channel); } //Pobieranie nazwy kanału public String getChannel() { return channel; } } Kanał został stworzony ma on nazwę "namespace:tp" Teraz w klasie MainBungee tworzymy instancję klasy TeleportChannel. //Instancja klasy TeleportChannel private static TeleportChannel teleportChannel; @Override public void onEnable(){ bungeePlugin = this; //Instancja klasy TeleportChannel teleportChannel = new TeleportChannel(this); } //Pobieranie klasy TeleportChannel public static TeleportChannel getTeleportChannel() { return teleportChannel; } Następnie musimy stworzyć funkcje które będą wysyłały informacje do serwera bukkit. public class TeleportChannel { //Nazwa kanału private String channel; public TeleportChannel(Plugin plugin){ //Ustawienie nazwy kanału channel = "namespace:tp"; //Rejestracja kanału plugin.getProxy().registerChannel(channel); } //Przenoszenie gracza na drugi server //Pobieramy serwery obu graczy sprawdzamy czy są takie same jeśli nie wysyłamy gracza player na server2 public void sendServer(ProxiedPlayer player, ProxiedPlayer other){ ServerInfo server1 = player.getServer().getInfo(); ServerInfo server2 = other.getServer().getInfo(); if(!server1.equals(server2)){ player.connect(server2); } } //Tutaj wysyłamy wiadomość do serwera bukkit public void teleport(ProxiedPlayer player, ProxiedPlayer other){ //Przesyłanie gracza na inny serwer sendServer(player, other); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); try { //Tutaj wpisujemy dane które mają zostać odebrane przez serwer bukkit //Dane wpisujemy przez writeUTF() //Pierwsze linijka jako prześlemy to akcja(nazwałem ją "teleport:to:player") //Druga linijka to nick gracza który chce się teleportować a trzecie linijka to nick gracza do którego się teleportujemy //Następnie wysyłamy treść graczowi other aby mógł ją odebrać dataOutputStream.writeUTF("teleport:to:player"); dataOutputStream.writeUTF(player.getName()); dataOutputStream.writeUTF(other.getName()); other.getServer().getInfo().sendData(channel, byteArrayOutputStream.toByteArray()); } catch (IOException e) { e.printStackTrace(); } } // //Pobieranie nazwy kanału public String getChannel() { return channel; } } Teraz możemy stworzyć komende /gtp. Polecenie tworzymy dla bungee nie dla bukkita. import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Command; import org.bukkit.ChatColor; //rozszerzamy o Command //Następnie eksportuje i implementujemy metody public class TeleportCommand extends Command { public TeleportCommand() { //Tutaj w super() wpisujemy nazwę polecenia super("gtp"); } @Override public void execute(CommandSender sender, String[] args) { //Sprawdzanie czy gracz podał nick if(args.length <1){ sender.sendMessage(new TextComponent(ChatColor.RED + "Podaj nick gracza")); return; } //Pobieranie ProxiedPlayer z argumentu 0 ProxiedPlayer other = MainBungee.getBungeePlugin().getProxy().getPlayer(args[0]); //Sprawdzanie czy gracz z argumentu jest online if(other == null){ sender.sendMessage(new TextComponent(ChatColor.RED + "Podany gracz jest offline")); return; } //Pobieranie gracza który użył polecenia ProxiedPlayer player = (ProxiedPlayer) sender; //Sprawdzanie czy player to other if(player.equals(other)){ sender.sendMessage(new TextComponent(ChatColor.RED + "Nie możesz teleportować się do siebie")); return; } //Wysyłanie treści do serwera bukkit MainBungee.getTeleportChannel().teleport(player, other); //Wysyłanie wiadomości do gracza który użył polecenia sender.sendMessage(new TextComponent(ChatColor.RED + "Zostałeś przeteleportowany do gracza: " + ChatColor.GOLD + other.getName())); } } Komenda została stworzona. Teraz trzeba ją zarejestrować w funkcji onEnable() w MainBungee. getProxy().getPluginManager().registerCommand(this, new TeleportCommand()); @Override public void onEnable(){ bungeePlugin = this; teleportChannel = new TeleportChannel(this); //Komende rejestrujemy w PluginManager getProxy().getPluginManager().registerCommand(this, new TeleportCommand()); } Bukkit: Wszystko co mieliśmy zrobić na bungee zrobione. Teraz przejdźmy do klasy MainBukkit musimy zaimplementować klase do PluginMessageListener a następnie zaimplementować metody. Powinieneś uzyskać taki efekt. public class MainBukkit extends JavaPlugin implements PluginMessageListener { @Override public void onEnable(){ } @Override public void onPluginMessageReceived(String s, Player player, byte[] bytes) { } } Teraz musimy zarejestrować kanały. @Override public void onEnable(){ //Rejestracja kanłu towarzyszącego Bukkit.getMessenger().registerOutgoingPluginChannel(this, "namespace:tp"); //Rejestracja kanału przychodzącego Bukkit.getMessenger().registerIncomingPluginChannel(this, "namespace:tp", this); } Kanały zarejestrowane został nam przedostatni krok (odbieranie wiadomości z proxy) Sprawdzamy czy kanał to "namespace:tp" oraz czy akcja to "teleport:to:player" jeśli wszystko się zgadza teleportujemy admin do other. @Override public void onPluginMessageReceived(String channel, Player player, byte[] bytes) { //Sprawdzamy czy otrzymana wiadomość jest z kanału "namespace:tp" if (channel.equals("namespace:tp")) { //Tutaj tworzymy akcje String action = null; //Lista Stringów do której dodamy nick gracza oraz nick drugiego gracza List<String> received = Lists.newArrayList(); DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(bytes)); try { //Ustawiamy akcje action = dataInputStream.readUTF(); //Następnie dodajemy do received pozostałe wiadomości while (dataInputStream.available() > 0) { received.add(dataInputStream.readUTF()); } } catch (Exception exeption) { exeption.printStackTrace(); } //Sprawdzamy czy akcja nie jest == null, i ma nazwę "teleport:to:player" if (action != null && action.equals("teleport:to:player")) { //Z received pobiermy graczy admin - gracz teleportujący się, jest w liście na pierwszym miejscu, other - gracz do którego się teleportujemy na drugim miejscu Player admin = Bukkit.getPlayer(received.get(0)); Player other = Bukkit.getPlayer(received.get(1)); //Tworzymy taska o odstępie czasowym 1/20 sekundy aby gracz zdążył przenieść się na serwer new BukkitRunnable() { @Override public void run() { //Sprawdzamy czy admin == null, jeśli jest zatrzymujemy kod if (admin == null) { return; // Sprawdzamy czy other == null, jeśli jest wysyłamy wiadomość do admina że gracz wyszedł z gry oraz zatrzymujemy dalszy kod } else if (other == null) { admin.sendMessage(ChatColor.RED + "Player left the game!"); return; } //Teleportujemy admina do othera admin.teleport(other); } }.runTaskLater(this, 1L); } } } } Ostatecznym krokiem jest stworzenie plików plugin.yml oraz bungee.yml #bungee.yml name: BungeeTolls author: patrick version: 1.0 main: me.patryk.bungetolls.bungee.MainBungee #plugin.yml name: BungeeTolls author: patrick version: 1.0 main: me.patryk.bungetolls.bukkit.MainBukkit Następnie wgrywamy plugin na serwer bukkit oraz bungeecord. Dziękuję za obejrzenie całego poradnika3 punkty -
Hosting
kerpson oraz jeden pozostały przyznał(a) reputację Wojciu za pytanie
Z wymienionych przez ciebie w ankiecie polecam tylko LVLUP.PRO, pomimo tego, że jest to mały hosting, to daje radę. Jedyny nadający się na serwery gier. O innych nie wspomnę, bo są to zwyczajnie masowe syfy, lepiej samemu postawić na VPSie i wyjdzie taniej Posiadałem kilka serwerów na różnych hostingach, ale tylko w LVLUP.PRO nie ma lagów jak u innych. PS. z kodem SKRIPT.PL masz 10% zniżki2 punkty -
Witam, wszystkich w tym poradniku dowiesz się jak stworzyć plugin, który będzie wyświetlał ilość graczy z naszego serwera na kanale Discord. Zaczynajmy! Krok 1. Stworzenie serwera discord. Klikamy plusik na pasku serwerów po lewej stronie naszego discorda następnie klikamy "Stwórz serwer" wpisujemy nazwe serwer i klikamy przycisk Stwórz. Krok 2. Stworzenie kanału głosowego. Kanał głosowy tworzymy dlatego, iż w kanałach tekstowych nie możemy używać spacji, a wygląd kanału "online-0" jest niezbyt profesjonalny. Kanał możemy już nazwać nazwą "Online: 0". Krok 3. Stworzenie aplikacji Discord oraz bota. Przejdź na stronę https://discord.com/developers/applications zaloguj się następnie przejdź do zakładki Applications i w prawym górnym rogu kliknij przycisk New Application wpisz nazwę aplikacji np.: minecraft i klikamy przycisk Create. Teraz przejdź do zakładki Bot i klikamy przycisk Add bot po prawo. Bot został stworzony. Krok 4. Zaproszenie bota na nasz serwer discord. Przechodzimy do zakładki OAuth2 w SCOPES zaznaczamy bot, w BOT_PERMISSIONS Admininistrator kopiujemy link i wklejamy go w nową kartę w przeglądarce wybieramy serwer i dołączamy do niego. Szczegółowo jest to opisane tutaj: https://discordpy.readthedocs.io/en/latest/discord.html#inviting-your-bot. Bot jest już na naszym serwerze teraz przejdźmy do pisania wtyczki pod serwer. Do stworzenia wtyczki będziemy potrzebowali api discorda my użyjemy JDA (Java Discord API). Aktualizować nazwę kanału możemy 2 razy na 10 minut, więc aktualizowanie nazwy kanału zrobimy w tasku co 6 minut. Repozytoria maven: Spigot: https://www.spigotmc.org/wiki/spigot-maven/. JDA (Java Discord API) https://github.com/DV8FromTheWorld/JDA. Teraz zaczniemy tworzyć wtyczkę. 1. Stwórz klasę główną z jej statyczną instancją. import org.bukkit.plugin.java.JavaPlugin; public class DiscordPlugin extends JavaPlugin { private static DiscordPlugin discordPlugin; @Override public void onEnable(){ discordPlugin = new DiscordPlugin(); } public static DiscordPlugin getDiscordPlugin() { return discordPlugin; } } 2. Stwórz klasę Bot w której uruchomimy bota. import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; import javax.security.auth.login.LoginException; public class Bot { private JDA jda; //Tworzymy voida z zmienną String która będzie przechowywała token. public Bot(String token){ try { jda = new JDABuilder(token).build(); } catch (LoginException e) { e.printStackTrace(); } } public JDA getJda() { return jda; } } 3. Tworzymy zmienną long o nazwie channelOnlineID, do której przypisujemy ID kanału, w którym chcemy zmienić nazwę. Aby otrzymać ID kanału kliknij PPM na kanał i z samego dołu wybierz: Kopiuj ID. import org.bukkit.plugin.java.JavaPlugin; public class DiscordPlugin extends JavaPlugin { private static DiscordPlugin discordPlugin; private long channelOnlineID; private Bot bot; @Override public void onEnable(){ discordPlugin = new DiscordPlugin(); //Token który odbierasz na stronie discord developer w zakładce bot this.bot = new Bot("NzI1MDkzNDc5MjIyMzQ1ODUy.XvdcVw.3NxaTmfIKYr6fsPnxOuaW2ZwFBg"); //ID kanału na którym nazwa ma być odświeżana this.channelOnlineID = 724920522042900533l; } public static DiscordPlugin getDiscordPlugin() { return discordPlugin; } public Bot getBot() { return bot; } public long getChannelOnlineID() { return channelOnlineID; } } 4. Tworzenie taska. import org.bukkit.Bukkit; import org.bukkit.scheduler.BukkitRunnable; public class Task extends BukkitRunnable { @Override public void run() { DiscordPlugin .getDiscordPlugin() .getBot() .getJda() .getVoiceChannelById(DiscordPlugin.getDiscordPlugin().getChannelOnlineID()) .getManager() .setName("Online: "+ Bukkit.getOnlinePlayers().size()) .queue(); } } 5. Rejestracja taska. Ja taska zarejestrowałem co 6 min, bo wiadomo na styk nie wszystko jest dobre. @Override public void onEnable(){ discordPlugin = new DiscordPlugin(); this.bot = new Bot("NzI1MDkzNDc5MjIyMzQ1ODUy.XvdcVw.3NfaTmBIKYr6fsPnxOuaW2ZwFBg"); this.channelOnlineID = 724920522042900533l; //Rejestracja taska new Task().runTaskTimerAsynchronously(this, ((60*20L)*6), ((60*20L)*6)); } Stwórz plugin.yml, a następnie zbuduj plugin i wgraj go na serwer. Dziękuję za obejrzenie całego poradnika. W razie problemów proszę pisać tutaj chętnie pomogę. Czekam na jakieś propozycje do innych poradników.1 punkt
-
Automatyczne tworzenie blokow
Pietrekk144 przyznał(a) reputację xAxee za pytanie
command /blocks [<text>]: permission: blocks permission message: nie masz uprawnien trigger: set {_ings::*} to (diamond and emerald, iron ingot, gold ingot, redstone) set {_bloc::*} to (diamond block and emerald block, iron block, gold block, redstone block) loop {_ings::*}: while player has 9 of loop-value: remove 9 of loop-value from player add {_bloc::%loop-index%} to player send "&7wymieniono"1 punkt -
człowieku mu chodzi o to żeby napisał dla każdego co to właśnie oznacza bo taki zielony to by gówno o tym wiedział1 punkt
-
Komentarze dodane1 punkt
-
Danie kopacza fosy
Patsor1 przyznał(a) reputację THEzombiePL za pytanie
command /dajfarmer [<player>] [<number>]: permission: dajfarmer.patsor permission message: &7Nie posiadasz uprawnien! &8(&edajfarmer.patsor8) trigger: if arg 1 is set: if arg 2 is set: give arg 2 of endstone named "&c&LAUTOMATYCZNA FOSA" to arg 1 loop 10 times: broadcast " " broadcast "&8&m---------&r &f&lFARMER&8&m---------&r" broadcast " " broadcast "&8» &7Gracz &6{@gracz} &7otrzymal %arg-2% kopaczy fos!" broadcast " " broadcast "&8&m---------&r &f&lFARMER &8&m---------&r" broadcast " " else: send "&8» &7Poprawne uzycie: &6/dajfarmer <nick> <ilosc>" else: send "&8» &7Poprawne uzycie: &6/dajfarmer <nick> <ilosc>" Teraz zadziała, od nowa przepisałam że spacjami bo robię to na telefonie1 punkt -
Spoko poradnik. Fajnie jakbyś w niektórych linijkach wyjaśniał skąd co się wzięło, bo osoba która nigdy nie miała styczności z kanałami bungeecorda to mało co ogarnie o co chodzi. Leci plus1 punkt
-
Wybicie z płytek
Patsor1 przyznał(a) reputację GOSTbusters28 za pytanie
Siema ziomek jest do tego plugin: https://dev.bukkit.org/projects/launch-pad Jeśli pomogłem daj Like1 punkt -
19.06.2020: Ulepszenie systemu zgłoszeń: Aby wysłać zgłoszenie, należy wybrać kategorie, do której zgłoszenie pasuje (Zdjęcie 1). Kategorie zostają wybrane spośród najpopularniejszych zgłoszeń Nowe kategorie mogą zostać dodane w późniejszym czasie Zgłoszenie można wysyłać raz na godzinę. Wysłane zgłoszenie można wycofać poprzez próbę wysłania zgłoszenia ponownie (Zdjęcie 2) Zdjęcie 1 Zdjęcie 21 punkt
-
Mało intuicyjny poradnik, osoba początkująca może sobie z nim nie poradzić, nic nie jest do końca wytłumaczone1 punkt
-
Angielski mi zawsze słabo idzie :V Po polsku o dziwo idzie mi lepiej1 punkt
-
Siema, ja jestem Dawid. Uczę sie pisaniem skryptów. Aktualnie tworzę projekt serwera Minigames i jest 80% szans że mi się uda. Jestem zwykłym 14 letnim chłopcem z blokowiska. Jestem ekstrawertykiem i aspołeczniakiem. Planuję iść w kierunku informatyki. Jeśli to właśnie czytasz to życzę ci miłego dnia/wieczoru0 punktów
-
Losowe tp
jogurcik122pl przyznał(a) reputację THEzombiePL za pytanie
Poszukaj na necie gotowego skryptu na rtp najlepiej, jeśli nie to plugin0 punktów -
Skrypt na efekty
BoboMinecraftXDD przyznał(a) reputację GOSTbusters28 za pytanie
Możesz pogrzebać w necie ale za darmo raczej nikt ci tego nie zrobi. Jeśli chcesz to pisz do mnie pv0 punktów -
@paweU kolejną edycje serwera rób wariacie0 punktów
-
&4, &e itp to kody koloru i innych formatów tesktu na czacie w mc, tu masz link z pełną listą tych kodów: https://minecraft.gamepedia.com/Formatting_codes Każda litera lub cyfra wpisana po & (bez spacji) oznacza dany kolor lub format. Gdy chcesz np żółty kolor z pogrubieniem wpisujesz &e&l (kolejność ma znaczenie, najpierw kolor potem format tekstu)0 punktów
-
&4 &8 itd. to prefixy komend , myśle że każdy wie co to jest jak się bierze za programowanie send . command trigger są opisane , proszę się bardziej przyjrzeć0 punktów
-
Najwięcej postów w tygodniu
-
Najwięcej tematów w tygodniu
-
Aktywni użytkownicy
