개인 자료란 (JE)

  서버 커뮤니티

Profile 제바류알려줭 대표칭호 없음
Profile

질문하기 스크립트

특정 블록 폭파 금지

2024.10.01 조회 수 76 추천 수 0
이해도 초보자 
게임버전 (JE) 1.16.5 
게임버전 (BE) 관련없음 
스크립트 버전 2.5.3 
스크립트 애드온 skellett, skquery, skutilities, skrayfall 

on explode:

@ if event-block is grass block:

@@cancel event


이런 구문으로 해봤는데 안돼서 도움 구합니다..ㅠㅠ

14개의 댓글

gamediller
2024.10.02

1. Skript 플러그인 방법 (서버 전용)

폭발 시 특정 블록을 보호하는 방법은 아래와 같습니다.


on explode:

    if event-block is grass block:

        cancel event


- 설명

폭발이 발생할 때(on explode), **잔디 블록(grass block)**이 폭발에 의해 파괴될 경우(if event-block is grass block), 해당 폭발을 취소(cancel event)하여 블록을 보호합니다.

다른 블록을 보호하려면 grass block 부분을 원하는 블록 이름으로 바꾸면 됩니다.


2. 데이터팩

데이터팩 코드 예시 (JSON 형식):


{

  "trigger": "minecraft:explosion",

  "conditions": {

    "block": "minecraft:grass_block"

  },

  "consequence": {

    "cancel": true

  }

}


- 설명 

폭발 이벤트가 발생하면(minecraft:explosion), **잔디 블록(grass_block)**이 파괴될 때 해당 이벤트를 취소하여 블록을 보호합니다.

이 방식으로 특정 블록에 대한 폭발을 감지하고 이벤트를 막을 수 있습니다.

제바류알려줭
2024.10.02
@gamediller

써 주신 스크립트를 써도 안됩니다

gamediller
2024.10.02
@제바류알려줭

on explode 이벤트가 정확하지 않을 수 있습니다. 이벤트  on explosion으로 변경해서 해보세요.

다음과 같이 변경하시면 됩니다.

on explosion:
    loop all blocks in the event-explosion:
        if loop-block is grass block:
            set loop-block to grass block

설명

  1. 이벤트 핸들링: on explosion 이벤트는 폭발이 발생할 때 트리거됩니다.
  2. 블록 순회: loop all blocks in the event-explosion 구문을 사용하여 폭발에 의해 영향을 받은 모든 블록을 순회합니다.
  3. 특정 블록 확인 및 복원: if loop-block is grass block 조건문을 통해 현재 순회 중인 블록이 잔디 블록인지 확인하고, 맞다면 set loop-block to grass block을 통해 블록을 원래 상태로 복원합니다.

 Skript 애드온 확인

사용 중인 애드온(Skellett, Skquery, SkUtilities, SkRayFall)이 최신 버전인지 확인하고, 해당 애드온들이 on explosion 이벤트를 제대로 지원하는지 문서를 참고해 보세요. 애드온에 따라 이벤트 이름이나 사용 방법이 다를 수 있습니다.

위의 수정된 스크립트를 사용하면 폭발로 인해 잔디 블록이 파괴되는 것을 방지할 수 있을 겁니다. 그래도 문제가 지속된다면, 서버 로그를 확인하여 오류 메시지가 있는지 살펴보시고, Skript 및 애드온의 최신 버전을 사용하는지 다시 한번 확인해 보세요. 

추가적인 도움이 필요하시면 언제든지 말씀해 주세요! 행운을 빕니다! 😊



제바류알려줭
2024.10.04
@gamediller

늦게 질문 드려서 죄송합니다

 

써주신 구문을 써보면

 

loop all blocks in the event-explosion: 에서 구문 오류가 뜸니다

 

저기에서 in the event-explosion 이 구문을 지우고 loop all blocks 이 구문만 쓰면

 

그 다음은 set loop-block to grass block 이 구문에서 오류가 납니다

windy_wind
2024.10.02

skript-reflect를 쓰실때가 왔군요...

전 이렇게 대충 써봤어요. 발전해나가보세요

ex)

 

import:
  org.bukkit.event.block.BlockExplodeEvent
  org.bukkit.event.entity.EntityExplodeEvent
  co.aikar.util.JSONUtil as Json
  


on BlockExplodeEvent:
  loop ...event.blockList():
    type of block at loop-value is glass block or glass

    set {_object} to Json.createObject() if {_object} is not set
    {_object}.put(location of loop-value, type of block at loop-value)
  {_object} is set
  wait 1 tick
  loop ...{_object}.keySet():
    block at loop-value is air
    set block at loop-value to {_object}.get(loop-value)
  
on EntityExplodeEvent:
  loop ...event.blockList():
    type of block at loop-value is glass block or glass

    set {_object} to Json.createObject() if {_object} is not set
    {_object}.put(location of loop-value, type of block at loop-value)
  {_object} is set
  wait 1 tick
  loop ...{_object}.keySet():
    block at loop-value is air
    set block at loop-value to {_object}.get(loop-value)
   

    


제바류알려줭
2024.10.04
@windy_wind

이 구문 또한 skript-reflect 애드온을 설치 해도 작동 되지 않습니다

windy_wind
2024.10.05
@제바류알려줭

제 서버에서는 잘 되네요.

아마도 1.20.6 이상 서버랑 그 이하 버전이랑 스크립트 차이가 나서 그럴 겁니다.

제바류알려줭
2024.10.05
@windy_wind

그렇군요 감사합니다

 

그럼 관련 플러그인 같은게 있을까요?

windy_wind
2024.10.05
@제바류알려줭

저 스크립트에서는 skript-reflect 에드온만 사용됬어요.

관련 플러그인은 위 에드온 말고 없고 일단 서버 버전이 제일 관련이 있을 것 같네요.

님 서버 버전에 맞게 skript-reflect 다운하시고

오류가 있다면 스샷해서 올려주세용

제바류알려줭
2024.10.05
@windy_wind

오류나 그런 건 없는데 작동이 안될 뿐 입니다

windy_wind
2024.10.05
@제바류알려줭

block at loop-value 를

type of block at loop-value로 해야했었나봐요.

 

중간에 코드 살짝 수정했던 부분에서 버그난것 같네요.

죄송합니다ㅠㅠㅠ

제바류알려줭
2024.10.05
@windy_wind

아닙니다

답변 해주신 것 만으로 감사합니다

제바류알려줭
2024.10.06
@windy_wind

근데.. 어디를 수정 해야 될지를 모르겠네요..

windy_wind
2024.10.23
@제바류알려줭

코드 수정해서 다시 복붙하심 되여