当玩家加入时,服务器不会给出ItemStack

时间:2016-11-16 20:46:19

标签: java bukkit

我创建了一个ItemStack,它应该在玩家加入时提供给玩家,但它不能按预期工作。

这是我的尝试:

public class Main extends JavaPlugin implements Listener{



public void onEnable(){
    Bukkit.getServer().getPluginManager().registerEvents(this, this);
    registerListeners();
}

private void registerListeners() {
    PluginManager pm = Bukkit.getPluginManager();
}

public static void giveItems(Player p) {

}


@EventHandler
public void onPlayerJoin(PlayerJoinEvent e) {
    Player p = e.getPlayer();
    ItemStack t = new ItemStack(Material.TNT, 1);
    ItemMeta tmeta = t.getItemMeta();
    tmeta.setDisplayName("§cTNT §7(Right click to use)");
    t.setItemMeta(tmeta);

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


    p.getInventory().setItem(4, t);
    p.getInventory().addItem(t);
    }
}



@SuppressWarnings("deprecation")
@EventHandler
public void onRightClick(PlayerInteractEvent e) {
    if(e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK) {
        if(e.getItem() != null && e.getItem().getType() == Material.TNT) {
            Player p = e.getPlayer();
            TNTPrimed tnt = (TNTPrimed) p.getWorld().spawn(p.getLocation(), TNTPrimed.class);
            tnt.setVelocity(p.getLocation().getDirection().normalize().multiply(1));
            p.updateInventory();

它失败了。 如何在加入服务器时成功将ItemStacks交给玩家?

2 个答案:

答案 0 :(得分:1)

呃,当你已经拥有要在变量p中提供项目的玩家时,为什么要循环遍历服务器中的所有玩家?您还没有使用正确的聊天颜色代码。

请改用:

// Imports and other code here...

@EventHandler
public void onPlayerJoin(PlayerJoinEvent e){
    Player p = e.getPlayer();
    ItemStack t = new ItemStack(Material.TNT);
    ItemMeta tmeta = t.getItemMeta();
    tmeta.setDisplayName(ChatColor.RED + "TNT " + ChatColor.GRAY + "(Right click to use)");
    t.setItemMeta(tmeta);
    p.getInventory().addItem(t);
}

除此之外,我没有发现您的设置有任何问题。

答案 1 :(得分:0)

查看您的代码时,应纠正以下错误:

  • 删除无用的方法registerLiteners()及其所有调用。该方法并没有真正做任何事情。
  • 您不应该让所有在线玩家都将ItemStack添加到您的播放器中。

其次:根据您的问题,我的理解是:您希望玩家加入服务器并收到该项目。您处理它的方式是,每次玩家加入服务器时,他都会在服务器中的每个在线玩家的项目库中添加项目。您可能遇到的情况是您正在自行测试插件,并且在您加入时没有在线玩家,这导致没有任何项目被提供。

考虑到所有因素,获得预期行为的正确方法应如下:

@EventHandler
public void onPlayerJoin(PlayerJoinEvent e) {
    Player joined = e.getPlayer();
    ItemStack itemToAdd = new ItemStack(Material.TNT);
    ItemMeta stackMeta = itemToAdd.getItemMeta();
    stackMeta.setDisplayName(ChatColor.RED + "TNT " + ChatColor.GRAY + "(Right click to use)");    //Using ChatColor is recommended over § character.
    itemToAdd.setItemMeta(stackMeta);
    joined.getInventory().addItem(itemToAdd);
}

该事件会在加入服务器后将您的自定义项目堆叠添加到玩家的库存中。

同样重要的是要指出,虽然它不是你问题的一部分,但你的PlayerInteractEvent应该被修复为只听你的自定义ItemStack。任何TnT都会被解雇。

相关问题