2016-11-16 6 views
0

プレイヤーに参加させるItemStackを作成しましたが、期待通りに動作しません。プレイヤーが参加したときにサーバが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をPlayerに渡すことができますか?

+1

問題は何ですか?エラーメッセージはありますか?また、誰かがあなたのサーバに参加した場合、そのサーバ上の誰もが何をしていてもアイテムを取得していることに注意してください。色のために§を使う代わりに、例えば 'ChatColor.RED'を使います。 – Squiddie

答えて

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); 
} 

を、私はあなたのセットアップと間違って何も表示されません。あなたのコードに次の間違いを探し

0

を修正する必要があります。

  • は役に立たない方法registerLiteners()とその呼び出しのすべてを削除します。このメソッドは実際に何もしません。
  • PlayerにItemStackを追加するために、すべてのオンラインプレーヤーを交代させるべきではありません。すべての

第二:私はあなたの状況として理解することができますどのようなあなたの質問からは、次のとおりです。あなたはプレイヤーがサーバーに参加して、そののためのアイテムを受信したいです。あなたがそれを処理する方法は、プレーヤーがサーバーに参加するたびに、サーバー内のすべてのプレイヤーの在庫に対してアイテムを追加することです。あなたがいる状況は、あなた自身でプラグインをテストしていることです。あなたが参加したときにオンラインのプレーヤーがないので、何もアイテムが与えられていません。彼が参加した後、イベントがプレイヤーのインベントリにカスタム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が開催されると解雇されます。

+0

私のコードをあなたが言ったことに変えましたが、それでも彼らはTNTを手に入れませんでしたか?私はまた、プレーヤーが参加して無効にしたときに項目を追加する他のプラグインをチェックしましたが、それは差異をもたらしませんでした。 – InfernoArtz

+0

@InfernoArtz私がテストしているとき、意図どおりに動作します。私のフルコードを見てみましょう:http://pastebin.com/EsRdVbAG – Kerooker

関連する問題