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

Lisenochek

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

Код таймера:
JavaScript:
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);
                    }
                }
            }
        }
    }
}
 
Получаешь Location от игрока и относительно этого Location проверяешь блоки сверху.
 
Получаешь Location от игрока и относительно этого Location проверяешь блоки сверху.
p.getLocation и что дальше?
Я попробовал сделать так, но не вышло:

JavaScript:
if(p.getWorld().hasStorm() && p.getLocation().getBlockY() == 2) {
}
 
А как тогда проверить?
Создаёшь функцию в неё передаешь Location игрока,в функции запускаешь цикл к примеру до 3,в каждом новом выполнении цикла проверяешь блок выше игрока.То есть цикл выполняется первый ход - проверяется блок выше игрока на один,если это не воздух возращаем true,если воздух ничего не делаем.Если цикл завершился не найдя блока над игроком,возращаем false;
 
Создаёшь функцию в неё передаешь Location игрока,в функции запускаешь цикл к примеру до 3,в каждом новом выполнении цикла проверяешь блок выше игрока.То есть цикл выполняется первый ход - проверяется блок выше игрока на один,если это не воздух возращаем true,если воздух ничего не делаем.Если цикл завершился не найдя блока над игроком,возращаем false;
Не понял. Это надо делать в отдельном таймере или я неправильно понял
 
p.getLocation и что дальше?
Я попробовал сделать так, но не вышло:

JavaScript:
if(p.getWorld().hasStorm() && p.getLocation().getBlockY() == 2) {
}
Код:
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{
                //тут если воздух
            }
 
Меня просили не скидывать готовый код,но всё же решил скинуть ,но не проверенный.Вот мой вариант:
Код:
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;
}
Код:
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{
                //тут если воздух
            }
В твоём коде ищется блок в конкретном месте,а не выше игрока.
 
Меня просили не скидывать готовый код,но всё же решил скинуть ,но не проверенный.Вот мой вариант:
Код:
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;
}

В твоём коде ищется блок в конкретном месте,а не выше игрока.
Посмотри внимательней: getBlockY()+2
 
Не работает. Я по-другому пытался, но стер случайно свой код. Вот вставленный код:

JavaScript:
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;
    }
}

Не кидайтесь тапками за мою криворукость, правда, вообще ничего не понял.
 
ну а если и так, то добавить цикл for он/она не сможет?
Не работает. Я по-другому пытался, но стер случайно свой код. Вот вставленный код:

JavaScript:
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;
    }
}

Не кидайтесь тапками за мою криворукость, правда, вообще ничего не понял.
Конечно не работает, loc то у тебя ничему не равно, нужно было хотя-бы сделать так:
Location loc = p.getLocation();
 
Ну а куда его тогда поставить. Это же таймер
 
Ну а куда его тогда поставить. Это же таймер
Перепиши условие:
Код:
[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]
 
if(p.getInventory().getChestplate() == null && !UnderBlock) {

Не может найти
 
Назад
Верх