2016-11-16 26 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提供給玩家?

+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()及其所有的呼叫。該方法並沒有真正做任何事情。
  • 您不應該讓所有在線玩家都將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); 
} 

本次活動將他加入後,你itemstack自定義添加到玩家的庫存服務器。



同樣重要的是要指出的是,雖然這不是你的問題的一部分,你的PlayerInteractEvent應固定於只能聽您的自定義ItemStack。它將在任何TnT舉行時被解僱。

+0

我改變了我的代碼,你說了什麼,但他們還沒有得到任何TNT?我還檢查了另一個插件,當玩家加入並禁用它時添加了一個項目,但這並沒有做出區別。 – InfernoArtz

+0

@InfernoArtz當我測試時,它按預期工作。看看我的完整代碼:http://pastebin.com/EsRdVbAG – Kerooker

相關問題