2015-08-13 99 views
-1

我试图编码一个带有两个参数的命令:第一个是要冒泡的玩家,第二个是气泡的半径。 它看起来像/bubble <player> <radius>气泡排斥

我基本上都希望任何在这个半径范围内行走的人都被枪杀得很远,但我真的不知道该怎么做。 我坚持的主要部分是知道某人是否在距离受害者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 
       } 
       } 
      } 
     } 
    } 

回答

1

插入气泡元数据给人,所以我们知道谁在气泡中。

FixedMetadataValue metadataValue = new FixedMetadataValue(plugin, true); 
victim.setMetadata("isInBubble", metadataValue); 

现在你需要处理PlayerMoveEvent并得到各地发球员和检查是否有这些“isInBubble”像这样(无需检查值):

mover.hasMetadata("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