개인 자료란 (JE)

  서버 커뮤니티

Profile 커맨더도라 대표칭호 없음

DoRaj1_ 4c9c95afcec34a3e9e8a1bc86f04e047

Profile

질문하기 스크립트

팀 채팅 관련 질문입니다 (급해요..!)

3 시간 전 조회 수 8 추천 수 0
이해도 초보자 
게임버전 (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::*}는 신호기의 위치, 팀원과 팀장 모두 속해있는 변수입니다)




5개의 댓글

gamediller
3 시간 전

이 스크립트는 신호기가 파괴되었을 때 팀원들에게 알림을 보내는 로직을 구현하려고 하는데,
문제는 {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::*} 변수가 올바르게 저장되고 있는지 확인하는 것이 좋습니다.

커맨더도라
3 시간 전
@gamediller

답변주셔서 감사합니다

 

일단 제안해주신 수정본으로 먼저 해본 뒤에 data 변수를 루프시켜 loop-value를 이용해보았지만 실패했습니다.. 저도 변수에 값이 잘못 저장되는 줄 알고 구문 중간에

 

send "%{team.%loop-num%.data::*}%" to event-player

 

를 사용해 값이 <닉네임> and <신호기 위치>로 잘 출력되는 것을 보고 질문을 드리게 되었습니다 혹시 변수에 닉네임이 아닌 좌표가 저장 되어도 변수 속의 플레이어에게 메시지사 가나요?

gamediller
3 시간 전
@커맨더도라

리스트에 플레이어 이름(닉네임)뿐만 아니라 좌표나 기타 데이터가 함께 저장될 경우, 메시지를 전송할 때 스크립트가 문제를 일으킬 수 있습니다.

gamediller
3 시간 전
@커맨더도라

send "&c신호기가 %event-player%에게 파괴되었습니다!" to {team.%loop-num%.data::*} # 팀원들에게 알림

아마 to {team.%loop-num%.data::*} 이부분에서 플래이어 닉네임 데이터 말고 다른 데이터를 포함해 메세지 전송에 문제가 생긴 것 같습니다.

gamediller
3 시간 전
@커맨더도라

아래와 같이 변수를 분리하여 사용하는 방법을 시도해 보세요.  
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 # 팀을 찾은 후 반복을 종료