Помогите Выпадение из мира

stminne77

Новичок
Пользователь
Баллы
16
Имя в Minecraft
stminne77
Можно ли сделать плагин,чтобы если упали в низ где ты начинаешь умирать,не убивало.а телепортировало на определнную точку?
 
Ну типа отследить ивент получения урона от void и отправить игрока на координату
 
Тут суть форума немного в другом. Тебе дают наводки, а ты сам делаешь.
Наводки - слушать событие получения урона, смотреть чтобы источник был VOID
 
Еще нужно фал дамаг убрать, а то разобьется при тпшке.
 
Код:
public class pluginplugin
  extends JavaPlugin
  implements Listener
{
  public void onEnable()
  {
    saveDefaultConfig();
    Bukkit.getPluginManager().registerEvents(this, this);
    load();
    save();
    _log.info("Plugin enable!");
  }

  public void onDisable()
  {
    _log.info("Plugin Disable!");
  }

  public void save()
  {
    getConfig().set("Text", this.upal);
    saveConfig();
  }

  public void load()
  {
    reloadConfig();
    this.upal = getConfig().getString("Text");
  }

  @EventHandler
  public void onPlayerMoveEvent(PlayerMoveEvent e)
  {
    Player p = e.getPlayer();
    int y = p.getLocation().getBlockY();
    Location spawn = p.getWorld().getSpawnLocation();
    if (y < -1)
    {
      p.teleport(spawn);
      p.sendMessage(this.upal);
    }
  }

  private boolean ReloadCFG(CommandSender sender)
  {
    if (sender != null) {
      sender.sendMessage(ChatColor.DARK_GREEN + "config reload!");
    }
    load();
    return true;
  }

  public boolean onCommand(CommandSender sender, Command cmd, String cmdLabel, String[] args)
  {
    if (args.length == 0) {
      return false;
    }
    Player player = (sender instanceof Player) ? (Player)sender : null;
    if (args[0].equalsIgnoreCase("reload"))
    {
      if ((player == null) || (player.hasPermission("plugin.reload"))) {
        return ReloadCFG(sender);
      }
      return false;
    }
    return true;
  }

  public static final Logger _log = Logger.getLogger("Minecraft");
  String upal;
}
Как теперь реализовать,чтобы это работало в определенном мире?
 
А еще лучше сделать не один мир, а список миров в конфиге.
 
Вообще, слушать ивент движения не целесообразно.
он вызывается постоянно, и при онлайне в 100 человек и слабом хосте, сервер может уже лагать, от такого количества лишних обработок.

Куда как правильнее слушать ивент получения дамага.
Java:
@EventHandler (priority=EventPriority.LOWEST,ignoreCancelled=true) //игнорируем отмену ивента (иначе игроки в режиме /god будут лететь до скончания веков), приоритет такой по тем же причинам
public void onEntityDamage(EntityDamageEvent e){
    if (e.getEntityType()==EntityType.PLAYER){//проверям, кто получает дамаг
        if (e.getCause()==DamageCause.VOID){//проверяем причину получения дамага. VOID - пропасть
            //здесь то что нам нужно
            if (!e.getEntity().getWorld().getName().equalsIgnoreCase("world name")) return; //если это не тот мир, то не выполняем код дальше
            e.getEntity().teleport(e.getEntity().getWorld().getSpawnLocation());
            e.getEntity().setFallDistance(0); //что бы не разбился
            e.setDamage(0);//убираем дамаг.
        }
    }
}
А еще лучше сделать не один мир, а список миров в конфиге.
ну это уже пусть сам думает как.
 
Вообще, слушать ивент движения не целесообразно.
он вызывается постоянно, и при онлайне в 100 человек и слабом хосте, сервер может уже лагать, от такого количества лишних обработок.

Куда как правильнее слушать ивент получения дамага.
Java:
@EventHandler (priority=EventPriority.LOWEST,ignoreCancelled=true) //игнорируем отмену ивента (иначе игроки в режиме /god будут лететь до скончания веков), приоритет такой по тем же причинам
public void onEntityDamage(EntityDamageEvent e){
    if (e.getEntityType()==EntityType.PLAYER){//проверям, кто получает дамаг
        if (e.getCause()==DamageCause.VOID){//проверяем причину получения дамага. VOID - пропасть
            //здесь то что нам нужно
            if (!e.getEntity().getWorld().getName().equalsIgnoreCase("world name")) return; //если это не тот мир, то не выполняем код дальше
            e.getEntity().teleport(e.getEntity().getWorld().getSpawnLocation());
            e.getEntity().setFallDistance(0); //что бы не разбился
            e.setDamage(0);//убираем дамаг.
        }
    }
}

ну это уже пусть сам думает как.
С одной ифкой это вообще ниочем.
 
И? Лузверь и его локация. Это все уже и так присвоено игроку.
как показывает практика, это все будет лежать не ссылкой, а объектом, что покушает ОЗУ
ну или я где то накурился, но тогда моя тема про то что плуг уже есть - магия и не иначе
 
объясните мне, я чего то не понимаю.

Создание и хранение переменных в огромном количестве это нормально?
Во-первых, где тут огромное количество?Во-вторых, если они нужны, то почему нет?Странная логика.
 
  • public void onPlayerMoveEvent(PlayerMoveEvent e)
  • {
  • Player p = e.getPlayer();
  • int y = p.getLocation().getBlockY();
  • Location spawn = p.getWorld().getSpawnLocation();
  • if (y < -1)
  • {
  • p.teleport(spawn);
  • p.sendMessage(this.upal);
  • }
  • }
Зачем каждый раз инициализировать переменные, инициализируй их, только тогда, когда y <= -1
 
Назад
Верх