Skip to content
Colda4988 edited this page Apr 11, 2022 · 8 revisions

TR에서 제공하는 조건문은 매우 강력합니다. TR에서는 어떠한 값 두개를 마음대로 비교하는것이 가능합니다. 밑에서 배울 IF문에서 이 조건문을 사용하는데, 이 조건문의 결과값에 따라 코드에 흐름을 마음대로 바꿀 수 있습니다.

조건문을 만드는 법

비교 연산자

비교 연산자는 true 혹은 false 가 결과값인 연산자 입니다. 사칙연산에서 + 가 두 수를 더해서 결과값이 숫자가 나오는거라면 비교 연산자(==, !=, >, <, >=, <=)는 두 값을 비교해서 결과에 따라 true 혹은 false 의 결과값이 나오게 됩니다.

연산자 비교
a == b a 와 b 가 같은지 비교
a != b a 와 b 가 다른지 비교
a > b a 가 b 보다 큰지 비교
a < b a 가 b 보다 작은지 비교
a >= b a 가 b 보다 크거나 같은지 비교
a <= b a 가 b 보다 작거나 같은지 비교

결과값은 항상 boolean값 으로 나오게 됩니다. 1 == 1 의 경우 true 1 > 5 의 경우 false

밑의 예제는 몇가지 올바른 비교 연산자 사용 방법 입니다.

  • $isop - 이 Placeholder 는 데이터 타입 자체가 boolean 입니다. 그렇기 때문에 굳이 불리언 연산자를 사용하지 않아도 됩니다
    • 예를들어 $isop$isop == true 는 사실상 같은 말 입니다
  • myLocalVariable != 10 - 지역변수 myLocalVariable이 10이 아닌지 검사 합니다.
  • {"myGlobalVariable"} >= 10 - 광역변수 myGlobalVariable이 10보다 크거나 같은지 검사합니다.

논리 연산자

다만 비교 연산을 하게 되는 경우 여러개의 비교를 동시에 해야 하는 경우가 있는데, 이런 경우 IF, ELSEIF 등을 겹쳐서 쓰기 보다는 논리 연산자를 이용해서 한번에 검사할 수 있습니다.

논리 연산자는 boolean 값에만 사용 할 수 있습니다!

&&(AND) 연산자

양 옆의 boolean 값이 true 인 경우 true가 됩니다. 하나라도 false라면 결과값 역시 false가 됩니다.

  • 1 == 1 && 2 == 2 - 통과 --- true && true
  • 1 == 2 && 2 == 2 - 안됨 --- false && true
  • 1 == 2 && 1 == 2 - 안됨 --- false && false

||(OR) 연산자

양 옆의 boolean 값 중 하나라도 true 인 경우 true 가 됩니다. 둘 다 false 라면 결과값도 false 가 됩니다.

  • 1 == 1 || 2 == 2 - 통과 --- true || true
  • 1 == 2 || 2 == 2 - 통과 --- false || true
  • 1 == 2 || 1 == 2 - 안됨 --- false || false

!(NOT) 연산자

단순히 boolean 값을 반대로 바꿔줍니다. true 라면 false로 false라면 true로 바뀝니다.

  • !(1 == 1) - 안됨 --- !(true)
  • !(1 == 2 && 2 == 2) - 통과 --- !(false && true)
  • !(1 == 2 || 1 == 2) - 통과 --- !(false || false)

IF 문

이제 TR에서 가장 재미있는 부분인 IF문 입니다! 이제 Placeholder나 위의 비교/논리 연산자도 알게 되었으니 이제 코드의 흐름을 바꿔 볼 시간입니다.

기본적인 구조

IF <boolean>
    <위의 값이 true 인 경우 실행 될 코드들>
ELSEIF <boolean>
    <처음의 IF 문이 false 였고 위의 값이 true 인 경우 실행 될 코드들>
ELSEIF <boolean>
    <위의 IF와 ELSEIF가 둘다 false 고 위의 값이 true 인 경우 실행 될 코드들>
...

ELSE
    <위의 모든 IF 와 ELSEIF가 false인 경우 실행 할 코드>
ENDIF
  • IF 문을 사용 하는 경우 반드시 IF 문이 끝나는 지점에 ENDIF 로 끝나는 지점을 표시 해야 합니다.
  • ELSEIF 나 ELSE 는 필요하지 않은 경우 사용하지 않아도 상관 없습니다.

예제

예제로 배우는것이 가장 쉬우니 예제를 보도록 하겠습니다.

IF takeItem(player, "DIAMOND", 1) -- 1
    #SOUND player.getLocation(), "ENTITY_PLAYER_LEVELUP", 1.0, 1.0 -- 2
    #CMDCON "econ add "+player.getName()+" 10" -- 3
    #MESSAGE "&aSold!" -- 4
ELSE -- 5
    #MESSAGE "&cYou do not have an iron." -- 6
ENDIF -- 7
  1. IF takeItem(player, "DIAMOND", 1)

takeItem() 의 경우 TR 에서 제공되는 메소드 중의 하나 입니다. CommonFunctions. 메소드가 뭔지 모른다면 함수를 생각 하시면 됩니다.

CommonFunctions 링크에 들어가시면 아마 "이게 다 대체 뭐야?" 이런 생각이 들것인데 전혀 걱정하지 않으셔도 됩니다. 거기 있는 정보를 모두 이해 할 필요가 없습니다!. 유심히 봐야 할 부분은 Method Summary 라는 곳 입니다.

Method Summary 아래에 보시면 takeItem(Player player, String id, int amount) 이라는 것을 아래쪽에서 찾을 수 있을 것 입니다. 자세한 내용은 볼 필요가 없구요 확인 하셔야 할것은 가장 왼쪽에 써있는 타입 입니다. 보시다시피 takeItem의 맨 왼쪽에 보시면 타입이 boolean 으로 되어 있을 것 인데 그것이 우리에게 필요한 정보 입니다. boolean? 우리가 지금 배우고 있는 그것이죠? 그리고 또한 () 안에 몇가지 종류가 있는데 그냥 퍼즐 맞추기를 한다고 생각 하시면 됩니다. player 에는 당연히 player가 들어가고 id는 아이템 id를 말하는 것 일거고 amount는 몇개일지 겠죠? 앞으로 뭔가 필요한 메소드가 있다면 이 CommonFunctions를 보시면 되는데 왼쪽의 타입과 () 사이에 뭘 넣어야 하는지만 알면 됩니다.

그럼 이제 이 메소드가 뭘 하는지를 알아야겠는데 영어가 가능하시면 내용을 읽어보셔도 되지만 아시다시피 타입이 boolean 입니다. truefalse 가 나오겠죠? 그리고 takeItem은 번역하자면 아이템을 가져온다 이런 뜻 입니다. 그럼 true나 false가 뭘 의미할까요? true면 해당 플레이어 에게서 해당 아이템을 지정한 갯수 만큼 가져 온것이고 false면 해당 플레이어가 아이템이 부족하다는 뜻 이겠죠?

  1. IF takeItem() 가 true 라면

아마 이미 이해 하셨을껍니다. IF takeItem() 가 true 라면, takeItem() 이 다이아몬드 1개 를 player 로 부터 가져온게 될것입니다. 그리고 값이 true 였기 때문에 IF문이 작동 해서 2, 3, 4 의 코드가 실행 됩니다.

  1. IF takeItem() 가 false 라면

IF takeItem() 이 false 라면 player 가 다이아몬드 가 한개도 없다는 것 이겠죠? 즉 아이템이 부족해서 false가 나오기 때문에 IF문은 실행되지 않고 그 밑의 ELSE 문이 실행 되게 됩니다.

  1. ENDIF

위에서도 말했지만 IF문은 항상 ENDIF로 끝을 지정 해 주어야 합니다.

Boolean Placeholder

boolean 타입인 Placeholders ($isop) 가 기억 나시나요? <boolean> 의 위치에 이 boolean 타입 Placeholder를 넣을 수 도 있습니다. 타입이 boolean이니 당연하겠죠?

IF $isop
    #MESSAGE "당신은 op 입니다!"
ELSEIF $haspermission:"some.permission"
    #MESSAGE "op는 아니지만 'some.permission' 이 있네요!"
ELSE
    #MESSAGE "아무 권한도 없습니다!"
ENDIF

그리고 위에서 배운 비교/논리 연산자도 써봅시다! 결과값이 true/false(boolean) 이니 당연하겠죠?

IF $playername == "wysohn"
    #MESSAGE "당신의 이름은 wysohn 입니다"
ELSE
    #MESSAGE "당신의 이름은 wysohn 이 아닙니다"
ENDIF



IF $health != $maxhealth
    #MODIFYPLAYER "HEALTH" $maxhealth
    #MESSAGE "체력이 만땅!"
    #MONEY -100
ELSE
    #MESSAGE "이미 체력이 최대치 입니다!"
ENDIF



IF $y >= 128 && $worldname == "world_nether"
    #MESSAGE "&a내가 지옥 꼭대기에 있다!!"
ENDIF

IF 문 안에 IF문을 넣어서 중첩 할수 있나요?

당연히 가능합니다. IF문을 중첩 하면 더 복잡하고 세밀한 코드 흐름을 조정 할 수 있습니다. 이후에 배울 반복문을 IF문 안에 넣거나 혹은 반복문의 안에 IF문을 넣는것도 가능합니다.

IF x < 10
    IF x < 6
        #MESSAGE "x 가 6 보다 작습니다"
    ENDIF 

    #MESSAGE "x 가 10 보다 작습니다"
ENDIF
#MESSAGE "스크립트 종료"

위의 스크립트가 실행되면 결과가 어떻게 될까요?

만약에 x값이 10 보다 작은 경우, IF x < 10 가 true 가 될것입니다. 하지만 x가 6보다는 클 경우 안에있는 IF x < 6는 false가 되겠지요. 헷갈린다면 x에 여러값을 넣어봅시다.

    1. 11 가 x 에 들어있는경우 이 경우 x < 10 가 false가 될것입니다. 11 < 10 이니 당연한 결과겠죠? 결과적으로 바깥쪽 IF문 자체가 실행 되지 않기 때문에 안쪽의 IF x < 6 는 비교를 해볼 짬도 없이 그냥 IF문이 끝나게 됩니다.

결과:

스크립트 종료
    1. 8 가 x 에 들어있는경우 이 경우는 x < 10 가 true 가 될것입니다. 8 < 10 이니 맞는말이겠죠? 결과적으로 안에있는 코드들 역시 작동 하게 됩니다. 다만 안으로 들어가니 안쪽에 또 x < 6 라는 IF 문이 있습니다. 그럼 또 x < 6 를 해보게 되는데 아시다시피 x안에는 8이들어있으니 false가 될것입니다. 8 < 6 은 아니니까말이죠. 결과적으로 이 안쪽에 있는 IF문은 실행이 되지 않습니다.

하지만 여기서 끝난게 아닙니다. 아시다시피 바깥의 x < 10 문은 IF에서 시작했지만 아직 ENDIF에 도달하지 않았습니다. 그리고 ENDIF전에 #MESSAGE "x 가 10 보다 작습니다" 라는 코드가 있지요. 그렇기 때문에 바깥의 IF문이 끝나기 전에 이 코드가 실행이 됩니다.

결과:

x 가 10 보다 작습니다
스크립트 종료
    1. 2 가 x 에 들어있는경우 이 경우 당연히 x < 10 는 true가 될것이고 ENDIF를 만나기 전까지의 코드가 실행될것입니다.

그리고 또 안쪽의 IF 문이 검사를 하는데 아시다시피 이 경우에는 2가 x에 들어있으니 x < 6 도 true가 될 것 입니다. 이 경우 해당 IF문 안에 있던 x 가 6 보다 작습니다 가 출력 될것입니다.

아시다시피 안쪽의 IF문 x < 6은 ENDIF를 만나서 끝났지만 아직 바깥의 IF x < 10 은 ENDIF를 만나지 않았습니다. 위에서 설명했던대로 ENDIF전에 코드가 있기 때문에 그 코드가 먼저 실행이 됩니다.

Result:

x 가 6 보다 작습니다
x 가 10 보다 작습니다
스크립트 종료

Null 검사

Null 은 TR에서 "존재하지 않는다" 를 나타내기 위해 있습니다. 주로 변수에 사용되는데요, 예를들어 어떤 변수를 사용 하려고 하는데 그 변수가 존재하지 않는다면 값이 null로 나오게 됩니다:

IF {"points"} == null
    {"points"} = 10
ELSE
    {"points"} = {"points"} + 1
ENDIF

즉 위의 예시의 경우 {"points"} 라는 광역변수를 사용 하기 전에 미리 이것이 존재 하는 값인지 체크 해 보고 있습니다. 즉 광역변수 points가 존재하지 않는다면 새로 만들어서 10을 넣고, 만약에 존재 한다면 이미 있는 광역변수 points에 1을 추가 하라는 뜻 입니다.

직접 비교

비교 연산 없이도 null값의 경우는 특수한 방법으로 IF문을 사용 할 수 있습니다:

IF value != null

의 경우

IF value   

와 같은 뜻 입니다.

직접 비교 규칙

IF문 을 아래 처럼 쓴다면

IF value
    ...
ENDIF

몇가지 룰이 있습니다.

1) value가 boolean 인 경우

이 경우 값이 true, false, 혹은 null 이 될 수 있습니다. 이런 경우 IF 문은 value가 오직 true인 경우에만 true로 취급합니다. 만약에 null 이나 false 인 경우는 false로써 취급됩니다.

2) value가 숫자 인 경우

이 경우에는 value 의 값이 0 인 경우에만 false로 취급 됩니다(혹은 소숫점이라면 0.0). 그 외의 다른 값은 true로 최급 됩니다. C언어와 비슷한 컨셉트 입니다.

3) value가 null이 아닌 무언가인경우

위의 두가지 케이스가 아니라면 value가 null 이 아니라면 무조건 true가 됩니다.

예시들

이해를 돕기 위한 몇가지 예제들 입니다.

IF $gamemode == "SURVIVAL"
    IF $money >= 1000
        #GIVE item(276,1)
        #MONEY -1000
        #MESSAGE "&a$1000원 이 감소 되었습니다!"
    ELSE
        #MESSAGE "&c돈이 부족합니다!"
    ENDIF
ELSE
    #MESSAGE "&c서바이벌 모드에서만 가능합니다!"
ENDIF

Plugin Description / 목차

1. Getting Started () (рус)

S.L. In-game Editor () (рус)

2. Triggers () (рус)

List and usage of Triggers / 트리거 목록과 사용 방법:

  • List of Executors / 실행자(Executor) 목록

4. Placeholders () (рус)

  • Using PlaceholderAPI / PlaceholderAPI 사용법
  • List of Placeholders / 플레이스 홀더(Placeholder) 목록

5. Conditions () (рус)

  • Creating Conditions / 조건식 만들기
    • Boolean Expressions / 부울 (Boolean) 표현 방법
  • Logical Operators / 연산자 사용법
  • IF statement / IF 조건문
  • Null Checking / Null 검사법
  • Switch Case / Switch Case 조건

6. Variables () (рус)

  • Local Variables / 지역 변수
  • Global Variables / 전역 변수

Advanced

Timings () (рус)

7. Methods () (рус)

  • Using Methods / 메소드 사용법
  • Special Data Types / 특수한 데이터 형식
  • Reading Javadocs / Javadoc 읽기
  • Handling Enum / Enum 데이터 처리
  • Lambda Expresion / Lambda(람다) 식 사용법

8. Array () (рус)

  • Creating an empty array / 빈 배열 만들기
  • Storing data into array / 배열에 데이터값 저장하기
  • Read data from array / 배열에서 데이터 읽기(불러오기)

9. Loops () (рус)

  • WHILE loop / WHILE 반복문
  • FOR loop / FOR 반복문
    • Iterating Collection / Collection 형식의 변수 순회법
    • #BREAK executor / #BREAK 실행자
    • #CONTINUE executor / #CONTINUE 실행자

10. Sync Mode () (рус)

  • #CANCELEVENT executor / #CANCELEVENT 실행자
  • Setting Sync/Async Mode / 동기, 비동기 모드 전환
    • Custom Trigger
    • Area Trigger

11. Custom Executors () (рус)

12. Plugin Access () (рус)

  • Check And Use / 플러그인 존재여부 확인
    • Get Third Party Plugin / 제 3자 플러그인 불러오기
    • Check Eligibility / 호환성 확인하기
    • Use the Plugin / 플러그인 사용하기

13. IMPORT Statement () (рус)

  • Creating new instance / 새 인스턴스 생성하기
  • Accessing static method / 종속 메소드 불러오기
  • Accessing static field / 종속 Enum 불러오기

14. IS Statement () (рус)

  • Understanding / 이해하기
    • Understanding Instance / 인스턴스 이해하기
    • Understanding Superclass / 부모클래스 이해하기
    • Understanding Subclass / 자식클래스 이해하기
  • Using IS Statement / IS조건연산자 사용하기

15. TRY-CATCH Statement () (рус)

  • Understanding TRY-CATCH Exception Handling / TRY-CATCH 예외처리 이해하기

Misc

16. Interface Casting () (рус)

module x.x does not "opens x.x" problem

  • List of Custom Events

Examples

Trigger

Trigger Example () (рус)

More Examples: Bukkit, Sponge

Case Specific

Clone this wiki locally