java - 如何在 MC Bukkit(Java 插件)中从命令中获取播放器
问题描述
我正在尝试使用插件在我的 Minecraft 世界中用病毒“感染”某人。我已经完成了它,它也像我想要的那样随机工作,但我也想用命令感染人们(比如“/infect”。我一直在寻找解决方案几个小时但我放弃了,所以我会想寻求帮助。这是插件中的我的 Main.jar:
import java.util.Random;
import java.lang.reflect.Method;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
public class Main extends JavaPlugin{
@Override
public void onEnable(){
getLogger().info("Pandemic has been activated...");
PluginManager pm = getServer().getPluginManager();
firstListener listener = new firstListener(this);
pm.registerEvents(listener, this);
}
public void onDisable(){
getLogger().info("Pandemic has shut down!");
}
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
Player player = (Player) sender;
if (sender instanceof Player) {
String lowerCmd = cmd.getName().toLowerCase();
switch (lowerCmd) {
case "infect":
firstListener listener = new firstListener(this);
listener.infection();
return true;
default:
player.sendMessage("Ese comando no existe");
return true;
}
}
player.sendMessage("Ese comando no existe");
return true;
}
}
我的 listener.jar 中有“感染”功能:
import java.util.Random;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
public class firstListener implements Listener {
//Constructor
public firstListener(Main plugin) {
Bukkit.getScheduler().scheduleSyncRepeatingTask(Bukkit.getPluginManager().getPlugin("Plugin"), new Runnable() {
@Override
public void run() {
Random rand = new Random();
// Generate random integers in range 0 to 999
int rand_int1 = rand.nextInt(31);
if (rand_int1 == 30) {
Player randomPlayer = Bukkit.getOnlinePlayers().stream().skip((int) (Bukkit.getOnlinePlayers().size() * Math.random())).findFirst().orElse(null);
randomPlayer.sendMessage(ChatColor.RED+ "Has sido lamentablemente infectado por coronavirus");
randomPlayer.addPotionEffect(new PotionEffect(PotionEffectType.WEAKNESS,18000, 1));
randomPlayer.addPotionEffect(new PotionEffect(PotionEffectType.CONFUSION,18000, 1));
randomPlayer.addPotionEffect(new PotionEffect(PotionEffectType.SLOW,18000, 1));
}
}
}, 1L , (long) 9000 * 20);
}
public void infection()
{
Player selectedPlayer = Bukkit.getPlayer("yo");
selectedPlayer.sendMessage(ChatColor.RED+ "Has sido lamentablemente infectado por coronavirus");
selectedPlayer.addPotionEffect(new PotionEffect(PotionEffectType.WEAKNESS,18000, 1));
selectedPlayer.addPotionEffect(new PotionEffect(PotionEffectType.CONFUSION,18000, 1));
selectedPlayer.addPotionEffect(new PotionEffect(PotionEffectType.SLOW,18000, 1));
}
//EventHandler
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
}
}
谢谢!
解决方案
你想在 /infect 被触发后感染随机玩家吗?或者只是感染命令发送者?
这是代码:
public class infect implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command cmd, String arg, String[] args) {
if(sender instanceof Player) {
Player p = (Player) sender;
// Infect command sender
if(p.hasPermission("infect")) {
/*
* Call event here
* Like add potion effect
*/
}
// Infect target player
if(p.hasPermission("infect")) {
if(args.length >= 1) {
try {
Player target = Bukkit.getPlayer(args[0]);
if(target.isOnline()) {
/*
* Call event here
* Like add potion effect
*/
}
} catch (Exception e) {
}
}
}
// Infect random player
if(p.hasPermission("infect")) {
int r = new Random().nextInt(Bukkit.getOnlinePlayers().size());
List<Player> isO = new ArrayList<Player>();
for (Player on : Bukkit.getOnlinePlayers()) {
isO.add(on);
}
if(isO.get(r) != null) {
/*
* Call event here
* Like add potion effect
*/
}
}
}
return true;
}
}
推荐阅读
- firebase - Firebase Google 以身份验证中的用户身份登录
- java - 我在 Windows 上安装了 JDK 和 JRE 时如何运行 Java 代码?
- html - CSS媒体查询不着色文本
- python - 变换频谱以消除正弦扫描失真
- python - 如何使用 Tensorboard 通过 Keras 功能 API 创建活动直方图
- python - 在 AWS Lambda 中使用 boto3 ThreadPoolExecutor 并行检索 S3 对象
- bash - Bash 命令适用于 Mac OS,但不适用于 Ubuntu 20.4
- c++ - How to populate and edit a std::array of maps
- python - 奇点容器中从来没有python?
- python - 比较 2 个数据框中每列有多少不同的值