2015-08-07 3 views
0

Я создаю плагин Spleef. Мне нужно подсчитать количество людей в фойе.Проверьте, сколько человек находится на определенном расстоянии от центра

Я думал, что могу подсчитать, сколько людей находится на некотором расстоянии от центра лобби. Я думаю, что это может работать лучше, чем запись, когда кто-то вводит команду.

Main.java:

package me.olsyboy.spleef; 

import org.bukkit.Bukkit; 
import org.bukkit.ChatColor; 
import org.bukkit.Location; 
import org.bukkit.World; 
import org.bukkit.command.Command; 
import org.bukkit.command.CommandSender; 
import org.bukkit.entity.Player; 
import org.bukkit.plugin.java.JavaPlugin; 
import org.bukkit.configuration.file.YamlConfiguration; 

import java.util.Arrays; 
import java.util.List; 

public class Main extends JavaPlugin { 
    public void onEnable(int amountOfPlayers) { 
     amountOfPlayers = 0; 
     loadConfiguration(); 
     reloadConfig(); 
    } 

    public void onDisable() { 
     saveDefaultConfig(); 
    } 

    public void loadConfiguration() { 
     //See "Creating you're defaults" 
     getConfig().options().copyDefaults(true); // NOTE: You do not have to use "plugin." if the class extends the java plugin 
     //Save the config whenever you manipulate it 
     saveDefaultConfig(); 
    } 

    @Override 
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { 
     Player player = (Player) sender; 
     if (cmd.getName().equalsIgnoreCase("spleef")) { 
      if (args[0].equalsIgnoreCase("setgame")) { 
       if (args.length == 2) { 
        String gameName = args[1]; //initialize the gameName variable here 
        getConfig().set("Game Locations." + gameName + ".Location", Arrays.asList(player.getLocation().getX(), player.getLocation().getY(), player.getLocation().getZ(), player.getLocation().getPitch(), player.getLocation().getYaw(), player.getLocation().getWorld().getName())); 
        getConfig().options().copyDefaults(true); 
        saveConfig(); 
        player.sendMessage(ChatColor.AQUA + "[Spleef] " + ChatColor.YELLOW + "Spleef Game Location Set"); 
       } 
      } 
      if (args[0].equalsIgnoreCase("join")) { 
       String gameName = args[1]; //initialize the gameName variable here 
       List<String> joinGameLocation = this.getConfig().getStringList("Game Locations." + gameName + ".Location"); 
       String xPos = joinGameLocation.get(0); 
       double xPos2 = Double.parseDouble(xPos); 

       String yPos = joinGameLocation.get(1); 
       double yPos2 = Double.parseDouble(yPos); 

       String zPos = joinGameLocation.get(2); 
       double zPos2 = Double.parseDouble(zPos); 

       String pitch = joinGameLocation.get(3); 
       float pitch2 = Float.parseFloat(pitch); 

       String Yaw = joinGameLocation.get(4); 
       float Yaw2 = Float.parseFloat(Yaw); 

       World actualWorld = Bukkit.getWorld(joinGameLocation.get(5)); 
       Location spleefGameLocation = new Location(actualWorld, xPos2, yPos2, zPos2); 
       spleefGameLocation.setPitch(pitch2); 
       spleefGameLocation.setYaw(Yaw2); 
       player.teleport(spleefGameLocation); 
      } 
      else if (!(args[0].equalsIgnoreCase("setgame"))) { 
       if (!args[0].equalsIgnoreCase("join")) { 
        player.sendMessage("/spleef join {GameName}"); 
       } 
      } 
     } 
     return true; 
    } 
} 

playerJoinedGame.java:

package me.olsyboy.spleef; 

public class playerJoinedGame extends Main { 
    public void onPlayerJoin(int amountOfPlayers) 
    { 
     amountOfPlayers = amountOfPlayers + 1; 
    } 
} 

Я не назвал onPlayerJoin метод из основного класса еще.

Я открыт для всех, кто имеет лучшие способы подсчета количества людей в холле.

+0

Просто дополнительная записка о ваших методах подсчета игроков. Прежде всего, полезный совет: используйте «amountOfPlayers + = 1» или «amountOfPlayers ++», это увеличит числовое поле (целые числа, парные, поплавки и т. Д.) Более чистым способом. Другой способ получить количество игроков на сервере: Bukkit.getOnlinePlayers(). Length; или Bukkit.getOnlinePlayers.size(); (в зависимости от версии, которую вы используете). Вы можете использовать это в виде Runnable или с помощью событий PlayerJoin/PlayerQuit. – Momo

ответ

2

Убедитесь, что у вас есть объект Location, центр которого вы хотите найти близлежащих игроков.

Location center = new Location(world, x, y, z); 

Затем укажите значение double с необходимым расстоянием.

double distance = 10D; 

Прежде всего, вы должны сделать петлю из всех игроков на сервере:

for (Player player : Bukkit.getOnlinePlayers()) { 

} 

Затем, получить расположение player:

for (Player player : Bukkit.getOnlinePlayers()) { 
    Location location = player.getLocation(); 
} 

Теперь мы можем сделать проверка расстояния между двумя местоположениями (center и location):

for (Player player : Bukkit.getOnlinePlayers()) { 
    Location location = player.getLocation(); 
    if (location.distanceSquared(center) <= distance * distance) { 
     // Do something 
    } 
} 

Примечание: Вы должны использовать distanceSquared(Location) что эквивалентно результат квадрат distance(Location), потому что distance(Location) использует метод квадратного корня Java, которая является очень ресурсосберегающей тяжелым.

Окончательный результат:

double distance = 10D; 
Location center = new Location(Bukkit.getWorld("world"), x, y, z); 

for (Player player : Bukkit.getOnlinePlayers()) { 
    Location location = player.getLocation(); 
    if (location.distanceSquared(center) <= distance * distance) { 
     // Do something 
    } 
} 
+0

Зачем вам нужно умножать 'расстояние'? –

+1

Поскольку distanceSquared() возвращает квадрат расстояния. Поскольку мы не хотим использовать метод distance() (который использует операцию с квадратным корнем), лучше сравнивать расстояния, используя квадрат и метод distanceSquared(). Это имеет минимальные последствия для маломасштабных ситуаций, но по-прежнему является лучшей практикой. - Использование distance() может привести к задержке сервера при злоупотреблении. – Momo

+1

Просто прочитайте https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Location.html#distance(org.bukkit.Location) и https: // hub.spigotmc.org/javadocs/spigot/org/bukkit/Location.html#distanceSquared(org.bukkit.Location). – Momo

Смежные вопросы