๋ค๊ฐํ ๊ธฐ๋ฐ ์ง์ญ ๊ด๋ฆฌ ํ๋ฌ๊ทธ์ธ. ์์ ํํ์ ๋ค๊ฐํ, ์ฌ๊ฐํ, ๋ ์ด์บ์คํธ ๋ชจ๋๋ก ์ง์ญ์ ์์ฑํ๊ณ , ํ๋๊ทธ๋ฅผ ์ค์ ํ์ฌ ๊ฒฝ๊ณ ๊ฒฝ๊ณ ์์คํ ๋ฑ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
์์กด์ฑ: 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์ผ๋ก ์ง์ญ ์กฐํ
Region region = FieldZoneAPI.getRegion(player.getLocation());
// ์ด๋ฆ์ผ๋ก ์ง์ญ ์กฐํ
Region region = FieldZoneAPI.getRegion("spawn");
// ๋ชจ๋ ์ง์ญ ๋ชฉ๋ก
List<Region> regions = FieldZoneAPI.getRegions();
// ์ด ์ง์ญ ๊ฐ์
int count = FieldZoneAPI.getRegionCount();// ํด๋น ์์น๊ฐ ์ง์ญ ๋ด๋ถ์ธ์ง ํ์ธ
boolean inside = FieldZoneAPI.isInRegion(player.getLocation());
// ํด๋น ์์น์ ํน์ ํ๋๊ทธ์ ์ํ ํ์ธ (TRUE / FALSE / NONE)
FlagState state = FieldZoneAPI.hasFlag(player.getLocation(), RegionFlag.WARNING);
boolean active = state.toBoolean(); // NONE๊ณผ FALSE๋ false// ๋ฉด์ (ใก)
double area = FieldZoneAPI.getArea("spawn");
// ๋๋ (๋ธ๋ก)
double perimeter = FieldZoneAPI.getPerimeter("spawn");
// ์ค์ฌ์
Point center = FieldZoneAPI.getCenter("spawn");Region์ record ํ์
์ด๋ฉฐ ๋ค์ ํ๋๋ฅผ ๊ฐ์ง๋๋ค:
| ํ๋ | ํ์ | ์ค๋ช |
|---|---|---|
uuid() |
UUID |
๊ณ ์ ์๋ณ์ |
name() |
String |
์ง์ญ ์ด๋ฆ |
pos() |
PolygonPos |
๋ค๊ฐํ ์์น ๋ฐ์ดํฐ (์ ๋ชฉ๋ก, ์๋, ๋ฉด์ , ๋๋ , ์ค์ฌ) |
flags() |
Map<RegionFlag, Boolean> |
์ค์ ๋ ํ๋๊ทธ์ ๊ฐ |
Region region = FieldZoneAPI.getRegion("spawn");
if (region != null) {
String name = region.name();
String world = region.pos().world();
double area = region.pos().area();
// hasFlag()๋ FlagState๋ฅผ ๋ฐํ (TRUE / FALSE / NONE)
FlagState state = 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()์์ ๋ฑ๋ก
RegionFlag myFlag = RegionFlag.create(this, "no_lightning");
FieldZoneAPI.registerFlag(myFlag);
// onDisable()์์ ํด์
FieldZoneAPI.unregisterFlag(myFlag);๋ฑ๋ก๋ ํ๋๊ทธ๋ ์๋์ผ๋ก /fieldzone flag set ๋ช
๋ น์ด์ ํญ ์๋์์ฑ์ ๋ํ๋ฉ๋๋ค.
// ํน์ ์์น์ ํด๋น ํ๋๊ทธ๊ฐ ์ค์ ๋์ด ์๋์ง ํ์ธ
FlagState state = FieldZoneAPI.hasFlag(location, myFlag);
if (state.toBoolean()) {
// ํ๋๊ทธ๊ฐ true๋ก ์ค์ ๋ ์ง์ญ ๋ด๋ถ
}
// 3-์ํ๋ฅผ ํ์ฉํ ์ธ๋ฐํ ์ ์ด
FlagState state = FieldZoneAPI.hasFlag(location, myFlag);
switch (state) {
case TRUE -> // ๋ช
์์ ์ผ๋ก ํ์ฑํ๋จ
case FALSE -> // ๋ช
์์ ์ผ๋ก ๋นํ์ฑํ๋จ
case NONE -> // ์ค์ ์์, ๊ธฐ๋ณธ ๋์ ์ ์ฉ
}clean-unregistered-flags ์ค์ ์ ๋ฐ๋ผ ๋ฏธ๋ฑ๋ก ํ๋๊ทธ์ ์ฒ๋ฆฌ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๋๋ค:
| ์ํฉ | false (๊ธฐ๋ณธ) |
true |
|---|---|---|
| ์์ ์ ํ๋ฌ๊ทธ์ธ ๋ฏธ๋ก๋ | ๋ณด์กด โ | ๋ณด์กด โ |
| ์์ ์ ํ๋ฌ๊ทธ์ธ ๋ก๋๋จ + ํ๋๊ทธ ๋ฏธ๋ฑ๋ก | ๋ณด์กด โ | ์ญ์ ๐๏ธ |
| ์์ ์ ํ๋ฌ๊ทธ์ธ ๋ก๋๋จ + ํ๋๊ทธ ๋ฑ๋ก๋จ | ์ ์ ์ฌ์ฉ | ์ ์ ์ฌ์ฉ |
์ด๋ ํ๋ฌ๊ทธ์ธ ์ ๋ฐ์ดํธ๋ก ํ๋๊ทธ๊ฐ ์ ๊ฑฐ๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์งํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค. ์์ ์ ํ๋ฌ๊ทธ์ธ์ด ํ์ฑ ์ํ์์๋ ํด๋น ํ๋๊ทธ๋ฅผ ๋ฑ๋กํ์ง ์์๋ค๋ฉด, ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ผ๋ก ํ๋จํ๊ณ ์ ๋ฆฌํฉ๋๋ค.
๋ค์์ ๋ฒ๊ฐ๋ฅผ ๋ฐ์์ํค๋ ํ๋ฌ๊ทธ์ธ์ด FieldZone์ ํ๋๊ทธ ์์คํ ์ ํ์ฉํ์ฌ ํน์ ์ง์ญ์์ ๋ฒ๊ฐ๋ฅผ ์ฐจ๋จํ๋ ์์ ํ ์์์ ๋๋ค:
package kr.example.lightning;
import kr.rtustudio.fieldzone.FieldZoneAPI;
import kr.rtustudio.fieldzone.region.FlagState;
import kr.rtustudio.fieldzone.region.RegionFlag;
import org.bukkit.Location;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.weather.LightningStrikeEvent;
import org.bukkit.plugin.java.JavaPlugin;
/**
* ๋ฒ๊ฐ ํ๋ฌ๊ทธ์ธ ์์.
* FieldZone์ 'no_lightning' ํ๋๊ทธ๋ฅผ ๋ฑ๋กํ๊ณ ,
* ํด๋น ํ๋๊ทธ๊ฐ true๋ก ์ค์ ๋ ์ง์ญ์์๋ ๋ฒ๊ฐ๋ฅผ ์ฐจ๋จํฉ๋๋ค.
*/
public class LightningPlugin extends JavaPlugin implements Listener {
// ํ๋๊ทธ๋ฅผ ํ๋๋ก ์ ์ธ
private RegionFlag noLightning;
@Override
public void onEnable() {
// 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");
}
@Override
public void onDisable() {
// ํ๋ฌ๊ทธ์ธ ์ข
๋ฃ ์ ํ๋๊ทธ ํด์
FieldZoneAPI.unregisterFlag(noLightning);
}
@EventHandler
private void onLightningStrike(LightningStrikeEvent event) {
Location location = event.getLightning().getLocation();
// FlagState๋ฅผ ํตํ 3-์ํ ํ์ธ
FlagState state = 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โ ์์ ์ ํ๋ฌ๊ทธ์ธ์ด ์์ผ๋ฏ๋ก ๋ฐ์ดํฐ๊ฐ ๋ณด์กด๋ฉ๋๋ค. (์์ ์๊ฐ ๋ก๋๋์๋๋ฐ ๋ฑ๋ก์ ์ ํ์ ๋๋ง ์ญ์ )