DoRaj1_ 4c9c95afcec34a3e9e8a1bc86f04e047
이해도 | 초보자 |
---|---|
게임버전 (JE) | 관련없음 |
게임버전 (BE) | 관련없음 |
스크립트 버전 | 2.9.4 |
각별님의 다크포레스트에서 신호기를 부쉈을 때 다른 팀이 부쉈는지 감지하는 이벤트를 만들고 있었는데
on break of beacon:
set {_beacon.break.loc} to event-block's location
loop 4 times: #4는 팀의 수
if {team.%loop-num%.data::*} contains event-player:
loop {team.%loop-num%.beacon.loc::*}:
if {team.%loop-num%.beacon.loc::*} contains {_beacon.break.loc}:
remove {_beacon.break.loc} from {team.%loop-num%.data::*}
remove {_beacon.break.loc} from {team.%loop-num%.beacon.loc::*}
send "&c신호기가 %event-player%에게 파괴되었습니다!" to {team.%loop-num%.data::*}
stop
이 구문에서 밑줄쳐진 문장이 작동이 되지 않아
loop {team.%loop-num-1%.data::*}:
send "&c신호기가 %event-player%에게 파괴되었습니다!" to loop-value-2
를 사용해도 봤지만 여전히 작동이 되지 않고 오직 event-player로만 작성해야 작동이 되는 오류가 있어 질문드립니다..!
(참고로 {team.%loop-num%.data::*}는 신호기의 위치, 팀원과 팀장 모두 속해있는 변수입니다)
gamediller
13 일 전이 스크립트는 신호기가 파괴되었을 때 팀원들에게 알림을 보내는 로직을 구현하려고 하는데,
문제는
{team.%loop-num%.data::*}
변수에서 특정 위치를 올바르게 탐색하거나 메시지를 전송하는 부분에서 발생하는 것 같습니다.코드 수정 제안
on break of beacon:
set {_beacon.break.loc} to event-block's location
loop 4 times: # 팀 수만큼 반복
if {team.%loop-num%.data::*} contains event-player:
# 신호기 위치가 해당 팀의 신호기 위치 목록에 포함되어 있는지 확인 (new!)
if {_beacon.break.loc} is in {team.%loop-num%.beacon.loc::*}:
remove {_beacon.break.loc} from {team.%loop-num%.beacon.loc::*} # 신호기 위치 제거
send "&c신호기가 %event-player%에게 파괴되었습니다!" to {team.%loop-num%.data::*} # 팀원들에게 알림
stop
설명
{team.%loop-num%.beacon.loc::*}
에_beacon.break.loc
가 포함되어 있는지 확인하는 방식으로 조건을 변경했습니다. 조건이 맞으면 해당 신호기 위치를 목록에서 제거하고, 알림을 보냅니다.loop-value
변수를 사용하지 않고 직접{team.%loop-num%.data::*}
에 메시지를 전송하도록 수정했습니다. 이는 Skript에서 전체 리스트에 메시지를 전송하는 방법 중 하나입니다.이렇게 수정해보시고, 문제가 계속 발생하면
{team.%loop-num%.data::*}
와{team.%loop-num%.beacon.loc::*}
변수가 올바르게 저장되고 있는지 확인하는 것이 좋습니다.커맨더도라
13 일 전답변주셔서 감사합니다
일단 제안해주신 수정본으로 먼저 해본 뒤에 data 변수를 루프시켜 loop-value를 이용해보았지만 실패했습니다.. 저도 변수에 값이 잘못 저장되는 줄 알고 구문 중간에
send "%{team.%loop-num%.data::*}%" to event-player
를 사용해 값이 <닉네임> and <신호기 위치>로 잘 출력되는 것을 보고 질문을 드리게 되었습니다 혹시 변수에 닉네임이 아닌 좌표가 저장 되어도 변수 속의 플레이어에게 메시지가 가나요?
gamediller
13 일 전리스트에 플레이어 이름(닉네임)뿐만 아니라 좌표나 기타 데이터가 함께 저장될 경우, 메시지를 전송할 때 스크립트가 문제를 일으킬 수 있습니다.
gamediller
13 일 전send "&c신호기가 %event-player%에게 파괴되었습니다!" to {team.%loop-num%.data::*} # 팀원들에게 알림
아마 to {team.%loop-num%.data::*} 이부분에서 플래이어 닉네임 데이터 말고 다른 데이터를 포함해 메세지 전송에 문제가 생긴 것 같습니다.
gamediller
13 일 전아래와 같이 변수를 분리하여 사용하는 방법을 시도해 보세요.
on break of beacon:
set {_beacon.break.loc} to event-block's location
loop 4 times: # 팀 수만큼 반복
set {_team.players} to filter {team.%loop-num%.data::*} where [input is a player]
set {_team.beacons} to {team.%loop-num%.beacon.loc::*}
# event-player가 해당 팀에 속해 있는지 확인
if {_team.players} contains event-player:
# 신호기 위치가 해당 팀의 신호기 위치 목록에 포함되어 있는지 확인
if {_team.beacons} contains {_beacon.break.loc}:
# 신호기 위치를 팀 신호기 목록에서 제거
remove {_beacon.break.loc} from {team.%loop-num%.beacon.loc::*}
# 신호기 파괴 알림을 해당 팀의 플레이어들에게 전송
loop {_team.players}:
send "&c신호기가 %event-player%에게 파괴되었습니다!" to loop-value
stop # 팀을 찾은 후 반복을 종료
커맨더도라
13 일 전이 구문으로 하면 filter가 안먹혀서 안되고.. filter 빼면 오류는 안나는데 저장이 안되서 메시지가 안보내집니다.. 게다가 send "" to <플레이어 닉네임> 으로 해도 mutiple command sender라면서 안되네요..? 왜이럴까요 ㅠㅠ
gamediller
12 일 전스크립트에서 오류 메시지인
[input is a player] is not a valid lambda statement
는 현재 사용하는 Skript 버전(2.9.4
)에서filter
구문이 아직 지원되지 않기 때문입니다. 제가 버전을 고려하지 못했네요그리고
{team.%loop-num%.data::*}
리스트에 플레이어 객체가 아닌 문자열(닉네임)을 저장하셨나요?send "" to <플레이어 닉네임>
구문에서 "multiple command sender" 오류가 나는 것은리스트에 플레이어 객체가 아닌 문자열(닉네임)이 저장되었을 경우 해당 오류가 발생했었을 수 있습니다.
gamediller
12 일 전on break of beacon:
set {_beacon.break.loc} to event-block's location
loop 4 times: # 팀 수만큼 반복
if event-player is in {team.%loop-num%.data::*}:
loop {team.%loop-num%.beacon.loc::*}:
if {_beacon.break.loc} is in {team.%loop-num%.beacon.loc::*}:
remove {_beacon.break.loc} from {team.%loop-num%.beacon.loc::*}
# 팀원들에게 메시지 전송
loop {team.%loop-num%.data::*}:
if loop-value is a player: # loop 이벤트 값이 플래이어 객체인 경우 실행 (new!)
send "&c신호기가 %event-player%에게 파괴되었습니다!" to loop-value
stop
gamediller
12 일 전아직 문제가 해결되지 않는다면, 데이터를 확인하기 위해 아래의 코드를 추가해 보세요
loop {team.%loop-num%.data::*}:
send "데이터: %loop-value%" to event-player
if loop-value is a player:
send "플레이어 객체 확인: %loop-value%" to event-player
이렇게 하면 {team.%loop-num%.data::*}에 어떤 데이터가 들어 있는지 직접 확인할 수 있어, 문제 원인을 더 정확히 파악할 수 있습니다.
이 방법으로 수정해 보시고, 결과를 알려주시면 추가 도움을 드릴 수 있습니다!
커맨더도라
10 일 전해결되었습니다!! 감사해요!!