💽PlaceHolderAPI
Luna PlaceholderAPI 전체 목록 (현재 코드 기준: Farming + Vital + Server + Item)
아래 목록은 제공된 클래스들의 onRequest()가 실제로 응답 가능한 플레이스홀더만 정리한 것입니다.
모두 내부에서 toLowerCase() 처리하므로 대/소문자 구분 없이 동작합니다.
1) FarmingPlaceholder (identifier = "farming")
identifier = "farming")기본 형식
%luna_farming_<params>%
동작 전제(빈 문자열 반환 조건)
player == null또는params == null/empty→""FarmingConfigManager.get() == null→""PlayerDataManager.get(uuid) == null→""
A. 메인 레벨/포인트
User user = User.getUser(player)가 null이면 아래 항목들은 전부 switch 미진입 → 결국""
%luna_farming_main_level%%luna_farming_main_xp%(소수 1자리 문자열)%luna_farming_main_xp_max%(소수 1자리 문자열)%luna_farming_main_progress%(0~100, 소수 1자리 문자열, 100 상한)%luna_farming_main_level_display%%luna_farming_stat_points%%luna_farming_skill_points%%luna_farming_stat_points_per_level%%luna_farming_skill_points_per_level%
B. 스탯(Stat)
형식:
%luna_farming_stat_<statId>_display%%luna_farming_stat_<statId>_desc%%luna_farming_stat_<statId>_value%%luna_farming_stat_<statId>%(위_value와 동일)
반환 규칙:
data.getTotalStat(statId)+data.getExternalStat("passive_skill_" + statId)(0이 아니면 더함)최종
int로 캐스팅 후 문자열 반환
C. 숙련도(Profession)
형식:
%luna_farming_profession_<professionId>_level%%luna_farming_profession_<professionId>_xp%(소수 1자리)%luna_farming_profession_<professionId>_progress%(0~100, 소수 1자리, 100 상한)%luna_farming_profession_<professionId>_display%%luna_farming_profession_<professionId>_desc%
특이사항:
progress는 조건 불충족 시"0"display/desc는 cfg 없으면""
D. 스킬(Skill) — 스킬ID 기반
형식:
%luna_farming_skill_<skillId>_<type>%
<type> 지원 전체:
namedescnext_desclevelmax_levelvaluenext_valueeffective_valueeffective_next_valuestat_displaycostcooldownnext_cooldowneffective_cooldowneffective_next_cooldownresource_costnext_resource_costeffective_resource_costeffective_next_resource_costeffective_leveleffective_level_rawbonus_leveleffective_bonusdisplay_leveldurationeffective_durationunlockunlocked(동일 동작)
중요 주의:
value/*value*는SkillLevelData.effects()의 첫 번째 effect 값만 사용
E. 스킬(Skill) — statId 자동 탐색 기반
형식:
%luna_farming_skill_<statId>_value%%luna_farming_skill_<statId>_effective_value%
동작:
모든 profession/skillTree를 순회하며
SkillLevelData.stats()에<statId>가 포함된 스킬을 처음 발견한 1개 기준으로 반환값은
Common.getDoubleToString(amount, 1)(소수 1자리)
주의:
동일 statId가 여러 스킬에 있으면 결과가 순회 순서에 의존(비결정)
F. 디버그
%luna_farming_debug_stats%%luna_farming_debug_external%
2) VitalPlaceholder (identifier = "vital")
identifier = "vital")기본 형식
%luna_vital_<param>%
전제:
player == null또는 오프라인 또는param == null→"0"vital / uservital 조회 실패 →
"0"<vitalId>는param.split("_")[0]이므로_포함 ID는 불가
지원 suffix:
%luna_vital_<id>_ratio%(0.0~1.0 clamp, String.valueOf)%luna_vital_<id>_current%%luna_vital_<id>_change_max%%luna_vital_<id>_max%%luna_vital_<id>_regen%%luna_vital_<id>_change_regen%%luna_vital_<id>_change_regen_interval%%luna_vital_<id>_decay%%luna_vital_<id>_change_decay%%luna_vital_<id>_change_decay_interval%
3) ServerDataPlaceholder (identifier = "server")
identifier = "server")기본 형식
%luna_server_<params>%
지원 목록:
%luna_server_online%현재 서버 온라인 인원 (
Bukkit.getOnlinePlayers().size())
%luna_server_total_online%전체 서버 총 인원 (
ServerPresence.listAliveWithTotal(env).totalPlayers)
%luna_server_online_<channel>%특정 채널 서버 인원
ServerPresence.getServerInfoByChannel(channel)없으면"0"
4) ItemDataPlaceholder (identifier = "item")
identifier = "item")기본 형식
%luna_item_<params>%
현재 코드에서 “실제로 의미 있게” 지원되는 케이스:
%luna_item_mainhand_name%메인핸드 아이템 이름 (
Common.getItemName(itemStack))이름이 존재하면 그 이름 반환
%luna_item_offhand_name%오프핸드 아이템 이름
이름이 존재하면 그 이름 반환
⚠️ 매우 중요(현재 코드 버그/오동작)
params가mainhand*또는offhand*로 시작하지만,_name이 아니거나,_name인데 아이템 이름이 비어있거나 null이면 아이템 정보가 아니라Bukkit.getOnlinePlayers().size()(온라인 인원)을 문자열로 반환합니다.
즉 아래도 “응답은 되지만” 의미는 온라인 인원으로 떨어집니다:
%luna_item_mainhand%%luna_item_mainhand_anything%(name 제외)%luna_item_offhand%%luna_item_offhand_anything%(name 제외)
그 외:
위 조건에 안 맞는 모든 값은
""
예시 모음
%luna_farming_stat_luck_value%%luna_farming_profession_fishing_progress%%luna_farming_skill_mass_fishing_effective_duration%%luna_vital_thirst_ratio%%luna_server_total_online%%luna_server_online_lobby%%luna_item_mainhand_name%
Last updated