-
Notifications
You must be signed in to change notification settings - Fork 0
Home
SkillScript๋ Bukkit/Spigot ์๋ฒ ๊ด๋ฆฌ์์ ๊ฐ๋ฐ์๊ฐ YAML ํ์ผ์ ์ฌ์ฉํ์ฌ ์ปค์คํ ์คํฌ์ ์ฝ๊ฒ ๋ง๋ค ์ ์๋๋ก ์ค๊ณ๋ ํ๋ฌ๊ทธ์ธ์ ๋๋ค. ๋ณต์กํ Java ์ฝ๋ฉ ์์ด ๋ค์ํ ๊ฒ์ ๋ด ๋์(์ก์ )์ ์กฐํฉํ์ฌ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ์คํฌ์ ๊ตฌํํ ์ ์์ต๋๋ค.
SkillScript ์คํฌ๋ฆฝํธ๋ ํ๋ฌ๊ทธ์ธ ํด๋ ๋ด scripts/ ๋๋ ํ ๋ฆฌ์ .yaml ๋๋ .yml ํ์ฅ์๋ฅผ ๊ฐ์ง ํ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค. ๊ฐ ํ์ผ์ ํ๋์ ์คํฌ์ ์ ์ํ๋ฉฐ, ํ์ผ ์ด๋ฆ(ํ์ฅ์ ์ ์ธ)์ด ํด๋น ์คํฌ์ ๊ณ ์ ํ ์ด๋ฆ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, Fireball.yaml์ด๋ผ๋ ํ์ผ์ ์์ฑํ๋ฉด, /cast Fireball ๋ช
๋ น์ด๋ก ํด๋น ์คํฌ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์คํฌ๋ฆฝํธ ํ์ผ์ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
# scripts/Fireball.yaml
# ์ต์์ ๋ ๋ฒจ์ ๋ฐ๋ก ์คํฌ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ ์ํฉ๋๋ค.
OnCast: # ํ๋ ์ด์ด๊ฐ ์คํฌ์ ์์ ํ์ ๋(/cast Fireball) ๋ฐ๋๋๋ ํธ๋ฆฌ๊ฑฐ์
๋๋ค.
# ์ฌ๊ธฐ์ ์ด ํธ๋ฆฌ๊ฑฐ๊ฐ ๋ฐ๋๋ ๋ ์์๋๋ก ์คํ๋ ์ก์
๋ชฉ๋ก์ ์ ์ํฉ๋๋ค.
- Variable.SetVariable: { name: "projectileSpeed", value: 1.5 }
- TargetBehaviour.SendMessage:
message: "&cLaunching Fireball!"
- TargetBehaviour.PlayEffect:
location: "@CasterLocation"
particle: "LAVA"
offset: { y: 1.5 } # ์์ ์ ๋จธ๋ฆฌ ์์์ ๋ฐ์ฌ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ
# ... Fireball ๊ด๋ จ ๋ค๋ฅธ ์ก์
๋ค ...
# OnHit: # (ํฅํ ์ง์ ์์ ) ์คํฌ ํฌ์ฌ์ฒด ๋ฑ์ด ์ ์คํ์ ๋
# - TargetBehaviour.Damage: { amount: 10 }
# - TargetBehaviour.PlayEffect: { particle: "EXPLOSION_LARGE" }
# ๋ค๋ฅธ ํธ๋ฆฌ๊ฑฐ๊ฐ ์๋ค๋ฉด ์ฌ๊ธฐ์ ์ถ๊ฐ...-
ํ๋์ ํ์ผ์ ํ๋์ ์คํฌ์ ๋ํ๋
๋๋ค. ์ฌ๋ฌ ์คํฌ์ ๋ง๋ค๋ ค๋ฉด ์ฌ๋ฌ YAML ํ์ผ์ ์์ฑํ์ธ์. (์:
Heal.yaml,Teleport.yaml) - ํ์ผ์ ์ต์์ ๋ ๋ฒจ์๋ ์คํฌ์ด ๋ฐ๋๋ ์กฐ๊ฑด์ ๋ํ๋ด๋ ํธ๋ฆฌ๊ฑฐ(Trigger) ํค(์:
OnCast,OnHit)๊ฐ ์์นํฉ๋๋ค. - ๊ฐ ํธ๋ฆฌ๊ฑฐ ์๋์๋ ์คํ๋ ์ก์
(Action)๋ค์ ๋ชฉ๋ก(List)์ด YAML ๋ฆฌ์คํธ ํ์(
-)์ผ๋ก ๋์ด๋ฉ๋๋ค. - ํ์ฌ ์ฃผ๋ก ์ฌ์ฉ๋๋ ํธ๋ฆฌ๊ฑฐ๋
/cast๋ช ๋ น์ด์ ์ฐ๋๋๋OnCast์ ๋๋ค.
์ก์ ์ ์คํฌ์ด ์ํํ๋ ๊ฐ๋ณ์ ์ธ ๋์ ๋จ์์ ๋๋ค. ๊ฐ ์ก์ ์ ์ ํด์ง ์ด๋ฆ๊ณผ ํ์ํ ํ๋ผ๋ฏธํฐ(Parameters)๋ฅผ ๊ฐ์ง๋๋ค.
๊ธฐ๋ณธ ํ์:
- ActionRegistryName: # ActionRegistry์ ๋ฑ๋ก๋ ์ก์
์ ์ ์ฒด ์ด๋ฆ (์: TargetBehaviour.SendMessage)
parameter1: value1 # ํด๋น ์ก์
์ด ์๊ตฌํ๋ ํ๋ผ๋ฏธํฐ์ ๊ฐ
parameter2: value2
# ...ํ๋ผ๋ฏธํฐ ํ์ :
์ก์ ํ๋ผ๋ฏธํฐ๋ ๋ค์ํ ๋ฐ์ดํฐ ํ์ ์ ๊ฐ์ง ์ ์์ต๋๋ค.
-
String: ๋ฌธ์์ด. ๋ณดํต ๋ฐ์ดํ๋ ์๋ต ๊ฐ๋ฅํ๋, ํน์๋ฌธ์๊ฐ ํฌํจ๋๊ฑฐ๋ ๋ช
ํ์ฑ์ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. (์:
message: "&aHello World!") -
Integer: ์ ์ ์ซ์. (์:
duration: 20) -
Double: ์ค์ ์ซ์. (์:
amount: 10.5) -
Boolean: ๋
ผ๋ฆฌ๊ฐ.
true๋๋false. (์:ignoreArmor: true) - Location: ๊ฒ์ ๋ด ์์น ์ขํ. ๋ณ์, ์ ๋ ํฐ, ๋๋ ๋งต ํ์์ผ๋ก ์ง์ ๊ฐ๋ฅ. (์์ธํ ๋ด์ฉ์ ์๋ ์ฐธ์กฐ)
-
Vector: 3์ฐจ์ ๋ฒกํฐ (๋ฐฉํฅ ๋๋ ์คํ์
). ๋ณ์, ์
๋ ํฐ, ๋ฆฌ์คํธ
[x, y, z], ๋๋ ๋งต{x: val, y: val, z: val}ํ์์ผ๋ก ์ง์ ๊ฐ๋ฅ. -
List: ํญ๋ชฉ์ ๋ชฉ๋ก. (์:
tags: ["mytag", "effect_tag"]) -
Map: ํค-๊ฐ ์์ ์งํฉ. (์:
particleData: { count: 5, speed: 0.1 }) -
Material: ๋ง์ธํฌ๋ํํธ ์์ดํ
/๋ธ๋ก ์ข
๋ฅ ์ด๋ฆ (๋์๋ฌธ์ ๊ตฌ๋ถ ์์). (์:
material: "DIAMOND_SWORD")
์คํฌ๋ฆฝํธ ์คํ ์์ ์ ๋์ ์ธ ๊ฐ์ ์ฐธ์กฐํ๊ธฐ ์ํด @ ๊ธฐํธ๋ก ์์ํ๋ ํน๋ณํ ํค์๋(์
๋ ํฐ)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ ์ ๋ ํฐ:
-
@Caster: ์คํฌ์ ์์ ํ ํ๋ ์ด์ด ์ํฐํฐ. -
@Target๋๋@CurrentTarget: ํ์ฌ ์ก์ ์ ๋์์ด ๋๋ ์ํฐํฐ ๋๋ ์์น. (์ก์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง,Target.*์ก์ ์ผ๋ก ์ค์ ๊ฐ๋ฅ) -
@CastLocation: ์คํฌ์ด ์ฒ์ ์์ ๋ ์์น (Location). -
@CasterLocation: ํ์ฌ ์์ ์์ ์ค์๊ฐ ์์น (Location). -
@TargetLocation๋๋@CurrentTargetLocation: ํ์ฌ ๋์์ ์์น (Location). ๋์์ด ์ํฐํฐ๊ฐ ์๋๋ฉด ๋์ํ์ง ์์ ์ ์์. -
@CastDirection: ์คํฌ์ด ์ฒ์ ์์ ๋ ๋ฐฉํฅ (Vector). -
@CasterDirection: ํ์ฌ ์์ ์์ ์ค์๊ฐ ๋ฐฉํฅ (Vector). -
@TargetDirection๋๋@CurrentTargetDirection: ํ์ฌ ๋์์ ๋ฐฉํฅ (Vector). ๋์์ด ์ํฐํฐ์ฌ์ผ ํจ.
์์ฑ ์ ๊ทผ:
. (์ )์ ์ฌ์ฉํ์ฌ ์
๋ ํฐ๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ฒด์ ํน์ ์์ฑ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. (์ฃผ๋ก variable.calculate ์ก์
์ ํํ์ ๋ด์์ ์ฌ์ฉ)
-
Location ์์ฑ:
-
@CasterLocation.X,@TargetLocation.Y,@CastLocation.Z
-
-
Entity ์์ฑ:
-
@Caster.X,@Target.Y,@Caster.Z(์ํฐํฐ์ ํ์ฌ ์์น) -
@Caster.Yaw,@Target.Pitch(์ํฐํฐ์ ๋ฐฉํฅ) -
@Caster.Health,@Target.Health(์ํฐํฐ์ ํ์ฌ ์ฒด๋ ฅ,Damageable์ด์ด์ผ ํจ) -
@Caster.MaxHealth,@Target.MaxHealth(์ํฐํฐ์ ์ต๋ ์ฒด๋ ฅ,LivingEntity์ด์ด์ผ ํจ) - (ํฅํ ์ถ๊ฐ ๊ฐ๋ฅ:
@Caster.FoodLevel๋ฑ)
-
์คํฌ๋ฆฝํธ ์คํ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์์๋ก ์ ์ฅํ๊ณ ์ฌ์ฉํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ ๋๋ค. ๋ณ์๋ ์คํฌ๋ฆฝํธ ์คํ ์ปจํ ์คํธ ๋ด์์ ์ ํจํ๋ฉฐ, ๋ค๋ฅธ ์คํฌ๋ฆฝํธ ์คํ์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค. ๋ณ์ ์ด๋ฆ์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
๋ณ์ ์ค์ :
-
Variable.SetVariable์ก์ ์ฌ์ฉ:- Variable.SetVariable: name: "myCounter" # ๋ณ์ ์ด๋ฆ value: 0 # ์ ์ฅํ ๊ฐ (๋ชจ๋ ํ๋ผ๋ฏธํฐ ํ์ ๊ฐ๋ฅ) - Variable.SetVariable: name: "targetEntity" value: "@Target" # ์ ๋ ํฐ ๊ฒฐ๊ณผ(Entity)๋ฅผ ์ ์ฅ - Variable.SetVariable: name: "startPos" value: "@CasterLocation" # ์ ๋ ํฐ ๊ฒฐ๊ณผ(Location)๋ฅผ ์ ์ฅ
-
Variable.Calculate์ก์ ์ฌ์ฉ (์ซ์): ์ํ์ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. (์๋ 'ํํ์' ์น์ ์ฐธ์กฐ)- Variable.Calculate: variable: "damageMultiplier" expression: "1.5 + @Caster.Health / 20"
-
Variable.GetLocation,Variable.GetDirection,Variable.GetOffsetLocation์ก์ ์ฌ์ฉ: ํน์ ์์น/๋ฐฉํฅ ๊ด๋ จ ๊ฐ์ ๊ณ์ฐํ์ฌ ๋ณ์์ ์ ์ฅํฉ๋๋ค.
๋ณ์ ์ฌ์ฉ:
-
์ก์
ํ๋ผ๋ฏธํฐ ๊ฐ์ผ๋ก ์ฌ์ฉ: ๋๋ถ๋ถ์ ์ก์
ํ๋ผ๋ฏธํฐ์ ๋ณ์ ์ด๋ฆ์ ์ง์ ์ง์ ํ์ฌ ํด๋น ๋ณ์์ ๊ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. (๋จ, ํด๋น ํ๋ผ๋ฏธํฐ๊ฐ ์๊ตฌํ๋ ํ์
๊ณผ ๋ณ์ ํ์
์ด ์ผ์นํด์ผ ํจ)
- Variable.SetVariable: { name: "targetToDamage", value: "@Target" } - Variable.SetVariable: { name: "calculatedDamage", value: 15.0 } - TargetBehaviour.Damage: target: targetToDamage # Entity ํ์ ๋ณ์ ์ฌ์ฉ amount: calculatedDamage # Double ํ์ ๋ณ์ ์ฌ์ฉ
-
Variable.Calculateํํ์ ๋ด์์ ์ฌ์ฉ: ์ซ์ ํ์ ๋ณ์๋ฅผ ์ํ ํํ์ ๋ด์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.- Variable.Calculate: variable: "finalDamage" expression: "baseDamage * damageMultiplier + bonusDamage" # baseDamage, damageMultiplier, bonusDamage ๋ณ์ ์ฌ์ฉ
TargetBehaviour.SendMessage์ ๊ฐ์ด ๋ฌธ์์ด์ ์ฌ์ฉํ๋ ์ผ๋ถ ์ก์
์์๋ ๋ฌธ์์ด ๋ด์ ๋ณ์ ๊ฐ์ด๋ ์
๋ ํฐ ๊ฐ์ ์ง์ ์ฝ์
ํ์ฌ ๋์ ์ธ ๋ด์ฉ์ ๋ง๋ค ์ ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ํ๋ ์ด์คํ๋ ํ์์ ์ฌ์ฉํฉ๋๋ค.
-
{var:๋ณ์์ด๋ฆ}: ์ง์ ๋ ์ด๋ฆ์ ๋ณ์ ๊ฐ์ ๋ฌธ์์ด๋ก ๋ณํํ์ฌ ์ฝ์ ํฉ๋๋ค. -
{sel:์ ๋ ํฐ.์์ฑ}: ์ง์ ๋ ์ ๋ ํฐ์ ์์ฑ์ ํ๊ฐํ์ฌ ๊ทธ ๊ฐ์ ๋ฌธ์์ด๋ก ๋ณํํ์ฌ ์ฝ์ ํฉ๋๋ค.
์์:
- Variable.SetVariable: { name: "kills", value: 10 }
- Target.SetSelf: {}
- TargetBehaviour.SendMessage:
target: "@Caster"
message: "&aYour Stats: &fHP: {sel:@Caster.Health}/{sel:@Caster.MaxHealth}, Kills: {var:kills}"
# ์์ ์ถ๋ ฅ (์ฒด๋ ฅ์ด 15/20 ์ด๊ณ kills ๋ณ์๊ฐ 10์ผ ๋):
# Your Stats: HP: 15/20, Kills: 10
- Variable.GetLocation: { target: "@Target", variable: "enemyPos" }
- TargetBehaviour.SendMessage:
target: "@Caster"
message: "&eTarget spotted at: {var:enemyPos}"
# ์์ ์ถ๋ ฅ (enemyPos ๋ณ์๊ฐ Location ๊ฐ์ฒด์ผ ๋):
# Target spotted at: world, 123.5, 65.0, 45.2์ฃผ์์ฌํญ:
- ํ๋ ์ด์คํ๋ ์์ ๋ณ์๋ช ์ด๋ ์ ๋ ํฐ ๋ฌธ์์ด์๋ ๊ณต๋ฐฑ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
- ๋ณ์๋ ์
๋ ํฐ๋ฅผ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ ์ด์คํ๋ ๋ฌธ์์ด(
{var:nonExistentVar})์ด ๊ทธ๋๋ก ๋จ๊ฑฐ๋ ๋น ๋ฌธ์์ด๋ก ๋์ฒด๋ ์ ์์ต๋๋ค. (์ ํํ ๋์์ ํ๋ฌ๊ทธ์ธ ์ค์ ์ด๋ ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์) - ํ์ฌ ๋ชจ๋ ์ก์ ์ ๋ชจ๋ ๋ฌธ์์ด ํ๋ผ๋ฏธํฐ์์ ์ด ๊ธฐ๋ฅ์ด ์ง์๋๋ ๊ฒ์ ์๋๋๋ค. ์ฃผ๋ก ๋ฉ์์ง, ๋ช ๋ น์ด ๊ด๋ จ ์ก์ ์์ ์ง์๋ฉ๋๋ค. (์ง์ ์ฌ๋ถ๋ ๊ฐ ์ก์ ์ค๋ช ์ฐธ์กฐ)
Variable.Calculate ์ก์
์ ๊ฐ๋ ฅํ ์ํ ํํ์ ๊ณ์ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋ด๋ถ์ ์ผ๋ก mXparser ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ตฌ๋ฌธ:
- Variable.Calculate:
variable: "resultVariableName" # ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ๋ณ์ ์ด๋ฆ
expression: "Your mathematical expression here" # ๊ณ์ฐํ ํํ์ ๋ฌธ์์ดํํ์ ๋ด ์ฌ์ฉ ๊ฐ๋ฅ ์์:
-
์ซ์:
10,-5.2,1.2E3๋ฑ -
๊ธฐ๋ณธ ์ฐ์ฐ์:
+,-,*,/(๋๋์ ),^(๊ฑฐ๋ญ์ ๊ณฑ),%(๋๋จธ์ง) -
mXparser ๋ด์ฅ ํจ์:
-
์ผ๊ฐํจ์:
sin(rad),cos(rad),tan(rad),asin(x),acos(x),atan(x)๋ฑ (๊ฐ๋๋ ๋ผ๋์ ์ฌ์ฉ) -
์ง์/๋ก๊ทธ:
exp(x),log(base, x),ln(x),log2(x),log10(x) -
๊ธฐํ ์ ์ฉ ํจ์:
sqrt(x)(์ ๊ณฑ๊ทผ),abs(x)(์ ๋๊ฐ),round(value, places)(๋ฐ์ฌ๋ฆผ),floor(x)(๋ด๋ฆผ),ceil(x)(์ฌ๋ฆผ),min(a, b, ...)(์ต์๊ฐ),max(a, b, ...)(์ต๋๊ฐ),rand()(0~1 ์ฌ์ด ๋์),if(condition, true_expr, false_expr)๋ฑ ๋งค์ฐ ๋ค์ํฉ๋๋ค. (์์ธํ ๋ด์ฉ์ mXparser ๋ฌธ์ ์ฐธ์กฐ)
-
์ผ๊ฐํจ์:
-
mXparser ๋ด์ฅ ์์:
pi,e,[deg](๊ฐ๋->๋ผ๋์ ๋ณํ),[rad](๋ผ๋์->๊ฐ๋ ๋ณํ) ๋ฑ -
SkillScript ์
๋ ํฐ: ํํ์ ๋ฌธ์์ด ์์
@Caster.Health,@TargetLocation.Y์ ๊ฐ์ด ์ง์ ์์ฑํ์ฌ ํ์ฌ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค. -
SkillScript ๋ณ์: ํํ์ ๋ฌธ์์ด ์์ ๋ณ์ ์ด๋ฆ์ ์ง์ ์์ฑํ์ฌ ํด๋น ๋ณ์์ ์ซ์ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค. (์:
myVar,calculatedDamage)
์์:
- Variable.Calculate:
variable: "launchAngle"
expression: "atan(@TargetLocation.Y - @CasterLocation.Y, sqrt( (@TargetLocation.X-@CasterLocation.X)^2 + (@TargetLocation.Z-@CasterLocation.Z)^2 )) * [rad]" # ๋ผ๋์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๋๋ก ๋ณํ
- Variable.Calculate:
variable: "randomOffset"
expression: "(rand() - 0.5) * 10" # -5 ~ 5 ์ฌ์ด์ ๋๋ค ๊ฐ
- Variable.Calculate:
variable: "adjustedHealth"
expression: "max(1, @Caster.Health - receivedDamage)" # ์ต์ 1 ๋ณด์ฅ์ฌ๊ธฐ์ ActionRegistry์ ๋ฑ๋ก๋ ๋ชจ๋ ์ก์
์ ์ด๋ฆ, ํ๋ผ๋ฏธํฐ, ์ค๋ช
์ ์์ธํ ๊ธฐ์ ํฉ๋๋ค.
(๊ฐ ์ก์ ๋ณ ์์ธ ์ค๋ช ์ถ๊ฐ)
-
ControlFlow.Delay
-
duration(Integer, Required): ์ง์ฐ์ํฌ ์๊ฐ (์๋ฒ ํฑ ๋จ์, 1์ด = 20ํฑ). - ์ค๋ช : ์คํฌ๋ฆฝํธ ์คํ์ ์ง์ ๋ ์๊ฐ ๋์ ์ผ์ ์ค์งํฉ๋๋ค.
-
-
ControlFlow.IfCondition
-
condition(Boolean/String/Number, Required): ํ๊ฐํ ์กฐ๊ฑด.true,"true",1๋ฑ์ ์ฐธ์ผ๋ก, ๋๋จธ์ง๋ ๊ฑฐ์ง์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. (ํฅํ ํํ์ ์ง์ ์์ ) -
Then(List, Optional): ์กฐ๊ฑด์ด ์ฐธ์ผ ๋ ์คํํ ์ก์ ๋ชฉ๋ก. -
Else(List, Optional): ์กฐ๊ฑด์ด ๊ฑฐ์ง์ผ ๋ ์คํํ ์ก์ ๋ชฉ๋ก. - ์ค๋ช : ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ ์ก์ ํ๋ฆ์ ์คํํฉ๋๋ค. (์ฃผ์: ํ์ฌ ์ค์ฒฉ๋ ์ ์ด ํ๋ฆ(If, Delay ๋ฑ) ์คํ์ ์ ์ฝ์ด ์์ ์ ์์ต๋๋ค.)
-
-
Object.CreateObject
-
initialLocation(Location, Required): ์ค๋ธ์ ํธ๊ฐ ์์ฑ๋ ์ด๊ธฐ ์์น. -
objectId(String, Optional): ์์ฑ๋ ์ค๋ธ์ ํธ์ ๊ณ ์ ID (์ง์ ํ์ง ์์ผ๋ฉด ์๋ ์์ฑ๋ ์ ์์). -
lifespan(Integer, Optional): ์ค๋ธ์ ํธ ์ง์ ์๊ฐ (ํฑ).-1๋๋ ๋ฏธ์ง์ ์ ์๊ตฌ. -
appearance(Map, Optional): ์ค๋ธ์ ํธ ์ธํ ๊ด๋ จ ๋ฐ์ดํฐ (ํํฐํด, ๋ชจ๋ธ ๋ฑ). -
initialVector(Vector, Optional): ์ค๋ธ์ ํธ์ ์ด๊ธฐ ์ด๋ ๋ฒกํฐ. -
shapeDefinition(Map, Optional): ์ค๋ธ์ ํธ์ ์ถฉ๋/ํํ ์ ์. -
tags(List, Optional): ์ค๋ธ์ ํธ์ ๋ถ์ฌํ ํ๊ทธ ๋ชฉ๋ก. -
ObjectBehaviour.*(List, Optional): ์ค๋ธ์ ํธ ์์ฒด์ ๋์ ์ ์ (์:ObjectBehaviour.OnTick,ObjectBehaviour.OnCollision). - ์ค๋ช : ๊ฒ์ ์๋์ ์คํฌ ์ค๋ธ์ ํธ(ํฌ์ฌ์ฒด, ์ฅํ ๋ฑ)๋ฅผ ์์ฑํฉ๋๋ค. (์ฃผ์: ํ์ฌ ์ค์ ์ค๋ธ์ ํธ ์์ฑ ๋ฐ ๊ด๋ฆฌ ๋ก์ง์ ๊ตฌํ๋์ง ์์์ต๋๋ค.)
-
-
Target.SetSelf
- (ํ๋ผ๋ฏธํฐ ์์)
- ์ค๋ช : ํ์ฌ ์ก์ ๋์์ ์คํฌ ์์ ์ ์์ (@Caster)์ผ๋ก ์ค์ ํฉ๋๋ค.
-
TargetBehaviour.Damage
-
target(Entity Selector/Variable, Optional): ํผํด๋ฅผ ์ ํ ๋์. ๋ฏธ์ง์ ์ ํ์ฌ ๋์(@Target). -
amount(Double, Required): ์ ํ ํผํด๋ (0๋ณด๋ค ์ปค์ผ ํจ). -
ignoreArmor(Boolean, Optional): ๋ฐฉ์ด๋ ฅ ๋ฌด์ ์ฌ๋ถ (๊ธฐ๋ณธ๊ฐfalse). (์ฃผ์: Bukkit API ์ ์ฝ์ผ๋ก ์๋ฒฝํ ๋์ํ์ง ์์ ์ ์์) -
source(Entity Selector/Variable, Optional): ํผํด ๋ฐ์์. ๋ฏธ์ง์ ์ ์์ ์(@Caster). - ์ค๋ช : ๋์ ์ํฐํฐ์๊ฒ ํผํด๋ฅผ ์ ํ๋๋ค.
-
-
TargetBehaviour.PlayEffect
-
location(Location Selector/Variable, Required): ํจ๊ณผ๊ฐ ์ฌ์๋ ์ค์ฌ ์์น. -
offset(Vector Selector/Variable/Literal, Optional):location์์ ์ถ๊ฐ๋ ์์น ์คํ์ . -
particle(String, Optional): ์ฌ์ํ ํํฐํด ์ด๋ฆ (Bukkit Particle enum ์ด๋ฆ). -
particleData(Map, Optional): ํํฐํด ์ธ๋ถ ์ค์ (์๋ ์ฐธ์กฐ). -
sound(String, Optional): ์ฌ์ํ ์ฌ์ด๋ ์ด๋ฆ (Bukkit Sound enum ์ด๋ฆ). -
soundData(Map, Optional): ์ฌ์ด๋ ์ธ๋ถ ์ค์ (์๋ ์ฐธ์กฐ). - ์ค๋ช : ์ง์ ๋ ์์น์ ํํฐํด ํจ๊ณผ๋ ์ฌ์ด๋๋ฅผ ์ฌ์ํฉ๋๋ค.
-
particleDataํ์ ํ๋ผ๋ฏธํฐ:-
count(Integer, Optional, ๊ธฐ๋ณธ๊ฐ 1): ํํฐํด ์์ฑ ๊ฐ์. -
speed(Double, Optional, ๊ธฐ๋ณธ๊ฐ 0.0): ํํฐํด ์๋/ํผ์ง ์ ๋. -
offset(Vector, Optional): ํํฐํด ์์ฑ ์์น์ ๋ถ์ฐ ์คํ์ (Location ์คํ์ ๊ณผ ๋ค๋ฆ!). ์:{x: 0.5, y: 0.5, z: 0.5} -
color(Map, Optional, DustOptions ์ ์ฉ):{r: 0-255, g: 0-255, b: 0-255, size: float}. -
material(String, Optional, ์์ดํ /๋ธ๋ก ํํฐํด ์ ์ฉ): Material ์ด๋ฆ.
-
-
soundDataํ์ ํ๋ผ๋ฏธํฐ:-
volume(Float, Optional, ๊ธฐ๋ณธ๊ฐ 1.0): ์ฌ์ด๋ ํฌ๊ธฐ. -
pitch(Float, Optional, ๊ธฐ๋ณธ๊ฐ 1.0): ์ฌ์ด๋ ๋๋ฎ์ด.
-
-
-
TargetBehaviour.SendMessage
-
message(String, Required): ์ ์กํ ๋ฉ์์ง. Bukkit ์์ ์ฝ๋(&) ์ง์. -
target(Player/Console Selector/Variable, Optional): ๋ฉ์์ง๋ฅผ ๋ฐ์ ๋์. ๋ฏธ์ง์ ์ ํ์ฌ ๋์(@Target, ํ๋ ์ด์ด์ฌ์ผ ํจ), ๊ทธ ๋ค์ ์์ ์(@Caster). - ์ค๋ช : ๋์์๊ฒ ์ฑํ ๋ฉ์์ง๋ฅผ ๋ณด๋ ๋๋ค.
-
-
Variable.Calculate
-
variable(String, Required): ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ๋ณ์ ์ด๋ฆ. -
expression(String, Required): ๊ณ์ฐํ ์ํ ํํ์. (์์ธํ ๋ด์ฉ์ 'ํํ์' ์น์ ์ฐธ์กฐ) - ์ค๋ช : ํํ์์ ๊ณ์ฐํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์์ ์ ์ฅํฉ๋๋ค.
-
-
Variable.GetDirection
-
target(Entity/Location Selector/Variable, Required): ๋ฐฉํฅ์ ๊ฐ์ ธ์ฌ ๋์. (์:@Caster,@Target,myLocationVar) -
variable(String, Required): ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ๋ณ์ ์ด๋ฆ. -
normalize(Boolean, Optional, ๊ธฐ๋ณธ๊ฐtrue): ๊ฒฐ๊ณผ๋ฅผ ๋จ์ ๋ฒกํฐ(๊ธธ์ด 1)๋ก ์ ๊ทํํ ์ง ์ฌ๋ถ. - ์ค๋ช : ๋์์ ํ์ฌ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ(Vector)์ ๊ฐ์ ธ์ ๋ณ์์ ์ ์ฅํฉ๋๋ค.
-
-
Variable.GetLocation
-
target(Entity/Location Selector/Variable, Required): ์์น๋ฅผ ๊ฐ์ ธ์ฌ ๋์. (์:@Caster,@Target,myLocationVar) -
variable(String, Required): ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ๋ณ์ ์ด๋ฆ. - ์ค๋ช : ๋์์ ํ์ฌ ์์น(Location)๋ฅผ ๊ฐ์ ธ์ ๋ณ์์ ์ ์ฅํฉ๋๋ค.
-
-
Variable.GetOffsetLocation
-
baseLocation(Location Selector/Variable, Required): ๊ธฐ์ค ์์น. -
offset(Vector Selector/Variable/Literal, Required): ๋ํ ์คํ์ ๋ฒกํฐ. -
variable(String, Required): ๊ณ์ฐ๋ ์ต์ข ์์น๋ฅผ ์ ์ฅํ ๋ณ์ ์ด๋ฆ. - ์ค๋ช : ๊ธฐ์ค ์์น์ ์คํ์ ๋ฒกํฐ๋ฅผ ๋ํ ์ ์์น๋ฅผ ๊ณ์ฐํ์ฌ ๋ณ์์ ์ ์ฅํฉ๋๋ค.
-
-
Variable.SetVariable
-
name(String, Required): ์ค์ ํ ๋ณ์์ ์ด๋ฆ. -
value(Any, Required): ๋ณ์์ ์ ์ฅํ ๊ฐ (๋ฌธ์์ด, ์ซ์, ๋ถ๋ฆฌ์ธ, ์ ๋ ํฐ ๊ฒฐ๊ณผ ๋ฑ). - ์ค๋ช : ์ง์ ๋ ์ด๋ฆ์ ๋ณ์์ ๊ฐ์ ์ค์ ํ๊ฑฐ๋ ๋ฎ์ด์๋๋ค.
-
๋ค์์ ์ฌ๋ฌ ์ก์ ๊ณผ ๋ณ์, ๊ณ์ฐ์ ํ์ฉํ๋ ์์ ์คํฌ๋ฆฝํธ์ ๋๋ค.
# scripts/examples.yaml
Skills:
AdvancedProjectile:
Triggers:
OnCast:
# 1. ์ด๊ธฐ ์ค์
- Target.SetSelf: {} # ๋์์ ์์ ์๋ก ์ด๊ธฐํ
- Variable.SetVariable: { name: "baseDamage", value: 10.0 }
- Variable.SetVariable: { name: "speedMultiplier", value: 1.2 }
- Variable.GetLocation: { target: "@Caster", variable: "spawnLoc" }
- Variable.GetDirection: { target: "@Caster", variable: "spawnDir" } # ์ ๊ทํ๋ ๋ฐฉํฅ ๋ฒกํฐ
# 2. ์์ ์ ์ฒด๋ ฅ ๋น๋ก ์ถ๊ฐ ๋ฐ๋ฏธ์ง ๊ณ์ฐ
- Variable.Calculate:
variable: "healthBonusDmg"
expression: "max(0, @Caster.Health / 5)" # ์ฒด๋ ฅ 5๋น 1์ ๋ณด๋์ค ๋ฐ๋ฏธ์ง, ์ต์ 0
- Variable.Calculate:
variable: "finalDamage"
expression: "baseDamage + healthBonusDmg"
# 3. ๋ฐ์ฌ ์์น ์กฐ์ (๋จธ๋ฆฌ ์ ์ฝ๊ฐ ์)
- Variable.GetOffsetLocation:
baseLocation: spawnLoc
offset: { x: 0, y: 1.8, z: 0 } # ๋ ๋์ด ๊ทผ์ฒ
variable: "eyeLoc"
- Variable.Calculate: # ๋ฐฉํฅ ๋ฒกํฐ์ ์๋ ๊ณฑํ๊ธฐ
variable: "velocity"
expression: "spawnDir * speedMultiplier * 20" # mXparser๋ ๋ฒกํฐ*์ค์นผ๋ผ ์๋ ์ง์ ์ํ ์ ์์. ํ์ธ ํ์
# ๋ง์ฝ ์ ํํ์์ด ์๋๋ค๋ฉด, ๊ฐ ์์๋ณ ๊ณ์ฐ ํ์:
# variable: velocityX, expression: spawnDir.X * speedMultiplier * 20
# variable: velocityY, expression: spawnDir.Y * speedMultiplier * 20
# variable: velocityZ, expression: spawnDir.Z * speedMultiplier * 20
# ์ดํ Vector ์์ฑ ์ก์
ํ์ (ํ์ฌ ์์)
# 4. ๋ฐ์ฌ ํจ๊ณผ ๋ฐ ๋ฉ์์ง
- TargetBehaviour.SendMessage:
message: "&eLaunching projectile! Damage: {var:finalDamage}" # ๋ณ์ ์นํ ์๋จ! ๋ฉ์์ง ๋ถ๋ฆฌ ํ์
- TargetBehaviour.SendMessage:
target: "@Caster"
message: "&eCalculated Damage: &f" # ๊ฐ ๋ถ๋ถ์ ๋ค์ ์ก์
์์? (ํ์ฌ ๋ถํธํจ)
# ๋๋ ์ต์ข
๋ฐ๋ฏธ์ง๋ฅผ ๋ค์ ๋จ๊ณ ์ก์
์ ํ๋ผ๋ฏธํฐ๋ก๋ง ์ฌ์ฉ
- TargetBehaviour.PlayEffect:
location: eyeLoc # ์กฐ์ ๋ ์์น์์ ํจ๊ณผ ์ฌ์
particle: "FLAME"
particleData: { count: 20, speed: 0.1, offset: {x: 0.2, y: 0.2, z: 0.2} }
sound: "ENTITY_GHAST_SHOOT"
# 5. ์ค์ ํฌ์ฌ์ฒด ์์ฑ (CreateObject ๊ตฌํ ์)
# - Object.CreateObject:
# initialLocation: eyeLoc
# initialVector: velocity # Vector ํ์
๋ณ์ ์ฌ์ฉ
# # ... ํฌ์ฌ์ฒด ์ธํ, ์ถฉ๋ ์ ๋์ ๋ฑ ์ ์ ...
# # ์: ObjectBehaviour.OnHit: [ { TargetBehaviour.Damage: { amount: finalDamage } } ]
(์ฃผ์: ์ ์์ ๋ ํ์ฌ ๊ธฐ๋ฅ ๋ฐ ์ ์ฝ์ ๋ฐ์ํ์ผ๋ฉฐ, ํนํ ๋ฌธ์์ด ๋ด ๋ณ์ ์นํ ๋ฐ ๋ฒกํฐ ์ฐ์ฐ, ์ค๋ธ์ ํธ ์์ฑ ๋ถ๋ถ์ ํฅํ ๊ฐ์ ์ด ํ์ํ ์ ์์ต๋๋ค.)