개인 자료란 (JE)

  서버 커뮤니티

Profile HB 대표칭호 없음
Profile

질문하기 스크립트

on armor unequip 버그

2021.08.23 조회 수 429 추천 수 0
이해도 1.12 
게임버전 (JE) 페이퍼 
게임버전 (BE) marsk 
스크립트 버전 초보자(스크립트 구성요소, 기본문법은 알아요) 
스크립트 애드온 2.4.1 beta 

해당 이벤트를 사용해 아이템을 벗으면 적용되어있던 효과가 풀리게끔 하고 싶은데

빠르게 여러번 아이템을 좌클릭해 장착, 해제를 하면 해제하여도 적용되는 버그가 있습니다.


every 1 seconds 와 같이 일정 시간마다 해당 아이템을 갖고 있다면 적용되게끔

하는 것도 고려했는데, every 라는 구문 자체가 all players를 loop해서 체크해야 하기때문에

렉의 원인이 될까봐 다른 방안을 떠올리다 도저히 안떠올라 질문합니다.




7개의 댓글

스크립터브혼
2021.08.23

버그를 재현해볼 수 있도록 작성하신 코드도 첨부해주시길 바랍니다.

HB
2021.08.23
@스크립터브혼


on armor equip:

@if event-item is diamond boots:

@@wait 0.5 seconds

@@if name of event-item contain "&a신속 신발":

@@@set player's walk speed to 0.26

@@@send "&f[ &b알림 &f] &a&l신속 신발 장착"

 

on armor unequip:

@if event-item is diamond boots:

@@wait 0.5 seconds

@@if name of event-item contain "&a신속 신발":

@@@set player's walk speed to 0.2

@@@send "&f[ &b알림 &f] &c&l신속 신발 장착 해제"


위 내용과 같이 작성했었습니다

스크립터브혼
2021.08.24
@HB

지연시간을 지우세요.

0.5초 딜레이를 주어서 그보다 짧은시간 동안 입고 벋고하면 오류가 생기는 거에요.

HB
2021.08.24
@스크립터브혼

혹시나해서 wait 1 tick으로도 해보고 wait 0.5 seconds와 같은 딜레이를 아얘 없이해봐도 똑같네요..

스크립터브혼
2021.08.25
@HB
on armor equip:
    send "[on armor equip] 입은 장비: %event-item% / 슬롯: %boot of player%" to console
on inventory click:
    send "[on inventory click] 액션: %inventory action% / 슬롯: %event-slot%" to console
on armor unequip:
    send "[on armor unequip] 벗은 장비: %event-item% / 슬롯: %boot of player%" to console

인벤토리 변화를 확인하기 위해서 각 이벤트마다 값을 출력해봤습니다.


[on armor unequip] 벗은 장비: diamond boots / 슬롯: diamond boots
[on inventory click] 액션: pickup all / 슬롯: the boots of Vhone

[on armor equip] 입은 장비: diamond boots / 슬롯: <none>
[on inventory click] 액션: nothing / 슬롯: the boots of Vhone

[on armor equip] 입은 장비: diamond boots / 슬롯: <none>
[on inventory click] 액션: place all / 슬롯: the boots of Vhone

[on armor unequip] 벗은 장비: diamond boots / 슬롯: diamond boots
[on inventory click] 액션: pickup all / 슬롯: the boots of Vhone

[on armor equip] 입은 장비: diamond boots / 슬롯: <none>
[on inventory click] 액션: nothing / 슬롯: the boots of Vhone

[on armor equip] 입은 장비: diamond boots / 슬롯: <none>
[on inventory click] 액션: place all / 슬롯: the boots of Vhone

[on armor unequip] 벗은 장비: diamond boots / 슬롯: diamond boots
[on inventory click] 액션: pickup all / 슬롯: the boots of Vhone

[on armor equip] 입은 장비: diamond boots / 슬롯: <none>
[on inventory click] 액션: nothing / 슬롯: the boots of Vhone

[on armor equip] 입은 장비: diamond boots / 슬롯: <none>
[on inventory click] 액션: place all / 슬롯: the boots of Vhone


여기서보면 액션이 nothing 인 경우 클릭이 된 것이 아니라서 장비를 입은 것이 아닙니다.

그러나 앞서 on armor equip 이벤트는 동작을 하게 되죠.


이것을 해결할 수 있는 방법은  이벤트의 처리를 일임하는 방법입니다.

on armor equip:
    set {event.equip} to true
on inventory click:
    if {event.equip} is set:
        delete {event.equip}
        inventory action is not nothing
        send "장비를 입다"

이벤트의 순서에 따라 가장 먼저 발생하는 이벤트에서 변수를 하나 설정하여

뒤에 오는 이벤트에서 해당 변수를 판단함으로써 앞선 이벤트의 처리를 대신 할 수 있습니다.

스크립터브혼
2021.08.25
@스크립터브혼

https://github.com/Sharpjaws/SharpSK/blob/master/src/main/java/com/codingforcookies/armorequip/ArmorEquipListener.java

 

on armor equip 이벤트는 InventoryClickEvent에서 발생됩니다.

InventoryClickEvent 는 스크립트에서 on inventory click 이벤트로 구현되어 있습니다.

 

on armor equip 이벤트는 클릭 액션이 nothing인 경우에도 동작하는 버그가 있으므로

위에 알려드린 방법으로 해결이 되지 않는다면 on inventory click으로 직접구현하여 해결해야합니다.

 

 

한가지 아셔야 하는 것은 on inventory click 이벤트는 드래그를 막지 못합니다.

 

HB
2021.08.26
@스크립터브혼

친절한 조언 감사드립니다

 

해당 장비를 장착시, 특정 변수가 true로 되게 하고

on inventory click 이벤트로 해당 변수가 활성화되었을 경우,

효과가 활성화 되게끔 할 수 있지만 드래그해서 버리거나 하면 다시 버그가 발생할 수 있다 라는 걸로 이해하였습니다.

 

따라서 내린 결론은 스크립트 선에서는 해결하기 힘들다는 것인데

말씀을 맞게 이해했는지 잘 모르겠습니다.