Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Проблема с погодой

Тема в разделе "Разработка плагинов для новичков", создана пользователем Lisenochek, 5 июл 2016.

  1. Автор темы
    Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Всем привет. Нужна помощь с погодой. Как сделать так, чтобы игрок не замерзал, когда он стоит под блоком в шторм?

    Код таймера:
    Код:
    package com.realistic.timers;
    
    import java.util.Random;
    
    import org.bukkit.Bukkit;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Listener;
    
    import com.realistic.api.API;
    import com.realistic.api.MessageManager;
    import com.realistic.api.MessageManager.MsgType;
    import com.realistic.list.MinecraftList;
    
    public class Cold implements Listener, Runnable {
       
        private API plugin;
        private MinecraftList ml;
        private final Random r = new Random();
       
        public Cold(API plugin) {
            this.plugin=plugin;
        }
       
        public Cold(MinecraftList ml) {
            this.ml=ml;
        }
    
        @Override
        public void run() {
           
            for(Player p : Bukkit.getOnlinePlayers()) {
               
                if(p.getWorld().hasStorm()) {
               
                    if(p.getInventory().getChestplate() != null) {
                    } else {
                           
                        MessageManager.getManager().msg(p, MsgType.INFORMATION, "Нужно одеться потеплее, иначе я замерну и заболею.");
                       
                        if(r.nextInt(10) <= 5) {
                           
                            ml.sickPlayers.put(p, true);
                        }
                    }
                }
            }
        }
    }
    
    
     
  2. Хостинг MineCraft
    <
  3. Novichock

    Novichock Активный участник Пользователь

    Баллы:
    76
    Skype:
    pavel.batalov1
    Получаешь Location от игрока и относительно этого Location проверяешь блоки сверху.
     
  4. Автор темы
    Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    p.getLocation и что дальше?[DOUBLEPOST=1467728446,1467728162][/DOUBLEPOST]Я попробовал сделать так, но не вышло:

    Код:
    if(p.getWorld().hasStorm() && p.getLocation().getBlockY() == 2) {
    }
     
  5. Novichock

    Novichock Активный участник Пользователь

    Баллы:
    76
    Skype:
    pavel.batalov1
    с помощью этого ты проверяешь высоту[DOUBLEPOST=1467728653,1467728548][/DOUBLEPOST]Может я повторюсь ,но для некоторых вещей лучше создавать отдельные функции.
     
  6. Автор темы
    Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    А как тогда проверить?
     
  7. Novichock

    Novichock Активный участник Пользователь

    Баллы:
    76
    Skype:
    pavel.batalov1
    Создаёшь функцию в неё передаешь Location игрока,в функции запускаешь цикл к примеру до 3,в каждом новом выполнении цикла проверяешь блок выше игрока.То есть цикл выполняется первый ход - проверяется блок выше игрока на один,если это не воздух возращаем true,если воздух ничего не делаем.Если цикл завершился не найдя блока над игроком,возращаем false;
     
  8. Автор темы
    Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Не понял. Это надо делать в отдельном таймере или я неправильно понял
     
  9. Novichock

    Novichock Активный участник Пользователь

    Баллы:
    76
    Skype:
    pavel.batalov1
    В отдельной функции,которая возращает true когда блок найден и false когда не найден.
     
  10. _MediaNik_

    _MediaNik_ Активный участник Пользователь

    Баллы:
    46
    Skype:
    Medianik5
    Имя в Minecraft:
    _MediaNik_
    Код:
    Location loc = new Location(p.getLocation().getWorld(), p.getLocation().getBlockX(), p.getLocation().getBlockY()+2, p.getLocation().getBlockZ());
                if(!p.getWorld().hasStorm() & !(loc.getBlock().getType() == Material.AIR)){
                    //тут если не воздух
                }else{
                    //тут если воздух
                }
    
     
  11. Novichock

    Novichock Активный участник Пользователь

    Баллы:
    76
    Skype:
    pavel.batalov1
    Меня просили не скидывать готовый код,но всё же решил скинуть ,но не проверенный.Вот мой вариант:
    Код:
    public boolean UnderBlock(Location loc){
    for(int i=1;i<3;i++){
    loc.setY(loc.getY()+1);
    if(loc.getBlock().getType!=Material.AIR){
    return true;
    }
    }
    return false;
    }
    В твоём коде ищется блок в конкретном месте,а не выше игрока.
     
  12. _MediaNik_

    _MediaNik_ Активный участник Пользователь

    Баллы:
    46
    Skype:
    Medianik5
    Имя в Minecraft:
    _MediaNik_
    Посмотри внимательней: getBlockY()+2
     
  13. Novichock

    Novichock Активный участник Пользователь

    Баллы:
    76
    Skype:
    pavel.batalov1
    У тебя проверяется блок только над головой,а у меня можно проверить все блоки выше игрока.
     
  14. _MediaNik_

    _MediaNik_ Активный участник Пользователь

    Баллы:
    46
    Skype:
    Medianik5
    Имя в Minecraft:
    _MediaNik_
    И
    где все? я по твоему коду только один увидел
     
  15. Автор темы
    Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Не работает. Я по-другому пытался, но стер случайно свой код. Вот вставленный код:

    Код:
    package com.realistic.timers;
    
    import java.util.Random;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Listener;
    
    import com.realistic.api.API;
    import com.realistic.api.MessageManager;
    import com.realistic.api.MessageManager.MsgType;
    import com.realistic.list.MinecraftList;
    
    public class Cold implements Listener, Runnable {
       
        private API plugin;
        private MinecraftList ml;
        private final Random r = new Random();
       
        public Cold(API plugin) {
            this.plugin=plugin;
        }
       
        public Cold(MinecraftList ml) {
            this.ml=ml;
        }
    
        @Override
        public void run() {
           
            for(Player p : Bukkit.getOnlinePlayers()) {
        
                if(p.getWorld().hasStorm()) {
               
                    if(p.getInventory().getChestplate() != null) {
                    } else {
                           
                        MessageManager.getManager().msg(p, MsgType.INFORMATION, "Нужно одеться потеплее, иначе я замерну и заболею.");
                       
                        if(r.nextInt(10) <= 5) {
                           
                            ml.sickPlayers.put(p, true);
                        }
                    }
                }
               
                if(p.isDead()) {
                   
                    ml.sickPlayers.remove(p);
                    p.setWalkSpeed(0.2f);
                }
            }
        }
       
        public boolean UnderBlock(Location loc) {
           
            for(int i=1;i<3;i++) {
                loc.setY(loc.getY()+1);
               
                if(loc.getBlock().getType() != Material.AIR) {
                    return true;
                }
            }
            return false;
        }
    }
    
    Не кидайтесь тапками за мою криворукость, правда, вообще ничего не понял.
     
  16. _MediaNik_

    _MediaNik_ Активный участник Пользователь

    Баллы:
    46
    Skype:
    Medianik5
    Имя в Minecraft:
    _MediaNik_
    ну а если и так, то добавить цикл for он/она не сможет?[DOUBLEPOST=1467731229,1467731113][/DOUBLEPOST]
    Конечно не работает, loc то у тебя ничему не равно, нужно было хотя-бы сделать так:
    Location loc = p.getLocation();
     
  17. Novichock

    Novichock Активный участник Пользователь

    Баллы:
    76
    Skype:
    pavel.batalov1
    Он не проверяет UnderBlock
     
  18. Автор темы
    Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Ну а куда его тогда поставить. Это же таймер
     
  19. Novichock

    Novichock Активный участник Пользователь

    Баллы:
    76
    Skype:
    pavel.batalov1
    Перепиши условие:
    Код:
    [LIST=1]
    [*]package com.realistic.timers;
    [*]
    
    [*]import java.util.Random;
    [*]
    
    [*]import org.bukkit.Bukkit;
    [*]import org.bukkit.Location;
    [*]import org.bukkit.Material;
    [*]import org.bukkit.entity.Player;
    [*]import org.bukkit.event.Listener;
    [*]
    
    [*]import com.realistic.api.API;
    [*]import com.realistic.api.MessageManager;
    [*]import com.realistic.api.MessageManager.MsgType;
    [*]import com.realistic.list.MinecraftList;
    [*]
    
    [*]public class Cold implements Listener, Runnable {
    [*]  
    [*]    private API plugin;
    [*]    private MinecraftList ml;
    [*]    private final Random r = new Random();
    [*]  
    [*]    public Cold(API plugin) {
    [*]       this.plugin=plugin;
    [*]   }
    [*]  
    [*]    public Cold(MinecraftList ml) {
    [*]       this.ml=ml;
    [*]   }
    [*]
    
    [*]   @Override
    [*]    public void run() {
    [*]      
    [*]       for(Player p : Bukkit.getOnlinePlayers()) {
    [*]  
    [*]           if(p.getWorld().hasStorm()) {
    [*]
    
    [*]            if(p.getInventory().getChestplate()==null && !UnderBlock){
    [*]                      
    [*]                    MessageManager.getManager().msg(p, MsgType.INFORMATION, "Нужно одеться потеплее, иначе я замерну и заболею.");
    [*]                  
    [*]                   if(r.nextInt(10) <= 5) {
    [*]                      
    [*]                        ml.sickPlayers.put(p, true);
    [*]           
    [*]               }
    [*]           }
    [*]          
    [*]           if(p.isDead()) {
    [*]              
    [*]                ml.sickPlayers.remove(p);
    [*]                p.setWalkSpeed(0.2f);
    [*]           }
    [*]       }
    [*]   }
    [*]  
    [*]    public boolean UnderBlock(Location loc) {
    [*]      
    [*]       for(int i=1;i<3;i++) {
    [*]            loc.setY(loc.getY()+1);
    [*]          
    [*]           if(loc.getBlock().getType() != Material.AIR) {
    [*]               return true;
    [*]           }
    [*]       }
    [*]       return false;
    [*]   }
    [*]}
    [/LIST]
    
     
  20. Автор темы
    Lisenochek

    Lisenochek Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    if(p.getInventory().getChestplate() == null && !UnderBlock) {

    Не может найти
     
  21. Novichock

    Novichock Активный участник Пользователь

    Баллы:
    76
    Skype:
    pavel.batalov1
    а извини забыл,что надо передать параметр,думал сам догадаешься.
    if(p.getInventory().getChestplate() == null && !UnderBlock(p.getLocation()))
     

Поделиться этой страницей