KO UO Topic combat - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
๊ณต๊ฒฉ, ์ ํฌ ๋ชจ๋, ๋ฌด๊ธฐ ๋ฅ๋ ฅ ๋ฐ ๋ถ๋ ์น์ . ํด๋ผ์ด์ธํธ์ ์์ฒญ๊ณผ ์๋ฒ๊ฐ ์ทจํ๋ ์กฐ์น๋ ๋ค๋ฆ ๋๋ค.
| ์ฃผ์ | ๋ช ๋ น ๋ฐ ์ค๋ช |
|---|---|
| Attack | UO.Attack |
| AttackNearest | UO.AttackNearest |
| LastAttack | UO.LastAttack |
| WarMode | UO.WarMode |
| WarTarget | UO.WarTargetID |
| ๋ฌด๊ธฐ ๋ฅ๋ ฅ | UO.GetWeaponAbilities ยท UO.GetAbilityID ยท UO.GetAbilityName ยท UO.GetActiveAbility |
| Primary Ability | UO.UsePrimaryAbility |
| Secondary Ability | UO.UseSecondaryAbility |
| Special Moves | UO.Specmove |
| BandageSelf | UO.BandageSelf |
UO.Attack ยท UO.AttackNearest ยท UO.LastAttack ยท UO.WarMode ยท UO.IsWarMode ยท UO.SetWarMode ยท UO.WarTargetID
UO.GetWeaponAbilities ยท UO.GetAbilityID ยท UO.GetAbilityName ยท UO.GetActiveAbility ยท UO.UseAbility ยท UO.UsePrimaryAbility ยท UO.UseSecondaryAbility ยท UO.Specmove
UO.SetClassMask ยท UO.ClearClassMask ยท UO.AttackNearest
๊ทธ๋ฃน์ ์ด๋ฆ๊ณผ ์ฐฉ์ฉํ๋ ์์ดํ
์ ์ ํ์ ์คํฌ๋ฆฝํธ์ ์ํด ์ง์ ๋ฉ๋๋ค. |๊น์ง์ ์ด๋ฆ ์์์ ๋ฐ๋ผ ์ฐ์ ์์๊ฐ ์ง์ ๋ฉ๋๋ค.
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
var selected = UO.LastTarget();
var allowed = UO.GetMobiles(10, "5|6", -1, 8, false, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(allowed)))
{
if (Truth(allowed[i] == selected))
{
UO.Attack(selected);
return null;
}
i += 1;
}
UO.Print("Selected target does not pass the filters");
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
var abilities = UO.GetWeaponAbilities();
UO.Print(UO.GetArrayLength(abilities));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Attack(object? objID);ํน์ serial์ ๊ณต๊ฒฉ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์ฌ์ฉ์๊ฐ ์ด๋ฏธ ๋์์ ์ ํํ๊ฑฐ๋ ๋ค๋ฅธ ํ์์ ์ฐพ์ ๊ฒฝ์ฐ์ ์ ํฉํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์๋ฅ/๊ฑฐ๋ฆฌ์ ๋ฐ๋ฅธ ๋ ๋ฆฝ์ ์ธ ๊ฒ์์ด ์์ต๋๋ค.
-
objIDโ ์ง๋ ฌ mobile: int, 10์ง์/16์ง์ ๋ฌธ์์ด ๋๋ ํ์ธ ๊ฐ๋ฅํ ๊ฐ์ฒด ์ด๋ฆ(์: lasttarget ๋๋ ์ด๋ฆ AddObject). graphic/type ๋๋ ํด๋์ค ์ด๋ฆ์ด ์๋๋๋ค. ํ์ ์ธ์์ ๋๋ค. 0์ ์ธ์์ ๋ฉ์ถ๋ผ๋ ๋ช ๋ น์ด ์๋๋๋ค. ID ์์ด ๋์์ ์ ํํ๋ ค๋ฉด ๊ฒ์ ๋๋ ๊ฒ์ ๋์์ ์ฌ์ฉํ์ธ์.
void - ๊ฐ์ด ์์ต๋๋ค. var result=UO.Attack(...)๊ฐ ์๋ UO.Attack(enemy)๋ฅผ ๋ณ๋์ ์ค์ ์์ฑํ์ธ์. ํตํ๋ฅผ ์ข ๋ฃํ๋ค๊ณ ํด์ ํํธ, ์์ ๋๋ ์๋ฒ ์น์ธ์ด ํ์ธ๋๋ ๊ฒ์ ์๋๋๋ค.
- ๋์ ์์ฒด๋ ์ฃฝ๊ฑฐ๋, ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์๊ฑฐ๋, self, ์๊ตฐ, ๋น serial ๋๋ ์์ดํ ์ ๋ฐ์ด๋ด์ง ์์ต๋๋ค. ์ ํํ ๋์์ ํ์ธํ์ธ์. ๋ฐ๋์งํ๊ฒ๋ GetMobiles/FindMan์์ mobile๋ฅผ ํํฐ๋งํฉ๋๋ค.
- ํ์ค GameActions.Attack๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. EnabledCriminalActionQuery๋ฅผ ์ฌ์ฉํ ๋ฒ์ฃ ๊ณต๊ฒฉ ๋ฌธ์ ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ์ ์์ ์ผ๋ก ์งํ๋๋ฉด LastAttack/NewTargetSystemSerial๊ฐ ์ ๋ฐ์ดํธ๋๊ณ ๊ณต๊ฒฉ ์์ฒญ ํจํท์ด ์ ์ก๋ฉ๋๋ค.
- ์ด ๋ช ๋ น์ WarMode๋ฅผ ํ์ฑํํ์ง ์๊ณ , ๋ง์ฐ์ค๋ฅผ ๋๋ธ ํด๋ฆญํ์ง ์์ผ๋ฉฐ, ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๊ฑฐ๋ ๋ฐ๋ณต ๊ณต๊ฒฉ ๋ฃจํ๋ฅผ ์์ํ์ง ์์ต๋๋ค. ์ ํฌ ๋ชจ๋์ ์ดํ ์ ํฌ ์ฒ๋ฆฌ๋ ์๋ฒ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
- ์ ์ ์๋ ๊ฐ์ฒด ์ด๋ฆ์ ๊ฐ์ง ๋ฌธ์์ด์ ๊ฒฝ์ฐ ํ์ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. Exists ํ ์คํธ๋ ๊ฐ์ฒด์ ์กด์ฌ๋ฅผ ์ฆ๋ช ํ์ง๋ง ๊ทธ๊ฒ์ด mobile์ธ์ง๋ ์ฆ๋ช ํ์ง ์์ต๋๋ค. GetMobiles๋ ๋ชจ๋ฐ์ผ๋ก ์ ๊ณต๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Attack");
UO.Attack(UO.LastTarget());๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- lasttarget๋ ์์ดํ ์ผ ์๋ ์๊ณ ์น๊ทผํ ์บ๋ฆญํฐ์ผ ์๋ ์์ต๋๋ค. ํ์ฉ ๋ชฉ๋ก์์๋ ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํฉ๋๋ค. Attack์ ์ต๋ ํ ๋ฒ ํธ์ถ๋ฉ๋๋ค.
var selected = UO.LastTarget();
var allowed = UO.GetMobiles(10, "5|6", -1, 8, false, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(allowed)))
{
if (Truth(allowed[i] == selected))
{
UO.Attack(selected);
return null;
}
i += 1;
}
UO.Print("Selected target does not pass the filters");
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- FindMan๋ serial๋ฅผ ๋ฐํํ๊ณ ๊ณต๊ฒฉํ์ง ์์ต๋๋ค. FindMan์๋ aliveOnly๊ฐ ์๊ธฐ ๋๋ฌธ์ IsDead ๊ฒ์ฌ๊ฐ ๋ณ๋๋ก ์ถ๊ฐ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var enemy = UO.FindMan(5, 6, true, 4, -1, -1, false);
if (Truth(enemy == 0))
{
return null;
}
if (Truth(UO.IsDead(enemy) == 0))
{
UO.AddObject("enemy", enemy);
UO.Attack(enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- GetMobiles๋ ์ด๋ฏธ Nearest=true๋ก ์ฃผ๋ฌธ๋์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋ชฉํ ์์ ๋ฒฝ์ด ์์ผ๋ฉด ๋ค์ ๋ชฉํ๋ฅผ ํ์ธํฉ๋๋ค. visibleOnly์ ์กด์ฌ ์์ฒด๊ฐ CheckLOS๋ฅผ ๋์ฒดํ์ง๋ ์์ต๋๋ค. ์๋ฒ ํ์ธ์ ๋ค๋ฅผ ์ ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var targets = UO.GetMobiles(8, 5, -1, 10, true, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(targets)))
{
var enemy = targets[i];
if (Truth(UO.CheckLOS(UO.GetX("self"), UO.GetY("self"), UO.GetZ("self"), UO.GetX(enemy), UO.GetY(enemy), UO.GetZ(enemy), UO.WorldNum())))
{
UO.Attack(enemy);
return null;
}
i += 1;
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any/Integer/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Attack:bridge.Attack(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "attack": bridge.Attack(Arg(0)); return InjectionValue.Unit;๋งค๊ฐ๋ณ์: objID (Any/Integer/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Attack. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Attack:bridge.Attack(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void Attack(int id) => bridge.Attack(id);๋งค๊ฐ๋ณ์: objID (Any/Integer/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Attack. -
InjectionScript.Runtime.InjectionApiUO.Attack:Attack(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void Attack(string id) => Attack(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.AttackNearest(object? notoriety);
int UO.AttackNearest(object? notoriety, object? distance);
int UO.AttackNearest(object? notoriety, object? distance, object? body);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask, object? aliveOnly);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask, object? aliveOnly, object? visibleOnly);ํ๋์ ์ ํฉํ ์ ํฌ ๋์์ ์ ํํ๊ณ ์ด๋ฅผ ๊ณต๊ฒฉ ์ฒ๋ฆฌ์์๊ฒ ์ ๋ฌํฉ๋๋ค. ํํฐ๋ ํ์ฉ๋๋ ๋ฌธ์๋ฅผ ์ ํํฉ๋๋ค. custom classMask๋ ์ฅ๋น์ ํด๋์ค ์ฐ์ ์์๋ฅผ ๊ฐ์ฅ ๊ฐ๊น์ด ํด๋์ค ๋ด ์ ํ์ผ๋ก ์ค์ ํฉ๋๋ค.
-
notorietyโ ์๋ฒ์์ ๋ฐ์ ์บ๋ฆญํฐ์์ ๊ด๊ณ ์ํ: 0 โ ์ ์ ์์, 1 โ ๋ฌด์ฃ, 2 โ ๋๋งน, 3 โ ํ์, 4 โ ๋ฒ์ฃ, 5 โ ์ , 6 โ ์ด์ธ์, 7 - ๋ฌด์ ์ ๋๋ค. ์ซ์๋ ํ๋์ ์ํ๋ฅผ ์๋ฏธํฉ๋๋ค. "5|6" ๋๋ ์ซ์ ๋ฐฐ์ด - ์ ํญ๋ชฉ ์ค ํ๋. ์ท์ ์๊น์ด๋ ์์ ์ ์๊น์ด ์๋๋๋ค. ์์(๋ณดํต -1), 0xFFFF, "any", ๋น ๋ฌธ์์ด ๋๋ ๋น ๋ฐฐ์ด์ ์ด ํํฐ๋ฅผ ๋ณ๋๋ก ๋นํ์ฑํํฉ๋๋ค. ์ ํจํ ์ซ์๊ฐ ์๋ ์๋ชป๋ ๋ฌธ์์ด์ ๋๊ตฌ๋ ์ฐพ์ ์ ์์ต๋๋ค. ์ํ ์์์ ๋ฐ๋ผ ์ฐ์ ์์๊ฐ ์ค์ ๋์ง ์์ต๋๋ค. 5 ํํฐ๋ NPC/๋ชฌ์คํฐ๋ฅผ ์๋์ผ๋ก ์ ํํ๋ ๋์ ์ ์ ์ ํํฉ๋๋ค. ์ค์ ๊ฐ์ ์๋ฒ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. -
distanceโ ์ ์ ํฌํจํ ์ํ ๋ฐ๊ฒฝ: 5๋ ๊ฑฐ๋ฆฌ 0..5๋ฅผ ํ์ฉํฉ๋๋ค. ๊ฑฐ๋ฆฌ๋ max(abs(dx),abs(dy))์ด๋ฏ๋ก ์ธ์ ํ ๋๊ฐ์ ๋ 1์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ซ์๊ฐ ์์์ธ ๊ฒฝ์ฐ์๋ ๋ฌด์ ํ ๊ฒ์์ด ์๋ UO.FindDistance()์ ์ ํํฉ๋๋ค. 0๋ ๋์ผํ X/Y ์ ์ ๋จ๊น๋๋ค. ๊ฒฝ๋ก์ ๊ธธ์ด๊ฐ ์๋๋๋ค. ์ฅ์ ๋ฌผ๊ณผ ๋ฐ๋ฅ์ ์ด ๋งค๊ฐ๋ณ์๋ก ํ์ธ๋์ง ์์ต๋๋ค. -
body- ํน์ ์บ๋ฆญํฐ์ ID๋ ์ฐฉ์ฉํ ๊ฐ์ท์ type๊ฐ ์๋ ์บ๋ฆญํฐ์ ์ ์ฒด/NPC ๊ทธ๋ํฝ์ ๋๋ค. ์ซ์, 16์ง์ ๋ฌธ์์ด, ๋ฌธ์์ด "0x0190|0x0191" ๋๋ ์ซ์ ๋ฐฐ์ด. 0x0190 (400) - ์ธ๊ฐ ๋จ์ฑ; 0x0191 (401) - ์ฌ์ฑ ์ธ๊ฐ. ๋ง์คํฌ๋ ๋ ๋ชธ์ ํ๋๋ก ๋ฌถ์ต๋๋ค. ๋ชฉ๋ก์๋ ๋ค๋ฅธ ์ข ์กฑ, ์ ๋ น ๋๋ ๋ณ์ ์ด ์๋์ผ๋ก ํฌํจ๋์ง ์์ต๋๋ค. ํ์ค ๊ทธ๋ํฝ ์ ์ฒด ์ ํ ํ. ์์(๊ธฐ๋ณธ์ ์ผ๋ก -1), 0xFFFF, "any", ๋น ๋ฌธ์์ด ๋๋ ๋น ๋ฐฐ์ด๋ง - ๋ชจ๋ ๋ณธ๋ฌธ. ์ ํจํ ์ซ์๊ฐ ์๋ ์ ์ ์๋ ํ ์คํธ๋ ๋น ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค. -
maxZโ ์ต๋ ๋ณต๊ทผ(Z ๋์ - ์บ๋ฆญํฐ์ Z)์ ํฌํจํ๋ฉฐ, Z ์ธ๊ณ ๋จ์์ ๋๋ค. ์ด๊ฒ์ ์ธต์๋ ์ ์ X/Y๊ฐ ์๋๋๋ค. maxZ=4 Z ํ๋ ์ด์ด 10๋ Z ๋์ 6..14๋ฅผ ํ์ฉํฉ๋๋ค. 0์๋ ์ ํํ ๋์ผํ ๋์ด๊ฐ ํ์ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก/์์์ ๊ฒฝ์ฐ UO.FindVertical()๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ณ๋จ์์๋ Z๋ก ์ํ๋ ๋์์ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์์ ์ฐจ์ด Z๋ ๋ฐ๋ฅ์ ์ ๊ทผ์ฑ์ ์ ์ฆํ์ง ๋ชปํฉ๋๋ค. -
nearest- true/1๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ฅ ๊ฐ๊น์ด ์ผ์น ๋ฌธ์๋ฅผ ์ ํํฉ๋๋ค. ๋ ์์ serial๋ก ๋์ผํ ๊ฑฐ๋ฆฌ๊ฐ ํ์ฉ๋ฉ๋๋ค. false/0 ํด๋ผ์ด์ธํธ ๋ชฉ๋ก ์์์์ ์ฒซ ๋ฒ์งธ๋ก ์ผ์นํ๋ ๊ฐ์ฒด๋ฅผ ์ ์งํ๊ณ ๊ฐ์ฅ ๋จผ ๊ฐ์ฒด๋ฅผ ์ ํํ์ง ์์ต๋๋ค. classMask์์๋ ํด๋์ค ์ฐ์ ์์๊ฐ ๋จผ์ ์ ์ฉ๋๊ณ ํด๋์ค ๋ด ๊ฑฐ๋ฆฌ๊ฐ ๊ทธ ๋ค์์ผ๋ก ์ ์ฉ๋ฉ๋๋ค. -
colorโ mobile ์์ฒด์ ์์: int ๋๋ ์ซ์/16์ง์ ๋ฌธ์์ด. ์์(๊ธฐ๋ณธ์ ์ผ๋ก -1) ๋ฐ 0xFFFF - ๋ชจ๋ hue; 0์ ์ ํํ hue 0์ด๋ฉฐ ์ด๋ค ๊ฐ๋ ์๋๋๋ค. ์ ๋ช ๋์ ์คํธ๋ฆฝ์ ์์์ด๋ ์ท์ ์์์ด ์๋๋๋ค. ์ด ํ๋ผ๋ฏธํฐ๋ ์ฐฉ์ฉ ์ค์ธ ์์ดํ ์ ์์์ ํ์ธํ์ง ์์ต๋๋ค. -
classMaskโ ๋์ผํ ์คํฌ๋ฆฝํธ ๋ฐํ์์์ UO.SetClassMask์ ์ํด ์ฌ์ ์ ์๋ ๊ท์น์ ์ด๋ฆ์ ๋๋ค. ์๋ฅผ ๋ค์ด "DTMH|hunter|spare" - ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฐ์ ์์๊ฐ ์ง์ ๋ฉ๋๋ค. ๋ฌธ์์ด ๋ฐฐ์ด๋ ํ์ฉ๋ฉ๋๋ค. ๋ชจ๋ ์ด๋ฆ, ๋์๋ฌธ์๋ ์ค์ํ์ง ์์ต๋๋ค. ์ค ๊ตฌ๋ถ ๊ธฐํธ: |, ์ผํ ๋๋ ;. ๋ชฉ๋ก ๋ด์ ์ ์ ์๋ ์ด๋ฆ/๋น ์์๋ ์ ์ฒด ์ ํ์ ์ ํ ์ทจ์ํฉ๋๋ค. ๊ฒฐ๊ณผ๋ 0, ๊ณต๊ฒฉ ์์. ์ด๋ ์ซ์ ๋นํธ๋ง์คํฌ๊ฐ ์๋๋๋ค. 7๋ ์ธ ๊ฐ์ง ํด๋์ค๋ฅผ ์๋ฏธํ์ง ์์ต๋๋ค. ๋๋ฝ๋ ์ธ์, -1, "-1", "any", "all" ๋๋ ๋น ๋ฌธ์์ด์ ํด๋์ค ํํฐ๋ฅผ ๋ณ๋๋ก ๋นํ์ฑํํฉ๋๋ค. ๋ง๋ฒ์ฌ/ํฑํฌ/๊ถ์๋ ๋ด์ฅ๋์ด ์์ง ์์ต๋๋ค. ์ด๋ฌํ ๊ท์น์ ๋ฑ๋กํ์ง ์์ผ๋ฉด ์ผ์นํ๋ ํญ๋ชฉ์ด ์์ต๋๋ค. -
aliveOnly- true/1๋ IsDead != 0์ธ ๋ชจ๋ฐ์ผ์ ์ ์ธํฉ๋๋ค. false/0๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ์กฐ๊ฑด์ ์ถ๊ฐํ์ง ์์ต๋๋ค. HP๋ฅผ 0๊ณผ ๋น๊ตํ์ง ์๊ณ , ์์ฒด ์์ดํ ์ ๊ฒ์ํ์ง ์์ผ๋ฉฐ, ๋์์ด ์ํ๋ ํ์๋ ์ด์๋จ์ ๊ฒ์ด๋ผ๊ณ ๋ณด์ฅํ์ง ์์ต๋๋ค. -
visibleOnly- true/1์๋ ํ์ฌ ์ํ ClassicUO์ ๋ฐ๋ผ IsVisible=1๊ฐ ํ์ํฉ๋๋ค. false/0๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์กฐ๊ฑด์ ์ถ๊ฐํ์ง ์์ต๋๋ค. ์ด๋ ๋ฒฝ/์์ ๊ฒ์ฌ๊ฐ ์๋ ํด๋ผ์ด์ธํธ์ ๋ํ ๋ก๋๋ ๊ฐ์ฒด์ ๊ฐ์์ฑ์ ๋๋ค. ๊ธฐํํ์ ๊ฒ์ฌ๋ฅผ ์ํด ์ขํ๊ฐ ํฌํจ๋ ๋ณ๋์ UO.CheckLOS๊ฐ ์์ต๋๋ค. ์๋ฒ๋ ์ฌ์ ํ ์์ ์ ๊ฑฐ๋ถํ ์ ์์ต๋๋ค.
int - serial๊ฐ ์ ํ๋จ mobile ๋๋ ์ ํฉํ ๋์์ด ์๊ฑฐ๋ classMask๊ฐ ์ ํจํ์ง ์์ ๊ฒฝ์ฐ 0. ์ด๊ฒ์ 1/0 ํ๋๊ทธ๋ ์๋๊ณ , body/type ํ๋๊ทธ๋ ์๋๋ฉฐ, ๊ฑฐ๋ฆฌ๋ ํ๊ฒฉ ํ์ธ๋ ์๋๋๋ค. ์ ์ ํ์ธํ์ธ์ != 0; ์ == true์ C#์์๋ ์ ํจํ์ง ์์ต๋๋ค. int๋ bool์ ๋น๊ต๋์ง ์์ต๋๋ค. ID๊ฐ 0์ด ์๋ ๊ฒฝ์ฐ ClassicUO ํธ๋ค๋ฌ๋ ์ฌ์ ํ ๋ฌด๊ณ ํ ๊ณต๊ฒฉ์ ๋ํ ํ์ธ์ ํ์ํ ์ ์์ต๋๋ค. ์๋ฒ๊ฐ ์์ ์ ๊ฑฐ๋ถํ ์ ์์ต๋๋ค.
- ์ง์ญ ๊ฒ์: ์ด๋ฏธ ๋ค์ด๋ก๋ํ ๋ชจ๋ฐ์ผ์๋ง ํด๋น๋ฉ๋๋ค. Ignore์ด ๊ณ ๋ ค๋ฉ๋๋ค. self๋ ์ง์ํ๋ ๋ช ๋ น์์ ๋ช ์์ ์ผ๋ก includeSelf=true๋ฅผ ์ ์ธํ๊ณ ๋ ์ ์ธ๋ฉ๋๋ค. ์ปจํ ์ด๋์ ์์ดํ ์ ๋ชจ๋ฐ์ผ์ด ์๋๋๋ค.
- ์กฐ๊ฑด์ด ํจ๊ป ์ ์ฉ๋ฉ๋๋ค(AND). body/notoriety ๋ด์ ์ ํจํ ๋์์ OR๋ฅผ ํตํด ๊ฒฐํฉ๋ฉ๋๋ค. FindItem, FindCount ๋ฐ GetFoundItems์์๋ ๊ฒ์์ด ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- body/notoriety์์ ์ ํจํ ์ซ์๊ฐ ์๋ ๋ง์คํฌ๋ ๋ค์์ ์ฌ์ฉํฉ๋๋ค. "any|5"๋ ์ฌ์ ํ 5๋ก ์ ํ๋ฉ๋๋ค. ์ ํจํ ์ซ์ ์์ ์๋ ๊ณต๋ฐฑ/์๋ชป๋ ์์๋ ๋ฌด์๋ฉ๋๋ค. ์ ํ์ด ์์ผ๋ฉด -1๋ฅผ ๋ณ๋๋ก ์ ๋ฌํ์ธ์. ์ด ๊ท์น์ classMask์ ์ ์ฉํ์ง ๋ง์ธ์. ์ ์ ์๋ ํด๋์ค ์ด๋ฆ์ ์ ์ฒด ๋ชฉ๋ก์ ๊ฑฐ๋ถํฉ๋๋ค.
- ํ์ ์ธ๊ณ์ ์์ญ์ ์ด์ง ์์ผ๋ฉฐ ๋ชฉํ๋ฅผ ํฅํด ๋ฌ๋ฆฌ์ง ์์ผ๋ฉฐ ๊ฒฝ๋ก์ ํต๊ณผ ๊ฐ๋ฅ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค. ์ ํ๊ณผ ์๋ฒ ์ฒ๋ฆฌ ์ฌ์ด์ ์ธ์์ ์ํ๊ฐ ๋ฐ๋ ์ ์์ต๋๋ค.
- true ๋ฐ 1์ ์ ์ก์ ํ๋๊ทธ false ๋ฐ 0์๋ ๋์ผํฉ๋๋ค. 0์ด ์๋ ๋ค๋ฅธ ์ซ์๋ true๋ก ๋ณํ๋์ง๋ง 8/9๋ ๋ณ๋์ ๋ชจ๋๊ฐ ์๋๋๋ค. ํด๋ฆฌ์ด true/false๋ฅผ ์ฌ์ฉํ์ธ์.
- ์ด๋ฆ์ ์๋ฒ ์ง์ ์ด ์๋ ์ปค์คํ ๋ผ๋ฒจ์ ๋๋ค. ๊ท์น์ DTMH, my_group ๋๋ ๋ค๋ฅธ ๋จ์ด๋ก ํธ์ถํ ์ ์์ต๋๋ค. ์์ง์ ์๋ฒ์ ์คํฌ/ํด๋์ค๋ฅผ ์บ๋ฆญํฐ ์ด๋ฆ์ผ๋ก ๊ฒฐ์ ํ์ง ์์ต๋๋ค.
- ํ์์์ ํ๋์ type ๋๋ ํ๋ฉด ๋ฐฐ์ด์ ๋ชฉ๋ก์์ ์ต์ํ ํ๋์ ํญ๋ชฉ์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฃน ๋ฐฐ์ด์ด๋ ๊ฐ ๊ทธ๋ฃน์์ ์ต์ํ ํ๋์ ํญ๋ชฉ์ด ํ์ํจ์ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, [leather, staves]์๋ ๊ฐ์ฃฝ๊ณผ ์งํก์ด๊ฐ ํ์ํฉ๋๋ค. ์ด๋ ๋์ ์ธํธ์ด๋ฉฐ ๋์ด๋ ์ท์ฅ ์ ์ฒด๋ฅผ ์ฐฉ์ฉํด์ผ ํ๋ ์๊ตฌ ์ฌํญ์ ์๋๋๋ค.
- ๊ธ์ง๋ ํญ๋ชฉ์ ์ฐฉ์ฉํ ๋ชจ๋ ํญ๋ชฉ์ ํ์ ํญ๋ชฉ์ด ์ถฉ์กฑ๋๋๋ผ๋ ์ด ๊ท์น์์ ์บ๋ฆญํฐ๋ฅผ ์ ์ธํฉ๋๋ค. ๊ฐ์ฃฝ๊ณผ ๊ธ์ง๋ ์ฒด์ธ์ ๊ฐ์ฃฝ ๊ท์ ์ ํต๊ณผํ์ง ๋ชปํฉ๋๋ค. ๋ค๋ฅธ ๊ท์น์ ๊ณ์ ํ ์คํธ๋ฉ๋๋ค.
- ๋ฐฐ๋ญ 21์ ์ ์ธํ๊ณ ๋ ์ด์ด 1..24์ ์ฐฉ์ฉํ ์์ดํ ๋ง ํฌํจ๋ฉ๋๋ค. ๋ฐฐ๋ญ/๊ฐ์ด, ๋ง์ดํธ 25, ํ์ฐฝ 26..28 ๋ฐ ์ํ 29์ ๋ด์ฉ๋ฌผ์ ์๋ฅ๋ก ๊ฐ์ฃผ๋์ง ์์ต๋๋ค. graphic/type๋ฅผ ๋น๊ตํฉ๋๋ค. serial, ์ด๋ฆ ๋ฐ hue ํญ๋ชฉ์ ์ฌ๊ธฐ์ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
- ์ ์ ํ ์ฅ๋น๊ฐ ๋ก๋๋์ง ์์ผ๋ฉด ๋ชฉ๋ก์ด ์ผ์นํ์ง ์์ต๋๋ค. ์๋ฒ๊ฐ ์์ง ์ฅ๋น๋ฅผ ์ ์กํ์ง ์์ ๊ฒฝ์ฐ ๋ก์ปฌ ๋ฐ์ดํฐ์ ๊ธ์ง ํญ๋ชฉ์ด ์๋ค๊ณ ํด์ ์๋ฒ์ ํด๋น ํญ๋ชฉ์ด ์์์ ์ฆ๋ช ํ๋ ๊ฒ์ ์๋๋๋ค. ํด๋ผ์ด์ธํธ๋ ์จ๊ฒจ์ง ๋ฐ์ดํฐ๋ฅผ ์ถ์ธกํ์ง ์์ต๋๋ค.
- ๊ท์น์ ํด๋น ๊ธฐ๋ฅ๊ณผ ํฌํจ์ ํฌํจํ์ฌ ํ๋์ ๋ฐํ์ ์คํฌ๋ฆฝํธ์ ์ํฉ๋๋ค. ๋ค๋ฅธ ๋ ๋ฆฝ์ ์ธ ์คํ์ผ๋ก ์ ์ก๋์ง ์์ผ๋ฉฐ ํ๋กํ์ ์ ์ฅ๋์ง ์์ต๋๋ค. ๋ค์ ์์ํ ๋ ์ผ๋ฐ ์ค์ ์ ์ฐจ ๋ฑ์ ํตํด ๋ค์ ์ ์ํ์ญ์์ค. ๋ฐ๋ณต๋๋ SetClassMask๋ ์ ๋ฐ์ดํฐ๊ฐ ์์ ํ ๊ฒ์ฆ๋ ํ์๋ง ๊ท์น์ ๋์ผํ ์ด๋ฆ์ผ๋ก ๋์ฒดํฉ๋๋ค.
- ๋ฐฐ์ด์ ๋ฑ๋ก ์ค์ ๋ณต์ฌ๋ฉ๋๋ค. ์๋ ๋ฐฐ์ด์ ๋ณ๊ฒฝํด๋ ๊ท์น์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. SetClassMask๋ฅผ ๋ฐ๋ณตํ์ธ์. ์ฌ๋ฌ ์ผ์น ๊ท์น์ classMask์ ์ด๋ฆ ์์์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค. ํ์ค ์๋ฒ ์๋ฅ ํ ์ด๋ธ์ ์์ต๋๋ค.
- 1..9 ์์น ์ธ์๊ฐ ์ง์๋ฉ๋๋ค. ๊ผฌ๋ฆฌ๋ฅผ ๊ฑด๋๋ธ ์ ์์ต๋๋ค. classMask๋ฅผ ์ค์ ํ๋ ค๋ฉด ์ฒ์ 6๊ฐ์ ์ธ์๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค. ๊ฐ ์์น์ ์๋ฏธ๋ฅผ ๋ณด๋ ค๋ฉด var์ด๋ผ๋ ์ด๋ฆ์ ์ฌ์ฉํ์ธ์.
- ํ๋์ ๋์์ด ์ ํ๋๊ณ ๊ณต๊ฒฉ์ด ํ ๋ฒ ์ ์ก๋ฉ๋๋ค. ์ด๊ฒ์ ์๋ ์ ํฌ ์ฃผ๊ธฐ๊ฐ ์๋๋๋ค. classMask๊ฐ ์์ผ๋ฉด ์ฅ๋น ํํฐ ๋ฐ ์์ดํ ์ฝ๊ธฐ๊ฐ ์ํ๋์ง ์์ต๋๋ค.
- ๋จผ์ ์ผ๋ฐ ํํฐ๋ฅผ ์ ์ฉํ ๋ค์ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฐ์ ์์๋ฅผ ์ง์ ํ ๋ค์ ๊ฐ์ฅ ๊ฐ๊น์ด ํํฐ๋ฅผ ์ ์ฉํฉ๋๋ค. ๊ฐ์ฅ ๊ฐ๊น์ด=false๋ ์ฌ์ ํ ํด๋์ค ์ฐ์ ์์๋ฅผ ์ ์งํ์ง๋ง ์ฒซ ๋ฒ์งธ๋ก ์ผ์นํ๋ ํด๋์ค ๋ด์์ ํด๋ผ์ด์ธํธ ๋ชฉ๋ก์ ์ฒซ ๋ฒ์งธ mobile๋ฅผ ์ ํํฉ๋๋ค.
- ์ด๋ฆ/์ง์์์ ํ์ ๋ฌธ์์ด์ ๊ฒ์ํ๋ ค๋ ์ด์ ์๋๊ฐ ์ฅ๋น ๊ท์น์ผ๋ก ๋์ฒด๋์์ต๋๋ค. ์ด๋ฌํ ์คํฌ๋ฆฝํธ๋ฅผ ๋ช ์์ ์ธ SetClassMask๋ก ์ด๋ํ์ธ์. ์บ๋ฆญํฐ์ ์ด๋ฆ์ ๋ ์ด์ ๊ทธ๋ฅผ ํน์ ํด๋์ค๋ก ์๋ณํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.AttackNearest(5, 5);
UO.Print("AttackNearest: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- body=-1, maxZ=FindVertical(), ๊ฐ์ฅ ๊ฐ๊น์ด=true, ์์=-1, classMask ๋นํ์ฑํ, aliveOnly=false, visibleOnly=false. ์ฃฝ์ ์ฌ๋์ ์ ์ธํ๋ ค๋ฉด ์๋ ์ ์ฒด ์์์ ์ฌ์ฉํ์ธ์.
var enemy = UO.AttackNearest(5, 5);
if (Truth(enemy == 0))
{
return null;
}
UO.AddObject("combat_target", enemy);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;2. ์ฃผ์ด์ง ๋ชธ์ฒด์ ๋์ผํ ๋์ด๋ง: ํด๋์ค๊ฐ ์๋ ๋ชจ๋ ํ๋๊ทธ - ์คํฌ๋ฆฝํธ ํจ์
๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- maxZ=0๋ ์๊ฒฉํ ๋์ด ๋น๊ต์ ์ ์ฉํ์ง๋ง ๋จ๊ณ์์ ๋์์ด ์๋ฆด ์ ์์ต๋๋ค. visibleOnly๋ ๋ฒฝ์ ํ์ธํ์ง ์์ต๋๋ค. 9๊ฐ์ ์ธ์๊ฐ ๋ชจ๋ ์๋ช ๋์์ต๋๋ค. true๊ฐ ์๋ ID๋ฅผ ๋ฐํํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var status = "5|6";
var radius = 8;
var bodies = "0x0190|0x0191";
var heightTolerance = 0;
dynamic chooseNearest = true;
var bodyHue = -1;
var equipmentClasses = -1;
dynamic requireAlive = true;
dynamic requireVisible = true;
var enemy = UO.AttackNearest(status, radius, bodies, heightTolerance, chooseNearest, bodyHue, equipmentClasses, requireAlive, requireVisible);
if (Truth(enemy != 0))
{
UO.AddObject("enemy_same_height", enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- DTMH๊ฐ ๋จผ์ ์ ํ๋ฉ๋๋ค. ์ ํฉํ DTMH๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง - ๋ฌด๊ฒ๊ณ ์ฌ๋ฅ๊พผ์ ๋๋ค. 10 ์ ์ DTMH๋ 2 ์ ์ Heavy๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ต๋๋ค. ์์๋ฅผ ๋ฐ๊พธ๋ ค๋ฉด classMask ์ค์ ๋ณ๊ฒฝํ์ธ์. ๋ ๊ฐ์ DTMH ์ค ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒ์ด ์ ํ๋ฉ๋๋ค.
- ๊ธฐ์ด๋ ๋ณ๋์ ๋ช ๋ น UO์ด ์๋ ์์ ํ ์ถ์๋ ์ฌ์ฉ์ ๊ธฐ๋ฅ C#์ ๋๋ค. Gear(๊ฐ์ฃฝ, ์งํก์ด)์ ๋ ๋ฐฐ์ด์ ๋ ๊ฐ์ ํ์ ๊ทธ๋ฃน์ ๊ตฌ์ฑํฉ๋๋ค. ๊ฐ์ฃฝ์ ์ ํ์ ์ถ๊ฐํ๋ฉด ๋์์ด ํ์ฅ๋ฉ๋๋ค. ๋ ๊ฐ์ ๊ฐ์ฃฝ ์์ดํ ์ ์ฐฉ์ฉํ ํ์๊ฐ ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var leather = Gear(0x13C4, 0x13C7);
var staves = Gear(0x0DF0, 0x0E81);
var chain = Gear(0x13BF, 0x13C0);
var plate = Gear(0x1415, 0x1411);
var bows = Gear(0x13B2, 0x0F50);
UO.SetClassMask("DTMH", Gear(leather, staves), chain);
UO.SetClassMask("ะพั
ะพัะฝะธะบ", bows);
UO.SetClassMask("ััะถัะปัะน", plate);
var notoriety = "5|6";
var distance = 12;
var body = -1;
var maxZ = 8;
dynamic nearest = true;
var color = -1;
var classMask = "DTMH|ััะถัะปัะน|ะพั
ะพัะฝะธะบ";
dynamic aliveOnly = true;
dynamic visibleOnly = true;
var enemy = UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly);
if (Truth(enemy == 0))
{
UO.Print("No matching enemy; no attack sent");
return null;
}
UO.AddObject("selected_enemy", enemy);
return null;
}
dynamic Gear(params dynamic[] values)
{
return values;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 10๋ ๋ฐ๊ฒฝ์ด๊ณ , 4๋ ํ์ฉ๋๋ ์ฐจ์ด Z์ด๋ฉฐ, ํ๋๊ทธ ๋นํ์ฑํ ์์ ๋ค์ -1์ classMask ๋ ๋ค์ ๋๋ค. ์๋ ์ ๋ฐ์ดํธ ๊ฐ ํด๋ผ์ด์ธํธ ๋ชฉ๋ก์ ์์๋ ๋ณด์ฅ๋์ง ์์ต๋๋ค. ์์ธก ๊ฐ๋ฅํ ๊ทผ์ ์ฑ์ ์ป์ผ๋ ค๋ฉด true๋ฅผ ์ฌ์ฉํ์ธ์.
dynamic sortByDistance = false;
var target = UO.AttackNearest(5, 10, -1, 4, sortByDistance, -1, -1, true, true);
if (Truth(target == 0))
{
return null;
}
UO.AddObject("current_enemy", target);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ผ๋ฒจ์ ์์๋ง ๋ณ๊ฒฝ๋ฉ๋๋ค. ์ ์๋ฅ ํ ์ด๋ธ์ด๋ ์ด๋ฆ์ ํด๋ผ์ด์ธํธ์ ์ถ๊ฐํ ํ์๊ฐ ์์ต๋๋ค. ๋ฌด๊ฑฐ์ด ํญ๋ชฉ์ ๋ํ ํด๋ฐฑ์ ๋ฐฉ์งํ๋ ค๋ฉด ์ฐ์ ์์์์ ์ ๊ฑฐํ์ธ์.
return RunScenario();
object? RunScenario()
{
var leather = Gear(0x13C4, 0x13C7);
var staves = Gear(0x0DF0, 0x0E81);
var chain = Gear(0x13BF, 0x13C0);
var plate = Gear(0x1415, 0x1411);
var bows = Gear(0x13B2, 0x0F50);
UO.SetClassMask("DTMH", Gear(leather, staves), chain);
UO.SetClassMask("ะพั
ะพัะฝะธะบ", bows);
UO.SetClassMask("ััะถัะปัะน", plate);
var priority = "ะพั
ะพัะฝะธะบ|DTMH|ััะถัะปัะน";
var enemy = UO.AttackNearest(5, 12, -1, 8, true, -1, priority, true, true);
if (Truth(enemy != 0))
{
UO.AddObject("priority_enemy", enemy);
}
return null;
}
dynamic Gear(params dynamic[] values)
{
return values;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: notoriety (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactAttackNearest(values))๋งค๊ฐ๋ณ์: notoriety (Any), distance (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactAttackNearest(values))๋งค๊ฐ๋ณ์: notoriety (Any), distance (Any), body (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactAttackNearest(values))๋งค๊ฐ๋ณ์: notoriety (Any), distance (Any), body (Any), maxZ (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest) โ UO.AttackNearest(Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color) โ UO.AttackNearest(Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask) โ UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly) โ UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any), aliveOnly (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly) โ UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any), aliveOnly (Any), visibleOnly (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactAttackNearest(values))ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.BandageSelf();์บ๋ฆญํฐ๋ฅผ UO.Wait-ํ๊ฒ์ผ๋ก ์ค์ ํ๊ณ ๋ฐฐ๋ญ์์ ์ ํํ 0x0E21 ์ ํ์ ๋ถ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์์
์ ํด๋ผ์ด์ธํธ์ ์ํด ์ ์ก๋๊ณ ์๋ฒ์ ์ํด ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void. ์ด ๋ฉ์๋๋ ์น๋ฃ ์ํ๋ฅผ ๋ฐํํ์ง ์์ผ๋ฉฐ ๋ถ๋ ๊ฐ๊ธฐ๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
- ๋ฐํ์์ ๋ชฉํ
Self๋ฅผ ์ค์ ํ ๋ค์ ๋ฐฐ๋ญ์์ hue์ ๊ฐ์ฅ ๊ฐ๊น๊ฒ ์ผ์นํ๋ ์ ํ0x0E21ํญ๋ชฉ์ ๊ฒ์ํ์ฌ ์ฌ์ฉํฉ๋๋ค. ๋ถ๋๊ฐ ๋ฐ๊ฒฌ๋์ง ์์ผ๋ฉด ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์์คํ ๋ก๊ทธ์ ๋ณด๊ณ ๋ฉ๋๋ค. ๊ฒ์ ๊ฒฐ๊ณผ๋ ํธ์ถ ์คํฌ๋ฆฝํธ๋ก ๋ฐํ๋์ง ์์ต๋๋ค. ์บ๋ฆญํฐ์ ์๋ฒ ์ํ์ ๋ฐ๋ผ ์น๋ฃ ๊ฐ๋ฅ์ฑ๊ณผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.BandageSelf");
UO.BandageSelf();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฐฐ๋ญ์ ์๋ ๋ถ๋๋ฅผ ํ ๋ฒ ์์ ์๊ฒ ์ฌ์ฉํ์ธ์.
UO.BandageSelf();2. ๋จผ์ ์ฐ๊ฒฐ์ ํ์ธํ ๋ค์ ์์ ์ ์ ๋ฌํฉ๋๋ค. ํตํ๋ ์น๋ฃ๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. - ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ
๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ ์ฐ๊ฒฐ์ ํ์ธํ ๋ค์ ์์ ์ ์ ๋ฌํฉ๋๋ค. ํตํ๋ ์น๋ฃ๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Connected()))
{
UO.BandageSelf();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;3. ์ด ์์ ์์๋ ๋ถ๋ ์ฌ์ฉ๋ง ๋ณด๊ณ ํ ๋ฟ ์น๋ฃ ์ฑ๊ณต ์ฌ๋ถ๋ ๋ณด๊ณ ํ์ง ์์ต๋๋ค. - ์คํฌ๋ฆฝํธ ํด๋์ค
๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ์์ ์์๋ ๋ถ๋ ์ฌ์ฉ๋ง ๋ณด๊ณ ํ ๋ฟ ์น๋ฃ ์ฑ๊ณต ์ฌ๋ถ๋ ๋ณด๊ณ ํ์ง ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
ApplyBandage();
return null;
}
void ApplyBandage()
{
UO.BandageSelf();
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.BandageSelf. -
InjectionScript.Runtime.InjectionApiUO.FindType:FindType(new InjectionValue(0x0e21), new InjectionValue(0), new InjectionValue("my")). -
InjectionScript.Runtime.InjectionApiUO.WaitTargetSelf:WaitTargetSelf(). -
InjectionScript.Runtime.InjectionApiUO.UseObject:UseObject(foundBandages). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("No bandages found.").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void BandageSelf()
{
var foundBandages = FindType(new InjectionValue(0x0e21), new InjectionValue(0), new InjectionValue("my"));
if (foundBandages != string.Empty)
{
WaitTargetSelf();
UseObject(foundBandages);
}
else
SystemMessage("No bandages found.");
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.ClearClassMask();
int UO.ClearClassMask(object? name);ํ์ฌ ์คํฌ๋ฆฝํธ ๋ฐํ์์ ํ๋์ ์ฌ์ฉ์ ์ ์ ์ฅ๋น ๊ท์น ๋๋ ๋ชจ๋ ๊ท์น์ ์ ๊ฑฐํฉ๋๋ค. ์ธํธ๋ฅผ ์ฌ๊ตฌ์ฑํ๊ฑฐ๋ ์์ ์ฐ์ ์์๋ฅผ ๋นํ์ฑํํ๊ธฐ ์ ์ ์ ์ฉํฉ๋๋ค.
-
nameโ SetClassMask์ ์ ๋ฌ๋ ์ ํ์ ์ด๋ฆ์ ๋๋ค. ์ฌ๋ก๋ ์ค์ํ์ง ์์ต๋๋ค. ์ธ์๊ฐ ์์ผ๋ฉด ์ด ๋ฐํ์์ ๋ํ ๋ชจ๋ ๊ท์น์ด ์ญ์ ๋ฉ๋๋ค. ์ด๊ฒ์ ์ฐ์ ์์ ๋ฌธ์์ด์ด ์๋๋๋ค. ์ฌ๊ธฐ์๋ "mage|tank"๊ฐ ํ์ฉ๋์ง ์์ต๋๋ค. ํ ๋ฒ์ ํ๋์ฉ ์ ๊ฑฐํ๊ฑฐ๋ ์ธ์ ์์ด ํธ์ถํ์ธ์.
int โ ์ญ์ ๋ ๊ท์น ์. 1๋ผ๋ ์ด๋ฆ์ ์ญ์ ๋จ์ ์๋ฏธํ๊ณ , 0์๋ ๊ทธ๋ฌํ ๊ท์น์ด ์์ต๋๋ค. ์ธ์๊ฐ ์์ผ๋ฉด ๋ถ์ธ ํ๋๊ทธ๊ฐ ์๋ 0..N์ด ๋ฐํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ ์ฒด ๊ฒฐ๊ณผ๋ฅผ true์ด ์๋ > 0์ ๋น๊ตํ์ธ์.
- ์ด๋ฏธ ์ ์ก๋ ๊ณต๊ฒฉ์ ์ทจ์ํ์ง ์์ผ๋ฉฐ ์คํฌ๋ฆฝํธ๋ฅผ ์ค์งํ์ง ์์ต๋๋ค. ์บ๋ฆญํฐ ์ฅ๋น๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- ์ผ๋จ ์ญ์ ๋๋ฉด ์ด๋ฆ์ ๋ค์ AttackNearest์์ ์ ์ ์๋ ์ํ๋ก ์ ์ง๋ฉ๋๋ค. classMask์์๋ ์ ๊ฑฐํ๊ฑฐ๋ ๋ค์ ๋ฑ๋กํ์ธ์. ์ ์ ์๋ ์ด๋ฆ์ ๋ชจ๋ ์ ํ์ ์ฐจ๋จํฉ๋๋ค.
- ๋ค๋ฅธ ์ฌ๋์ ๋ฐํ์๊ณผ ํด๋น ๊ท์น์ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค. ํด๋์ค๊ฐ ์๋ ์ผ๋ฐ ๊ฒ์์ ๊ฒฝ์ฐ ๋น ํ์๋ณต ์ธํธ ๋์ classMask=-1๋ฅผ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.ClearClassMask();
UO.Print("ClearClassMask: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ๊ฑฐํด๋ ๋ฌด๊ธฐ๊ฐ ๋ฐ๋๊ฑฐ๋ ์ ํฌ๊ฐ ๋๋์ง๋ ์์ต๋๋ค. ์ถ๊ฐ ๋ถ๋ฅ๋ง ๋ณ๊ฒฝ๋ฉ๋๋ค.
UO.SetClassMask("ะฒัะตะผะตะฝะฝัะน", 0x13B2);
UO.SetClassMask("ะพัะฝะพะฒะฝะพะน", 0x1415);
UO.ClearClassMask("ะฒัะตะผะตะฝะฝัะน");
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "ะพัะฝะพะฒะฝะพะน", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("main_enemy", enemy);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ๊ฑฐ๋จ - ์ ๊ฑฐ๋ ๊ท์น ์์ ๋๋ค. ํด๋ผ์ด์ธํธ๋ฅผ ๋ค์ ์์ํ์ง ์๊ณ ๋์ผํ ๋ฐํ์์ ์ ์ธํธ๊ฐ ์์ฑ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.SetClassMask("ััะฐััะน_ะฝะฐะฑะพั", 0x13B2);
var removed = UO.ClearClassMask();
UO.SetClassMask("ะฝะพะฒัะน_ะฝะฐะฑะพั", 0x0F50);
var enemy = UO.AttackNearest(5, 8, -1, 4, true, -1, "ะฝะพะฒัะน_ะฝะฐะฑะพั", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("new_enemy", enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๊ฒฉ ์ด๋ฆ์ ์ ๋ฌํ์ง ๋ง์ญ์์ค. ๊ฒฐ๊ณผ๋ 0์ ๋๋ค. -1๋ ์ท๋ง ๋นํ์ฑํํฉ๋๋ค. ๋ค๋ฅธ ํํฐ๋ ๊ณ์ ์๋ํฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.SetClassMask("ะฟะพ_ะพะดะตะถะดะต", 0x13C4);
UO.ClearClassMask();
var classes = -1;
var enemy = UO.AttackNearest(5, 5, -1, 4, true, -1, classes, true, true);
if (Truth(enemy != 0))
{
UO.AddObject("enemy_without_classes", enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [ClearClassMask]. -
InjectionScript.Runtime.InjectionApiUO.ClearClassMask:ClearClassMask(null).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
args => new InjectionValue(ClearClassMask(null))๋งค๊ฐ๋ณ์: name (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [ClearClassMask]. -
InjectionScript.Runtime.InjectionApiUO.ClearClassMask:ClearClassMask(ReadClassName(args[0])). -
InjectionScript.Runtime.InjectionApiUO.ReadClassName:ReadClassName(args[0]).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
args => new InjectionValue(ClearClassMask(ReadClassName(args[0])))ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetAbilityID(object? abilityName);ID ํด๋ผ์ด์ธํธ ๋๋ ํฐ๋ฆฌ์์ ๋ฌด๊ธฐ ๋ฅ๋ ฅ ์ด๋ฆ์ด๋ ์ซ์ ๋ฌธ์์ด์ ํ์ธํฉ๋๋ค.
-
abilityName- string: ์ด๋ฆ AbilityData, ์ด๊ฑฐํ ๋ฅ๋ ฅ ์ด๋ฆ ๋๋ ์์์ ID. ์ด๋ฆ์ ๋น๊ตํ ๋ ๊ณต๋ฐฑ/๊ตฌ๋์ ์ ์ ๊ฑฐ๋๋ฉฐ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
int 1..AbilityData.Abilities.Length - ์๋ ค์ง ๋ฅ๋ ฅ; 0๋ ์ ์ ์๋ ์ด๋ฆ, ์ ๊ทํ๋ ๋น ๋ฌธ์์ด ๋๋ ๋๋ ํฐ๋ฆฌ ์ธ๋ถ์ ์ซ์ ID์ ๋๋ค.
- ResolveClassicUOAbilityId๋ ๋จผ์ ์ญ์ง์ int๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ ๋ค์ ์ ๊ทํ๋ ๋๋ ํฐ๋ฆฌ ์ด๋ฆ๊ณผ ์ด๊ฑฐํ ์ด๋ฆ์ ๋น๊ตํฉ๋๋ค. ์ด ๋ช ๋ น์ ๋ฅ๋ ฅ์ ํ์ฑํํ๊ฑฐ๋ ํ์ฌ ๋ฌด๊ธฐ์์ ํธํ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetAbilityID("Armor Ignore");
UO.Print("GetAbilityID: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ซ์๋ ๋ฅ๋ ฅ์ ์ฌ์ฉ์ด ์๋ ์นดํ๋ก๊ทธ์ ID๋ฅผ ๋ํ๋ ๋๋ค.
var id = UO.GetAbilityID("Armor Ignore");
UO.Print(Convert.ToString(id));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 1 ๋ผ์ธ์ ๋ฆฌ์กธ๋ฒ์ ์์น ๊ฒฝ๋ก๋ฅผ ํต๊ณผํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.GetAbilityID("1");
UO.Print(Convert.ToString(id));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋๋ฝ๋ ์ด๋ฆ์ 0๋ฅผ ๋ฐํํฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var id = UO.GetAbilityID("unknown-example-ability");
UO.Print(Convert.ToString(id));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: abilityName (String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetAbilityID. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ResolveAbility:bridge.ResolveAbility(abilityName).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetAbilityID(string abilityName) => bridge.ResolveAbility(abilityName);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.GetAbilityName(object? abilityId);ID ๋๋ ํ ๋ฆฌ์์ ๋ฌด๊ธฐ ๋ฅ๋ ฅ์ ์ด๋ฆ์ ๋ฐํํฉ๋๋ค.
-
abilityId- int: ์ธ๋ฑ์ฑ ID์ 1๋ก ์์ํฉ๋๋ค. ๋ธ๋ฆฌ์ง๋ AbilityData.Abilities[abilityId-1]๋ฅผ ์ฝ์ต๋๋ค.
string ๋๋ ํ ๋ฆฌ ์ด๋ฆ. ID๊ฐ 1๋ณด๋ค ์๊ฑฐ๋ ๋๋ ํฐ๋ฆฌ ๊ธธ์ด๋ณด๋ค ํฐ ๊ฒฝ์ฐ ๋น ๋ฌธ์์ด์ด ๋ฐํ๋ฉ๋๋ค.
- ํ๋ ๊ฐ์ ์ง์ญ์ ์ด๋ฉฐ ๋ฅ๋ ฅ์ ํ์ฑํํ์ง ์์ต๋๋ค. ์นดํ๋ก๊ทธ์ ID๋ ํ์ฌ ๋ฌด๊ธฐ์ ํด๋น ๋ฅ๋ ฅ์ด ์กด์ฌํ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetAbilityName(1);
UO.Print("GetAbilityName: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ID 1์ ๋๋ ํฐ๋ฆฌ์ ์ฒซ ๋ฒ์งธ ์์์ ์ผ์นํฉ๋๋ค.
var name = UO.GetAbilityName(1);
UO.Print(name);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฆฌ์กธ๋ฒ๊ฐ ์ฐพ์ ID๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฆ์ด ๋ฐํ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.GetAbilityID("Armor Ignore");
if (Truth(id > 0))
{
UO.Print(UO.GetAbilityName(id));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ID 0๋ ๊ธธ์ด๊ฐ 0์ธ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var name = UO.GetAbilityName(0);
UO.Print(Convert.ToString(Len(name)));
return null;
}
int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: abilityId (Integer)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetAbilityName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetAbilityName:bridge.GetAbilityName(abilityId).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetAbilityName(int abilityId) => bridge.GetAbilityName(abilityId);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetActiveAbility();์บ๋ฆญํฐ๊ฐ ํ์ฑํํ ์ ํฌ ๋ฅ๋ ฅ์ ์ด๋ฆ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
string์ ํ์ฑํ ๋ฅ๋ ฅ์ ์์ด ์ด๋ฆ์ ๋๋ค(์: Armor Ignore). ํ์ฑํ๋ ๋ฅ๋ ฅ์ด ์๊ฑฐ๋ ๋ฌธ์๊ฐ ๋๋ฝ๋ ๊ฒฝ์ฐ ๋ฌธ์์ด "0"์ ๋๋ค. ์ด๋ int, 0, ID ๋ฅ๋ ฅ์ด๋ ์ ์ค ์ฑ๊ณต ํ์ธ์ด ์๋๋๋ค.
- ํ์ฌ ๋ฌธ์์ PrimaryAbility/SecondaryAbility ํ๋๊ทธ๋ฅผ ์ฝ์ต๋๋ค. ๋ ๋ค ํ์ฑํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๋ฅ๋ ฅ์ด ์ ํ๋ฉ๋๋ค. ์ด๋ฆ์ด ๊ฒ์๋๊ธฐ ์ ์ ํ๋ ํ๋๊ทธ๊ฐ ๋ฒํธ์์ ์ ๊ฑฐ๋ฉ๋๋ค.
- ๋ฐ์ดํฐ๋ ๋ก์ปฌ์์ ์ฝํ์ง๋๋ค. ๊ฒํฐ ์์ฒด๋ ๋ฅ๋ ฅ์ ํ์ฑํํ์ง ์์ผ๋ฉฐ ๋ง๋๋ฅผ ์๋นํ์ง ์์ต๋๋ค. ๊ณต๊ฒฉ ํ ์๋ฒ๋ ํ์ฑํ๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetActiveAbility();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค. ํ์ฌ ํด๋ผ์ด์ธํธ์ ๋ฌธ์๋ฅผ ์ฝ์ต๋๋ค.
- ํ์ฑํ๊ฐ ์์ผ๋ฉด 0 ๋ฌธ์์ด์ด ์ธ์๋ฉ๋๋ค.
var name = UO.GetActiveAbility();
UO.Print(name);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น๊ต๋ ๋ฌธ์์ด 0๋ก ์ด๋ฃจ์ด์ง๋๋ค. UsePrimaryAbility๋ ๋ณ๋๋ก ํธ์ถ๋ฉ๋๋ค.
- ์ด๋ ํ์ฑํ ์์ฒญ์ด์ง ์ฑ๊ณต์ ์ธ ๊ฒฝ๊ณ ์ ์ฆ๊ฑฐ๊ฐ ์๋๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅ ์ฌ๋ถ๋ ๋ฌด๊ธฐ ๋ฐ ์๋ฒ ๊ท์น์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.GetActiveAbility() == "0"))
{
UO.UsePrimaryAbility();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- GetAbilityID๋ getter๊ฐ ๋ฐํํ ์ด๋ฆ์ ๋ฐ์ต๋๋ค.
- ID ๋ฅ๋ ฅ์ serial ๋ฌด๊ธฐ๋ ์บ๋ฆญํฐ๊ฐ ์๋๋๋ค. ์ฒซ์งธ, ํ์ฑ ๋ฅ๋ ฅ์ ๋ถ์ฌ๊ฐ ๋ฐฐ์ ๋ฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var name = UO.GetActiveAbility();
if (Truth(name != "0"))
{
var id = UO.GetAbilityID(name);
UO.Print("Ability ID: " + Convert.ToString(id));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetActiveAbility:bridge.GetActiveAbility().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getactiveability": return new InjectionValue(bridge.GetActiveAbility());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetWeaponAbilities();Bridge๋ Player.Abilities๋ฅผ ์ฝ๊ณ ((byte)๊ฐ & 0x7F)๋ฅผ ์ ์ฉํ๊ณ ์์ ID๋ฅผ ์๋ ์์๋๋ก ์ ์ฅํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
ํ์ฌ ๋ฌด๊ธฐ์ ๊ธ์ ์ ์ธ int ID ๋ฅ๋ ฅ ๋ฐฐ์ด์ ๋๋ค. ๋์ ํ๋๊ทธ 0x80๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค. 0 ๊ฐ์ ์ ์ธ๋ฉ๋๋ค. ํ๋ ์ด์ด ์์ - ๋น ๋ฐฐ์ด์ ๋๋ค.
- Bridge๋ Player.Abilities๋ฅผ ์ฝ๊ณ ((byte)๊ฐ & 0x7F)์ ์ ์ฉํ๊ณ ์์ ID๋ฅผ ์๋ ์์๋๋ก ์ ์ฅํฉ๋๋ค. ํ์ฑ ๋ชจ๋์ ์ฌ์ค์ด๋ ์ด๋ฆ์ด ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ID์ ๋ฐํํฉ๋๋ค.
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetWeaponAbilities();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Bridge๋ Player.Abilities๋ฅผ ์ฝ๊ณ ((byte)๊ฐ & 0x7F)๋ฅผ ์ ์ฉํ๊ณ ์์ ID๋ฅผ ์๋ ์์๋๋ก ์ ์ฅํฉ๋๋ค.
var abilities = UO.GetWeaponAbilities();
UO.Print(UO.GetArrayLength(abilities));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Bridge๋ Player.Abilities๋ฅผ ์ฝ๊ณ ((byte)๊ฐ & 0x7F)์ ์ ์ฉํ๊ณ ์์ ID๋ฅผ ์๋ ์์๋๋ก ์ ์ฅํฉ๋๋ค. ํ์ฑ ๋ชจ๋์ ์ฌ์ค์ด๋ ์ด๋ฆ์ด ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ID์ ๋ฐํํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var abilities = UO.GetWeaponAbilities();
if (Truth(UO.GetArrayLength(abilities) > 0))
{
UO.Print(UO.GetAbilityName(abilities[0]));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.GetWeaponAbilities();
UO.Wait(500);
var after = UO.GetWeaponAbilities();
UO.Print(before);
UO.Print(after);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetWeaponAbilities. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetWeaponAbilities:bridge.GetWeaponAbilities().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public InjectionValue GetWeaponAbilities() => new InjectionValue(
(bridge.GetWeaponAbilities() ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsWarMode(object? objID);์ ํฌ ์์ธ๋ฅผ ํ์ธํฉ๋๋ค mobile.
-
objIDโ ํน์ ๊ฐ์ฒด์ ํ์ serial/ID: int, 16์ง์ ๋ฌธ์์ด ๋๋ ๋ณ์นญ self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. ์ง์ ๋์ง ์์ ์ด๋ฆ์ 0๋ก ํด์๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ ๋์์ ์ด์ง ์์ต๋๋ค. ์ธ์๋ ํ์์ ๋๋ค. ์ง์ self๋ฅผ ํต๊ณผํ์ธ์.
int 1 - ๋ก๋๋จ mobile์๋ InWarMode ์์ฑ์ด ์์ต๋๋ค. int 0 - ์์ฑ์ด ๋๋ฝ๋์๊ฑฐ๋ ๊ฐ์ฒด๊ฐ mobile๊ฐ ์๋๊ฑฐ๋ ์ ์ ์๊ฑฐ๋ ์ญ์ ๋์์ต๋๋ค. ์บ๋ฆญํฐ๊ฐ ๋๊ตฌ๋ฅผ ๊ณต๊ฒฉํ๊ณ ์๋์ง ์๋ ค์ฃผ์ง ์์ผ๋ฉฐ ์ ํฌ ๋ชจ๋๋ฅผ ์ผ์ง๋ ์์ต๋๋ค. ์ธ๋ถ ๋ชจ๋ ์ฝ๊ธฐ๋ ์๋ฒ์์ ๋ฐ์ ๋ฐ์ดํฐ๋ก ์ ํ๋ฉ๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ์๋ฒ์ ๋ํ ์์ฒญ๋ ์๊ณ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ด๋ํ ํ์๋ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ์ฝ๋ ์๊ฐ์ ๊ฐ๋ฆฌํจ๋ค. UO.Wait ๋๋ ๋ค๋ฅธ ์์ ํ์ ๊ฐ์ฒด์ ํด๋น ํ๋๊ทธ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- ์บ๋ฆญํฐ๊ฐ ๋๊ตฌ๋ฅผ ๊ณต๊ฒฉํ๊ณ ์๋์ง ์๋ ค์ฃผ์ง ์์ผ๋ฉฐ ์ ํฌ ๋ชจ๋๋ฅผ ์ผ์ง๋ ์์ต๋๋ค. ์ธ๋ถ ๋ชจ๋ ์ฝ๊ธฐ๋ ์๋ฒ์์ ๋ฐ์ ๋ฐ์ดํฐ๋ก ์ ํ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsWarMode("self");
UO.Print("IsWarMode: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- self ์ธ์๋ ํด๋น ๋ฌธ์๋ฅผ ๋ช ์์ ์ผ๋ก ์ ํํฉ๋๋ค. ์ํ - 1/0์๋ง ํด๋น๋ฉ๋๋ค.
- ์บ๋ฆญํฐ๊ฐ ๋๊ตฌ๋ฅผ ๊ณต๊ฒฉํ๊ณ ์๋์ง ์๋ ค์ฃผ์ง ์์ผ๋ฉฐ ์ ํฌ ๋ชจ๋๋ฅผ ์ผ์ง๋ ์์ต๋๋ค. ์ธ๋ถ ๋ชจ๋ ์ฝ๊ธฐ๋ ์๋ฒ์์ ๋ฐ์ ๋ฐ์ดํฐ๋ก ์ ํ๋ฉ๋๋ค.
var state = UO.IsWarMode("self");
if (Truth(state))
{
UO.Print("Combat stance is active");
}
else
{
UO.Print("Combat stance is inactive");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- IsNpc ์ ๋ชฉ ๋ฐ ์ ์ ์๋ ๊ฐ์ฒด๋ ์ ์ธ๋ฉ๋๋ค. target์ ๋ณ๊ฒฝ๋๋ lasttarget์ ๋ํ ์ค์๊ฐ ์ฐธ์กฐ๊ฐ ์๋ ๋จ์ผ serial์ ์ ์ฅํฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ InWarMode ํ๋๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์ ์ ํ ์ํ๋ฅผ ์์ ํ ํ์๋ง ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var state = UO.IsWarMode(target);
UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
}
else
{
UO.Print("No loaded mobile selected");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.Wait(500) โ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ผ์ ์ค์ง๋ฉ๋๋ค. ์ดํ์๋ mobile์ด ์ฌ์ ํ ์กด์ฌํ๋์ง ๋ณ๋๋ก ํ์ธํฉ๋๋ค.
- ๋ ์ด๋ฏธ์ง๊ฐ ๋น๊ต๋ฉ๋๋ค. ์ค๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ด ๋๋ฝ๋ ์ ์์ผ๋ฉฐ ์ด๋ ์๋ฒ ์ด๋ฒคํธ์ ๋ํ ์ง์์ ์ธ ๊ตฌ๋ ์ด ์๋๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var before = UO.IsWarMode(target);
await Delay(500);
if (Truth(UO.IsNPC(target)))
{
var after = UO.IsWarMode(target);
if (Truth(before != after))
{
UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
}
}
else
{
UO.Print("Mobile left the local world");
}
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsWarMode:bridge.IsWarMode(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.WarMode:WarMode().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "iswarmode": return new InjectionValue(arguments.Length > 0 ? bridge.IsWarMode(Arg(0)) : WarMode());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.LastAttack();๋ง์ง๋ง ๊ณต๊ฒฉ ๋์์ serial๋ฅผ ์ฝ์ด์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ์ ์ฅ๋จ serial; 0์ serial์ด ์ค์น๋์ง ์์์์ ์๋ฏธํฉ๋๋ค. bool๋ ์๋๊ณ graphic/type๋ ์๋๋๋ค. 0์ด ์๋ ID๋ ์ธ์์ ๋ ์ด์ ์กด์ฌํ์ง ์์ ์ ์์ต๋๋ค.
- ํ๋ ์์ค: bridge.LastAttack. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ์ ํํ๊ฑฐ๋ ์ฌ์ฉํ๊ฑฐ๋ ๊ณต๊ฒฉํ์ง ์์ต๋๋ค.
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.LastAttack();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ง์ง๋ง ๊ณต๊ฒฉ ๋์์ serial๋ฅผ ์ฝ์ด์ต๋๋ค.
var id = UO.LastAttack();
UO.Print(Hex(id));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ๋ ์์ค: bridge.LastAttack. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ์ ํํ๊ฑฐ๋ ์ฌ์ฉํ๊ฑฐ๋ ๊ณต๊ฒฉํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.LastAttack();
if (Truth(id != 0) && Truth(UO.Exists(id)))
{
UO.Print(UO.GetName(id));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.LastAttack();
UO.Wait(500);
var after = UO.LastAttack();
UO.Print(before = after);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastAttack:bridge.LastAttack.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "lastattack":
case "wartargetid": return new InjectionValue(bridge.LastAttack);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.SetClassMask(object? name, object? required);
int UO.SetClassMask(object? name, object? required, object? forbidden);classMask์ ๋ํ ์ฌ์ฉ์ ์ ์ ์ฅ๋น ํด๋์ค๋ฅผ UO.AttackNearest๋ก ์์ฑํ๊ฑฐ๋ ๊ต์ฒดํฉ๋๋ค. ์ด๋ฆ๊ณผ graphic/type ํญ๋ชฉ์ ์ ํํฉ๋๋ค. ๋ด์ฅ๋ ์ง์ฑ ์ ํ์ํ์ง ์์ต๋๋ค.
-
nameโ ์ด๋ฆ์ด ํฌํจ๋ ๋น์ด ์์ง ์์ ๋ฌธ์์ด(์: "DTMH", "my_group", "archer_with_shield") ๋์๋ฌธ์๋ ์ค์ํ์ง ์์ผ๋ฉฐ ๊ฐ์ฅ์๋ฆฌ ์ฃผ๋ณ์ ๊ณต๋ฐฑ์ ์ ๊ฑฐ๋ฉ๋๋ค. | , ; ๊ธ์ง๋จ: ์ฐ์ ์์ ๊ตฌ๋ถ ๊ธฐํธ์ ๋๋ค. any/all/-1๋ ํํฐ๋ฅผ ๋นํ์ฑํํ๊ธฐ ์ํด ์์ฝ๋์ด ์์ต๋๋ค. -
requiredโ ํ๋์ type, ๋์ฒด ํญ๋ชฉ์ ๋จ์ ๋ฐฐ์ด ๋๋ ํ์ ๊ทธ๋ฃน์ ๋ฐฐ์ด์ ๋๋ค. ๊ฐ ๊ทธ๋ฃน์ type ๋๋ ํ๋ฉด ๋ฐฐ์ด์ ๋๋ค. ๊ฐ ๊ทธ๋ฃน์์ ์ต์ํ ํ ๊ฐ์ง๊ฐ ํ์ํฉ๋๋ค. ๋น ํ์ ๊ทธ๋ฃน์ ํ์ฉ๋์ง ์์ต๋๋ค. ๊ฐ type๋ int/์ซ์/16์ง์ ๋ฌธ์์ด 1..65534์ ๋๋ค. ๊ทธ๋ฃน ๋ฐฐ์ด๋ณด๋ค ๋ ๊น๊ฒ ์ค์ฒฉ๋๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค. ์ด๋ serial์ด๋ body ๋ฌธ์๊ฐ ์๋ graphic ํญ๋ชฉ์ ๋๋ค. -
forbiddenโ ์ ํ์ type ๋๋ ์๋ชป๋ ์ ํ์ ํ๋ฉด ๋ฐฐ์ด์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ธ์ง๋ ํ๋ชฉ์ ์์ต๋๋ค. ๋น ๋ฐฐ์ด๋ ํ์ฉ๋ฉ๋๋ค. ๊ทธ๋ฌํ ํ๋ชฉ์ ์ฐฉ์ฉํ๋ฉด ๊ท์น์ด ์ผ์นํ์ง ์์ต๋๋ค. ๋์ผํ ๊ฒฝ๊ณ 1..65534; -1/์ฌ๊ธฐ์์๋ ํ์ฉ๋์ง ์์ต๋๋ค. ํ์ ๊ทธ๋ฃน์ ๋ํ ๋ชจ๋ ๋์์ ์์ ํ ๊ธ์งํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
int 1 - ๊ท์น์ ํ์ธํ๊ณ ๊ธฐ๋กํ์ต๋๋ค. ์๋ชป๋ ์ ํ/์ด๋ฆ/๋น ํ์ ๊ทธ๋ฃน/๋ถ์ผ์น๋ก ์ธํด ์คํฌ๋ฆฝํธ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉฐ, ์ด๋ try/CATCH์ ์ํด ํฌ์ฐฉ๋ ์ ์์ต๋๋ค. ์ด์ ๊ท์น์ด ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค. serial ๋๋ ๋ฐ๊ฒฌ๋ ๋ฌธ์๋ฅผ ๋ฐํํ์ง ์์ผ๋ฉฐ ๊ณต๊ฒฉ์ ์์ํ์ง ์์ต๋๋ค.
- ์ด๋ฆ์ ์๋ฒ ์ง์ ์ด ์๋ ์ปค์คํ ๋ผ๋ฒจ์ ๋๋ค. ๊ท์น์ DTMH, my_group ๋๋ ๋ค๋ฅธ ๋จ์ด๋ก ํธ์ถํ ์ ์์ต๋๋ค. ์์ง์ ์๋ฒ์ ์คํฌ/ํด๋์ค๋ฅผ ์บ๋ฆญํฐ ์ด๋ฆ์ผ๋ก ๊ฒฐ์ ํ์ง ์์ต๋๋ค.
- ํ์์์ ํ๋์ type ๋๋ ํ๋ฉด ๋ฐฐ์ด์ ๋ชฉ๋ก์์ ์ต์ํ ํ๋์ ํญ๋ชฉ์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฃน ๋ฐฐ์ด์ด๋ ๊ฐ ๊ทธ๋ฃน์์ ์ต์ํ ํ๋์ ํญ๋ชฉ์ด ํ์ํจ์ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, [leather, staves]์๋ ๊ฐ์ฃฝ๊ณผ ์งํก์ด๊ฐ ํ์ํฉ๋๋ค. ์ด๋ ๋์ ์ธํธ์ด๋ฉฐ ๋์ด๋ ์ท์ฅ ์ ์ฒด๋ฅผ ์ฐฉ์ฉํด์ผ ํ๋ ์๊ตฌ ์ฌํญ์ ์๋๋๋ค.
- ๊ธ์ง๋ ํญ๋ชฉ์ ์ฐฉ์ฉํ ๋ชจ๋ ํญ๋ชฉ์ ํ์ ํญ๋ชฉ์ด ์ถฉ์กฑ๋๋๋ผ๋ ์ด ๊ท์น์์ ์บ๋ฆญํฐ๋ฅผ ์ ์ธํฉ๋๋ค. ๊ฐ์ฃฝ๊ณผ ๊ธ์ง๋ ์ฒด์ธ์ ๊ฐ์ฃฝ ๊ท์ ์ ํต๊ณผํ์ง ๋ชปํฉ๋๋ค. ๋ค๋ฅธ ๊ท์น์ ๊ณ์ ํ ์คํธ๋ฉ๋๋ค.
- ๋ฐฐ๋ญ 21์ ์ ์ธํ๊ณ ๋ ์ด์ด 1..24์ ์ฐฉ์ฉํ ์์ดํ ๋ง ํฌํจ๋ฉ๋๋ค. ๋ฐฐ๋ญ/๊ฐ์ด, ๋ง์ดํธ 25, ํ์ฐฝ 26..28 ๋ฐ ์ํ 29์ ๋ด์ฉ๋ฌผ์ ์๋ฅ๋ก ๊ฐ์ฃผ๋์ง ์์ต๋๋ค. graphic/type๋ฅผ ๋น๊ตํฉ๋๋ค. serial, ์ด๋ฆ ๋ฐ hue ํญ๋ชฉ์ ์ฌ๊ธฐ์ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
- ์ ์ ํ ์ฅ๋น๊ฐ ๋ก๋๋์ง ์์ผ๋ฉด ๋ชฉ๋ก์ด ์ผ์นํ์ง ์์ต๋๋ค. ์๋ฒ๊ฐ ์์ง ์ฅ๋น๋ฅผ ์ ์กํ์ง ์์ ๊ฒฝ์ฐ ๋ก์ปฌ ๋ฐ์ดํฐ์ ๊ธ์ง ํญ๋ชฉ์ด ์๋ค๊ณ ํด์ ์๋ฒ์ ํด๋น ํญ๋ชฉ์ด ์์์ ์ฆ๋ช ํ๋ ๊ฒ์ ์๋๋๋ค. ํด๋ผ์ด์ธํธ๋ ์จ๊ฒจ์ง ๋ฐ์ดํฐ๋ฅผ ์ถ์ธกํ์ง ์์ต๋๋ค.
- ๊ท์น์ ํด๋น ๊ธฐ๋ฅ๊ณผ ํฌํจ์ ํฌํจํ์ฌ ํ๋์ ๋ฐํ์ ์คํฌ๋ฆฝํธ์ ์ํฉ๋๋ค. ๋ค๋ฅธ ๋ ๋ฆฝ์ ์ธ ์คํ์ผ๋ก ์ ์ก๋์ง ์์ผ๋ฉฐ ํ๋กํ์ ์ ์ฅ๋์ง ์์ต๋๋ค. ๋ค์ ์์ํ ๋ ์ผ๋ฐ ์ค์ ์ ์ฐจ ๋ฑ์ ํตํด ๋ค์ ์ ์ํ์ญ์์ค. ๋ฐ๋ณต๋๋ SetClassMask๋ ์ ๋ฐ์ดํฐ๊ฐ ์์ ํ ๊ฒ์ฆ๋ ํ์๋ง ๊ท์น์ ๋์ผํ ์ด๋ฆ์ผ๋ก ๋์ฒดํฉ๋๋ค.
- ๋ฐฐ์ด์ ๋ฑ๋ก ์ค์ ๋ณต์ฌ๋ฉ๋๋ค. ์๋ ๋ฐฐ์ด์ ๋ณ๊ฒฝํด๋ ๊ท์น์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. SetClassMask๋ฅผ ๋ฐ๋ณตํ์ธ์. ์ฌ๋ฌ ์ผ์น ๊ท์น์ classMask์ ์ด๋ฆ ์์์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค. ํ์ค ์๋ฒ ์๋ฅ ํ ์ด๋ธ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.SetClassMask("simple_sword", 0x0F5E);
UO.Print("SetClassMask: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- DTMH - ๋น์ ์ด๋ฆ๋ง์. myLeather/forbiddenChain์ ๊ฐ์ ์์์ ๋๋ค. ์๋ฒ์ ์ค์ graphic๋ก ๋์ฒด/๋ณด์ถฉํ์ธ์. ํ๋ซ ๋ชฉ๋ก์ ์ ์ฒด ์ธํธ๊ฐ ์๋ OR๋ฅผ ์๋ฏธํฉ๋๋ค.
var myLeather = Gear(0x13C4, 0x13C7);
var forbiddenChain = Gear(0x13BF, 0x13C0);
UO.SetClassMask("DTMH", myLeather, forbiddenChain);
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "DTMH", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("leather_enemy", enemy);
}
dynamic Gear(params dynamic[] values)
{
return values;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- DTMH๊ฐ ๋จผ์ ์ ํ๋ฉ๋๋ค. ์ ํฉํ DTMH๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง - ๋ฌด๊ฒ๊ณ ์ฌ๋ฅ๊พผ์ ๋๋ค. 10 ์ ์ DTMH๋ 2 ์ ์ Heavy๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ต๋๋ค. ์์๋ฅผ ๋ฐ๊พธ๋ ค๋ฉด classMask ์ค์ ๋ณ๊ฒฝํ์ธ์. ๋ ๊ฐ์ DTMH ์ค ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒ์ด ์ ํ๋ฉ๋๋ค.
- ๊ธฐ์ด๋ ๋ณ๋์ ๋ช ๋ น UO์ด ์๋ ์์ ํ ์ถ์๋ ์ฌ์ฉ์ ๊ธฐ๋ฅ C#์ ๋๋ค. Gear(๊ฐ์ฃฝ, ์งํก์ด)์ ๋ ๋ฐฐ์ด์ ๋ ๊ฐ์ ํ์ ๊ทธ๋ฃน์ ๊ตฌ์ฑํฉ๋๋ค. ๊ฐ์ฃฝ์ ์ ํ์ ์ถ๊ฐํ๋ฉด ๋์์ด ํ์ฅ๋ฉ๋๋ค. ๋ ๊ฐ์ ๊ฐ์ฃฝ ์์ดํ ์ ์ฐฉ์ฉํ ํ์๊ฐ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var leather = Gear(0x13C4, 0x13C7);
var staves = Gear(0x0DF0, 0x0E81);
var chain = Gear(0x13BF, 0x13C0);
var plate = Gear(0x1415, 0x1411);
var bows = Gear(0x13B2, 0x0F50);
UO.SetClassMask("DTMH", Gear(leather, staves), chain);
UO.SetClassMask("ะพั
ะพัะฝะธะบ", bows);
UO.SetClassMask("ััะถัะปัะน", plate);
var notoriety = "5|6";
var distance = 12;
var body = -1;
var maxZ = 8;
dynamic nearest = true;
var color = -1;
var classMask = "DTMH|ััะถัะปัะน|ะพั
ะพัะฝะธะบ";
dynamic aliveOnly = true;
dynamic visibleOnly = true;
var enemy = UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly);
if (Truth(enemy == 0))
{
UO.Print("No matching enemy; no attack sent");
return null;
}
UO.AddObject("selected_enemy", enemy);
return null;
}
dynamic Gear(params dynamic[] values)
{
return values;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ณ์ ํ์[1]๋ฅผ ์ ์ธํ๋ฉด ์ธ๋ฑ์ค 0 ๋ฐ 1๊ฐ ์๋ ๋ ์์๊ฐ ์์ฑ๋ฉ๋๋ค. ๋ ๊ฐ์ ์ค์ฒฉ๋ ๊ทธ๋ฃน์๋ ๋ชธํต๊ณผ ๋ฌด๊ธฐ๊ฐ ํ์ํฉ๋๋ค. flat [torsoType,weaponType]์ ๋ชธํต ๋๋ ๋ฌด๊ธฐ๋ฅผ ์๋ฏธํฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
dynamic[] required = new dynamic[checked((int)(1) + 1)];
dynamic[] torso = new dynamic[checked((int)(0) + 1)];
dynamic[] weapon = new dynamic[checked((int)(0) + 1)];
torso[0] = 0x13C4;
weapon[0] = 0x0DF0;
required[0] = torso;
required[1] = weapon;
UO.SetClassMask("ะผะพะน_ะบะพะผะฟะปะตะบั", required);
var enemy = UO.AttackNearest(5, 6, -1, 4, true, -1, "ะผะพะน_ะบะพะผะฟะปะตะบั", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("outfit_enemy", enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฌ๋ฑ๋กํ๋ฉด ๊ท์น ์ฌ๋ณธ์ด ๋์ฒด๋ฉ๋๋ค. ์ด์ ์ด๋ฆ์ ๋์ผํ๊ฒ ์ ์ง๋๋ฏ๋ก ์ฐ์ ์์ ํ์ ๋ค์ ์์ฑํ ํ์๊ฐ ์์ต๋๋ค.
dynamic[] allowed = new dynamic[checked((int)(0) + 1)];
allowed[0] = 0x13B2;
UO.SetClassMask("ะฟัะธะพัะธัะตัะฝัะน", allowed);
allowed[0] = 0x0F50;
UO.SetClassMask("ะฟัะธะพัะธัะตัะฝัะน", allowed);
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "ะฟัะธะพัะธัะตัะฝัะน", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("updated_outfit", enemy);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: name (Any), required (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [SetClassMask]. -
InjectionScript.Runtime.InjectionApiUO.SetClassMask:SetClassMask(args).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
args => new InjectionValue(SetClassMask(args))๋งค๊ฐ๋ณ์: name (Any), required (Any), forbidden (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [SetClassMask]. -
InjectionScript.Runtime.InjectionApiUO.SetClassMask:SetClassMask(args).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
args => new InjectionValue(SetClassMask(args))ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetWarMode(object? value);์บ๋ฆญํฐ์ ์ ํฌ ๋ชจ๋ ๋๋ ํํ ๋ชจ๋๋ฅผ ์์ฒญํฉ๋๋ค.
-
value- 0 - ํํ ๋ชจ๋; 0์ด ์๋ ์ ์๋ ์ ํฌ ๋ชจ๋์ ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- WarMode๋ ๋ชจ๋๋ฅผ GameActions๋ก ์ ๋ฌํฉ๋๋ค.ToggleWarMode: 0๋ ๋นํ์ฑํ๋๊ณ 0์ด ์๋ ๊ฐ์ ํ์ฑํ๋ฉ๋๋ค. ํ๋ ์ด์ด๊ฐ ์์ผ๋ฉด ์๋ฌด ์์ ๋ ์ํ๋์ง ์์ต๋๋ค.
- Bridge๋ ๊ฒ์ ์คํธ๋ฆผ์ ๋ํ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์๋ฒ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ด์ฅ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetWarMode");
UO.SetWarMode(1);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์บ๋ฆญํฐ์ ์ ํฌ ๋ชจ๋ ๋๋ ํํ ๋ชจ๋๋ฅผ ์์ฒญํฉ๋๋ค.
UO.SetWarMode(1);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- WarMode๋ ๋ชจ๋๋ฅผ GameActions๋ก ์ ๋ฌํฉ๋๋ค.ToggleWarMode: 0๋ ๋นํ์ฑํ๋๊ณ 0์ด ์๋ ๊ฐ์ ํ์ฑํ๋ฉ๋๋ค. ํ๋ ์ด์ด๊ฐ ์์ผ๋ฉด ์๋ฌด ์์ ๋ ์ํ๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.SetWarMode(0);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Bridge๋ ๊ฒ์ ์คํธ๋ฆผ์ ๋ํ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์๋ฒ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ด์ฅ์ ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
ApplyMode(1);
return null;
}
void ApplyMode(dynamic mode)
{
UO.SetWarMode(mode);
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.WarMode:WarMode(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setwarmode": WarMode(Arg(0)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Specmove(object? direction);
void UO.Specmove(object? direction, object? running);ํ ๋จ๊ณ ์์ฒญ์ ๋ธ๋ฆฌ์ง์ ์ง์ ๋ณด๋ ๋๋ค.
-
directionโ int; ๋ฐฉํฅ ๋ฐ 7 daรซt 0..7 N,NE,E,SE,S,SW,W,NW. -
running- ์ ํ์ ์ซ์ ํ๋๊ทธ int: 0/none - ๊ฑท๊ธฐ, 0์ด ์๋ - ๋ฌ๋ฆฌ๊ธฐ.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ExecuteLegacyManualAlias ๋ธ๋ฆฌ์ง๋ฅผ ํธ์ถํฉ๋๋ค.Step(๋ฐฉํฅ & 7, ์คํ != 0) ๋ชจ๋ ๊ฒฐ๊ณผ ์ฝ๋ 0/2/3/4/5/7; void๋ ๋ฐ์ผ๋ก ๋์์ต๋๋ค. ์ด๊ฒ์ ๊ฒฝ๋ก๊ฐ ์๋ ํ ๋จ๊ณ/ํ์ ์ ๋๋ค. Step~10000 ms ์ด๋ด์ ๋๊ธฐ๋ ์ ์ง๋์ง๋ง ์คํฌ๋ฆฝํธ๋ ์น์ธ, ์คํจ ๋๋ ํ์์์ ์ฝ๋๋ฅผ ๋ฐ์ง ๋ชปํฉ๋๋ค.
- ๋ถ๊ธฐ๊ฐ UO.Step์ ๋ฐํ์ ์กฐ๊ฑด MoveCheckStamina/MoveExitOnDisconnect/MoveOpenDoor์ ์ถฉ์กฑํ์ง ์์ต๋๋ค. Bridge/Player.Walk ์์ฒด์ ์๋ฒ๋ ์ฌ์ ํ ์์ง์์ ํ์ธํฉ๋๋ค.
- ๊ฒ์ ์คํธ๋ฆผ์ QueueStep๋ ํ๋ ์ด์ด, ์ฐ๊ฒฐ, ๋ฐฉํฅ, ๋๊ธฐ์ด, ํ ํฌ ๋ฐ ๋ก์ปฌ ํธ๋ํฝ์ ํ์ธํฉ๋๋ค. Player.Walk ์ด์ ์๋ ๊ฐ ํธ์ถ์ด ํด๋น ์ํ์ค์ Walker์ ํ์ธ/๊ฑฐ๋ถ ์ธ๋๋ฅผ ๋ณ๋๋ก ๊ธฐ๋กํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด ์ค๋ ์ท๊ณผ ํจ๊ป Result๋ฅผ ๋ฐํํฉ๋๋ค. Step ๋ฐ ๋ณด๋ฅ ์ค StepControlled ๋ค์ ์์ฒญ์ ๊ณตํต ํ๋๊ฐ ์๋ ์ด ์ ์ฅ๋ ์๋ง ํ์ธํฉ๋๋ค. ๊ต์ฒด ํ๋ ์ด์ด/์์ปค๋ ์ผ๋ฐ์ ์ธ ๊ฑฐ๋ถ๋ก ๋๊ธฐ๋ฅผ ์ข ๋ฃํฉ๋๋ค. ๋ค๋ฅธ ์ผ๋ฐ ๋ช ๋ น์ ํ์ธํ๋ค๊ณ ํด์ ์ด ๋จ๊ณ๊ฐ ํ์ธ๋๋ ๊ฒ์ ์๋๋๋ค. ์์ง์์ด ์๋ ํ์ ์ ๋ณ๋์ ๊ฒฝ์ฐ๋ก ์ ์ง๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Specmove");
UO.Specmove(0);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ ๋จ๊ณ ์์ฒญ์ ๋ธ๋ฆฌ์ง์ ์ง์ ๋ณด๋ ๋๋ค.
UO.Specmove(0);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteLegacyManualAlias๋ bridge.Step(direction&7,running!=0)์ ํธ์ถํ ๋ค์ ๋ฐํ๋ 1/0๋ฅผ ์ญ์ ํฉ๋๋ค. ์ด๋ ํ ๋จ๊ณ์ด์ง ์ขํ๋ก ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์๋๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Specmove(2, 1);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ถ๊ธฐ๊ฐ UO.Step์ ๋ฐํ์ ์กฐ๊ฑด MoveCheckStamina/MoveExitOnDisconnect/MoveOpenDoor์ ์ถฉ์กฑํ์ง ์์ต๋๋ค. Bridge/Player.Walk ์์ฒด์ ์๋ฒ๋ ์ฌ์ ํ ์์ง์์ ํ์ธํฉ๋๋ค.
์ต์ ๊ฑธ์ ๊ฐ๊ฒฉ: ๊ฑท๊ธฐ - ๊ฑท๊ธฐ 400 ms, ๋ฌ๋ฆฌ๊ธฐ 200 ms; ๋ผ์ด๋ฉ - ๊ฑท๊ธฐ 200 ms, ๋ฌ๋ฆฌ๊ธฐ 100 ms.
์ด๋ ์ค๋์ ๋ํด ์๋์ผ๋ก ์ ์๋ ์ค์ ์ด ์๋ ํ์ค ํด๋ผ์ด์ธํธ ์ ํ์ ๋๋ค. ์๋ฒ ์๋์ ๋นํ ๋ชจ๋๋ ๋ณ๋๋ก ๊ณ์ฐ๋ฉ๋๋ค. ์คํฌ๋ฆฝํธ ํ์ด๋จธ๋ ์ด๋ ์๋๋ฅผ ๋ฆ์ถ ์ ์์ง๋ง ์ด๋ฌํ ์ ํ์ ์ค์ด์ง๋ ์์ต๋๋ค.
๋จ๊ณ, ๊ฒฝ๋ก, Follow, ๋ง์ฐ์ค/ํค ์ ์ด ๋ฐ ์ง๋๋ ์บ๋ฆญํฐ์ ๊ณต์ ๋๊ธฐ์ด์ ์ฌ์ฉํฉ๋๋ค. ์๋ฒ๊ฐ ๊ฒฝ๋ก๋ฅผ ๋ฐ๊พธ๊ฑฐ๋ ๋ฐฉํฅ์ ๋ฐ๊พธ๊ฑฐ๋ ์์น๋ฅผ ์กฐ์ ํด๋ ๊ฑธ์ ์์ฒญ ํ ๋จ์ ์ผ์์ ์ง๋ ์ทจ์๋์ง ์์ต๋๋ค. ์ง์ฐ ํ์๋ ์์ค๋ ํ๋ ์์ ๋ณด์ํ ๋น ๋ฅธ ๋ฒ์คํธ๊ฐ ์์ต๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ฅ์ ๋ฌผ, ์์ฌ์ํต ๋ถ๋์ผ๋ก ์ธํด ์์ง์์ด ๋๋ ค์ง ์ ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.GetX();
UO.Specmove(2, 0);
UO.Wait(500);
UO.Print(UO.GetX() - before);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: direction (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Step:bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "specmove": bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0); break;๋งค๊ฐ๋ณ์: direction (Any), running (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Step:bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "specmove": bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.UseAbility(object? abilityId);ํ์ฌ ๋ฌด๊ธฐ์ ์ฌ์ฉํ ์ ์๋ ๋ฅ๋ ฅ์ ์์ฒญํฉ๋๋ค.
-
abilityId- ๋ฅ๋ ฅ์ ์ด๋ฆ ๋๋ int ID 1..AbilityData.Abilities.Length. ์ด๋ฆ์ ์ ๊ทํ๋ฉ๋๋ค. ๋ฌธ์/์ซ์๋ง ๋๋ฌธ์๋ก ์ ์ฅ๋๊ณ ๋น๊ต๋ฉ๋๋ค. ์ซ์ ํ ์คํธ๋ ID๋ฅผ ์๋ฏธํฉ๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 - ID๋ ํ์ฌ ํ๋ ์ด์ด์ ๊ธฐ๋ณธ/๋ณด์กฐ ๋ฅ๋ ฅ๊ณผ ์ผ์นํ๋ฉฐ ํด๋น GameActions๊ฐ ํธ์ถ๋ฉ๋๋ค. 0 - ํ๋ ์ด์ด ์์, ์ ์ ์์ ID/์ด๋ฆ ๋๋ ๋ฅ๋ ฅ์ด ํ์ฌ ๋ฌด๊ธฐ์ ์ํ์ง ์์ต๋๋ค.
- ๋ฌธ์์ด ํ์์ ResolveAbility๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ซ์ ์ฆ์ ๋ธ๋ฆฌ์ง.UseAbility. ํ์ฌ ๋ ๊ฐ์ง ๋ฅ๋ ฅ์์ 0x80๋ฅผ ๋ง์คํฌํ๊ณ ID์ ์ผ์น์ํจ ๋ค์ UsePrimaryAbility ๋๋ UseSecondaryAbility๋ฅผ ํธ์ถํฉ๋๋ค.
- ์ด๋ ์ ์ค, ๋ง๋ ์๋ชจ ๋๋ ์๋ฒ ํ์ฑํ ํ์ธ์ด ์๋ ๋ก์ปฌ ์์ฒญ์ ์๋ฝํ๋ ๊ฒ์ ๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ ID๋ GetWeaponAbilities๋ก ์ฝํ์ง๋ฉฐ, ํ์ฑ ์ด๋ฆ์ GetActiveAbility์ ๋๋ค.
- GameActions๋ ๋ฅ๋ ฅ ์ ํ ๋นํธ 0x80๋ฅผ ํ ๊ธํฉ๋๋ค. ์ด๋ฏธ ์ ํ๋ ๋ฅ๋ ฅ์ ID 0๋ฅผ ๋ณด๋ด๊ณ ์ ํ์ ์ทจ์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ ์ ํ ๋นํธ๊ฐ ๋ชจ๋ ์ง์์ง๊ณ ์ ํ๋ ID๊ฐ ์ ์ก๋ ๋ค์ ํด๋น ๋นํธ๊ฐ ๋ก์ปฌ๋ก ์ค์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ค์ ํธ์ถํ๋ฉด ๋ฅ๋ ฅ์ด ๊บผ์ง ์ ์์ต๋๋ค. ๋ก์ปฌ ๋ณ๊ฒฝ์ด ์ฑ๊ณต์ ์ธ ์ ์ค์ด๋ ์๋ฒ ํ์ธ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.UseAbility("Armor Ignore");
UO.Print("UseAbility: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ๋ฌด๊ธฐ์ ์ฌ์ฉํ ์ ์๋ ๋ฅ๋ ฅ์ ์์ฒญํฉ๋๋ค.
UO.Print(UO.UseAbility("Armor Ignore"));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฌธ์์ด ํ์์ ResolveAbility๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ซ์ ์ฆ์ ๋ธ๋ฆฌ์ง.UseAbility. ํ์ฌ ๋ ๊ฐ์ง ๋ฅ๋ ฅ์์ 0x80๋ฅผ ๋ง์คํฌํ๊ณ ID์ ์ผ์น์ํจ ๋ค์ UsePrimaryAbility ๋๋ UseSecondaryAbility๋ฅผ ํธ์ถํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var abilities = UO.GetWeaponAbilities();
if (Truth(UO.GetArrayLength(abilities) > 0))
{
UO.Print(UO.UseAbility(abilities[0]));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด๋ ์ ์ค, ๋ง๋ ์๋ชจ ๋๋ ์๋ฒ ํ์ฑํ ํ์ธ์ด ์๋ ๋ก์ปฌ ์์ฒญ์ ์๋ฝํ๋ ๊ฒ์ ๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ ID๋ GetWeaponAbilities๋ก ์ฝํ์ง๋ฉฐ, ํ์ฑ ์ด๋ฆ์ GetActiveAbility์ ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var id = UO.GetAbilityID("Armor Ignore");
if (Truth(id > 0))
{
var accepted = UO.UseAbility(id);
UO.Print(accepted);
UO.Print(UO.GetActiveAbility());
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: abilityId (Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UseAbility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseAbility:bridge.UseAbility(abilityId).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int UseAbility(int abilityId) => bridge.UseAbility(abilityId);๋งค๊ฐ๋ณ์: abilityId (Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UseAbility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ResolveAbility:bridge.ResolveAbility(abilityName). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseAbility:bridge.UseAbility(abilityId).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int UseAbility(string abilityName)
{
int abilityId = bridge.ResolveAbility(abilityName);
return abilityId > 0 ? bridge.UseAbility(abilityId) : 0;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.UsePrimaryAbility();๋ฌด๊ธฐ์ ์ฃผ์ ๋ฅ๋ ฅ์ ์ํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- UsePrimaryAbility๋ Invoke๋ฅผ ํตํด GameActions.UsePrimaryAbility(_world)๋ฅผ ์ ์กํฉ๋๋ค. ๋ฐํ๋ ์๋ฝ ํ์๊ฐ ์์ต๋๋ค. ํ์ฑ ๋ฅ๋ ฅ์ ๋ณ๋๋ก ํ์ธ๋ฉ๋๋ค.
- ์์ ์์ UO.Wait๋ ์คํฌ๋ฆฝํธ ์ผ์ ์ค์ง๋ง ์ง์ ํฉ๋๋ค. ์ผ์ ์ค์ง๊ฐ ๋๋ฌ๋ค๊ณ ํด์ ์๋ฒ๊ฐ ์์ฒญ์ ์๋ฃํ์์ ์ฆ๋ช ํ๋ ๊ฒ์ ์๋๋๋ค.
- GameActions๋ ๋ฅ๋ ฅ ์ ํ ๋นํธ 0x80๋ฅผ ํ ๊ธํฉ๋๋ค. ์ด๋ฏธ ์ ํ๋ ๋ฅ๋ ฅ์ ID 0๋ฅผ ๋ณด๋ด๊ณ ์ ํ์ ์ทจ์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ ์ ํ ๋นํธ๊ฐ ๋ชจ๋ ์ง์์ง๊ณ ์ ํ๋ ID๊ฐ ์ ์ก๋ ๋ค์ ํด๋น ๋นํธ๊ฐ ๋ก์ปฌ๋ก ์ค์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ค์ ํธ์ถํ๋ฉด ๋ฅ๋ ฅ์ด ๊บผ์ง ์ ์์ต๋๋ค. ๋ก์ปฌ ๋ณ๊ฒฝ์ด ์ฑ๊ณต์ ์ธ ์ ์ค์ด๋ ์๋ฒ ํ์ธ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.UsePrimaryAbility");
UO.UsePrimaryAbility();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฌด๊ธฐ์ ์ฃผ์ ๋ฅ๋ ฅ์ ์ํํฉ๋๋ค.
UO.UsePrimaryAbility();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UsePrimaryAbility๋ Invoke๋ฅผ ํตํด GameActions.UsePrimaryAbility(_world)๋ฅผ ์ ์กํฉ๋๋ค. ๋ฐํ๋ ์๋ฝ ํ์๊ฐ ์์ต๋๋ค. ํ์ฑ ๋ฅ๋ ฅ์ ๋ณ๋๋ก ํ์ธ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.GetWeaponAbilities());
UO.UsePrimaryAbility();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ ์์ UO.Wait๋ ์คํฌ๋ฆฝํธ ์ผ์ ์ค์ง๋ง ์ง์ ํฉ๋๋ค. ์ผ์ ์ค์ง๊ฐ ๋๋ฌ๋ค๊ณ ํด์ ์๋ฒ๊ฐ ์์ฒญ์ ์๋ฃํ์์ ์ฆ๋ช ํ๋ ๊ฒ์ ์๋๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.UsePrimaryAbility();
UO.Print(UO.GetActiveAbility());
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UsePrimaryAbility:bridge.UsePrimaryAbility().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "useprimaryability": bridge.UsePrimaryAbility(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.UseSecondaryAbility();์ถ๊ฐ ๋ฌด๊ธฐ ๋ฅ๋ ฅ์ ์ํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- UseSecondaryAbility๋ Invoke๋ฅผ ํตํด GameActions.UseSecondaryAbility(_world)๋ฅผ ์ ์กํฉ๋๋ค. ๋ฐํ๋ ์๋ฝ ํ์๊ฐ ์์ต๋๋ค. ํ์ฑ ๋ฅ๋ ฅ์ ๋ณ๋๋ก ํ์ธ๋ฉ๋๋ค.
- ์์ ์์ UO.Wait๋ ์คํฌ๋ฆฝํธ ์ผ์ ์ค์ง๋ง ์ง์ ํฉ๋๋ค. ์ผ์ ์ค์ง๊ฐ ๋๋ฌ๋ค๊ณ ํด์ ์๋ฒ๊ฐ ์์ฒญ์ ์๋ฃํ์์ ์ฆ๋ช ํ๋ ๊ฒ์ ์๋๋๋ค.
- GameActions๋ ๋ฅ๋ ฅ ์ ํ ๋นํธ 0x80๋ฅผ ํ ๊ธํฉ๋๋ค. ์ด๋ฏธ ์ ํ๋ ๋ฅ๋ ฅ์ ID 0๋ฅผ ๋ณด๋ด๊ณ ์ ํ์ ์ทจ์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ ์ ํ ๋นํธ๊ฐ ๋ชจ๋ ์ง์์ง๊ณ ์ ํ๋ ID๊ฐ ์ ์ก๋ ๋ค์ ํด๋น ๋นํธ๊ฐ ๋ก์ปฌ๋ก ์ค์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ค์ ํธ์ถํ๋ฉด ๋ฅ๋ ฅ์ด ๊บผ์ง ์ ์์ต๋๋ค. ๋ก์ปฌ ๋ณ๊ฒฝ์ด ์ฑ๊ณต์ ์ธ ์ ์ค์ด๋ ์๋ฒ ํ์ธ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.UseSecondaryAbility");
UO.UseSecondaryAbility();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ถ๊ฐ ๋ฌด๊ธฐ ๋ฅ๋ ฅ์ ์ํํฉ๋๋ค.
UO.UseSecondaryAbility();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UseSecondaryAbility๋ Invoke๋ฅผ ํตํด GameActions.UseSecondaryAbility(_world)๋ฅผ ์ ์กํฉ๋๋ค. ๋ฐํ๋ ์๋ฝ ํ์๊ฐ ์์ต๋๋ค. ํ์ฑ ๋ฅ๋ ฅ์ ๋ณ๋๋ก ํ์ธ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.GetWeaponAbilities());
UO.UseSecondaryAbility();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ ์์ UO.Wait๋ ์คํฌ๋ฆฝํธ ์ผ์ ์ค์ง๋ง ์ง์ ํฉ๋๋ค. ์ผ์ ์ค์ง๊ฐ ๋๋ฌ๋ค๊ณ ํด์ ์๋ฒ๊ฐ ์์ฒญ์ ์๋ฃํ์์ ์ฆ๋ช ํ๋ ๊ฒ์ ์๋๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.UseSecondaryAbility();
UO.Print(UO.GetActiveAbility());
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseSecondaryAbility:bridge.UseSecondaryAbility().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "usesecondaryability": bridge.UseSecondaryAbility(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.WarMode();
void UO.WarMode(object? mode);์บ๋ฆญํฐ์ ์ ํฌ ๋ชจ๋๋ฅผ ์ฝ๊ฑฐ๋ ์ฟผ๋ฆฌํฉ๋๋ค.
-
modeโ ์ ํ์ int: 0๋ ๋นํ์ฑํ๋๊ณ 0์ด ์๋ ๊ฐ์ ํ์ฑํ๋ฉ๋๋ค. ์ธ์๊ฐ ์๋ ํ์์ ์ฝ๊ธฐ๋ง ํฉ๋๋ค.
์ธ์ ์์ ์ซ์ ํ๋๊ทธ int: 1 - ํ์ฌ ํ๋ ์ด์ด๊ฐ ์ ํฌ ๋ชจ๋์ ์์, 0 - ํํ ๋ชจ๋/ํ๋ ์ด์ด ์์. ๋ชจ๋ - null์์๋ ๊ฒฐ๊ณผ๊ฐ ์์ต๋๋ค.
- WarMode()๋ Player.InWarMode๋ฅผ ๋ก์ปฌ์์ ์ฝ์ต๋๋ค. WarMode(๋ชจ๋)๋ ์ ํํ ๋ชจ๋๋ก GameActions.ToggleWarMode๋ฅผ ํธ์ถํฉ๋๋ค. ํ๋ ์ด์ด๊ฐ ์์ผ๋ฉด ์์ฒญ์ด ์คํ๋์ง ์์ต๋๋ค.
- ์ธ์๊ฐ ์๋ ์์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์์ ํ ๋นํ์ง ๋ง์ญ์์ค. ์ฆ์ ๋ค์ ์ฝ๋ ๊ฒ์ ์จ๋ผ์ธ ํ์ธ์ด ์๋๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.WarMode();
UO.Print("WarMode: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์บ๋ฆญํฐ์ ์ ํฌ ๋ชจ๋๋ฅผ ์ฝ๊ฑฐ๋ ์ฟผ๋ฆฌํฉ๋๋ค.
var active = UO.WarMode();
UO.Print(active);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- WarMode()๋ Player.InWarMode๋ฅผ ๋ก์ปฌ์์ ์ฝ์ต๋๋ค. WarMode(๋ชจ๋)๋ ์ ํํ ๋ชจ๋๋ก GameActions.ToggleWarMode๋ฅผ ํธ์ถํฉ๋๋ค. ํ๋ ์ด์ด๊ฐ ์์ผ๋ฉด ์์ฒญ์ด ์คํ๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.WarMode(1);
UO.Wait(250);
UO.Print(UO.WarMode());
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ์์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์์ ํ ๋นํ์ง ๋ง์ญ์์ค. ์ฆ์ ๋ค์ ์ฝ๋ ๊ฒ์ ์จ๋ผ์ธ ํ์ธ์ด ์๋๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.WarMode();
UO.WarMode(0);
UO.Print(before);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WarMode. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WarMode:bridge.WarMode().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int WarMode() => bridge.WarMode();๋งค๊ฐ๋ณ์: mode (Integer)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WarMode. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WarMode:bridge.WarMode(mode).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void WarMode(int mode) => bridge.WarMode(mode);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.WarTargetID();๋ง์ง๋ง ๊ณต๊ฒฉ ๋์์ serial๋ฅผ ์ฝ์ด์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ์ ์ฅ๋จ serial; 0์ serial์ด ์ค์น๋์ง ์์์์ ์๋ฏธํฉ๋๋ค. bool๋ ์๋๊ณ graphic/type๋ ์๋๋๋ค. 0์ด ์๋ ID๋ ์ธ์์ ๋ ์ด์ ์กด์ฌํ์ง ์์ ์ ์์ต๋๋ค.
- ํ๋ ์์ค: bridge.LastAttack. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ์ ํํ๊ฑฐ๋ ์ฌ์ฉํ๊ฑฐ๋ ๊ณต๊ฒฉํ์ง ์์ต๋๋ค.
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.WarTargetID();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ง์ง๋ง ๊ณต๊ฒฉ ๋์์ serial๋ฅผ ์ฝ์ด์ต๋๋ค.
var id = UO.WarTargetID();
UO.Print(Hex(id));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ๋ ์์ค: bridge.LastAttack. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ์ ํํ๊ฑฐ๋ ์ฌ์ฉํ๊ฑฐ๋ ๊ณต๊ฒฉํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.WarTargetID();
if (Truth(id != 0) && Truth(UO.Exists(id)))
{
UO.Print(UO.GetName(id));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.WarTargetID();
UO.Wait(500);
var after = UO.WarTargetID();
UO.Print(before = after);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastAttack:bridge.LastAttack.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "lastattack":
case "wartargetid": return new InjectionValue(bridge.LastAttack);