개인 자료란 (JE)

  서버 커뮤니티

Profile 만두마크 대표칭호 없음
Profile

질문하기 스크립트

스크립트 질문

2020.09.16 조회 수 510 추천 수 0
게임버전 (JE) 모드버킷 
게임버전 (BE)
스크립트 애드온 2.2dev 

command /참가:

    trigger:

        if {참가대기.%uuid of player%} = 0:

            if 2 > {참가자} :

                add 1 to {참가자}

                set {참가대기.%uuid of player%} to 1

                set {참가자.인원체크} to 0

                add player to {참가자::*}

                message "%player%님이 참가하셨습니다." to {참가자::*}

                message "현재 참가대기 인원은 %{참가자}%명입니다. 잠시 기다려주세요" to {참가자::*}

                message "참가를 취소하려면 '/참가취소' 를 입력해주세요." to {참가자::*}

                loop {참가자::*}:

                    wait 10 second

                    if {참가자} = 2:

                        set {_참가자.시작시간.%player%} to 10

                        loop 10 times:

                            message "현재 참가인원이 모여 %{_참가자.시작시간.%player%}%초 뒤 시작됩니다."

                            subtract 1 from {_참가자.시작시간.%player%}

                            wait 1 second

                            if {참가자} != 2:

                                message "참가 중 유저가 취소하여 대기로 돌아갑니다." to {참가자::*}

                                add player to {참가자::*}

                            if {_참가자.시작시간.%player%} <= 0:

                                set {참가자.남은시간.%player%} to 60

                                execute command "/워프 사원_던전1" by player

                                loop 60 times:

                                    message "현재 남은 시간은 %{참가자.남은시간.%player%}%초 입니다."

                                    subtract 1 from {참가자.남은시간.%player%}

                                    wait 1 second

                                    if {참가자.남은시간.%player%} = 0:    

                                        message "시간이 다 되어 3초 뒤 마을로 돌아갑니다."

                                        wait 3 second

                                        execute player command "/워프 성입구"

                                        execute player command "/참가초기화"

                                        execute player command "/참가취소"

                                        stop


코드를 짜서 엄청 잘 사용이 되는데요 .. 


만약 동시에 

/참여 를하거나 짧은시간내에 참여를 같이 누르면 정상적으로 실행되는데

만약 한명이 /참여 를 입력 후 몇 초뒤에 다른유저가 /참여 를 입력할 경우

처음 입력한 유저는 진입을 못해요.. 혹시 방법이 있을까요? ㅠㅠ


즉 실행 시 player 한명에 루프만 돌아버려요.. 

이동도 혼자하고 복귀도 혼자하고.. 방법을 꼭 알고싶습니다.

4개의 댓글

스크립터브혼
2020.09.16

1. 참가 인원을 {참가자}{참가자::*} 두가지로 정의 할 이유가 없습니다.
참가자는 {참가자::*}로 관리하시고, 참가인원은 number of {참가자::*}로 리스트의 개수를 사용하세요.

2. {참가자::*} 루프 후 10초 후에 참가인원이 2명인 경우에 명령어를 입력한 플레이어만 워프 명령어가 실행됩니다.
이부분에서 문제가 생깁니다.
첫번째 유저가 명령어를 입력하고 10초를 기다립니다.

상황1_ 10초 사이에 두번째 유저가 명령어를 입력하면,
첫번째 유저는 if {참가자} = 2:조건이 참이므로 게임이 시작됩니다.
두번째 유저도 조건이 참이므로 게임이 시작됩니다.

상황2_ 10초 후 두번째 유저가 명령을 입력하면
첫번째 유저는 10초가 이미 지났으므로 조건이 거짓이 되어 시작하지 않습니다.
그런데 두번째 유저는 첫번째 유저가 참가취소를 하지 않았기 때문에 참이되어 게임이 시작됩니다.

3. 두 플레이어 모두 참가했다 하더라도 각각의 유저가 같은 시간을 공유하지 않습니다.
(2)에서의 문제로 플레이어 각각 실행되는 로직에서 싱크를 맞추는 과정이 없이 코드가 계속 이어지므로,
두 플레이어가 명령한 시간 차 만큼 메세지가 다르게 표시될것입니다.

첫번째 플레이어 명령 5초 후 두번째 플레이어가 명령했다면,
첫번째 플레이어가 "3초뒤 시작" 메세지를 받을때 두번째 유저는 "8초뒤 시작" 메세지를 받게됩니다.

스크립터브혼
2020.09.16
@스크립터브혼

이 문제를 해결하기 위해서는

1. 플레이어가 하는 일과 게임이 하는 일을 분리해야 합니다.

플레이어는 게임에 참여만 할뿐, 게임을 시작하거나 끝낼 수 없습니다.
참가 명령어에서 플레이어와 관련된 코드는 플레이어가 게임에 참가할 수 있는지,
참가할 수 있다면 게임에 참가했다는 것만 확인하는 일을 하면 됩니다.

그리고 게임에 관련된 코드는 플레이어가 참가 가능한지, 참여한 플레이어들로 시작할 수 있는지,
시작할 수 있으면 게임을 시작하고, 종료하는 일을 해야합니다.
 

2. 코드가 중복실행되는 환경이라는 것을 염두해야합니다.
올려주신 코드에서는 대기시간이 있습니다. 이 대기시간 확인은 게임이 하는 일입니다.
어느 플레이어가 입력하든 몇번을 입력하든, 한개의 게임은 한개의 대기시간을 가집니다.

즉, 중복실행되는 환경에서 대기시간 로직은 한번만 실행되야 한다는 것입니다.
또한 대기시간은 게임이 하는 일이므로 {참가자.남은시간.%player%}와 같이 player가 쓰이는 일이 있을 수 없습니다.
게임이 하는 일은 게임을 구성하는 데이터로 로직이 완성되어야합니다.

 

만두마크
2020.09.16
@스크립터브혼

감사합니다. 문제에 원인을 알려주셔서 감사합니다.

추가로 다른 추가 내용도 감사합니다 ㅠㅠ

항상 수고하십니다.

뉴스 및 창작물
/files/thumbnails/477/930/003/262x150.crop.jpg?20241201030912

레드스톤

뉴진스 - Super Shy | 마크 노트블럭 커버

노트블럭전문가

2024-12-01

0

/files/thumbnails/483/916/003/262x150.crop.jpg?20241127115329

레드스톤

[노트블럭 커버] 뉴진스 - ETA 3

노트블럭전문가

2024-11-27

1

/files/thumbnails/150/925/003/262x150.crop.jpg?20241123005717

건축

응답하라 1988 ? 1

팀뉴일리시

2024-11-23

5

/files/thumbnails/761/908/003/262x150.crop.jpg?20241025153749

건축

서울 숭례문(崇禮門) 6

KHC

2024-10-25

2

/files/thumbnails/578/899/003/262x150.crop.jpg?20241010142350

건축

경주 월정교 1

KHC

2024-10-10

2