SigExpression
Expression module
조건이나 결과 값으로 쓰일 수 있는 표현식을 관리하는 모듈입니다.
Usage
기본적인 사용 방법은 SigExpressionApi#getExpression(String) 입니다.
String expression = "{sigachievement_daily_block_break} >= 10"
SigExpression sigExpression = SigExpressionApi.getInstance().getExpression(expression);
return sigExpression.isTrue(player);Feature
Overview
표현식 평가기는 내부적으로
EvalEx를 사용합니다. EvalEx Documentationplaceholder 는 중괄호를 사용합니다.
두 개 이상의 placeholder 를 넣을 수 있습니다.
기본적인
PlaceholderProvider는PlaceholderAPI를 사용하며, 값을 찾을 수 없는 경우IdentityPlaceholderProvider를 사용합니다. (값 그대로 반환)
Methods
getNumber(Player): expression의 number 값을 얻습니다. def는0입니다. 실패 시 logging 합니다.getNumber(Player, double): 위와 같으나, 제공된 def 값을 반환하며 logging 하지 않습니다.getBoolean(Player): expression의 boolean 값을 얻습니다. def는false입니다. 실패 시 logging 합니다.getBoolean(Player, boolean): 위와 같으나, 제공된 def 값을 반환하며 logging 하지 않습니다.isTrue(Player):getBoolean(Player)과 같습니다.isFalse(Player):!getBoolean(Player)과 같습니다.
SigExpressionUtil
getDescAsParsed(Player, List): SigExpression 값을 parse한 결과를 보여줍니다. def 값은-입니다. 예){sigachievement_daily_block_break}/10 -> 5/10
Format
SigExpressionFactory는 아래 3개의 Format 을 받을 수 있습니다.
expressionex)
"{a} == 10 && {b} == 5"
expression;desc표현식에는 설명이 붙을 수 있습니다. 밑의 Desc 부분을 참고해주세요.
ex)
"{a} == 10 && {b} == 5;Simple description"
type;expression;desc하위 호환성을 위한 Format 으로, type 부분은 무시됩니다.
ex)
"INTEGER;{a} == 10 && {b} == 5;First Desc,Second Desc"
Parse
Placeholder parsing 을 위해 사용되는 SigParser는 EvalEx와 다른 별개의 시스템을 사용합니다. (재사용을 시도해보았으나 해당 부분은 EvalEx Tokenizer에 하드코딩 되어 있습니다.)
해당 부분은 PlaceholderProvider가 값을 가져오고 이 값을 EvalEx에 넣을 때 맞는 Type 으로 변환하는 부분에서 사용되고 있습니다. 따라서 Placeholder 가 주는 값을 EvalEx의 타입에 맞게 넣었더라도 SigType 에 없는 경우 적용되지 않을 수 있습니다.
CompositionPlaceholderProvider
여러 개의 PlaceholderProvider를 가지는 Provider 입니다. 맨 처음 canParse(Player, String)가 true인 Provider의 값을 return 합니다.
Provider를 찾지 못했는데 def 값이 없을 경우 IllegalArgumentException을 throw 합니다.
Desc
SigExpression 에는 별도의 Desc 가 붙을 수 있습니다.
Desc 는 여러 줄이 들어갈 수 있으며, ,로 구분됩니다.
"INTEGER;{a} == 10 && {b} == 5;First Desc,Second Desc""{a} == 10 && {b} == 5;Simple description"
SigDescExpression#getDesc()로 사용 가능하며, getDescAsParsed()를 사용하면 Placeholder 값을 자동으로 채워준 Desc 을 받을 수 있습니다.
Example
{placeholder} > 0 && {placeholder_2} <= 1.5{placeholder} + 500.56;{placeholder} 더하기 500.56
Caution
getNumber()의 fallback 값은0입니다.getBoolean()의 fallback 값은false입니다.비교식의 경우
NaN등 String 값을 반환할 시String#compareTo를 이용하며, 의도치 않은 결과를 반환할 수 있습니다.
Last updated