개인 자료란 (JE)

  서버 커뮤니티

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

DoRaj1_ 4c9c95afcec34a3e9e8a1bc86f04e047

Profile

질문하기 스크립트

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

16 일 전 조회 수 48 추천 수 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::*}는 신호기의 위치, 팀원과 팀장 모두 속해있는 변수입니다)




10개의 댓글

gamediller
16 일 전

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

커맨더도라
16 일 전
@gamediller

답변주셔서 감사합니다

 

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

 

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

 

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

gamediller
16 일 전
@커맨더도라

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

gamediller
16 일 전
@커맨더도라

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

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

gamediller
16 일 전
@커맨더도라

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

@gamediller

이 구문으로 하면 filter가 안먹혀서 안되고.. filter 빼면 오류는 안나는데 저장이 안되서 메시지가 안보내집니다.. 게다가 send "" to <플레이어 닉네임> 으로 해도 mutiple command sender라면서 안되네요..? 왜이럴까요 ㅠㅠ

gamediller
15 일 전
@커맨더도라

스크립트에서 오류 메시지인 [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
15 일 전
@커맨더도라

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
15 일 전
@커맨더도라

아직 문제가 해결되지 않는다면, 데이터를 확인하기 위해 아래의 코드를 추가해 보세요

 

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::*}에 어떤 데이터가 들어 있는지 직접 확인할 수 있어, 문제 원인을 더 정확히 파악할 수 있습니다.

 

이 방법으로 수정해 보시고, 결과를 알려주시면 추가 도움을 드릴 수 있습니다!

커맨더도라
13 일 전
@gamediller

해결되었습니다!! 감사해요!!