2017-10-24 2 views
0

그래서 내가하고있는 일은 플레이어가 PlayerInteractEvent을 사용하여 공기를 오른쪽 클릭하면 플레이어의 타겟 블록을 가져 와서 "블록"이라는 변수로 저장하는 것입니다.버튼을 누르기 (먼 곳에서)

이 모든 것은 정상적으로 작동하지만이 블록과 버튼이 맞는지 확인하고 싶습니다. 그렇다면 "밀어 넣기"만하면됩니다. 그 형태는 참으로 버튼 인 경우

내가 확인 후 org.bukkit.material.Button에 블록을 캐스팅 시도, 그때과 같이 전원으로 설정합니다 ((Button) block.getState().getData()).setPowered(true);,하지만 난 다음 시도 그래서 아무 짓도 안 했어요 : block.setData((byte) (block.getData() | 0x8)));을, 그 그것을 켜 놓았지만 계속 머물렀다.

어떻게하면 제대로 할 수 있습니까?

@SuppressWarnings("deprecation") 
@EventHandler 
public void onPlayerInteraction(PlayerInteractEvent e) { 
    if (e.getAction().equals(Action.RIGHT_CLICK_AIR)) { 
     Block block = e.getPlayer().getTargetBlock((Set<Material>) null, 200); 
     if (block.getType().equals(Material.STONE_BUTTON) || block.getType().equals(Material.WOOD_BUTTON)) { 
      block.setData((byte) (block.getData() | 0x8)); 
     } 
    } 
} 

PS :

여기에 전체 코드 나는 Spigot 1.12.2 API을 사용하고 있습니다.

답변

1

우선 버튼이 블록이기 때문에 RIGHT_CLICK_BLOCK 동작을 트리거하려고합니다. 둘째, 버튼을 누르기 전에 이벤트가 호출되므로 플레이어가 클릭 한 후 buttom의 상태를 변경하려면 나중에 이벤트를 전달한 후 나중에 변경해야하는 작업을 실행해야합니다.

또한 손으로 항목 유형을 null로 확인하지 않아도됩니다. ItemStack이 null이 아니면 Material은 null이 아니며 ItemStack이 null 인 경우 NPE를 catch하여 Material을 얻습니다. 버전 1.9 이상에서는 PlayerInteractEvent이 두 번 (손과 손으로) 호출되기 때문에 EquipmentSlot을 확인할 수도 있습니다.

ItemStack item = e.getPlayer().getInventory().getItemInMainHand(); 
if (e.getAction().equals(Action.RIGHT_CLICK_BLOCK) && e.getHand() == EquipmentSlot.HAND 
     && (item == null || item.getType() == Material.AIR)) { 
    // Your code 
} 

차단하기 위해 모든 다시 쓰기 및 업데이트, Button에 캐스팅, 블록 상태에서 MaterialData를 얻을, 새로운 방식으로 버튼의 상태를 변경 전원 상태를 변경하려면 :

Button button = (Button) block.getState().getData(); 
button.setPowered(true); 
block.getState().setData(button); 
block.getState().update(); 

또한, 당신 돈 ActionRIGHT_CLICK_BLOCK 인 경우 블록에서 마주보고 확인해야합니다. 그러면 이벤트에서 직접 가져올 수 있습니다.

Block block = e.getClickedBlock(); 

그래서, 나는, 최종 코드는 수도 외모 그렇게 생각 :

Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin("YourPluginName"); 
ItemStack item = e.getPlayer().getInventory().getItemInMainHand(); 
if (e.getAction().equals(Action.RIGHT_CLICK_BLOCK) && e.getHand() == EquipmentSlot.HAND 
     && (item == null || item.getType() == Material.AIR)) { 
    Block block = e.getClickedBlock(); 
    Bukkit.getServer().getScheduler().runTaskLater(plugin, new Runnable() { 
     public void run() { 
      Button button = (Button) block.getState().getData(); 
      button.setPowered(true); 
      block.getState().setData(button); 
      block.getState().update(); 
     } 
    }, 2L); 
} 
+0

아, 그래서, 당신은 공기 이벤트에서 마우스 오른쪽 버튼으로 클릭이 자동으로 bukkit 취소 때문에, 취소 무시 추가해야합니다. '@EventHandler (ignoreCancelled = true)'를 시도하십시오. – i0xHeX

+0

댓글 상자에 "댓글을 사용하여 더 많은 정보를 요청하거나 개선을 제안합니다."라고 표시됩니다. 단순히 "이것이 작동하지 않는다"고 말하면 무엇이 잘못되었는지 찾아내는 데 도움이되지 않습니다. – Moira

+0

그래, 버튼을 클릭하는 방법을 알아 냈어.하지만 이제는 플레이어가 아무 아이템도 가지고 있지 않을 때 공중에서 오른쪽 클릭을 감지하는 또 다른 문제가있다. –