마린잉엥
대표칭호 없음
이해도 | 1.16 |
---|---|
게임버전 (JE) | 스피곳 |
게임버전 (BE) | 단순 간단한 종합 스크립트 질문 |
스크립트 애드온 | 2.5 |
안녕하세요
덕분에 gui 수리하기와 모든 질문에 정상적으로
구현을 하게 되었습니다.
최근에 질문드렸던 x-ray는 너무 구현이 어려운 거 같아서
리소스팩 보내기로 x-ray를 적용시키는 것으로 구현을 했는데요
1. 적용한 리소스팩 취소
x-ray라는 이름을 가진 막대기(stick)을 우클릭(on right click)
send resource pack from "url" to player 해서 정상적으로 플러그인이 적용이 되었습니다.
다시 x-ray라는 이름을 가진 막대기(stick)을
쉬프트(on sneak toggle)를 누르면 적용한 x-ray를 원래 기본 마인크래프트 내장 리소스팩으로
되돌아오는 것으로 구현하고 싶은데 모르겠네요ㅠㅠ
나갔다 들어오지 않고 어떻게 구현할 수 있을까요?
2. 인벤토리에 survival 이라는 이름을 가진 책(book) 아이템이 없다면
플레이어를 무한 adventure 모드로 바꾸고 싶은데요
플레이어의 인벤토리 안에 survival 책을 감지하는 구문을 모르겠습니다ㅠㅠ
3. [오류] 아무런 효과가 적용되어있지 않는데 캐릭터에 발광효과 걸릴 때 적용되는 외곽선이 보입니다.
/effect clear을 해도 아무런 효과가 없다며 제거할 것이 없다는데
캐릭터에 둘러쌓인 외곽선을 안보이게 하는 방법이 없을까요?
우유를 먹어도 안됩니다.
무너_
2020.11.11제가 찾지 못한 것일 수도 있지만, Send Resource Pack 으로 보내신 리소스팩은 Skript로 따로 해제가 불가능합니다.
서버에서 보낸 리소스팩을 정상적으로 다운로드 하였는지 또는 거절하였는지를 확인하는 것만 가능합니다.
Has Resource Pack 또는 Resource Pack State 로 확인하실 수 있고, 마지막으로 보낸 리소스팩은 Last Resource Pack Response 로 확인하실 수 있습니다.
인벤토리에 아이템이 포함 되어 있는지 확인하는 Contains 를 이용하시면 됩니다.
Contains는 인벤토리 뿐만 아니라, 배열로 이루어진 변수에 포함 여부, 문자열 안에 텍스트 포함 여부도 알 수 있습니다.
모든 플레이어에게 존재 하는지 여부를 확인하여야 하기 때문에, Loops 와 Periodical 를 이용해야 합니다.
해당 플레이어가 서바이벌 모드인데, 구지 또 서바이벌로 바꾸면 서버에 미세한(?)랙을 줄 수 있기도 하기 때문에, 해당 게임모드가 아닐 경우에만 바꿀 수 있도록 Game Mode 를 이용하겠습니다.
if player's inventory has book named "아이템 이름":
또는
if player's inventory contains book named "아이템 이름":
라고 적으시면 됩니다.전체적인 구문은 아래에 적어드리겠습니다.
아래 구문은 op유저도 게임모드를 강제로 바꿔버리기 때문에, op유저를 제외하시려면
if player is not op:
를 넣어주세요.아래 구문에서, every tick을 사용했지만, every second / every 10 tick 이렇게 자유롭게 적으셔도 됩니다.
(every tick이 가장 빠르게 바꾸고 좋습니당)
@는 텝을 의미합니다.
every tick:
@loop all players:
@@if loop-player's inventory has book named "survival":
@@@if loop-player's gamemode is not survival:
@@@@set loop-player's gamemode to survival
@@else:
@@@if loop-player's gamedmoe is not adventure:
@@@@set loop-player's gamemode to adventure
혹시 스크립트로 glowing을 준것 아닐까요? Glowing 을 한번 확인해 주세요.
set glowing of player to false 를 한번 해보세요!
마린잉엥
2020.11.11Q1. 리소스팩 바로 전으로 돌아가는 법 없을까요?ㅠ
우연히 어찌하다가 예전에 돌아가는 거 만들어본 적있는 거 같은데
그 스크립트가 없어져서 못하고 있네요
Q2.
every tick:
@loop all players:
@@if loop-player's inventory has book named "survival":
@@@if loop-player's gamemode is not survival:
@@@@set loop-player's gamemode to survival
@@else:
@@@if loop-player's gamemode is not adventure:
@@@@set loop-player's gamemode to adventure
정상적으로 스크립트 로드는 되는데 책을 가지고 있어도 어드벤처,
책을 가지고 있지 않아도 어드벤처로 계속 고정되네요..
Q3. 완전히 해결되었습니다. 감사합니다.
무너_
2020.11.11정확히 아이템이 "책"인지 확인해 주세요. 일반적인 책이면 book, 인첸트 된 책이면 enchanted book, 입력된 책이면 written book입니다. 다른 어떤 Lore이나 NBT값이 있는지 확인해 주세요.
어떠한 색도 입히지 않았는지 확인해 주세요. 책 이름이 "&fsurvival"이면 인식되지 않습니다.
uncolored name of loop-item을 이용하여야 합니다. [Colored / Uncolored]
그래도 되지 않는다면, 아래의 구문을 사용해 주세요. 좀 복잡하고 비교적 오래 걸리는 구문이지만, 확실한 방법입니다.
해당 플레이어의 인벤토리를 모두 체크해서 책일 경우, 해당 책의 이름이 "survival"인가를 확인하는 함수[Functions]를 이용하는 겁니다.
function has_book(p: player) :: boolean:
@loop all items in the inventory of {_p}:
@@if loop-item is book:
@@@if name of loop-item is "survival":
@@@@return true
@return false
every tick:
@loop all players:
@@if has_book(loop-player):
@@@if loop-player's gamemode is not survival:
@@@@set loop-player's gamemode to survival
@@else:
@@@if loop-player's gamemode is not adventure:
@@@@set loop-player's gamemode to adventure
마린잉엥
2020.11.11확인해보니 적용이 안되는 이유를 찾았습니다! 정말 감사합니다.
일반 책에 로어가 있는 아이템인데
이름만 맞으면 될 줄 알았으나 로어를 넣어주니까 정상적으로 작동이 잘 됩니다.
every tick:
@loop all players:
@@if player is not op:
@@@if loop-player's inventory has book named "Survival" with lore "서바이벌 모드로 변경한다":
@@@@if loop-player's gamemode is not survival:
@@@@@set loop-player's gamemode to survival
@@@else:
@@@@if loop-player's gamemode is not adventure:
@@@@@set loop-player's gamemode to adventure
이렇게 하여 정상적으로 해결되었으나 문제는
op가 아닐 경우를 넣어줬음에도 불구하고
op여도 op가 아니여도 적용이 됩니다.
이 상황에서 if player is not op: 이 구문을 바꿔야 할까요?
무너_
2020.11.11아아앗ㅅ 잘못썼었네요 if loop-player is not op: 가 맞습니다
마린잉엥
2020.11.11아주 잘됩니다 2번도 해결이긴 한데요
혹시 여기서 조건을 추가해도 될까요?
좌표 146 75 9 부터 139 75 17 범위의 사각형 지역에 있을 경우는
책이 없어도 어드벤처 모드로 변경이 안되게 적용이 안되게 하고 싶습니다.
무너_
2020.11.11Q. 좌표 146 75 9 부터 139 75 17 범위의 사각형 지역에 있을 경우는
책이 없어도 어드벤처 모드로 변경이 안되게 적용이 안되게 하고 싶습니다.
A.
혹시, 책이 있어도 어드벤처 모드 또는 책이 없어도 서바이벌 모드 아닐까요?
책이 없으면 무조건 어드벤처 모드가 되는데, 그러면 구문이 필요가 없습니다.
그래도 일단 말씀하신 대로 적어드리겠습니다. 변경하고 싶으시면 gamemode의 이름을 변경하시면 됩니다.
Comparsion의 Between을 사용하시면 됩니다. 자세한 내용은 Comperison 을 참고해 주세요.
저는 구문의 길이를 줄이기 위해 Functions 를 사용하겠습니다.
주어진 좌표를 보니, y좌표는 동일하다는 것을 보았습니다. y좌표가 같으면 해당 좌표에 정확히 일치하여야 합니다.
(즉, 점프를 하면 인식을 하지 못합니다)
이를 보완하기 위해서는 두 좌표중에 한 좌표의 y좌표를 2정도 올려주시는게 좋습니다.
구문은 아래에 올려드리겠습니다.
@는 텝을 의미합니다.
function locs(p: player) :: boolean:
@if x-coordinate of {_p}'s location between 146 and x-coordinate of 139:
@@if y-coordinate of {_p}'s location between 75 and y-coordinate of 75:
@@@if z-coordinate of {_p}'s location between 9 and z-coordinate of 17:
@@@@return true
@return false
every tick:
@loop all players:
@@if player is not op:
@@@if locs(loop-player) is true: #함수이기 때문에, is true라는 표현은 쓰지 않으셔도 됩니다.
@@@@if loop-player's gamemode is not adventure:
@@@@@set loop-player's gamemode to adventure
@@@else if loop-player's inventory has book named "Survival" with lore "서바이벌 모드로 변경한다":
@@@@if loop-player's gamemode is not survival:
@@@@@set loop-player's gamemode to survival
@@@else:
@@@@if loop-player's gamemode is not adventure:
@@@@@set loop-player's gamemode to adventure
마린잉엥
2020.11.11흐어어.. 오류가 떠서 고민이 많네요 .
우선 특수한 서버이고 기본적인 모드는 어드벤처입니다.
시작부터 어드벤처 모드로 시작합니다.
1. "Survival" 이라는 책이 있으면 서바이벌 모드로 변경이 되며 책이 없으면 기본 어드벤처로 돌아옵니다
> "Survival" 이라는 책을 얻어서 어떤 플레이어가 서바이벌 모드로 바꿨다고 가정을 해봅시다
하지만 시간이 지나고 다시 그 책을 팔면 책이 없어도 서바이벌 모드가 되버리는 오류가 발생하게 됩니다.
2. 특수한 공간이 있습니다.
주위를 기반암으로 둘러쌓아서 못나가게 한 공간이 있습니다.
바로 미니게임 공간인데요 좌표 146 75 9 부터 139 75 17 범위의 사각형 지역입니다.
여기서는 미니게임을 진행해야 하기 때문에
들어오면 모든 플레이어를 서바이벌 모드로 바꿔줘야 하고
나가면 다시 어드벤처 모드로 바꿔줘야 하는데
[ 미니게임 공간에서 나가면 어드벤처, 들어오면 서바이벌 ] : 이것은 구현이 되었습니다.
근데 점프하면 또 안된다고 한다면 의미가 없을 거 같습니다..
미니게임 공간에 들어오고 나가는 건 텔레포트 좌표로 구성되어있습니다
/미니게임 치면 123,123,123 기반암으로 주위를 가둔 공간으로 이동하며
/스폰 치면 다시 321,321,321 공간으로 밖으로 나갑니다.
아이디어가 하나 있는데요
미니게임 공간에 들어오면 "minigame" (두더지밭 입장권)이라는 책을 줘서
"minigame"(두더지밭 입장권)이라는 책을 가지고 있으면 무조건 서바이벌 모드로 변경합니다.
그리고 나갈 때 /스폰을 치면 "minigame" 을 플레이어 아이템에서 삭제 시킵니다.
나가는 방법은 /스폰밖에 없거든용..
요렇게 해버리면 서바이벌 모드라는 책을 가지고 있는 유저가 미니게임 공간 밖에서
두더지 밭 입장권이라는 책이 없기에 어드벤처로 바뀌어버립니다.
두개를 융합해야 되는데 무지 어렵고 헤깔리네요.ㅠㅠ
마린잉엥
2020.11.12드디어 ...!! ㅠㅠ 하 감사합니다 되었네요
중요한 건 알고리즘을 짜는 게 제일 중요했습니다.
머리가 좋지 않아서 알고리즘 만드는 게 도저히 생각이 안나서
무너님 마지막 예시 맨 위부터 영어 차례대로 읽으면서 하나하나 짜내려갔는 데
결국 구현에 성공했습니다. 전부 무너님 덕분입니다 감사합니다!
[ 구현에 성공한 스크립트 ]
every tick:
@loop all players:
@@if loop-player is not op: /// # 아래 내용은 무조건 op가 아니여야만 적용한다
@@@if loop-player's inventory has paper named "minigame" with lore "블라블라": //// # 미니게임 공간이동할 때 주는 아이템
@@@@if loop-player's gamemode is not survival:
@@@@@set loop-player's gamemode to survival ///// # 미니게임 공간에서는 무조건 서바이벌 적용
@@@else if loop-player's inventory has book named "&eWe &fare &cSurvival" with lore "&e서바이벌 모드로 변경한다":
@@@@if loop-player's gamemode is not survival: ///// #미니게임이 아닐 때 서바이벌 모드 책있는지 탐색한다
@@@@@set loop-player's gamemode to survival //// # 책이 있으면 무조건 서바이벌
@@@else:
@@@@if loop-player's gamemode is not adventure: ///// #없으면 무조건 어드벤처
@@@@@set loop-player's gamemode to adventure
else if , else 너무 헤깔려서 힘들었는데
마지막 무너님 예시를 참고하여 만들었습니다.
무너님 댓글이 없었다면 구현 불가했을 건데 정말 감사합니다!
이렇게 2번 3번 은 모두 완벽히 해결이 되었습니다.
1번 - 브혼님께서 말씀해주신 빈 리소스팩을 만들어봐야 되는데 영상보면서
배우고 있는데 프로그래밍인 거 같아서 매우 어려워보이네요
무너_
2020.11.12빈 리소스팩은, 아마도 리소스팩 파일 안에서 assets폴더를 비우면 될 것 같습니다.
pack.mcmeta파일만 남겨두시면, 빈 리소스팩을 만드실 수 있을겁니다.
예시로 빈 리소스팩을 올려드리겠습니다. Empty.zip
마린잉엥
2020.11.12굳굳 정말 감사합니다!
1번 - 빈 리소스팩 적용할 시 이전으로 되돌리기가 가능합니다 ( 실제 확인하여 해결 )
2번 - 알고리즘 문제 해결
3번 - 발광 삭제 스크립트로 해결
감사합니다
무너_
2020.11.12호오.. 잘 됬다면 다행이네요!
스크립터브혼
2020.11.11서버 리소스팩은 한가지만 적용되니까 리소스가 없는 빈 리소스팩을 만들어 요청하면 되지 않을까요
마린잉엥
2020.11.11리소스가 없는 빈 리소스팩은 어떻게 만들수 있나요?
스크립터브혼
2020.11.11https://www.youtube.com/watch?v=kY8ib4_hII8