스크립터브혼
스크립트 전문가
Vhone dc73ee51d49946dabf4f634c6e3ce5c6
// JAVA @EventHandler(priority = EventPriority.LOWEST) public void onJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); player.addAttachment(this).setPermission("testperm", true); player.recalculatePermissions(); // Data Reload this.getServer().realodData(); }
서버 접속 시 플레이어에게 퍼미션을 부여해도 명령어를 사용할 수 없어요.
접속한 상태에서 서버를 리로드하면 그때야 명령어를 사용할 수 있습니다.
player.hasPermission() 메소드는 true입니다. 플레이어는 퍼미션을 받았고,
오퍼레이터 플레이어가 접속하면 명령어가 잘 되기때문에 커맨드도 정상적으로 등록 되었습니다.
예전에 이 문제를 이벤트 우선순위를 바꿔서 해결을 했던것으로 기억하는데
뭐가 빠진건지 모르겠습니다.
# YAML commands: realy: permission: testperm permissions: testperm: description: testperm test
냥냐챠
2020.08.28이 부분은 답변하기 전에 한가지 물어봐야 되는 것이 있다냥.
a. 외부 퍼미션 관리 플러그인을 쓰고 있는가
b. 그냥 버킷 자체의 퍼미션 관리를 쓰고있는가
만약 a 의 경우라면, Bukkit API 의 setPermission 메소드를 경유해서 설정하는 방법은 다른 외부 퍼미션 관리 플러그인(LuckPerms 같은 것들)이 존중하지 않을 수가 있다냥.
이건 각 퍼미션 관리 플러그인들이 어떻게 퍼미션을 관리하고 있는지 상이하기 때문인데냥 퍼미션이 즉시 적용될 수도 있고 안될 수도 있다냥.
제일 좋은 방법은 해당 퍼미션 관리 플러그인들이 제공하는 API 를 이용해서 직접 그 플러그인에게 해당 사용자의 퍼미션이 갱신되었다는 것을
알려주는 거다냥. LuckPerms 가 이쪽으로는 가장 잘 제공하고 있다냥.
만약 외부 퍼미션 관리 플러그인 없이 저 코드를 실행했는데 저런 결과가 나오는 것이라면 후속 질문을 올려봐라냥
즐거운 코딩 판치해라냥 '^'b
스크립터브혼
2020.08.28사투 끝에 몇시간 전.. 해결했습니다... 버킷 내부 퍼미션에 관한 문제였습니다.
퍼미션과 커맨드를 저장하는 SimplePluginManager클래스에 대해서 더 알아 봤는데,
커맨드와 관련된 필드 commandMap,
퍼미션과 관련된 필드 permissions, defaultPerms, permSubs, defSubs가 어떤 일을 수행하는지 확인했습니다.
결론적으로 SimplePluginManager는 단순히 입력된 데이터를 받을 뿐이고,
실제로 데이터를 업데이트하는 일은 다른곳에서 한다는 것을 알았습니다.
플레이어의 addAttachment(Plugin)메소드에서 Plguin을 통해 SimplePluginManager의 permSubs 필드를 수정하고
recalculatePermissions()메소드는 permSubs필드의 퍼미션 중 플에이어 와 연관된 데이터를 업데이트하는 것을 확인했습니다.
그리고...
updateCommands()메소드로 SimplePluginManager에 등록된 커맨드와, 커맨드가 가지고 있는 퍼미션 키로 permSubs필드에 등록된 플레이어에게 명령어를 업데이드 해주는 것으로 최종확인했습니다...
SimplePluginManager나 서버에서 무언가 할 줄 알았는데, 그냥 플레이어가 가지고 있었네요.
객체지향... 이 뭔지 다시한번 깨닫는 시간이었어요...