게임버전 (JE) | 모드버킷 |
---|---|
게임버전 (BE) | x |
스크립트 애드온 | 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 한명에 루프만 돌아버려요..
이동도 혼자하고 복귀도 혼자하고.. 방법을 꼭 알고싶습니다.
스크립터브혼
2020.09.161. 참가 인원을
{참가자}
와{참가자::*}
두가지로 정의 할 이유가 없습니다.참가자는
{참가자::*}
로 관리하시고, 참가인원은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[게임 시작 대기시간 구현하기 (반복문 단일시행 패턴)] 참고하세요.
만두마크
2020.09.16감사합니다. 문제에 원인을 알려주셔서 감사합니다.
추가로 다른 추가 내용도 감사합니다 ㅠㅠ
항상 수고하십니다.