개인 자료란 (JE)

  서버 커뮤니티

Profile 해피 대표칭호 없음
Profile

강좌 자바 에디션(JE) 플러그인 개발

해피의 스크립트 강좌 #5 ( 미니게임 )

2019.11.29 조회 수 3767 추천 수 3
분야 스크립트 
게임버전 모든버전 

스크립트 난이도 : ★★☆☆☆

스크립트 응용 범위 : ★★★★☆

 

안녕하세요! 해피입니다.

이번 스크립트는 서버에서 이벤트로 쓰면 좋은 스크립트인데요.

제가 사용하기 위해 만든 이벤트 스크립트이지만 스크립트 자체가 매우 쉽다 보니깐 여러분들에게도 알려주면서 같이 공유하려고 글을 작성하게 되었습니다.

 

이 스크립트 같은 경우는 해외서버에 많이 있는 TNT런 과 비슷한 이벤트 스크립트 인데요.

 

사실상 TNT런을 생각하면서 제작한게 아니였지만 제작하고 나서 보니 너무 똑같더라구요 ㅋㅋㅋ

 

뭐.. 암튼 시작해보도록 하겠습니다.

구분선.png

 

[ 스크립트 구문 ]

options:
    a: &e&l[ &f&lRunning &e&l]&f&l
    
on any movement:
    if {Run.game} is set:
        if {Run.invite.%player%} is set:
            if block 1 under player is black_concrete:
                set event-block to air
            if block 1 under player is red_wool:
                make player run cmd "warp running_fail" as op
                delete {run.invite.%player%}
                loop all players:
                    if {run.invite.%loop-player%} is true:
                        add 1 to {_player}    
                if {_player} is set:
                    broadcast "{@a} &6&l[ &f&l%player% &6&l]&f&l 탈락! 남은 인원 &a&l[ &f&l%{_player}% &a&l]"
                 

command 러닝 [<text>] [<text>]:
    permission: op.op
    trigger:
        if arg 1 is not set:
            send "{@a} /러닝 참여 &7&l- 게임에 참가합니다."
            send "{@a} /러닝 강제참여 <닉네임> &7&l- 플레이어를 게임에 참여시킵니다."
            send "{@a} /러닝 인원 &7&l- 현재 참여중인 인원을 확인합니다."
            send "{@a} /러닝 시작 &7&l- 러닝 게임을 시작합니다."
            send "{@a} /러닝 종료 &7&l- 게임을 종료합니다."
            send "{@a} /러닝 참여가능 <가능/불가> &7&l- 게임을 참여할 수 있도록 또는 없도록 설정합니다."
            stop
        if arg 1 is "참여":
            if {Run.invite.%player%} is not set:
                if {run.join} is set:
                    if {run.game} is not set:
                        make player run cmd "warp running_start" as op
                        set {Run.invite.%player%} to true
                        send "{@a} 게임에 참여하였습니다 !"
                        stop
                    if {run.game} is set:
                        send "{@a} 현재 게임이 진행중임으로 참여가 불가능합니다."
                        stop
                if {run.join} is not set:
                    send "{@a} 현재 이벤트 시간이 아닙니다!"
                    stop
            if {Run.invite.%player%} is set:
                send "{@a} 당신은 이미 게임에 참여중입니다."
        if arg 1 is "강제참여":
            if arg 2 is set:
                if {Run.invite.%arg 2%} is set:
                    send "{@a} 해당 플레이어는 이미 참여중입니다."
                    stop
                if {Run.invite.%arg 2%} is not set:
                    make player run cmd "warp running_start %arg 2%" as op
                    set {run.invite.%arg 2%} to true
                    stop
        if arg 1 is "인원":
            loop all players:
                if {run.invite.%loop-player%} is true:
                    send "&a&l[ &f&l%loop-player% &a&l]"
                    add 1 to {_pl}
            if {_pl} is set:
                send "{@a} 현재 참여인원은 &c[ &f%{_pl}% &c] &f명 입니다."
            else:
                send "{@a} &f참여중인 플레이어가 없습니다."
        if arg 1 is "시작":
            if {run.game} is set:
                send "{@a} 이미 게임이 진행중입니다!"
                stop
            else:
                broadcast "{@a} 러닝 이벤트가 시작되었습니다. 지금으로부터 10초 후 게임이 시작됩니다."
                wait 5 seconds
                broadcast "{@a} 5초 남았습니다!"
                wait 2 seconds
                broadcast "{@a} 3초 남았습니다!"
                wait 1 seconds 
                broadcast "{@a} 2초 남았습니다!"
                wait 1 seconds
                broadcast "{@a} 1초 남았습니다!"
                wait 1 seconds
                broadcast "{@a} 게임이 시작되었습니다! 지금부터 콘크리트가 사라집니다."
                set {run.game} to true
        if arg 1 is "종료":
            if {run.game} is not set:
                send "{@a} 현재 게임이 진행중이지 않습니다!"
            else:
                broadcast "{@a} 러닝 이벤트가 종료되었습니다!"
                delete {run.game}
                loop all players:
                    if {run.invite.%loop-player%} is true:
                        delete {run.invite.%loop-player%}
                delete {_pl}
        if arg 1 is "참여가능":
            if arg 2 is "가능":
                if {run.join} is not set:
                    set {run.join} to true
                     send "{@a} 게임을 참여할 수 있도록 설정되었습니다."

                    stop
                if {run.join} is set:
                    send "{@a} 이미 참여할 수 있도록 설정되어있습니다."
                    stop
            if arg 2 is "불가":
                if {run.join} is set:
                    delete {run.join}
                    send "{@a} 게임을 참여할 수 없도록 설정되었습니다."
                    stop
                if {run.join} is not set:
                    send "{@a} 이미 참여할 수 없도록 설정되어있습니다."
                     stop

구분선.png

 

[ 스크립트 설명 ]

 

options:
    a: &e&l[ &f&lRunning &e&l]&f&l #{@a} 라는 접두사를 만들어둡니다. 스크립트 메세지나 구문 앞에 {@a} 를 입력하면 &e&l[ &f&lRunning &e&l]&f&l 이게 실행된다고 보시면 됩니다. 즉 {@a} = &e&l[ &f&lRunning &e&l]&f&l
     

on any movement: #움직임을 감지하는 구문
    if {Run.game} is set: #{run.game} 이라는 변수가 있을 경우
        if {Run.invite.%player%} is set: #또한 {run.invite.%player%} 라는 변수가 있을경우 즉 움직인 사람이 {run.invite} 라는 변수를 가지고 있을 경우
            if block 1 under player is black_concrete: #플레이어 아래 한칸 블럭이 black_concrete 블랙_콘크리트 일 경우
                 set event-block to air #그 검은색 아이템을 공기로 바꾼다

            if block 1 under player is red_wool: #플레이어 아래 한칸 블럭이 red_wool 빨간_양털 일 경우
                make player run cmd "warp running_fail" as op #오피 권한으로 "warp running_fail" 이라는 명령어를 실행시킨다.

               delete {run.invite.%player%} #{run.invite} 변수를 제거한다 여기서 제거하는 이유는 탈락했을때 남은 인원수를 확인하기 위해 제거를 시키게 됩니다.
                loop all players: #모든 플레이어 대상으로
                    if {run.invite.%loop-player%} is true: #{run.invite} 라는 구문을 가지고 있는 플레이어일 경우
                        add 1 to {_player} #{_player} 변수를 1 추가한다
                if {_player} is set: #{_player} 변수가 있을 경우
                    broadcast "{@a} &6&l[ &f&l%player% &6&l]&f&l 탈락! 남은 인원 &a&l[ &f&l%{_player}% &a&l]" #[ &f&lRunning &e&l] &f&l 탈락! 남은 인원 &a&l[ &f&l숫자 &a&l] 가 공지로 입력됩니다. 여기서 %{_player}% 는 위에 아까 추가된 1변수의 최종값을 보여주게 됩니다.

 

예시로 {run.invite} 변수를 가지고 있는 플레이어가 3명 있을경우 1명이 빨간 양털을 밟아 탈락하게 되고 그 탈락한 유저는 {run.invtie} 변수가 제거되고 이제 모든 플레이어 대상으로 루트를 돌린 다음에 {run.invite} 변수를 가지고 있는 사람 수만큼 add 1 to 즉 1 변수를 추가하면서 그 마지막 최종적인 값을 broadcast 로 내보내게 되는겁니다. 
                 

command 러닝 [<text>] [<text>]: #/러닝 이라는 명령어를 입력했을 경우 

 

여기서 [<text>] 이것은 /러닝 (여기) 명령어 뒤에 또 다른 명령어가 올 경우에 [<text>] 를 사용하게 됩니다. 하지만 모든곳에서 [<text>] 만 사용되는것이 아닙니다. [<text>] 말고도 [<string>] [<player>] [<integer>] 등이 있습니다. 하지만 대부분 [<text>] 를 많이 사용하게 됩니다.


    permission: op.op #op.op 라는 펼미션이 있을 경우
    trigger:
        if arg 1 is not set: # arg 1 즉 첫번째 [<text>] /러닝 (여기) 에 아무것도 입력하지 않았을 경우

즉 /러닝 명령어만 입력했을 경우
            send "{@a} /러닝 참여 &7&l- 게임에 참가합니다."
            send "{@a} /러닝 강제참여 <닉네임> &7&l- 플레이어를 게임에 참여시킵니다."
            send "{@a} /러닝 인원 &7&l- 현재 참여중인 인원을 확인합니다."
            send "{@a} /러닝 시작 &7&l- 러닝 게임을 시작합니다."
            send "{@a} /러닝 종료 &7&l- 게임을 종료합니다."
            send "{@a} /러닝 참여가능 <가능/불가> &7&l- 게임을 참여할 수 있도록 또는 없도록 설정합니다." #이런식의 메세지를 보냅니다.
            stop # 구문 종료
        if arg 1 is "참여": # 첫번째 [<text>] 에 참여 라는 명령어를 입력했을 경우
           if {Run.invite.%player%} is not set: #명령어를 입력한 유저가 {run.invite} 라는 변수를 가지고 있지 않을 경우
                if {run.join} is set: #{run.join} 변수가 있을 경우
                    if {run.game} is not set: #{run.game} 변수가 없을 경우
                        make player run cmd "warp running_start" as op #warp running_start 명령어가 오피 권한으로 실행되고
                         set {Run.invite.%player%} to true #플레이어에 {run.invite} 변수를 true 로 지정합니다.

                        send "{@a} 게임에 참여하였습니다 !" #그리고 게임 참여 메세지를 보냅니다.
                        stop #구문 종료
                    if {run.game} is set: #{run.game} 변수가 있을 경우
                        send "{@a} 현재 게임이 진행중임으로 참여가 불가능합니다." #게임 진행중임으로 참여 불가능 메세지 전송
                        stop
                if {run.join} is not set: #{run.join} 변수가 없을 경우
                    send "{@a} 현재 이벤트 시간이 아닙니다!" #이벤트 기간이 아니라는것을 알려주는 변수
                    stop # 구문종료

 

사실 위의 구문에서 if 를 2면더 사용할 필요 없이 else: 를 사용하여 더욱 간략하게 제작할 수가 있습니다.

하지만 저는 예전부터 else: 보다는 if 구문을 추가적으로 입력하는것이 버릇이 들어져서 이거 제작할 당시도 배포용도로 제작한것이 아니기 때문에 저의 편의성만 추구하여 제작하게 된 스크립트입니다. else: 를 사용하면 더욱 구문을 간략하게 만들 수 있다는점! 알아두시길 바랍니다.
            if {Run.invite.%player%} is set: #{run.invite} 변수를 가지고 있을 경우
                send "{@a} 당신은 이미 게임에 참여중입니다." # 이미 게임 참여중이라는 메세지를 보냅니다.

                stop
        if arg 1 is "강제참여": #첫번째 명령어칸에 강제참여 를 입력시
            if arg 2 is set: #2번째 [<text>] 에 입력시
                if {Run.invite.%arg 2%} is set: #{run.invite} 를 %arg 2% 즉 2번째 [<text>] 에서 입력한 글씨의 플레이어가 변수를 가지고 있을 경우
                    send "{@a} 해당 플레이어는 이미 참여중입니다." # 이미 참여중이라는 메세지 전송 
                    stop # 구문종료
                if {Run.invite.%arg 2%} is not set: #{run.invite} 변수를 %arg 2% 에 작성 즉 [<text>] 2번째에 작성한 플레이어가 가지고 있지 않을 경우
                    make player run cmd "warp running_start %arg 2%" as op #warp running_start %arg 2% 명령어를 오피 권한으로 실행합니다.

 

만약 /러닝 강제참여 topkide 를 입력하게 된다면 warp running_start topkide 라는 명령어가 입력되게 되는겁니다.
                    set {run.invite.%arg 2%} to true #{run.invite} 변수를 true 로 설정합니다.
                    stop
        if arg 1 is "인원": #인원이라는 명령어 입력시
            loop all players: #모든 플레이어 대상으로 loop 는 돌리다 즉 계속해서 없을때까지 반복한다고 생각하시면 됩니다. 모든 유저를 대상으로 돌린다.
                if {run.invite.%loop-player%} is true: #{run.invite} 가 true 인 유저분들 중에서
                    send "&a&l[ &f&l%loop-player% &a&l]" #%loop-player% 는 %player% 와 같은 구문입니다.
                     add 1 to {_pl} #{_pl} 에 변수 1를 추가한다

            if {_pl} is set: #{_pl} 변수가 있을 경우
                send "{@a} 현재 참여인원은 &c[ &f%{_pl}% &c] &f명 입니다." #현재 인원은 총 %{_pl}% 명인지 알려주는 구문
            else: #만약 없을경우
                send "{@a} &f참여중인 플레이어가 없습니다." #플레이어는 없다는 메세지
        if arg 1 is "시작": #시작 명령어 입력시
            if {run.game} is set: #{run.game} 구문이 이미 설정되어 있다면
                send "{@a} 이미 게임이 진행중입니다!" #게임은 이미 진행중이라는 메세지 전송
                stop
            else: #만약 없을 경우
                broadcast "{@a} 러닝 이벤트가 시작되었습니다. 지금으로부터 10초 후 게임이 시작됩니다." 
                wait 5 seconds #5초뒤
                broadcast "{@a} 5초 남았습니다!"
                wait 2 seconds #2초뒤
                broadcast "{@a} 3초 남았습니다!"
                wait 1 seconds 
                broadcast "{@a} 2초 남았습니다!"
                wait 1 seconds
                broadcast "{@a} 1초 남았습니다!"
                wait 1 seconds
                broadcast "{@a} 게임이 시작되었습니다! 지금부터 콘크리트가 사라집니다." #게임 시작 안내 메세지
                set {run.game} to true #{run.game} 의 변수를 true 로 바꾼다.
        if arg 1 is "종료": #종료 명령어 입력시
            if {run.game} is not set: #{run.game} 구문이 없을 경우
                send "{@a} 현재 게임이 진행중이지 않습니다!" #게임은 진행중이지 않습니다.
            else: # 만약 있을 경우
                broadcast "{@a} 러닝 이벤트가 종료되었습니다!" #게임 종료
                delete {run.game} #{run.game} 구문 삭제
                loop all players: #모든 플레이어 대상으로 루프
                    if {run.invite.%loop-player%} is true: #{run.invite} 를 가지고 있는 유저들을
                        delete {run.invite.%loop-player%} #모두 제거
                delete {_pl} #그리고 전에 인원 체크용이였던 {_pl} 도 함께 제거

                delete {_player} 
        if arg 1 is "참여가능": #참여가능 명령어
            if arg 2 is "가능": # 2번째 명령어에 가능 일시
                if {run.join} is not set: #{run.join} 이 없을 경우
                    set {run.join} to true #{run.join} 을 true 로 설정한 후
                    send "{@a} 게임을 참여할 수 있도록 설정되었습니다." #참여 메세지 안내

                    stop #구문종료
                if {run.join} is set: #이미 있을 경우
                    send "{@a} 이미 참여할 수 있도록 설정되어있습니다." # 이미 있다고 말함
                    stop # 구문종료
            if arg 2 is "불가": #불가시
                if {run.join} is set: #{run.join} 구문이 있을 경우
                    delete {run.join} #삭제
                    send "{@a} 게임을 참여할 수 없도록 설정되었습니다." #참여할 수 없도록 설정
                    stop #종료
                if {run.join} is not set: #없을 경우
                    send "{@a} 이미 참여할 수 없도록 설정되어있습니다." #이미 참여할 수 없다고 안내
                    stop #구문종료
구분선.png

 

 

따로 영상 자료는 없습니다!

원래부터 배포용으로 제작하려는 의도가 없었기 때문에 따로 촬영하지는 않았습니다.

 

많이 부족한 스크립트 이지만 사용하셔서 더욱 업그레이드 시켜서 사용하시는걸 추천 드립니다!

 

감사합니다 !구분선.png

 

 

[ 자료 다운로드 ]

 

러닝.zip

 

 

 




3개의 댓글

DDang_
2020.01.14

추천입니다 @.@

br


                loop all players:

                    if {run.invite.%loop-player%} is true:

                        add 1 to {_player}    

                if {_player} is set:

                    broadcast "{@a} &6&l[ &f&l%player% &6&l]&f&l 탈락! 남은 인원 &a&l[ &f&l%{_player}% &a&l]"

on any movement: 

에서

loop all players: 구문이 작동이 안됩니다.

탈락과 동시에 탈락! 이라는 메세지가 떠야하는데 뜨질 않네요.

버전은 1.12.2 이구요 스크립트는 최신버전입니다

Kavin_74
2021.10.16

너무 감사드립니다 이거 진짜진짜 (on any movement:}진짜 필요했어여....너무 감사해여

뉴스 및 창작물
/files/thumbnails/483/916/003/262x150.crop.jpg?20241127115329

레드스톤

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

노트블럭전문가

2024-11-27

0

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

건축

응답하라 1988 ?

팀뉴일리시

2024-11-23

4

/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

/files/thumbnails/219/899/003/262x150.crop.jpg?20241009200950

건축

송전탑+도시 2

dbasd12

2024-10-09

2

/files/thumbnails/246/898/003/262x150.crop.jpg?20241008102328

레드스톤

단다단 - 오토노케(オトノケ) | 마인크래프트 노트블럭 커버

노트블럭전문가

2024-10-08

1

/files/thumbnails/348/896/003/262x150.crop.jpg?20241006103035

디도스/봇테러등등을 낚는 방법 5

물귀신

2024-10-06

3