Java 气泡抑制

Java 气泡抑制,java,bukkit,Java,Bukkit,我试图编写一个包含两个参数的命令:第一个参数是要冒泡的玩家,第二个参数是冒泡的半径。 它看起来像/bubble 我基本上希望在这个半径范围内行走的人被射出很远的地方,但我真的不知道怎么做。 我一直坚持的主要部分是知道某人是否在距离受害者5个街区以内(使用元数据)以及如何对他们进行排序 package me.Glowhoo.EpicUtil; import java.util.ArrayList; import java.util.Collection; import java.util.Lis

我试图编写一个包含两个参数的命令:第一个参数是要冒泡的玩家,第二个参数是冒泡的半径。 它看起来像
/bubble

我基本上希望在这个半径范围内行走的人被射出很远的地方,但我真的不知道怎么做。 我一直坚持的主要部分是知道某人是否在距离受害者5个街区以内(使用元数据)以及如何对他们进行排序

package me.Glowhoo.EpicUtil;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.plugin.Plugin;
/*
 * Author =
* Glowhoo
* 
*/
public class Bubble implements CommandExecutor, Listener {
    private Main plugin;

    public Bubble(Main plugin)
    {
    this.plugin = plugin;
    }
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args)
    {
        Bukkit.getServer().getPluginManager().registerEvents(this, this.plugin);
        if (cmd.getName().equalsIgnoreCase("bubble"))
        {
            if (sender instanceof Player)
            {
                if (args.length > 0 && args.length <= 2)
                {
                    if (Bukkit.getPlayer(args[0]) != null)
                    {
                        Player victim = (Bukkit.getPlayer(args[0]));



            FixedMetadataValue metadataValue = new FixedMetadataValue(this.plugin, true);
            if (args[1].equalsIgnoreCase("off")){

                  Bukkit.broadcastMessage(ChatColor.GREEN + victim.getName() + ChatColor.DARK_GRAY + " Is no longer in a bubble!");
                victim.removeMetadata("isInbubble", this.plugin);

                return true;
            }else if (args[1].equalsIgnoreCase("on")){

                  Bukkit.broadcastMessage(ChatColor.GREEN + victim.getName() + ChatColor.DARK_GRAY + " Is now in a bubble!");
                victim.setMetadata("isInBubble", metadataValue);

                if (victim.hasMetadata("isInBubble"))
                {
                    victim.sendMessage("Metadata assigned");
                }
                return true;
            }






        }
        else
        {
            sender.sendMessage(ChatColor.RED + "Player is not online!");
            return false;
        }

        }
        else
        {
            sender.sendMessage(ChatColor.RED + "Invalid arguments!");
            return false;
        }


    }
    else
    {
        sender.sendMessage(ChatColor.AQUA + "The console cannot bubble someone!");
        return false;
    }

}



return false;
    }
    @EventHandler
    public void onPlayerMove(PlayerMoveEvent e) {
         Player mover = e.getPlayer();
         Location from = e.getFrom();
         Location to = e.getTo();
         Collection<Entity> nearbyEntities = mover.getWorld().
         getNearbyEntities(from,  10, 10, 10);//Get entities in a 10 block square from loc "from"
         List<Player> nearbyPlayers = new ArrayList<Player>();
         for (Entity en : nearbyEntities) {
             if (en instanceof Player)
             {
               nearbyPlayers.add((Player) en);
             }
         }
         for (Player victim : nearbyPlayers) {
             if (victim.hasMetadata("isInBubble") && victim != mover) {
                Location victimLoc = victim.getLocation();
                if (victimLoc.distance(to) <= 5) {//Radius 5
                    mover.sendMessage("mover");
                    victim.sendMessage("victim");
                     //Cancel so cant move
                     //we have nothing left no need to get in for statement again
                }
                }
             }
         }
    }
package me.Glowhoo.EpicUtil;
导入java.util.ArrayList;
导入java.util.Collection;
导入java.util.List;
导入org.bukkit.bukkit;
导入org.bukkit.ChatColor;
导入org.bukkit.Location;
导入org.bukkit.command.command;
导入org.bukkit.command.CommandExecutor;
导入org.bukkit.command.CommandSender;
导入org.bukkit.entity.entity;
导入org.bukkit.entity.Player;
导入org.bukkit.event.EventHandler;
导入org.bukkit.event.Listener;
导入org.bukkit.event.player.PlayerMoveEvent;
导入org.bukkit.metadata.FixedMetadataValue;
导入org.bukkit.plugin.plugin;
/*
*作者=
*怒吼
* 
*/
公共类Bubble实现CommandExecutor、Listener{
私有主插件;
公共泡泡(主插件)
{
this.plugin=plugin;
}
@凌驾
公共布尔onCommand(CommandSender-sender、Command cmd、String commandLabel、String[]args)
{
Bukkit.getServer().getPluginManager().registerEvents(this,this.plugin);
if(cmd.getName().equalsIgnoreCase(“气泡”))
{
if(播放机的发送方实例)
{

如果(args.length>0&&args.length将冒泡元数据插入到人员中,这样我们就知道谁在冒泡中了

FixedMetadataValue metadataValue = new FixedMetadataValue(plugin, true);
victim.setMetadata("isInBubble", metadataValue);
现在,您需要处理
PlayerMoveEvent
,让玩家在移动器周围走动,并检查是否有这样的“isInBubble”(无需检查值):

要删除它,您需要与创建它时使用的插件类相同的插件类

mover.removeMetadata("isInBubble", plugin);
我为您编写了以下代码:

@EventHandler
public void onPlayerMove(PlayerMoveEvent e) {
     Player mover = e.getPlayer();
     Location from = e.getFrom();
     Location to = e.getTo();
     Collection<Entity> nearbyEntities = mover.getWorld().getNearbyEntities(from,  10, 10, 10);//Get entities in a 10 block square from loc "from"
     List<Player> nearbyPlayers = new ArrayList<Player>();
     for (Entity en : nearbyEntities) {
         if (en instanceof Player)
           nearbyPlayers.add((Player) en);
     }
     for (Player victim : nearbyPlayers) {
         if (victim.hasMetadata("isInBubble") && victim != mover) {
            Location victimLoc = victim.getLocation();
            if (victimLoc.distance(to) <= 5) {//Radius 5
                e.setCancelled(true); //Cancel so cant move
                return; //we have nothing left no need to get in for statement again
            }
            }
         }
     }
}
@EventHandler
PlayerMove上的公共无效(PlayerMoveEvent e){
Player mover=e.getPlayer();
位置from=e.getFrom();
位置to=e.getTo();
Collection nearbyEntities=mover.getWorld().getNearbyEntities(from,10,10,10);//从loc“from”获取10块正方形中的实体
List nearbyPlayers=new ArrayList();
for(实体en:nearbyEntities){
if(播放器的en实例)
nearbyPlayers.add((Player)en);
}
用于(玩家受害者:近距离玩家){
if(受害者.hasmatadata(“isInBubble”)&受害者!=mover){
Location-victimLoc=victor.getLocation();
如果(受害者位置距离)
@EventHandler
public void onPlayerMove(PlayerMoveEvent e) {
     Player mover = e.getPlayer();
     Location from = e.getFrom();
     Location to = e.getTo();
     Collection<Entity> nearbyEntities = mover.getWorld().getNearbyEntities(from,  10, 10, 10);//Get entities in a 10 block square from loc "from"
     List<Player> nearbyPlayers = new ArrayList<Player>();
     for (Entity en : nearbyEntities) {
         if (en instanceof Player)
           nearbyPlayers.add((Player) en);
     }
     for (Player victim : nearbyPlayers) {
         if (victim.hasMetadata("isInBubble") && victim != mover) {
            Location victimLoc = victim.getLocation();
            if (victimLoc.distance(to) <= 5) {//Radius 5
                e.setCancelled(true); //Cancel so cant move
                return; //we have nothing left no need to get in for statement again
            }
            }
         }
     }
}