마인크래프트 강좌/데이터팩 강좌

마인크래프트 데이터팩 강좌 [7] - 조건 (Predicate)

Potan 2021. 6. 23. 12:20
반응형

 

 

 

안녕하세요 Potan입니다.

 

 

이번시간에는 조건에 대해 알아보겠습니다.

마인크래프트 1.17을 바탕으로 제작되었습니다.

 

1. 조건 (Predicate(술부)) 이란?

원래 단어는 Predicate로

이러한 의미를 가지고 있는데 이를 쉽게 말하면 주어를 설명하는 부분을 의미한다고 보시면 될거같습니다.

즉, 명령어의 대상을 설명한다 간단히 말하자면 명령어의 대상의 조건을 말한다고 보면 될듯 합니다.

오로지 데이터팩이 있어야만 사용 가능한 JSON 파일로 loot table의 함수를 이용해 작성합니다.

(어떤 조건을 달성하면 특별한 아이템을 주는 loot table의 조건 기능만 가져온 것이라 보면 됩니다.)

따라서 loot table 강좌에서 조건에 관한 내용은 이 내용으로 대체가 가능합니다.

 

주로 /execute if predicate나 @a[predicate=] 로 쓰입니다.

 

 

2. 만들기

조건은 predicates 폴더 안에 넣으셔야 하며 안에 정리용 폴더를 더 만들 수 있습니다.

조건은 .json 파일로 작성됩니다.

조건은 17가지의 condition으로 기능이 달라집니다.

loot table의 조건을 가져온 것이기에 predicate 명령어로 사용할 수 없는 condition들이 있습니다.

이점 유의하시기 바랍니다.

 

 

모든 predicate 들은 {} 형식이 아닌 [ {}, {} ] 형식으로 여러개를 설정할 수 있습니다. 이 경우 and로 연결됩니다.

1. alternative - 여러가지 조건들을 or로 묶습니다.

  • terms - or로 묶을 조건들을 담은 리스트입니다.
더보기
 {
    "condition": "minecraft:alternative",
    "terms": [
      {
        "condition": "minecraft:entity_properties",
        "entity": "this",
        "predicate": {
          "flags": {
            "is_sneaking": true
          }
        }
      },
      {
        "condition": "minecraft:entity_scores",
        "entity": "this",
        "scores": {
          "death": {
            "min": 1
          }
        }
      }
    ]
  }

 

2. block_state_property - 블록 상태를 확인합니다.

  • block - 블록의 ID입니다. 일치하지 않는다면 실패합니다.
  • properties - (선택사항) 해당 블록의 블록 상태를 확인합니다. 모든 값은 문자열로 이루어집니다. 일치하지 않는다면 실패합니다.
더보기

레버를 확인하는 명령어입니다.

{
    "condition": "minecraft:block_state_property",
    "block": "minecraft:lever",
    "properties": {
      "powered": "true",
      "face": "wall"
    }
}

 

 

 

3. damage_source_properties - 데미지 원인을 확인합니다.

  • predicate - 데미지 원인의 속성입니다.
    • bypasses_armor - 피해가 플레이어의 방어력을 무시하고 들어오는지 확인합니다. (ex:질식피해) (T/F)
    • bypasses_invulnerability - 피해가 플레이어의 무적 상태를 무시하고 들어오는지 확인합니다. (ex: 공허 또는 /kill) (T/F)
    • bypasses_magic - 피해가 허기 없음으로 받는 피해인지 확인합니다. (T/F)
    • direct_entity - 피해의 직접적 원인이 되는 엔티티를 확인합니다. 자주 쓰는 태그 2번을 확인해주세요.
    • is_explosion - 피해의 원인이 폭발인지 확인합니다. (T/F)
    • is_fire - 피해의 원인이 불인지 확인합니다. (T/F)
    • is_magic - 피해의 원인이 마법인지 확인합니다. (T/F)
    • is_projectile - 피해의 원인이 발사체로 인한 것인지 확인합니다. (T/F)
    • is_lightning - 피해의 원인이 번개로 인한 것인지 확인합니다. (T/F)
    • source_entity - 피해의 원인인 엔티티를 확인합니다. (ex: 화살 쏘는 스켈레톤) 자주 쓰는 태그 2번을 확인해주세요.
더보기
{
  "condition": "minecraft:damage_source_properties",
  "predicate": {
    "is_explosion": false,
    "is_fire": false,
    "is_magic": false,
    "is_projectile": true,
    "is_lightning": false,
    "bypasses_armor": false,
    "bypasses_invulnerability": false,
    "bypasses_magic": false,
    "source_entity": {
      "type": "minecraft:skeleton"
    }
  }
}

 

 

 

4. entity_properties - 엔티티의 속성을 확인합니다.

  • entity - 확인할 엔티티를 정합니다. predicate로 쓰일 경우 보통 this를 사용합니다.
    • this - 죽은 엔티티 또는 발전과제를 달성하거나 던전 상자를 열거나, 블록을 부순 플레이어입니다.
    • killer - 죽인 엔티티 (플레이어 포함)
    • killer_player - 죽인 플레이어 (엔티티 X)

  • predicate - entity에서 확인된 엔티티에 대한 속성입니다. 발전과제와 똑같은 구조를 가집니다.
    • 자주 쓰는 태그 2번과 동일합니다. 이하 내용은 1.17에서 새롭게 추가된 내용입니다.

    • lightning_bolt - 번개의 속성을 확인합니다. 엔티티가 번개여야 합니다.
      • blocks_set_on_fire - 번개로 인해 불이 붙은 블록의 개수입니다.
      • entity_struck - 번개를 맞은 엔티티의 속성입니다. 반드시 한 마리 이상이 맞아야 합니다.

    • passenger - 해당 엔티티를 타고 있는 엔티티에 대한 속성입니다.
    • player - 자주 쓰는 태그 2번의 player를 확인해주세요.
      • looking_at - 플레이어가 바라보고 있는 엔티티입니다. 100블록 이내에서 플레이어의 눈과 엔티티의 눈을 통해 확인합니다.
    • stepping_on - 해당 엔티티가 서있는 블록에 대한 Location 태그입니다.
더보기

잔디 블록을 밟고 있으며 좀비를 바라보고 있는 플레이어를 태우고 있는 말인지 확인합니다.

@e를 통해 말에게 predicate를 해줘야합니다.

{
  "condition": "minecraft:entity_properties",
  "entity": "this",
  "predicate": {
    "type": "minecraft:horse",
    "stepping_on": {
      "block": {
        "blocks": [
          "minecraft:grass_block"
        ]
      }
    },
    "passenger": {
      "type": "minecraft:player",
      "player": {
        "looking_at": {
          "type": "minecraft:zombie"
          }
      }
    }
  }
}

predicate.json 파일을 쓰는 대표적인 이유.

 

5. entity_scores - 엔티티의 스코어보드 점수를 확인합니다.

  • entity - 확인할 엔티티를 정합니다. predicate로 쓰일 경우 보통 this를 사용합니다.
    • this - 죽은 엔티티 또는 발전과제를 달성하거나 던전 상자를 열거나, 블록을 부순 플레이어입니다.
    • killer - 죽인 엔티티 (플레이어 포함)
    • killer_player - 죽인 플레이어 (엔티티 X)

  • scores - 확인할 점수 리스트입니다. 모든 점수가 일치해야합니다.

예시

더보기
{
  "condition": "minecraft:entity_scores",
  "entity": "this",
  "scores": {
    "a": {
      "min": 1,
      "max": 5
    },
    "b": 3
  }
}

 

6. inverted - 조건의 참 거짓을 반대로 바꿉니다.

  • term - 반대로 변경할 조건을 작성합니다.

예시

더보기
{
  "condition": "minecraft:inverted",
  "term": {
    "condition": "minecraft:entity_properties",
    "entity": "this",
    "predicate": {
      "type": "minecraft:player"
    }
  }
}

 

7. killed_by_player - killer_player 가 존재하는지 확인합니다.

  • inverse - true로 설정시 조건이 반대가 됩니다.

예시

더보기
{
  "condition": "minecraft:killed_by_player",
  "inverse": true
}

 

8. location_check - 해당 위치를 확인합니다.

  • offsetX - 위치에 대한 X 오프셋 (선택사항)
  • offsetY - 위치에 대한 Y 오프셋 (선택사항)
  • offsetZ - 위치에 대한 Z 오프셋 (선택사항)
  • predicate - 위치를 확인합니다. 자주쓰는 태그 3번을 사용합니다.

예시

더보기
{
  "condition": "minecraft:location_check",
  "offsetX": 0,
  "offsetY": 0,
  "offsetZ": 0,
  "predicate": {
    "biome": "minecraft:cold_ocean",
    "light": {
      "light": {
        "min": 8,
        "max": 0
      }
    }
  }
}

 

9. match_tool - 도구를 확인합니다.

예시

더보기

 

{
  "condition": "minecraft:match_tool",
  "predicate": {
    "items": [
      "minecraft:golden_sword"
    ],
    "durability": {
      "min": 0,
      "max": 100
    }
  }
}

 

10. random_chance - 0.0 ~ 1.0 사이의 난수를 뽑아 특정 값보다 작은지 확인합니다.

  • chance - 성공의 기준이 되는 값 (0.0 ~ 1.0)

예시

더보기
{
  "condition": "minecraft:random_chance",
  "chance": 0.3
}

 

11. random_chance_with_looting

- 10번과 동일하나 killer 엔티티의 약탈 레벨에 영향을 받습니다.

  • chance - 기본 성공률
  • looting_multiplier - 약탈 레벨이 성공률에 얼마나 영향을 끼치는지 정합니다.

성공률 : chance + (약탈 레벨 * looting_multiplier)

예시

더보기
{
  "condition": "minecraft:random_chance_with_looting",
  "chance": 0.3,
  "looting_multiplier": 2
}

 

12. reference - 다른 조건이 성공하는지 확인합니다.

  • name - 확인할 조건의 namespace ID 입니다. 자기 자신을 확인하면 오류가 발생합니다.

예시

더보기
{
  "condition": "minecraft:reference",
  "name": "mypack:potan/is_sneak"
}

 

13. survives_explosion -  1 / 폭발 반경 확률로 성공합니다.

구성요소가 없습니다.

예시는 생략하겠습니다.  "condition": "minecraft:survives_explosion" 이게 끝입니다.

 

14. table_bonus - 마법부여 레벨에 따라 테이블에서 특정한 확률로 통과합니다.

  • enchantment - 마법 부여의 ID입니다.
  • chances - 인챈트 레벨의 확률 목록입니다. (0부터 시작)

저도 이게 무슨 소린지 잘 모르겠습니다 ;;

예시

더보기
{
  "condition": "minecraft:table_bonus",
  "enchantment": "minecraft:sharpness",
  "chances": [
    0.9,
    0.5,
    0.1
  ]
}

 

15. time_check - 현재 시간을 확인합니다.

  • value - 확인할 tick 시간입니다. 범위를 지정할 수 있습니다. 
  • period - 시간의 길이로 이 값만큼의 틱이 지나면 다시 0으로 돌아갑니다. (선택사항)
    • 예시 : 24000 (하루의 길이) 으로 설정할 경우 /time query daytime 처럼 작동합니다. (자정이 되면 0이 됨)

예시

더보기
{
  "condition": "minecraft:time_check",
  "value": {
    "min": 0,
    "max": 1000
  },
  "period": 24000
}

 

16. weather_check - 현재 날씨 상태를 확인합니다.

  • raining - true일 경우 비가 오는 경우일때만 참을 반환합니다. (기본값 false)
  • thundering - true일 경우 비와 천둥(/weather thunder) 일때만 참을 반환합니다. (기본값 false)

예시

더보기
{
  "condition": "minecraft:weather_check",
  "raining": true,
  "thundering": false
}

 

17. value_check - 값이 범위 내에 있는지 확인합니다.

예시

더보기
{
  "condition": "minecraft:value_check",
  "value": {
    "type": "minecraft:score",
    "target": {
      "type": "minecraft:fixed",
      "name": "Potan7"
    },
    "score": "death"
  },
  "range": {
    "min": 2
  }
}

 

부록. predicate generator

https://misode.github.io/predicate/

 

Predicate Generator Minecraft 1.15, 1.16, 1.17

 

misode.github.io

저의 경우 이 사이트를 주로 사용합니다.

 

다음 강좌는 아이템 수정자입니다. 

반응형