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 Documentation

  • placeholder 는 중괄호를 사용합니다.

  • 두 개 이상의 placeholder 를 넣을 수 있습니다.

  • 기본적인 PlaceholderProviderPlaceholderAPI를 사용하며, 값을 찾을 수 없는 경우 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 을 받을 수 있습니다.

  • expression

    • ex)"{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