Skocz do zawartości

QuickRoads - Szybsze poruszanie po blokach


ArduinoKrystian

Rekomendowane odpowiedzi

WITAJCIE!!!

Chciałbym wam przedstawić mój pierwszy plugin

QuickRoads.

Plugin umożliwia ustawienie wartości efektu speed po przemieszczeniu się na dany blok.

Komendy:

/quickroads info <-- wyświetla informacje o wartości efektu speed na danym bloku
/quickroads reload <-- przeładowuje konfiguracje
skrót /qr

Konfiguracja:

Block: GRASS_PATH,STONE <-- bolki z efektami 
Speed: 3,5 <-- wartość efektu speed na blokach np. GRASS_PATH:3 STONE:5

Pobieranie:

1.0.0

Plik:http://www.mediafire.com/file/f30phf9gsf156zv/QuickRoads.jar

Skan:https://www.virustotal.com/#/file/9cb0b3be693d8930c87443199472e409ea8216e545c7bffcebedb5b7a3e2cb22/detection

1.1.0

Plik:http://www.mediafire.com/file/ya1rld1y8xgx7x6/QuickRoads1.1.0.jar

Skan:https://www.virustotal.com/#/file/c327dd916a18ca916d71b37125dc3aa76bc3811c3af82f5236676e3a5b2d91f4/detection

1.2.0

Plik:http://www.mediafire.com/file/d3p0xj11ph9644r/QuickRoads1.2.0.jar

Skan:https://www.virustotal.com/#/file/4af844906a8dbb538734343a4c19a50cb459fccc29d59adc56814c1e3e7fbac0/detection

 

Edytowane przez ArduinoKrystian
Odnośnik do komentarza
Udostępnij na innych stronach

Musisz udostępnić  plik na dropboxie i użyć wygenerowanego linku do udostępniania... bo tak to wkleiłeś linka co każdemu będzie próbował znaleźć ten plik na własnym koncie

Dobra, poprawiłeś link, i jest to czego się obawiałem:

  @EventHandler
  public void onPlayerMove(PlayerMoveEvent e)
  {
    for (int x = 0; x < this.block.length; x++)
    {
      if (e.getTo().getBlock().getRelative(BlockFace.DOWN).getType() == Material.valueOf(this.block[x].toUpperCase())) {
        for (Player p : Bukkit.getServer().getOnlinePlayers()) {
          e.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 3, this.speed[x] - 1));
        }
      }
      if ((e.getTo().getBlock().getRelative(BlockFace.SELF).getType() == Material.valueOf(this.block[x].toUpperCase())) && (Material.valueOf(this.block[x].toUpperCase()) == Material.GRASS_PATH)) {
        for (Player p : Bukkit.getServer().getOnlinePlayers()) {
          e.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 3, this.speed[x] - 1));
        }
      }
    }
  }

Taki kod w evencie od ruchu to słaby pomysł, even od ruchu bardzo obciąża serwer bo wykonuje się wiele razy w ciągu sekundy dla każdego gracza.

 

Do tego ten kod nie ma sensu, z jakiegoś powodu robisz tam pętlę po graczach i nawet nie używasz tych graczy z pętli, tam nie powinno być tej pętli - nadajesz efekt graczu tyle razy ilu jest graczy na serwerze online :D to nie ma sensu.
 

Tak samo słabym pomysłem jest operowania na stringach w takich eventach "Material.valueOf(this.block[x].toUpperCase())" nie ma żadnej potrzeby by coś takiego robić, możesz przygotować to w onEnable, tak by mieć od razu gotowe Material. Do tego w material jest specjalna metoda od szukania po nazwie - sprytniejsza bo robi więcej dodatkowych rzeczy by zwiększyć szansę na znalezienie bloku.

 

Ogólnie najlepiej by było zrobić taska który np co sekundę sprawdza na jakim bloku stoi każdy gracz i odpowiednio mu nadać efekt, do tego same efekty możesz trzymać w mapce Map<Material, Integer> gdzie klucz to ten typ bloku a wartość to poziom efektu - więc nie musisz robić pętli po wszystkich. Na dalsze optymalizacje można podzielić te skanowanie by np sprawdzać X graczy co tick, tak by nie sprawdzać np 500 graczy na raz na większych serwerach, ale to jednak nie powinno być problemem z tak prostą operacją, a dobre podzielenie to jednak sporo roboty, więc można się obejść bez tego.

Odnośnik do komentarza
Udostępnij na innych stronach

41 minut temu, ArduinoKrystian napisał:

Poprawiłem plugin według zaleceń pana @GotoFinal Dziękuje:)

no nie za bardzo, bo wstawiłeś tego taska do eventu dalej... :D 

To powinno być w np OnEnable, jako task z pętlą po graczach online.

coś na zasadzie:

new BukkitRunnable() {
@Override void run() {
  for (Player p:Bukkit.getOnlinePlayers()) {
    Block block = p.getLocation().getBlock().getRelative(0, -1, 0);
    Integer speed = speedBlocksMap.get(block.getType());
    if (speed == null) continue; // null czyli nie ma w mapie
    // nadanie efektu na np 2 sekundy i tej pobranej mocy
  }
}
}.startTaskTimer(this, 10,10);

 

Można by też dodac sprawdzenie by nie nadawać efektu komuś kto już ma speeda o silniejszej mocy, lub napisać sprytniejszy system który to zsumuje na czas bycia na tym innym bloku.

Edytowane przez GotoFinal
Odnośnik do komentarza
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Nieaktywny
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...