개인 자료란 (JE)

  서버 커뮤니티

Profile 마린잉엥 대표칭호 없음
Profile

질문하기 스크립트

마법사 지팡이 마법 스크립트 2

2020.11.04 조회 수 627 추천 수 0
이해도 1.16 
게임버전 (JE) 스피곳 
스크립트 애드온 2.5 

안녕하세요

이번에 구현하는 마법 스크립트는 뭔가 기능이 단순한데

생각보다 구현은 단순하지가 않은 거 같습니다.

이번에는 삼지창 마법을 구현하려고 하는 데 

역시 일부는 되고 일부는 안되서 질문드립니다.


0fa25021658a3d6efb899154c36debbe.PNG


1. 몬스터에게 4미터의 머리위에서 소환되어 삼지창이 잘 떨어집니다

2. kill을 준 이유는 렉때문에..

3. 버그가 있는지 해당 스크립트를 실행하면 엔티티에게 우클릭을 1번만 했는데 

어쩔 때는 정상적으로 타겟 엔티티 1번만 실행되는데 어쩔 때는 4번 연속 실행되다가

어쩔 때는 6번이 실행된 적이 있습니다. 왜 이런 차이가 나는지 궁금하네요


=> 해당 구문을 이렇게 짜고 싶습니다.

우클릭시 플레이어 주변 5블럭 반경 이내에 

모든 몬스터에게 각각 1개의 삼지창을 머리위에서 떨어뜨린다 . 

반경 전체 원거리 공격 스킬을 구현하고 싶습니다

가능할까요?





5개의 댓글

스크립터브혼
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 형태로 분기할 때만 쓰입니다.

 

@스크립터브혼

대박.. 정확합니다. 

tnt 십만개가 동시에 터져도 아무 이상없는 컴퓨터인데

삼지창 몇개 소환되었다고 엄청난 렉이 걸려서 

저는 마크 안에 삼지창을 연속으로 소환하면 렉 걸리는 오류가 있는 줄 알았답니다.

wait 1 seconds 가 원인이었네요


피드백 해주신 내용을 바탕으로 다시 구문을 짰습니다.


e774da1c212b5db1b53a039dd22d351f.PNG

많이 깔끔해진 듯하네요 

정상적으로 오류없이 작동하며 원하는 기능입니다.

단, 여기서 삼지창이 너무 많이 쌓이면 보기가 안좋아서 

떨어지는 삼지창에 데미지를 입히고 1초안에 바닥에 쌓인 삼지창을 삭제하고 싶은데

delete entity / remove entity / kill entity 다 안되서

execute 커맨드 명령어를 사용했는데 분명 오류는 없는데 작동을 안하네요 


여기서 삼지창에 데미지를 입히고 삼지창을 삭제하고 싶습니다.

(조건, 어태커가 영웅의 지팡이라는 end rod아이템을 들고 있어야만 적용되게 하고 싶어요)

스크립터브혼
2020.11.05
@마린잉엥

if만 빼라는게 아니고 if ~ : 형태를 빼라는 겁니다.

on right click:
    player's tool is end red
    name of player's tool contains "~"
    
    loop all monsters ~:
        name of loop-entity is ~
        name of loop-entity is not ~
        loop-entity is not ~

        spawn ~
        message "~"

컨디션은 그 자체로 기능을 수행합니다. 컨디션의 값이 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.05
@마린잉엥

last spawned entity는 말그대로 마지막에 스폰된 엔티티를 의미합니다.

두개가 소환된 상황에서 last spawned entity는 두번째에 소환된 엔티티를 의미합니다.

또한, 삼지창을 소환한 상태에서 동물이나 몬스터가 자연스폰된 경우에도 마지막으로 스폰된 동물이나 몬스터를 의미하게 됩니다.

 

즉, last spawned entity는 소환 즉시 사용하는 경우에만 예측할 수 있습니다.

코드의 기능과 역할, 쓰임, 순서에 대해서 더 고민해보시기 바랍니다.


엔티티 다시 서칭 할 수 있는 방법을 찾아보세요.

소환된 엔티티의 UUID를 저장해도 되고,

엔티티를 소환할때 엔티티에 커스텀 Tag를 달아도 됩니다.