개인 자료란 (JE)

  서버 커뮤니티

Profile build1006 대표칭호 없음
Profile

질문하기 스크립트

스크립트 질문

2022.11.19 조회 수 961 추천 수 0
이해도 입문자 
게임버전 (JE) 1.19.2 
게임버전 (BE) 관련없음 

on swap hand items:

    cancel event

    set {_현재아이템} to player's tool

    if {_현재아이템} = wooden sword:

        if player is not on ground:

            if {can_dash} is 0:

                set {can_dash} to 1

                push the player forwards at speed 0.25

                remove strength from player

                apply potion of strength of tier 1 to player for 1 seconds replacing existing effect


every 1 tick:

    loop all players:

        if loop-player is on ground:

            set {can_dash} to 0

이렇게 공중에서 한 번만 대쉬할 수 있게 하는 코드를 짰는데 작동이 안 됩니다

어디가 문제인지 알려주실 수 있나요?

22개의 댓글

코코냐
2022.11.19

can_dash 값이 전역변수 1개인것 같습니다.

build1006
2022.11.19
@코코냐

좀 더 자세히 알려주실 수 있나요?

qsef1256
2022.11.20

일단 이미 true 랑 false가 있으니 해당 구문을 먼저 사용해주시기 바랍니다.

근데 제가 테스트 해본 바로는 큰 문제가 없는 것 같습니다. 기타 잡다한 구문은 뺐긴 했는데 기본적인 작동은 합니다. 혹시 모르니까 제가 쓴 소스는 여기 올리겠는데, 어떻게 작동을 안 하는 건지 설명을 좀 더 해주셔야 할 것 같습니다.

on swap hand items:
    cancel event
    if player is not on ground:
        if {can_dash} is 0:
            set {can_dash} to 1
            push the player forwards at speed 0.25
            broadcast "dash"


every 1 tick:
    loop all players:
        if loop-player is on ground:
            set {can_dash} to 0
build1006
2022.11.20
@qsef1256

공중에서 여러 번 대쉬가 됩니다

qsef1256
2022.11.20
@build1006

해당 부분도 확인 했었습니다. 여러 번 f 를 눌러도 공중에서는 "dash" 한번만 됬었어요. 재현 불가 합니다.

build1006
2022.11.21
@qsef1256

여러 명이서 할 때 버그가 일어나네요

qsef1256
2022.11.22
@build1006

그 문제라면 각 플레이어마다 배열변수로 만들어야 할 부분인 것 같네요. 근데 그러면 on tick으로 인해 서버에 심각한 렉을 유발할테니 다른 구조를 택하시는 게 맞습니다

build1006
2022.11.25
@qsef1256

어떤 구조로 해야될까요 ㅠ

qsef1256
2022.11.25
@build1006

on tick 을 쓰지 마시구요, 그냥 on swap hand items 만 이용해서 true false 구현을 할 수 있을 것 같네요.

on swap hand items:
    cancel event
    if player is on ground:
      clear {dash::%event-player%}
    else:
      if {dash::%event-player%} is true:
        stop
      set {dash::%event-player%} to true
      dash(event-player)

function dash(player: player):
  push the {_player} forwards at speed 0.25
  broadcast "dash"
build1006
2022.11.26
@qsef1256

감사합니다

build1006
2022.11.26
@qsef1256

근데 이렇게 하면 땅에서 f를 한 번 더 눌러야 대쉬가 되는데 그건 해결 못 할까요 ㅠ

build1006
2022.11.26
@build1006

on swap hand items:

    cancel event

    if player is not on ground:

        if {dash::%event-player%} is true:

            stop

        set {dash::%event-player%} to true

        dash(event-player)

        while {dash::%event-player%} is false:

            if event-player is on ground:

               set {dash::%event-player%} to false

 

function dash(player: player):

    push {_player} forwards at speed 0.25

    broadcast "dash"

 

이런 식으로 땅에 닿이면 변수가 false로 바뀌게 해놨는데 왜 작동이 안 될까요 ㅠ

qsef1256
2022.11.26
@build1006

while 쓰는 건 괜찮은 선택이라고 생각되네요, 근데 while {dash::%event-player%} is true를 쓰셔야죠. while의 정의가 조건이 true 인 동안 계속 반복하겠다니까요. 렉 방지를 위해서 wait 5 tick 도 넣어주시고요.

build1006
2022.11.26
@qsef1256

넵 감사합니다

build1006
2022.11.26
@qsef1256

진짜 죄송한데 스크립트가 최종적으로 이렇게 작성이 됐거든요

on swap hand items:

    cancel event

    if player is not on ground:

        if {dash::%event-player%} is true:

            stop

        set {dash::%event-player%} to true

        dash(event-player)

        while {dash::%event-player%} is true:

            if event-player is on ground:

                set {dash::%event-player%} to false

                wait 5 tick

 

function dash(player:player):

    push {_player} forwards at speed 0.25

    broadcast "dash"

근데 작동이 안 됩니다 왜 그럴까요 ㅠ

qsef1256
2022.11.26
@build1006

서버 안 터지던가요? 전 while에서 서버 터지던데요

build1006
2022.11.26
@qsef1256

안 터집니다 근데 그냥 작동이 안되네요

qsef1256
2022.11.26
@build1006

이걸로 한번 해보세요.

on swap hand items:
    cancel event
    if player is not on ground:
        if {dash::%event-player%} is true:
            stop
        set {dash::%event-player%} to true
        dash(event-player)
        while {dash::%event-player%} is true:
            wait 5 tick
            if event-player is on ground:
                set {dash::%event-player%} to false
                
function dash(player:player):
    push {_player} forwards at speed 0.25
    broadcast "dash"
qsef1256
2022.11.26
@build1006

while은 잘 쓰면 편리하지만 기본적으로 무한 루프를 일으키고 서버 터트릴 위험이 높은 구문이에요. wait 5 tick 이 if 밑에 있는데 이러면 만약 if 문의 조건을 잘못 입력해서 if 문에 접근이 불가 하게 되어버리면 그냥 무한 루프가 벌어집니다.

build1006
2022.11.26
@qsef1256

저거 그대로 복붙했는데 안 써지네요 ㅠ

qsef1256
2022.11.26
@build1006

기존 dash 변수가 남아서 그럴 가능성이 있습니다. variables.csv에서 수동으로 삭제하거나 clear {dash::*} 를 실행하세요.

build1006
2022.11.27
@qsef1256

감사합니다

뉴스 및 창작물
/files/thumbnails/761/908/003/262x150.crop.jpg?20241025153749

건축

서울 숭례문(崇禮門) 4

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

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

물귀신

2024-10-06

3