Skocz do zawartości
  • 0

Plugin na tnt od danej do danej godziny


Pytanie

4 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0
options:
	godzinaod: 10
	godzinado: 15

on explode:
	if {@godzinaod} <= hour:
    	if {@godzinado} >= hour:
      		stop
      	else:
			cancel event
    else:
		cancel event

Pluginy: Script.

PS: Weź to wytabuj.

Edytowane przez KrejzolekPRO
Odnośnik do komentarza
https://skript.pl/temat/17167-plugin-na-tnt-od-danej-do-danej-godziny/#findComment-117546
Udostępnij na innych stronach

  • 0
6 godzin temu, KrejzolekPRO napisał:

options:
	godzinaod: 10
	godzinado: 15

on explode:
	if {@godzinaod} <= hour:
    	if {@godzinado} >= hour:
      		stop
      	else:
			cancel event
    else:
		cancel event

Pluginy: Script.

PS: Weź to wytabuj.

Towarzyszu to nie jest plugin tylko skrypt. Inaczej konfiguracja do jakiegoś pluginu.

--------------------------------------------------

 

Ten problem można rozwiązać na dwa sposoby. Jeden to blokowanie stawiania TNT oraz jego wybuchania. Drugie to tylko jego wybuchania. Osobiście preferuje to pierwsze, ponieważ można wtedy do gracza wysłać bezpośrednią wiadomość o wyłączonym TNT.

Do zarządzania czasem na serwerze będziesz potrzebował klasy Calendar. Dzięki temu będziesz mógł porównać godziny do tych podanych w pliku konfiguracyjnym (oczywiście możesz je zapisać na twardo w kodzie (tzw. hard-coded), ale moje osobiste doświadczenia pokazują, że jest to jeden z największych błędów). Po porównaniu możesz zwrócić prawdę (true), lub fałsz (false) jako rezultat tej metody. Drugą częścią tego kodu będą słuchacze (listenery), które będą śledzić serwer i nasłuchiwać podanych przez wydarzeń w jego logice. Możesz nasłuchiwać BlockPlaceEvent (nadawany przy postawieniu bloku przez gracza), ExplosionPrimeEvent (nadawany przy odpaleniu TNT - patrz niżej), EntityExplodeEvent (kiedy TNT ale także i creeper wybucha), EntityChangeBlockEvent (kiedy enderman będzie próbował postawić TNT) oraz BlockDispenseEvent (kiedy blok zostanie postawiony przez dispenser). Myślę, że to już wszystko. Pamiętaj, że o czymś mogłem zapomnieć.

ExplosionPrimeEvent: nadawany przy odpaleniu TNT, jego aktywacji. Musimy nasłuchiwać to zdarzenie, ponieważ TNT mogło zostać postawione w czasie włączonego TNT na serwerze, natomiast odpalone poprzez redstone lub palącą się strzałę, co doprowadziło do jego aktywacji.

 

Jeżeli wszystkie dane w zdarzeniu zostały sprawdzone (jest to TNT) możesz sprawdzić czy zostało wykonane w odpowiednim przedziale czasowym. Jeżeli nie to anulujesz event i w miarę możliwości próbujesz wysłać do gracza wiadomość o wyłączonym TNT.

 

Myślę, że pomogłem!
Pozdrawiam Czerwono Towarzyszu! :)

Edytowane przez TheMolkaPL
Odnośnik do komentarza
https://skript.pl/temat/17167-plugin-na-tnt-od-danej-do-danej-godziny/#findComment-117623
Udostępnij na innych stronach

  • 0
Spoiler

import java.util.Calendar;

import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.player.PlayerInteractEvent;

import pl.killerek.xfosahc.core.utils.ColorUtils;
import pl.killerek.xfosahc.core.utils.Util;

public class ExplodeListener
  implements Listener
{
  @EventHandler
  public void onEntityExplode(EntityExplodeEvent e)
  {
    Calendar c = Calendar.getInstance();
    int hr = c.get(11);
    if (((hr >= 24) || (hr < 12)) && (e.getEntity().getType().equals(EntityType.PRIMED_TNT))) {
      e.setCancelled(true);
    }
  }
  
  @EventHandler(priority=EventPriority.HIGHEST)
  public void onBlock(BlockPlaceEvent e)
  {
    Player p = e.getPlayer();
    Material m = e.getBlock().getType();
    Location l = e.getBlock().getLocation();
    int y = l.getBlockY();
    if (m == Material.TNT) {
      if (y > 50) {
        e.setCancelled(true);
        p.sendMessage(ColorUtils.fixColor("§4Blad: §cTnT mozna stawiac od 50 kratki"));
      }
    }
  } 
  @EventHandler
  public void onPlayerClick(PlayerInteractEvent e)
  {
    Player p = e.getPlayer();
    if ((e.getAction() == Action.RIGHT_CLICK_BLOCK) && 
      (p.getItemInHand().getType().equals(Material.EXPLOSIVE_MINECART)) && 
      (p.getLocation().getY() > 50.0D))
    {
      Util.sendMsg(p, "&4Blad: &cMinecart z TNT mozna stawiac tylko od 50 poziomu w dol.");
      e.setCancelled(true);
      return;
    }
  }
  @EventHandler
  public void onTNTPlace(BlockPlaceEvent e)
  {
    Material m = e.getBlockPlaced().getType();
    Player p = e.getPlayer();
    
    Calendar c = Calendar.getInstance();
    int hr = c.get(11);
    if ((m == Material.TNT) && ((hr >= 24) || (hr < 12)))
    {
      e.setCancelled(true);
      p.sendMessage(ColorUtils.fixColor("§4Blad: §cTnT jest wlaczone w godzinach 12-24"));
    }
  }
}

Liczę na +. c:

PS. Ten kawałek kodu z tnt place od 50 poziomu se usuń.

Edytowane przez Killerek01
Odnośnik do komentarza
https://skript.pl/temat/17167-plugin-na-tnt-od-danej-do-danej-godziny/#findComment-118087
Udostępnij na innych stronach

  • 0

^^ Formatuj kod :P Ciężko się czyta z tą jedną spacją. Trochę się do niego też przyczepie. :P

 

int hr = c.get(11);

Powinieneś używać const, czyli HOUR_OF_DAY z klasy Calendar. Pamiętaj, że te wartości liczbowe mogą zostać zmienione, i co wtedy? Tak, wszystko się popsuje.

 

p.sendMessage(ColorUtils.fixColor("§4Blad: §cTnT mozna stawiac od 50 kratki"));

Nie używaj paragrafów i nie twórz zbędnych metod do formatowania, jeżeli możesz to zrobić przy włączeniu serwera. Obciążasz przez to zbędnie procesor, bo ta metoda używana jest za każdym razem jej wywołania, a jej rezultat mógłby być łatwo cachowany przy włączeniu serwera. Paragrafy już dzisiaj są "deprecated", czyli przestarzałe. Powinieneś używać enum ChatColor do kolorowania wiadomości. Dzisiaj te teksty są już "legacy", czyli stare i nieużywane. Najnowocześniejszą metodą wysyłania i kolorowania wiadomości jest JSON i są od niego klasy BaseComponent z API chatu BungeeCorda, który jest zaimplementowany także w Spigocie. Paragrafy już nie są używane i tylko z prośby zostało dodane ich konwertowanie do JSONa. Pamiętaj, że ta konwersja z paragrafów może zostać w każdej chwili usunięta (Spigot lubi psuć kompatybilność ze starszymi plugnami), i co wtedy? Tak, wszystko się popsuje.

 

Util.sendMsg(p, "&4Blad: &cMinecart z TNT mozna stawiac tylko od 50 poziomu w dol.");

To samo też i tu.

 

Calendar c = Calendar.getInstance();
int hr = c.get(11);
if ((m == Material.TNT) && ((hr >= 24) || (hr < 12))) {
    e.setCancelled(true);
    p.sendMessage(ColorUtils.fixColor("§4Blad: §cTnT jest wlaczone w godzinach 12-24"));
}

Kopiujesz kod z pierwszego listenera. Nigdy przenigdy nie kopiuje się kodu! Naprawa jednej rzeczy nie naprawi drugiej! Od takiej uniwersalności są metody. To ona powinna sprawdzić czy można postawić TNT i zwrócić prawdę lub fałsz.

 

Poza EntityExplodeEvent powinieneś jeszcze nasłuchiwać ExplosionPrimeEvent. Anulowanie EntityExplodeEvent spowoduje owszem, brak wybuchu. Ale TNT które miało wybuchnąć zniknie! Dzieje się tak, ponieważ to TNT jest entity, a event wywoływany jest wtedy kiedy już zniknęło i ma nastąpić sam wybuch. ExplosionPrimeEvent jest wywoływany jeszcze wcześniej. Jego anulowanie spowoduje brak zniknięcia TNT.

 

Pozdrawiam Czerwono

Edytowane przez TheMolkaPL
Podział na sekcję dla wygodniejszego czytania
Odnośnik do komentarza
https://skript.pl/temat/17167-plugin-na-tnt-od-danej-do-danej-godziny/#findComment-118152
Udostępnij na innych stronach

Nieaktywny
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

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