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

Plugin - teleportacja na czas - co zrobić, aby musieli odczekać?


Trovst_eu

Rekomendowane odpowiedzi

Opublikowano

­Witam, od wczoraj uczę się pisania pluginów, póki co możliwość moich pluginów to zaledwie, ustawianie spawnu, teleportacja, zmienianie pogody, czasu, uzdrawianie kogoś.

 

Chciałbym się zapytać, co zrobić, aby gracze bez uprawnienia "location.spawn.admin" musieli odczekać 5 sekund na teleportację.

 

Od razu mówię, że nie chce pobierać essentials ani czyiś pluginów, po prostu zależy mi aby nauczyć się pisać podobne rzeczy samemu, no może z małą pomocą innych :)

Opublikowano

­No to już ogarnąłem. Teraz mam nowy problem... gdy próbuję zrobić losową teleportację w linijce

Random random = new Random();

podświetla mi się słowo Random, przez co komenda nie działa, a tutaj screen gdy naciskam na lampkę http://scr.hu/4hdd/dkibs
 

Opublikowano

Mniemam a nawet jestem pewny, że używasz JDGui do podglądania kodu i w ten sposób piszesz.. Jest to ZŁE. Jeśli już musisz podglądnąć kod to korzystaj z plików open source (Github etc). Dekompilator tworzy takie cuda na kiju, że to nie ma najmniejszego sensu..

 

Co do erroru to po imporcie co Ci wywala? ._.

784091427630431250239.png

Regulamin sygnatur

Opublikowano

Możesz zrobić scheduler

 

 

Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this,new Runnable(){

        @Override
        public void run() {
        // TUTAJ KOD KTORY WYKONA SIE PO 5SEK
       }
}, 5*20L);

 

teraz kilka informacji:

tam gdzie masz "this", używasz tego tylko kiedy kod jest w głównej klasie, inaczej wpisujesz tam instancje głownej klasy, albo konstruktor który ją zwraca...co tam wolisz

i teraz tak 20 ticków (to na dole) to jedna sekunda dlatego zrobiłem podstawowe mnożenie 5*20 ticków oczywiście zamiast tego można wpisać 100

 

.. to jest najprostsze opóźnienie

tumblr_mvmbjq2EGs1s3ulybo1_500.gif

Jeśli to czytasz, znaczy to że się opierdalasz :)

Opublikowano

­Matrzak, dziękuje za pomoc, ale jak już wyżej napisałem, to mam ogarnięte :) Teraz problem pojawia się w komendzie randomtp, którą próbuję napisać :)

Opublikowano

Nie możesz dać po prostu całego kodu?

Jesteś pewny, że piszesz to sam od zera a nie po prostu kopiujesz kompilatora?

Paczki małą, klasy dużą.

784091427630431250239.png

Regulamin sygnatur

Opublikowano

@Trovst_eu

 

O nie doczytałem że poradziłeś sobie z taskiem ;x

 

co do random tp..

	    World world = player.getWorld();
	    Random rand = new Random();
	    final double x = rand.nextDouble() * 10000.0D - 5000.0D;
            final double z = rand.nextDouble() * 10000.0D - 5000.0D;
	    
	    double y = world.getHighestBlockYAt((int)x, (int)z);
	    
	    y += 5.0D;
	    Location loctp = new Location(world,x,y,z);
	    Biome biome = player.getWorld().getBiome(loctp.getBlockX(), loctp.getBlockZ());

ogl to dzięki temu możesz jeszcze sprawdzić biom na owych koordach dzięki czemu przy np oceanie teleport możesz anulować :)

Dla przykładu:

    	if(biome.equals(Biome.OCEAN)){
    		player.sendMessage("Wczytano biom: Ocean - Sprobuj jeszcze raz");
                return;
      	}
      	else if(biome.equals(Biome.DEEP_OCEAN)){
    		player.sendMessage("Wczytano biom: Gleboki Ocean - Sprobuj jeszcze raz");
                return;
      	}

@Edit

Oczywiście rozumiem ze Random masz zainportowane

Jeżeli dalej nie działa daj cały kod

tumblr_mvmbjq2EGs1s3ulybo1_500.gif

Jeśli to czytasz, znaczy to że się opierdalasz :)

Opublikowano

­Okay, wszystko działa, mój kod się trochę różnił, ale właśnie zaimportowanie.. trzeba było zaimportować import java.util.Random; czego nie zrobiłem :)

Opublikowano

A co przykładowo w tym kodzie źle zrobiłem, bo nie działa mi:

        if(cmd.getName().equalsIgnoreCase("randomtp")){
            if(!(sender.hasPermission("location.randomtp"))){
                sender.sendMessage("§4Nie posiadasz uprawnien na uzycie tej komendy.");
            } else  if(sender.hasPermission("location.randomtp")){    
                sender.sendMessage("§cZostaniesz przeteleportowany za 5 sekund.");
            final CommandSender cs = sender;
            Bukkit.getScheduler().runTaskLaterAsynchronously(this, new Runnable() {
                public void run(){
                    Player p = (Player) cs;
                    World world = p.getWorld();
                    Random rand = new Random();
                    final double x = rand.nextDouble() * 10000.0D - 5000.0D;
                        final double z = rand.nextDouble() * 10000.0D - 5000.0D;
                    double y = world.getHighestBlockYAt((int)x, (int)z);
                    y += 5.0D;
                    Location loctp = new Location(world,x,y,z);
                    p.teleport(loctp);
                    }
                }, 100L);
            }
        }
Opublikowano

Kilka uwag:

            if(!(sender.hasPermission("location.randomtp"))){
                sender.sendMessage("§4Nie posiadasz uprawnien na uzycie tej komendy.");
            } else  if(sender.hasPermission("location.randomtp")){    

Po co tutaj else if? dodatkowy kod a else będzie działało tak samo

 

Po drugie może zamiast dawać kod wyjaśnisz dlaczego to nie działa i ewentualnie (jeżeli masz)  podasz logi

tumblr_mvmbjq2EGs1s3ulybo1_500.gif

Jeśli to czytasz, znaczy to że się opierdalasz :)

Opublikowano

­

[17:59:31 WARN]: org.apache.commons.lang.UnhandledException: Plugin xx v0.1 generated an exception while executing task 17
at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:56)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalStateException: Asynchronous chunk load!
at org.spigotmc.AsyncCatcher.catchOp(AsyncCatcher.java:14)
at org.bukkit.craftbukkit.v1_7_R4.CraftWorld.loadChunk(CraftWorld.java:244)
at org.bukkit.craftbukkit.v1_7_R4.CraftWorld.loadChunk(CraftWorld.java:145)
at org.bukkit.craftbukkit.v1_7_R4.CraftWorld.getHighestBlockYAt(CraftWorld.java:94)
at hpm.games.location.main$2.run(main.java:208)
at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftTask.run(CraftTask.java:71)
at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:53)
... 3 more
Opublikowano
if(!sender.hasPermission("perm")) {
sender.sendMessage("&cBrak uprawnien!");
return true;
}

Dalsza czesc kodu.

Gdy osoba wykonująca nie będzie miała permisji --> Kod się zatrzyma.

To co tam zrobiłeś nie ma najmniejszego sensu.

Możesz w taki sam sposób robić inne przypadki, np czy gracz posiada 10 dirta ;].

Pisane z telefonu, mogą być błędy :D

784091427630431250239.png

Regulamin sygnatur

Opublikowano

Dududududud

[17:59:31 WARN]: org.apache.commons.lang.UnhandledException: Plugin xx v0.1 generated an exception while executing task 17
Caused by: java.lang.IllegalStateException: Asynchronous chunk load!

Użyłeś złego taska

 

podmień

Bukkit.getScheduler().runTaskLaterAsynchronously(this, new Runnable() {

na

Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this,new Runnable(){

tumblr_mvmbjq2EGs1s3ulybo1_500.gif

Jeśli to czytasz, znaczy to że się opierdalasz :)

Opublikowano

­Co do @Matrzak:P

Kurde, no tak nie dopisałem tego! zapomniałem, kurcze ja zawszę muszę taki błąd zrobić :\

 

 

 

Dzięki chłopaki za pomoc :) Ale niestety.. to jeszcze nie jest koniec. Z racji tego, iż pisze plugin z komendami takimi jak: /ustawspawn, /spawn, /ustawdom, /dom, /warp, /ustawwarp, /tp, /tphere, /tpa, /tpaccept, /tprandom to myślę, że trochę pomocy będę potrzebował. A niestety ja uwielbiam robić błędy i nauka mi idzie ciężko, chociaż chęci mam spore :)

		if(cmd.getName().equalsIgnoreCase("ustawspawn")){
			if(sender.hasPermission("location.setspawn")){
			Player p = (Player) sender;
			Location l = p.getLocation();
			if(sender instanceof Player){
					p.getWorld().setSpawnLocation(l.getBlockX(),l.getBlockY(),l.getBlockZ());
					sender.sendMessage("§aSpawn zostal ustawiony.");
					return false;
			}else{
				sender.sendMessage("§4Komenda tylko dla graczy!");
					}
				}
			}
				// Teleporting to Spawn //
		if(cmd.getName().equalsIgnoreCase("spawn")){
			if(!(sender.hasPermission("location.spawn"))){
				sender.sendMessage("§4Nie posiadasz uprawnien na uzycie tej komendy.");
			}
			if(sender.hasPermission("location.spawn.admin")){
				Player p = (Player) sender;
				p.teleport(p.getWorld().getSpawnLocation());
				sender.sendMessage("§aZostales przeniesiony na Spawn.");	
			}	else{
			sender.sendMessage("§cZostaniesz przeniesiony na spawn za 5 sekund.");
			final CommandSender cs = sender; 
			Bukkit.getScheduler().runTaskLaterAsynchronously(this, new Runnable(){
				public void run(){
						if(cs instanceof Player){
						Player p = (Player) cs;
						p.teleport(p.getWorld().getSpawnLocation());
						cs.sendMessage("§aZostales przeniesiony na Spawn.");
					}else{
						cs.sendMessage("§4Komenda tylko dla graczy!");
					}
					}	
				}, 100L);
			}
		}

Więc tutaj cały błąd polega na tym, że gdy ustawie spawn w netherze, endzie, i na świecie i jestem przykładowo w endzie, to jest tam osobny spawn.

Opublikowano

Zacznijmy od tego, że naucz się pisać hmm. Przejrzyście.

Chodzi tutaj o układ tego wszystkiego bo jak na razie wygląda to masakrycznie- Ale wejdzie Ci to z czasem! Nie zniechęcaj się!

 

Następnie przejdźmy do Twojego sprawdzania permisji.. To nie ma sensu to co ty robisz.

Są dwie opcje początkowe (Później możesz to zupełnie inaczej robić ale na razie wole Ci nie mieszać).

A więc:

a) To co pisałem wcześniej, jeśli gracz nie posiada permisji -> Return :

if(!sender.hasPermission("perm")) {
sender.sendMessage("&cBrak uprawnien!");
return true;
}

i w tym momencie nie musisz już sprawdzać czy ją posiada. Bo ją na 100% musi posiadać :D.

Tak samo możesz sprawdzać inne przypadki, czy posiada dirta bla bla bla.

 

Kolejną rzeczą jest porządek w src. Najlepiej podziel sobie go na package --> listeners, commands etc. Obczaj sobie na githubie u kogoś jak to wygląda. Każda nowa komenda = nowa klasa.

 

Teraz Ci pokaże jak to powinno wyglądać według mnie (Może ktoś kto jest bardziej zaawansowany mnie poprawi :v).

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String s, String[] args) {
        if (!(sender instanceof Player)) {
            return true;
        }
        Player p = (Player) sender;
        if (cmd.getName().equalsIgnoreCase("ustawspawn")) {
            if (!p.hasPermission("location.setspawn")) {
                sender.sendMessage("§cBrak uprawnien!");
                return true;
            }
            Location loc = p.getLocation();
            p.getWorld().setSpawnLocation(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
            p.sendMessage("§aSpawn zostal ustawiony.");
            return true;
        }
        if (cmd.getName().equalsIgnoreCase("spawn")) {
            if (!p.hasPermission("location.spawn")) {
                sender.sendMessage("§cnie posiadasz uprawnien na uzycie tej komendy.");
                return true;
            }
            if (p.hasPermission("location.spawn.admin")) {
                p.teleport(p.getWorld().getSpawnLocation());
                p.sendMessage("§aZostales przeniesiony na Spawn.");
                return true;
            }
            Bukkit.getScheduler().runTaskLaterAsynchronously((Plugin) this, new Runnable() {
                @Override
                public void run() {
                    p.teleport(p.getWorld().getSpawnLocation());
                    p.sendMessage("§aZostales przeniesiony na Spawn.");
                }
            }, 100L);
        }
        return true;
    }
}

784091427630431250239.png

Regulamin sygnatur

Opublikowano

­@Oldis

 

Słuchaj, zrobiłem tak jak mówisz, w sumie i tak swój plugin chciałem później przepisywać na czysto :)

Ale problem polega na tym, że gdy ustawie spawn na normalnym świecie, a później wejdę do netheru i ustawie spawn, to gdy wrócę do normalnego świata teleportuje mnie do spawnu który ustawiłem w świeie world, a gdy z powrotem wejdę do netheru i wpiszę spawn to teleportuje mnie do spawnu, który ustawiłem w netherze.  A chciałbym, żeby spawn był tylko w jednym świecie :)

Opublikowano

Hmm.

Szczerze to teraz strzelam i musisz sobie to sprawdzić :v

World spawn = Bukkit.getWorld("TUTAJ_NAZWA_SWIATA");

Później lokacje zapisujesz normalnie do tego worlda jak wcześniej i go teleportujesz tak samo :D

784091427630431250239.png

Regulamin sygnatur

Opublikowano

­Ogólnie zmieniłem trochę kod, a dokładnie z konfigiem. Z góry mówię, że wzorowałem się na jednym z filmików na yt.

        if (cmd.getName().equalsIgnoreCase("ustawspawn")) {
            if (!p.hasPermission("location.setspawn")) {
                sender.sendMessage("§4Nie posiadasz uprawnien na uzycie tej komendy.");
                return true;
            }
            getConfig().set("Spawn.X", p.getLocation().getBlockX());
            getConfig().set("Spawn.Y", p.getLocation().getBlockY());
            getConfig().set("Spawn.Z", p.getLocation().getBlockZ());
            getConfig().set("Spawn.World", p.getWorld().getName());
            saveConfig();
            p.sendMessage("§aSpawn zostal ustawiony.");
            return true;
        }
        if (cmd.getName().equalsIgnoreCase("spawn")) {
            if (!p.hasPermission("location.spawn")) {
                sender.sendMessage("§4Nie posiadasz uprawnien na uzycie tej komendy.");
                return true;
            }
            if (p.hasPermission("location.spawn.admin")) {
                p.teleport(p.getWorld().getSpawnLocation());
                p.sendMessage("§aZostales przeniesiony na Spawn.");
                return true;
            }
            sender.sendMessage("§cZostaniesz przeniesiony na spawn za 5 sekund.");
            final CommandSender cs = sender;
            Bukkit.getScheduler().runTaskLaterAsynchronously((Plugin) this, new Runnable() {
                public void run() {
                    Player p = (Player) cs;
                    int x = getConfig().getInt("Spawn.X");
                    int y = getConfig().getInt("Spawn.Y");
                    int z = getConfig().getInt("Spawn.Z");
                    String worldname = getConfig().getString("Spawn.World");
                    World w = getServer().getWorld(worldname);
                    Location l = new Location(w, x, y, z);
                    p.teleport(l);
                    p.sendMessage("§aZostales przeniesiony na Spawn.");
                }
            }, 100L);
        }

No i tak sobie patrzę na ten kod, patrzę na uprawnienia i kurcze! już wiem... location.spawn.admin - ale ja głupi! poprawiłem i działa :) Poprawnego kodu nie muszę chyba wysyłać :P

 

 

Kolejną rzeczą jest możliwość stworzenia sobie /sethome z ograniczeniem i bez ograniczenia, tylko.. jak dodać to ograniczenie? :) Póki co jestem w stanie zrobić coś takiego jak /ustawdom <1/2>

Opublikowano

Kilka spraw..

 

praktycznie każdy programista ładnie segreguje sobie paczki i klasy żeby to było spójne.. więc radzę zrobić coś takiego

uq0cob.jpg

Jak coś to nie używam eclipse tylko IntelIiJ

 

Co do sethomu możesz zrobić osobny plik w którym będziesz po nickach graczy lub uuid(co bardziej polecam) zapisywał koordynaty ustawionych przez nich sethomów oraz ich nazwy!

Lub jeżeli chcesz iść na głęboką wodę to możesz użyć bazy danych.. co na początku programowania jednak bym ci odradził.. to trudny orzech do zgryzienia

 

@Edit

Paczki w eclipse wyglądają podobnie:

r9ild1.jpg

tumblr_mvmbjq2EGs1s3ulybo1_500.gif

Jeśli to czytasz, znaczy to że się opierdalasz :)

Opublikowano

­Ogólnie, to staram się właśnie utrzymywać porządek w plikach, jutro zacznę ogarniać ten plugin, bo w weekend nie miałem zbytnio czasu.

Opublikowano

Omg wszyscy wklejają jakieś kody do skript'a a to wszystko można ustawić w pluginie essentials (facepalm) . Dodajesz do permisji gracza essentials.teleport.delay.#### //oczekiwanie na tp

essentials.teleport.cooldown.#### //odstęp czasowy między tp

#### zamieniasz chyba na milisekundy. Sprawdź sobie ;)

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...