다각형 기반 지역 관리 플러그인. 자유 형태의 다각형, 사각형, 레이캐스트 모드로 지역을 생성하고, 플래그를 설정하여 경계 경고 시스템 등을 구성할 수 있습니다.
의존성: RSFramework
기본 명령어: /fieldzone (별칭: /지역)
| 명령어 | 설명 |
|---|---|
/fieldzone wand | 지역 선택 도구를 받습니다 |
/fieldzone create <이름> | 선택한 점들로 지역을 생성합니다 |
/fieldzone remove <지역> | 지역을 제거합니다 |
/fieldzone teleport <지역> | 지역의 중심으로 이동합니다 |
/fieldzone list | 모든 지역 목록을 확인합니다 |
/fieldzone info <지역> | 지역의 상세 정보를 확인합니다 (면적, 둘레, 중심, 플래그 등) |
/fieldzone clear | 선택한 모든 점을 초기화합니다 |
/fieldzone particle | 파티클 표시를 켜거나 끕니다 |
/fieldzone flag set <지역> <플래그> [true|false] | 지역에 플래그 값을 설정합니다 (기본: true) |
/fieldzone flag clear <지역> <플래그> | 지역에서 플래그를 해제합니다 (NONE 상태로 복귀) |
/fieldzone flag list <지역> | 지역의 플래그 목록을 확인합니다 |
/fieldzone reload | 설정을 다시 불러옵니다 |
도구를 들고 **우클릭(Shift)**으로 모드를 전환할 수 있습니다.
| 모드 | 설명 |
|---|---|
| 자유 (FREE) | 클릭한 위치마다 점이 추가됩니다. 자유로운 다각형 생성에 적합합니다. |
| 사각형 (SQUARE) | 두 지점을 선택하면 자동으로 사각형 영역이 생성됩니다. |
| 레이캐스트 (RAYCAST) | 바라보는 방향의 블록에 점을 추가합니다. (최대 거리: 설정 가능) |
도구 조작:
- 좌클릭: 점 추가 (자유/레이캐스트 모드) 또는 첫 번째/두 번째 지점 선택 (사각형 모드)
- 우클릭: 마지막 점 제거
- Shift + 우클릭: 선택 모드 전환
플래그는 namespace:key 형식을 사용합니다. 내장 플래그는 fieldzone 네임스페이스를 사용하며, 외부 플러그인은 자신만의 네임스페이스로 커스텀 플래그를 등록할 수 있습니다.
| 플래그 | 설명 |
|---|---|
fieldzone:warning | 플레이어가 지역 경계에 가까이 가면 빨간색 파티클로 경계면을 표시합니다 |
명령어에서
fieldzone:접두사는 생략 가능합니다. (예:/fz flag set spawn warning)
| 항목 | 기본값 | 설명 |
|---|---|---|
clean-unregistered-flags | false | 소유자 플러그인이 로드되었지만 플래그를 등록하지 않았을 때 해당 플래그를 자동 삭제할지 여부 |
wand.item | minecraft:blaze_rod | 도구 아이템 (CustomItems 형식) |
wand.raycast-max-range | 200 | 레이캐스트 최대 거리 |
wand.particle.interval | 2 | 파티클 표시 간격 (틱) |
wand.particle.density | 0.05 | 파티클 밀도 (낮을수록 촘촘) |
wand.particle.wave-gap | 10 | 파도 간격 (블록) |
wand.particle.wave-phase-step | 0.1 | 파도 상승 단계 |
wand.particle.vertical-range | 64 | 수직 표시 범위 (±블록) |
| 항목 | 기본값 | 설명 |
|---|---|---|
warning.distance | 2.75 | 경고 감지 거리 (블록) |
warning.particle.type | OMINOUS_SPAWNING | 경고 파티클 종류 |
warning.particle.cooldown | 29 | 파티클 쿨다운 (틱) |
warning.particle.interval | 0.25 | 샘플링 간격 (블록) |
| Placeholder | 설명 |
|---|---|
%fieldzone_region% | 현재 위치한 지역 이름 (없으면 "빈 공간") |
%fieldzone_count% | 총 지역 개수 |
%fieldzone_area_<이름>% | 특정 지역의 면적 |
%fieldzone_points_<이름>% | 특정 지역의 점 개수 |
| 권한 | 기본 | 설명 |
|---|---|---|
fieldzone.wand | OP | 도구 관련 명령어 사용 |
repositories {
maven {
name ="RTUStudio"
url = uri("https://repo.codemc.io/repository/rtustudio/")
}
}
dependencies {
compileOnly("kr.rtustudio:fieldzone:1.2.0")
}plugin.yml에 의존성을 추가하세요:
depend:
- FieldZone모든 API는 FieldZoneAPI 클래스의 static 메소드로 제공됩니다.
// Location으로 지역 조회Regionregion = FieldZoneAPI.getRegion(player.getLocation());
// 이름으로 지역 조회Regionregion = FieldZoneAPI.getRegion("spawn");
// 모든 지역 목록List<Region> regions = FieldZoneAPI.getRegions();
// 총 지역 개수intcount = FieldZoneAPI.getRegionCount();// 해당 위치가 지역 내부인지 확인booleaninside = FieldZoneAPI.isInRegion(player.getLocation());
// 해당 위치에 특정 플래그의 상태 확인 (TRUE / FALSE / NONE)FlagStatestate = FieldZoneAPI.hasFlag(player.getLocation(), RegionFlag.WARNING);
booleanactive = state.toBoolean(); // NONE과 FALSE는 false// 면적 (㎡)doublearea = FieldZoneAPI.getArea("spawn");
// 둘레 (블록)doubleperimeter = FieldZoneAPI.getPerimeter("spawn");
// 중심점Pointcenter = FieldZoneAPI.getCenter("spawn");Region은 record 타입이며 다음 필드를 가집니다:
| 필드 | 타입 | 설명 |
|---|---|---|
uuid() | UUID | 고유 식별자 |
name() | String | 지역 이름 |
pos() | PolygonPos | 다각형 위치 데이터 (점 목록, 월드, 면적, 둘레, 중심) |
flags() | Map<RegionFlag, Boolean> | 설정된 플래그와 값 |
Regionregion = FieldZoneAPI.getRegion("spawn");
if (region != null) {
Stringname = region.name();
Stringworld = region.pos().world();
doublearea = region.pos().area();
// hasFlag()는 FlagState를 반환 (TRUE / FALSE / NONE)FlagStatestate = region.hasFlag(RegionFlag.WARNING);
if (state.toBoolean()) {
// 경고 활성화됨
}
}FieldZone은 외부 플러그인이 자체 플래그를 등록하고 활용할 수 있는 확장 가능한 플래그 시스템을 제공합니다. WorldGuard처럼, 외부 플러그인은 자신만의 네임스페이스를 가진 플래그를 추가할 수 있습니다.
RegionFlag는 namespace(소유자)와 key(이름)로 구성된 레코드입니다:
// FieldZone 내장 플래그RegionFlag.WARNING// → "fieldzone:warning"// 커스텀 플래그 생성 (RegionFlag.create 사용 권장)RegionFlag.create(this, "no_lightning") // → "myplugin:no_lightning"RegionFlag.create(this, "safe_zone") // → "myplugin:safe_zone"hasFlag()는 boolean이 아닌 FlagState enum을 반환합니다:
| 상태 | 의미 | toBoolean() |
|---|---|---|
TRUE | 플래그가 명시적으로 true로 설정됨 | true |
FALSE | 플래그가 명시적으로 false로 설정됨 | false |
NONE | 플래그가 설정되지 않음 (데이터에 저장되지 않음) | false |
// onEnable()에서 등록RegionFlagmyFlag = RegionFlag.create(this, "no_lightning");
FieldZoneAPI.registerFlag(myFlag);
// onDisable()에서 해제FieldZoneAPI.unregisterFlag(myFlag);등록된 플래그는 자동으로 /fieldzone flag set 명령어의 탭 자동완성에 나타납니다.
// 특정 위치에 해당 플래그가 설정되어 있는지 확인FlagStatestate = FieldZoneAPI.hasFlag(location, myFlag);
if (state.toBoolean()) {
// 플래그가 true로 설정된 지역 내부
}
// 3-상태를 활용한 세밀한 제어FlagStatestate = FieldZoneAPI.hasFlag(location, myFlag);
switch (state) {
caseTRUE -> // 명시적으로 활성화됨caseFALSE -> // 명시적으로 비활성화됨caseNONE -> // 설정 없음, 기본 동작 적용
}clean-unregistered-flags 설정에 따라 미등록 플래그의 처리 방식이 달라집니다:
| 상황 | false (기본) | true |
|---|---|---|
| 소유자 플러그인 미로드 | 보존 ✅ | 보존 ✅ |
| 소유자 플러그인 로드됨 + 플래그 미등록 | 보존 ✅ | 삭제 🗑️ |
| 소유자 플러그인 로드됨 + 플래그 등록됨 | 정상 사용 | 정상 사용 |
이는 플러그인 업데이트로 플래그가 제거된 경우를 감지하기 위한 것입니다. 소유자 플러그인이 활성 상태임에도 해당 플래그를 등록하지 않았다면, 더 이상 사용하지 않는 것으로 판단하고 정리합니다.
다음은 번개를 발생시키는 플러그인이 FieldZone의 플래그 시스템을 활용하여 특정 지역에서 번개를 차단하는 완전한 예시입니다:
packagekr.example.lightning;
importkr.rtustudio.fieldzone.FieldZoneAPI;
importkr.rtustudio.fieldzone.region.FlagState;
importkr.rtustudio.fieldzone.region.RegionFlag;
importorg.bukkit.Location;
importorg.bukkit.event.EventHandler;
importorg.bukkit.event.Listener;
importorg.bukkit.event.weather.LightningStrikeEvent;
importorg.bukkit.plugin.java.JavaPlugin;
/** * 번개 플러그인 예시. * FieldZone에 'no_lightning' 플래그를 등록하고, * 해당 플래그가 true로 설정된 지역에서는 번개를 차단합니다. */publicclassLightningPluginextendsJavaPluginimplementsListener {
// 플래그를 필드로 선언privateRegionFlagnoLightning;
@OverridepublicvoidonEnable() {
// RegionFlag.create(this, key) — 플러그인 이름이 자동으로 namespace가 됨noLightning = RegionFlag.create(this, "no_lightning");
// FieldZone 레지스트리에 커스텀 플래그 등록// → /fz flag set <지역> LightningPlugin:no_lightning 으로 사용 가능// → /fz flag set <지역> LightningPlugin:no_lightning false 로 명시적 비활성화도 가능FieldZoneAPI.registerFlag(noLightning);
getServer().getPluginManager().registerEvents(this, this);
getLogger().info("LightningPlugin enabled — registered 'lightning:no_lightning' flag");
}
@OverridepublicvoidonDisable() {
// 플러그인 종료 시 플래그 해제FieldZoneAPI.unregisterFlag(noLightning);
}
@EventHandlerprivatevoidonLightningStrike(LightningStrikeEventevent) {
Locationlocation = event.getLightning().getLocation();
// FlagState를 통한 3-상태 확인FlagStatestate = FieldZoneAPI.hasFlag(location, noLightning);
// toBoolean()으로 간단히 확인 (TRUE만 true, FALSE와 NONE은 false)if (state.toBoolean()) {
event.setCancelled(true);
}
}
}사용 흐름:
- 서버에 FieldZone과 LightningPlugin이 함께 설치되어 있습니다.
- LightningPlugin이 활성화되면
lightning:no_lightning플래그가 자동 등록됩니다. - 관리자가
/fz flag set spawn LightningPlugin:no_lightning명령어를 실행합니다 → TRUE 설정. - 이제
spawn지역에서는 번개가 차단됩니다. /fz flag set spawn LightningPlugin:no_lightning false→ 명시적으로 FALSE 설정 (차단 해제)./fz flag clear spawn LightningPlugin:no_lightning→ NONE 상태로 복귀 (데이터에서 삭제).- LightningPlugin을 제거하면:
clean-unregistered-flags: false→ 플래그 데이터가 보존되어, 다시 설치하면 바로 작동합니다.clean-unregistered-flags: true→ 소유자 플러그인이 없으므로 데이터가 보존됩니다. (소유자가 로드되었는데 등록을 안 했을 때만 삭제)