2015-01-02 1 views
0
나는 Bukkit 플러그인을 만들고있어

은이 플러그인은 계정 플러그인 두 번 전송,이 클래스 플레이어가 로그인 이벤트를 처리합니다. 어떤 이유 BlockPlaceEvent 들어은 플레이어가 자신의 서버 계정에 로그인하지 않은 상태에서 이벤트를 중지하고 메시지를 보냅니다. 모든 것이 올바르게 해고됩니다. 그러나 어떤 이유로 그것은 메시지를 두 번 보냅니다.Player.sendMessage는()

코드 :

@EventHandler 
public void OnPlayerQuit(PlayerQuitEvent PQE) { 
    // Case the PQE Entity to a player. 
    Player Player = (Player) PQE.getPlayer(); 

    // Get the players UUID to open the file needed 
    String UserUUID = Player.getUniqueId().toString(); 

    // Open the file and read it 
    File Directory = new File("./plugins/ServerUtils/ServerAccounts/" + UserUUID + ".json"); 
    if(Directory.exists()) { 
     try { 
      JSONObject NewFinalResult = new JSONObject(this.readFile(Directory)); 
      NewFinalResult.getJSONObject("info").put("loggedin", false); 
      this.overWriteToFile(Directory, NewFinalResult.toString()); 
     } 
     catch(Exception E) { 
      E.printStackTrace(); 
     } 
    } 

} 

@EventHandler 
public void OnPlayerChat(PlayerChatEvent PCE) { 
    Player Player = (Player) PCE.getPlayer(); 
    String UserUUID = Player.getUniqueId().toString(); 
    File Directory = new File(Directories.ServerAccounts + "/" + UserUUID + ".json"); 
    JSONObject UserFileJSON = new JSONObject(this.readFile(Directory)); 
    if(UserFileJSON.getJSONObject("info").getBoolean("loggedin") == false) { 
     PCE.setCancelled(true); 
     Player.sendMessage(ChatColor.RED + "You must be logged in to do this!"); 
     Player.sendMessage(ChatColor.RED + "To log in, simply type: " + ChatColor.BLUE + "\"/login <password>\""); 
    } 
} 

@EventHandler 
public void OnBlockBreak(BlockBreakEvent BBE) { 
    Player Player = (Player) BBE.getPlayer(); 
    String UserUUID = Player.getUniqueId().toString(); 
    File Directory = new File(Directories.ServerAccounts + "/" + UserUUID + ".json"); 
    JSONObject UserFileJSON = new JSONObject(this.readFile(Directory)); 
    if(UserFileJSON.getJSONObject("info").getBoolean("loggedin") == false) { 
     BBE.setCancelled(true); 
     Player.sendMessage(ChatColor.RED + "You must be logged in to do this!"); 
     Player.sendMessage(ChatColor.RED + "To log in, simply type: " + ChatColor.BLUE + "\"/login <password>\""); 
    } 
} 

@EventHandler 
public void OnBlockPlace(BlockPlaceEvent BPE) { 
    Player Player = (Player) BPE.getPlayer(); 
    String UserUUID = Player.getUniqueId().toString(); 
    File Directory = new File(Directories.ServerAccounts + "/" + UserUUID + ".json"); 
    JSONObject UserFileJSON = new JSONObject(this.readFile(Directory)); 
    if(UserFileJSON.getJSONObject("info").getBoolean("loggedin") == false) { 
     BPE.setCancelled(true); 
     Player.sendMessage(ChatColor.RED + "You must be logged in to do this!"); 
     Player.sendMessage(ChatColor.RED + "To log in, simply type: " + ChatColor.BLUE + "\"/login <password>\""); 
    } 
} 
+1

있습니까 같은 이벤트가 두 번 열리지는 않습니까? 아니면 동시에 2 개의 다른 이벤트를 받고 있습니까? 각 이벤트의 메시지를 조금씩 바꿀 수 있으므로 어떤 이벤트를 통해 메시지를 보내고 있는지 확인할 수 있습니다. –

+0

@DavidtenHove BlockPlaceEvent가 취소되었을 때 트리거 할 것이라고 생각했기 때문에 BlockBreakEvent를 제거했지만 아무것도 삭제하지 않았기 때문에 제거했습니다. 다른 사건들 중 아무 것도 이것을하지 않습니다. –

+0

@DavidtenHove 나는 당신의 충고를 따랐으며, "이 블록을 놓으라고!"라고 말했습니다. 또는 "채팅!" 그래서 나는 어느 것이 발포하고 있는지, 그리고 "당신은이 블록을 배치하기 위해 로그인해야합니다!"라는 메시지를 알았습니다. 두 번 나타났습니다. 그래서 우리는 같은 사건이 다른 사건이 아닌 두 번씩 발포한다는 것을 압니다. –

답변

1

을 고정! 어떤 이유로, 메시지가 두 번 보낼 것입니다, 그래서 나중에 보낸 시간이 한 번 이상 더 큰 않네 확인했다 다수의 변수를 추가, 그것은 다시 0 다음으로 설정하는 코드입니다 : 당신이

int TimesSent = 0; 
@EventHandler 
public void OnBlockPlace(BlockPlaceEvent BPE) { 
    try { 
     Player Player = (Player) BPE.getPlayer(); 
     String UserUUID = Player.getUniqueId().toString(); 
     File Directory = new File(Directories.ServerAccounts + "/" + UserUUID + ".json"); 
     JSONObject UserFileJSON = new JSONObject(this.readFile(Directory)); 
     if(UserFileJSON.getJSONObject("info").getBoolean("loggedin") == false) { 
      BPE.setCancelled(true); 
      if(TimesSent < 1) { 
       Player.sendMessage(ChatColor.RED + "You must be logged in to place this block!"); 
       Player.sendMessage(ChatColor.RED + "To log in, simply type: " + ChatColor.BLUE + "\"/login <password>\""); 
       TimesSent++; 
      } 
      else { 
       TimesSent--; 
      } 
     } 
    } 
    catch(Exception E) { 
     if(E instanceof FileNotFoundException) { 
      //Ignore 
     } 
     else { 
      E.printStackTrace(); 
     } 
    } 
} 
+0

나 한테 부탁하면 꽤 고약한 수정. 메시지가 한 번만 전송 ​​되더라도 해당 메소드의 코드는 여전히 트리거되고 있습니다 ('File'작성, 읽기 및 구문 분석, 꽤 프로세스 집중적 인 활동). 값싼 해킹을 사용하는 대신 실제 문제의 근원을 찾아 수정해야합니다. 나는 또한 꽤 많이 몇 번 호출되는 방법으로 파일 읽기를 수행하지 않는 것이 좋습니다. 대신 플레이어 정보를 * 한 번 *로드해야 메모리에 저장되어 IO없이 IO에 쉽게 액세스 할 수 있습니다. 그런 다음 플러그인을 사용하면 파일에 저장합니다. –

+0

@VinceEmigh Ok. 플러그 인 FIRST가 시작된 다음 나중에 다시 호출합니다. 하지만 코드에서 오랫동안 다시 작성해야하지만 가치가있는 것처럼 보입니다. 또한, 아픈 TimesSent 위해 TimesTriggered 이름 바꾸기 및 전체 주위에 넣어, 그래서 메시지가 중복됩니다, 나는 위에서 언급 한대로 if 문없이 오류를 해결하기 위해 노력했습니다. –

+0

또한, 나는 진짜 픽스를 발견했다고 생각합니다. 문제의 핵심은 메인 파일 (모든 것을 시작하는 것)의 onEnable()이 한 클래스에 여러 리스너를 생성하고있는 것 같습니다. –