마린잉엥
대표칭호 없음
이해도 | 1.16 |
---|---|
게임버전 (JE) | 스피곳 |
스크립트 애드온 | 2.5 |
안녕하세요
이번에 구현하는 마법 스크립트는 뭔가 기능이 단순한데
생각보다 구현은 단순하지가 않은 거 같습니다.
이번에는 삼지창 마법을 구현하려고 하는 데
역시 일부는 되고 일부는 안되서 질문드립니다.
1. 몬스터에게 4미터의 머리위에서 소환되어 삼지창이 잘 떨어집니다
2. kill을 준 이유는 렉때문에..
3. 버그가 있는지 해당 스크립트를 실행하면 엔티티에게 우클릭을 1번만 했는데
어쩔 때는 정상적으로 타겟 엔티티 1번만 실행되는데 어쩔 때는 4번 연속 실행되다가
어쩔 때는 6번이 실행된 적이 있습니다. 왜 이런 차이가 나는지 궁금하네요
=> 해당 구문을 이렇게 짜고 싶습니다.
우클릭시 플레이어 주변 5블럭 반경 이내에
모든 몬스터에게 각각 1개의 삼지창을 머리위에서 떨어뜨린다 .
반경 전체 원거리 공격 스킬을 구현하고 싶습니다
가능할까요?
스크립터브혼
2020.11.04루프를 사용하여 여러 엔티티에 동작하게 하면서 그 안에 지연시간을 넣었기 때문에 그렇습니다.
만약 최초 이벤트 동작시 엔티티가 총 10마리가 있다면 wait 1 seconds로 인해서 이것은 10초동안 10번 동작하게 됩니다.
그 10초안에 한번 더 클릭하게 되면 이제 먼저 실행된 이벤트와 중첩되어 두번 동작하게 되는겁니다.
그 외,
컨디션과 조건문은 구분해서 사용하세요.
컨디션은 참, 거짓으로 구분되는 문장입니다. 그 자체로써 기능을 가지고 있기때문에 if ~ 바디 형태로 사용할 필요가 없습니다.
> if player's tool is end rod: → player's tool is end rod
스크립트에서 if는 알고리즘의 분기가 필요할때, if 아래에 여러 코드(바디)가 올 때. 두 경우에만 쓰입니다.
> if {treedown.%player%} is true:
> cancel event
> stop
이와 같이 메인 흐름으로부터 분기하여 여러 코드를 담아야 하거나
if ~ else 형태로 분기할 때만 쓰입니다.
마린잉엥
2020.11.04대박.. 정확합니다.
tnt 십만개가 동시에 터져도 아무 이상없는 컴퓨터인데
삼지창 몇개 소환되었다고 엄청난 렉이 걸려서
저는 마크 안에 삼지창을 연속으로 소환하면 렉 걸리는 오류가 있는 줄 알았답니다.
wait 1 seconds 가 원인이었네요
피드백 해주신 내용을 바탕으로 다시 구문을 짰습니다.
많이 깔끔해진 듯하네요
정상적으로 오류없이 작동하며 원하는 기능입니다.
단, 여기서 삼지창이 너무 많이 쌓이면 보기가 안좋아서
떨어지는 삼지창에 데미지를 입히고 1초안에 바닥에 쌓인 삼지창을 삭제하고 싶은데
delete entity / remove entity / kill entity 다 안되서
execute 커맨드 명령어를 사용했는데 분명 오류는 없는데 작동을 안하네요
여기서 삼지창에 데미지를 입히고 삼지창을 삭제하고 싶습니다.
(조건, 어태커가 영웅의 지팡이라는 end rod아이템을 들고 있어야만 적용되게 하고 싶어요)
스크립터브혼
2020.11.05if만 빼라는게 아니고 if ~ : 형태를 빼라는 겁니다.
컨디션은 그 자체로 기능을 수행합니다. 컨디션의 값이 false면 아래 코드를 실행하지 않습니다.
spawn ~ 이펙트로 엔티티를 생성하면 [last spawned entity]로 생성된 엔티티를 가져올 수 있습니다.
엔티티를 따로 저장해두었다가 삭제하거나, 생성-지연-제거 알고리즘을 함수로 빼면 메인 흐름과 별개로 동작하게 할수 있습니다.
마린잉엥
2020.11.05감사합니다! 덕분에 delete last spawned entity로 마지막 스폰 엔티티를 삭제되는 기능을 찾았습니다.
기능적으로 정말 만족스러운 스크립트를 완성했는데요
문제는 버그가 발생하는 거 같습니다
오른쪽 마우스를 꾹 누르고 있으면
2개가 삼지창 나오고 1개만 삭제되는 현상이 있습니다.
간단명료한 단순한 스크립트를 좋아하지만, 항상 딜레이부분은
구문이 간단하면서도 상당히 구현이 애매하네요
오른쪽 마우스를 꾹 누르고 있더라도
2개 삼지창이 나오면 2개 다 똑같이 삭제되게 구현하고 싶습니다.
on right click:
name of player's tool contains "&b영웅의 지팡이&a(우클릭)"
if {tddown.%player%} is true:
delete the last spawned entity
set {tddown.%player%} to false
if {tddown.%player%} isn't set:
set {tddown.%player%} to false
if {tddown.%player%} is false:
loop all monsters in radius 10 around player:
name of loop-entity is not "%player%"
name of loop-entity is not "%item%"
loop-entity is not a dropped item
spawn a trident 4 meters above the loop-entity
message "§l§6[Magic] §l&f정의의 심판!" to player
set {tddown.%player%} to true
스크립터브혼
2020.11.05last spawned entity는 말그대로 마지막에 스폰된 엔티티를 의미합니다.
두개가 소환된 상황에서 last spawned entity는 두번째에 소환된 엔티티를 의미합니다.
또한, 삼지창을 소환한 상태에서 동물이나 몬스터가 자연스폰된 경우에도 마지막으로 스폰된 동물이나 몬스터를 의미하게 됩니다.
즉, last spawned entity는 소환 즉시 사용하는 경우에만 예측할 수 있습니다.
코드의 기능과 역할, 쓰임, 순서에 대해서 더 고민해보시기 바랍니다.
엔티티 다시 서칭 할 수 있는 방법을 찾아보세요.
소환된 엔티티의 UUID를 저장해도 되고,
엔티티를 소환할때 엔티티에 커스텀 Tag를 달아도 됩니다.