KO UO Topic magic - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
๋ง๋ฒ์ ์ด์ฉํ ์ฃผ๋ฌธ, ๋ฅ๋ ฅ ๋ฐ ์์ง์. ํ๊ฒ ์ก์ ์ ์ํด์๋ ํ๊ฒ์ ๋ฏธ๋ฆฌ ์ค์ ํ๊ณ ์ ์ฉ ์กฐ๊ฑด์ ํ์ธํ์ธ์.
์ ์ฒด ์นดํ๋ก๊ทธ ๋ฐ ์์ ์ด๊ธฐ
| ์ฃผ์ | ๋ช ๋ น ๋ฐ ์ค๋ช |
|---|---|
| Cast | UO.Cast |
| CastToObject | UO.CastToObject |
| CastAbility | UO.CastAbility |
| Active Spell Ability | UO.IsActiveSpellAbility |
| Spell Timers | UO.TicksSpell |
UO.Cast ยท UO.CastToObject ยท UO.CastAbility ยท UO.IsActiveSpellAbility ยท UO.TicksSpell
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
UO.CancelWaitTarget();
if (Truth(UO.Cast("Cure")))
{
UO.Print("Choose the character with the spell cursor");
}
else
{
UO.Print("Cure request rejected");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
var accepted = UO.CastToObject("Heal", "self");
UO.Print(Convert.ToString(accepted));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.AddGate(object? bookSerial);-
bookSerial๋ ํธํ ์คํฌ๋ฆฝํธ๊ฐ ๋ ๊ฑฐ์ ๋ชฉ๋ก ํญ๋ชฉ์ผ๋ก ์ ์ฅํ๋ ์๋ณ์ ๊ฐ์ ๋๋ค. ํ์ฌ ๋ฐํ์์์๋ ๊ฐ์ด ๋ฌธ์์ด๋ก ์ง๋ ฌํ๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์๋์ ๊ฐ์ฒด๊ฐ ์๋์ง ํ์ธํ์ง ์์ต๋๋ค.
void. ํ์ ์ฑ
์ ๊ฐ์ฉ์ฑ์ด๋ ๊ฒ์ ํฌํธ ์์ฑ์ ํ์ธํ์ง ์์ต๋๋ค.
- ๊ฐ์ ํ์ฌ ๋ฐํ์ ์ํ์ ๋ชฉ๋ก
AddGate์ ์ถ๊ฐ๋ฉ๋๋ค. ClassicUO์์ ์ด ํธํ์ฑ ๋ชฉ๋ก์ ๊ฒ์ ์์ ์ ํธ์ถํ์ง ์์ผ๋ฉฐ ์ฝ์ ์ ์๋ ๋ฌธ์ํ๋ ๊ณต๊ฐ getter๊ฐ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.AddGate");
UO.AddGate("0x40012345");1. ๊ฒ์ดํธ๋ฅผ ์ด์ง ์๊ณ ๋ ID๋ฅผ ๋ ๊ฑฐ์ ๋ฐ์ดํฐ๋ก ์ ์ฅํ ์ ์์ต๋๋ค. - ์ง์ ์คํฌ๋ฆฝํธ
๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฒ์ดํธ๋ฅผ ์ด์ง ์๊ณ ๋ ID๋ฅผ ๋ ๊ฑฐ์ ๋ฐ์ดํฐ๋ก ์ ์ฅํ ์ ์์ต๋๋ค.
UO.AddGate("0x40012345");2. ํธํ๋๋ ์คํฌ๋ฆฝํธ์ ์ ๋ฌ๋ ๋ฌธ์์ด์ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค. - ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ
๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํธํ๋๋ ์คํฌ๋ฆฝํธ์ ์ ๋ฌ๋ ๋ฌธ์์ด์ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var bookSerial = "0x40012345";
UO.AddGate(bookSerial);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฐํ์ ๋ชฉ๋ก AddGate์ ๊ฐ์ ์๋๋ค.
- ํธ์ถ์ ํธํ์ฑ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ทธ๋ ์ธ์์์ ์ฑ ์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
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()
{
RememberGateBook("0x40012345");
return null;
}
void RememberGateBook(dynamic bookSerial)
{
UO.AddGate(bookSerial);
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: bookSerial (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::LegacyList:LegacyList(name). -
InjectionScript.Runtime.InjectionValue.ToString:value.ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "adddir":
case "addfindlist":
case "addgate":
case "addrecall":
case "addstep":
LegacyList(name).Add(string.Join("|", arguments.Select(value => value.ToString())));
break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.AddRecall(object? bookSerial);-
bookSerial๋ ํธํ ์คํฌ๋ฆฝํธ๊ฐ ๋ ๊ฑฐ์ ๋ชฉ๋ก ํญ๋ชฉ์ผ๋ก ์ ์ฅํ๋ ์๋ณ์ ๊ฐ์ ๋๋ค. ๋ฐํ์์ ์ ๋ฌ๋ ๊ฐ์ ๋ฌธ์์ด๋ก ์ง๋ ฌํํฉ๋๋ค.
void. ํธ์ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์์ผ๋ฉฐ ์ฑ
์ด ์๋์ง ํ์ธํ์ง ์์ต๋๋ค.
- ๊ฐ์ ํ์ฌ ๋ฐํ์ ์ํ์ ๋ชฉ๋ก
AddRecall์ ์ถ๊ฐ๋ฉ๋๋ค. ClassicUO์์ ์ด ํธํ์ฑ ๋ชฉ๋ก ์์ฒด๋ ๊ฒ์ ๋ช ๋ น์ ๋ณด๋ด์ง ์์ผ๋ฉฐ ์ฝ์ ์ ์๋ ๋ฌธ์ํ๋ ๊ณต๊ฐ getter๊ฐ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.AddRecall");
UO.AddRecall("0x40012345");1. ๊ฐ์ ํธํ์ฑ ๋ฐ์ดํฐ๋ก ์ ์ฅํ๊ณ Recall์ ์คํํ์ง ๋ง์ญ์์ค. - ์ง์ ์คํฌ๋ฆฝํธ
๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํธํ์ฑ ๋ฐ์ดํฐ๋ก ์ ์ฅํ๊ณ Recall์ ์คํํ์ง ๋ง์ญ์์ค.
UO.AddRecall("0x40012345");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฌธ์์ด ๋ณ์๋ฅผ ํตํด ์๋ณ์๋ฅผ ์ ๋ฌํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var bookSerial = "0x40012345";
UO.AddRecall(bookSerial);
return null;
}3. ๊ฐ ํธ์ถ์ ํ์ฌ ๋ฐํ์์ AddRecall์ ๋ณ๋์ ํญ๋ชฉ์ ์ถ๊ฐํฉ๋๋ค. - ์คํฌ๋ฆฝํธ ํด๋์ค
๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ ํธ์ถ์ ํ์ฌ ๋ฐํ์์ AddRecall์ ๋ณ๋์ ํญ๋ชฉ์ ์ถ๊ฐํฉ๋๋ค.
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.AddRecall("0x40012345");
UO.AddRecall("0x40012346");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: bookSerial (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::LegacyList:LegacyList(name). -
InjectionScript.Runtime.InjectionValue.ToString:value.ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "adddir":
case "addfindlist":
case "addgate":
case "addrecall":
case "addstep":
LegacyList(name).Add(string.Join("|", arguments.Select(value => value.ToString())));
break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Cast(object? spellName);์ด๋ฆ์ผ๋ก ์ฃผ๋ฌธ์ ์ฌ์ฉ์ ์์ฒญํฉ๋๋ค. ์ ํํ ํ๋์ ๋งค๊ฐ๋ณ์: spellName(์: UO.Cast("Heal")). ๋์์ ๋ณ๋๋ก ์ ํ๋ฉ๋๋ค. ๋ง์ฐ์ค๋ก ํ์๋ ์ญ์์ ์ ์ฌ์ฉํ๊ฑฐ๋ Cast ์ WaitTargetObject๋ฅผ ํตํด ์ ํํฉ๋๋ค. ์์ฒญ์ ์๋ฝํ๋ค๊ณ ํด์ ์ฑ๊ณต์ ์ธ ํจ๊ณผ๊ฐ ํ์ธ๋๋ ๊ฒ์ ์๋๋๋ค.
-
spellName- ํ์ ๋ผ์ธ - "Heal", "Cure", "Greater Heal"๊ณผ ๊ฐ์ด ๋ฐ์ดํ๋ก ๋ฌถ์ธ ์ฃผ๋ฌธ์ ์์ด ์ด๋ฆ์ ๋๋ค. ์ด๋ฆ์ ์ธํฐํ์ด์ค์ ํจ๊ป ๋ฒ์ญ๋์ง ์์ต๋๋ค. ์ฌ์ ์ ๋ด์ฅ๋ ๋ณ์นญ๊ณผ ์ฒ ์ ๋จ์ด๋ ์ธ์ํฉ๋๋ค. ๋ฌธ์์ด "29"์ ํฌํจํ ์ซ์ ID, ๋์, ๊ฑฐ๋ฆฌ, ์ ๋ช , maxZ ๋ฐ ๋๊ธฐ๋ Cast ๋งค๊ฐ๋ณ์๊ฐ ์๋๋๋ค. ๋ชจ๋ ์ด๋ฆ ๋ฐ ํ๊ต.
int: 1/true โ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ์๋ฝํ์ต๋๋ค. 0/false - ์ด๋ฆ์ด ์ธ์๋์ง ์๊ฑฐ๋ ์์ฒญ์ด ๋ก์ปฌ์์ ๊ฑฐ๋ถ๋ฉ๋๋ค. if UO.Cast("Heal") { ... }๋ผ๊ณ ์ฐ๊ฑฐ๋ 1/true์ ๋น๊ตํ ์ ์์ต๋๋ค. ์ด๋ ID ์ฃผ๋ฌธ์ด๋ ์น์ /ํผํด์ ์ฆ๊ฑฐ๊ฐ ์๋๋๋ค. ๋๋ฝ๋๊ฑฐ๋ ์ถ๊ฐ๋ ์ธ์๋ก ์ธํด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด ๋ช ๋ น์ ์ฃผ๋ฌธ์ ์กฐ์ค ๋ฐ ์๋ฃ๋ฅผ ๊ธฐ๋ํ์ง ์์ต๋๋ค.
- ๋จ์ผ ํ์: UO.Cast(spellName). ๋ ๋ฒ์งธ ๋๋ ํ์ ์ธ์๊ฐ ์์ต๋๋ค. ๋์ ๊ฒ์, ์๋ต ์ค๋น, ๋๊ธฐ, ์ญ์ ๋ ๋ณ๋์ ๋ช ๋ น์ผ๋ก ์ํ๋ฉ๋๋ค.
- ์๋์ผ๋ก ์ ํํ๋ ค๋ฉด ์ด์ ๋๊ธฐ์ด CancelWaitTarget์ ์ง์ฐ๊ณ Cast์ ํธ์ถํ ๋ค์ ์ญ์์ ์ผ๋ก ์ํ๋ ๊ฐ์ฒด๋ฅผ ํด๋ฆญํ์ธ์. Cast ์์ฒด๋ ๋๊ธฐ์ด์ ์ง์ฐ์ง ์์ต๋๋ค. ์คํฌ๋ฆฝํธ๊ฐ ๋ฏธ๋ฆฌ ๋๊ธฐ์ด์ ์ค๋นํ์ ์๋ ์์ต๋๋ค.
- ์๋ ๋์์ ๊ฒฝ์ฐ ๋จผ์ WaitTargetObject(serial/alias)๋ฅผ ํธ์ถํ ๋ค์ Cast(์ด๋ฆ)์ ํธ์ถํฉ๋๋ค. ์ด ๋ช ๋ น์ ์ฌ์ฉํ๋ฉด ์๋ฒ์ ๋น ๋ฅธ ์กฐ์ค์ ๋์ํ ์ ์์ต๋๋ค. ๋ฒ์๊ฐ ์๋ ์ฃผ๋ฌธ์ ๊ฒฝ์ฐ ๋ต๋ณ์ ์ค๋นํ์ง ๋ง์ธ์.
- ์๋ฒ๋ ์ฃผ๋ฌธ์ ๊ฐ์ฉ์ฑ, ์์, ์ ํจํ ๋์, ๋ฒ์ ๋ฐ ํจ๊ณผ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ๊ธ์ ์ ์ธ ๊ฒฐ๊ณผ๋ ํด๋น ์์ฒญ์ด ํ์ง์์ ์๋ฝ๋์์์ ํ์ธํ๋ ๊ฒ์ ๋๋ค.
- ์๋ฒ์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ค๋น๋ ๋๊ธฐ์ด์ด ๋ฌด์ธ ์ํ๋ก ์ ์ง๋ ์ ์์ต๋๋ค. ์ ํ๋ ๋๊ธฐ ๋๋ ๋ก์ปฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ ํ์๋ CancelWaitTarget๋ฅผ ์ ๊ฑฐํ์ธ์. ๋์๊ณผ ๋์์ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ง ๋ง์ญ์์ค.
- ์๋ฝ๋ ์์ฒญ์ด TicksSpell๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. Cast๋ HP์ด ํ์ฑํ๋๊ฑฐ๋ ์น์ ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ์นดํ๋ก๊ทธ ID๋ ๋ด๋ถ ํ๋กํ ์ฝ์ ์ค๋ช ํ์ง๋ง ์ธ์์ ์ด๋ฆ์ ๋์ฒดํ์ง๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Cast("Cure");
UO.Print("Cast: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์น๋ฃ๋ Cast์ ๋ํ ์ ์ผํ ์ฃผ์ฅ์ ๋๋ค. ์คํ ํ ๊ฒ์ ์กฐ์ค๊ฒฝ์ ์ฌ์ฉํ์ฌ ์บ๋ฆญํฐ๋ฅผ ์ ํํ์ธ์. ์๋ฒ ์ฅ์ ๋ฐ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด์ธ์.
UO.CancelWaitTarget();
if (Truth(UO.Cast("Cure")))
{
UO.Print("Choose the character with the spell cursor");
}
else
{
UO.Print("Cure request rejected");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- self โ ์ธ์ WaitTargetObject; ์น์ ๋ Cast์ ์ ์ผํ ์ฃผ์ฅ์ ๋๋ค. 3000 - ์ด ์์์๋ ์กฐ์ค ์๊ฐ์ด 3์ด์ด๋ฉฐ, ์น์ ์๋ฃ๋ฅผ ๋ณด์ฅํ๋ ๊ฒ์ ์๋๋๋ค. ๋ง์ง๋ง์ผ๋ก ๋จ์ ์๋ต๊ณผ ์คํจ ์ ์ญ์ ํฉ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
UO.CancelWaitTarget();
try
{
UO.WaitTargetObject("self");
if (Truth(UO.Cast("Heal")))
{
await Delay(3000);
}
}
finally
{
UO.CancelWaitTarget();
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- spellName, ๋์, cleanupDelayMs - ํจ์ CastAtObject์ ๋งค๊ฐ๋ณ์, ๊ณผ๋ถํ๊ฐ ์๋ UO.Cast. ๋ด๋ถ์ ์ผ๋ก Cast๋ spellName๋ง ํ์ฉํฉ๋๋ค. ASC๋ ๋ฌธ์์ด ID์ ์ซ์๋ก ๋ณํํฉ๋๋ค. 4000 โ ๋๊ธฐ์ด ์ญ์ ์ง์ฐ. true์ ์น๋ฃ์ ์ฑ๊ณต์ด ์๋๋ผ ์์ฒญ์ ์๋ฝ์ ์๋ฏธํฉ๋๋ค.
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 = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(await CastAtObject("Greater Heal", target, 4000)))
{
UO.Print("Request sent; verify healing in the game");
}
return null;
}
async Task<dynamic> CastAtObject(dynamic spellName, dynamic target, dynamic cleanupDelayMs)
{
if (!(Truth(UO.Connected())) || Truth(UO.Dead()) || Truth(target <= 0) || !(Truth(UO.Exists(target))))
{
return false;
}
dynamic accepted = false;
UO.CancelWaitTarget();
try
{
UO.WaitTargetObject(target);
accepted = UO.Cast(spellName);
if (Truth(accepted))
{
await Delay(cleanupDelayMs);
}
}
finally
{
UO.CancelWaitTarget();
}
return accepted;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: spellName (String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Cast. -
InjectionScript.Runtime.NumberConversions.TryStr2Int:NumberConversions.TryStr2Int((spellName ?? string.Empty).Trim(), out _). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("UO.Cast: use one spell name, for example UO.Cast(\"Heal\")."). -
InjectionScript.Runtime.InjectionApiUO.CastCore:CastCore(spellName).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Cast(string spellName)
{
if (NumberConversions.TryStr2Int((spellName ?? string.Empty).Trim(), out _))
{
SystemMessage("UO.Cast: use one spell name, for example UO.Cast(\"Heal\").");
return 0;
}
return CastCore(spellName) ? 1 : 0;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.CastAbility(object? abilityId);UseAbility๋ฅผ ํตํด ํ์ฌ ๋ฌด๊ธฐ์ ํ์ฌ ์ ํ๋ ๋ฅ๋ ฅ์ ์ ํํฉ๋๋ค. ์ด๋ฏธ ์ ํํ ๋ฅ๋ ฅ์ ๋ค์ ํธ์ถํ๋ฉด ์ ํ์ด ์ทจ์๋ฉ๋๋ค.
-
abilityIdโ ResolveClassicUOAbilityId๋ก ํด๊ฒฐ๋๋ ๋ฅ๋ ฅ ์ด๋ฆ ๋๋ ๋ฒํธ ๋ฌธ์์ด; ์ ์ ์๋ ๊ฐ์ 0๋ฅผ ์ ๊ณตํฉ๋๋ค.
int 1 โ ํด๋ผ์ด์ธํธ๊ฐ ํ์ฌ ๊ธฐ๋ณธ/๋ณด์กฐ ๋ฅ๋ ฅ์ ํธ์ถํ์ต๋๋ค. 0 - ์บ๋ฆญํฐ ์์, ์ ์ ์์ ID ๋๋ ๋ฅ๋ ฅ์ด ํ์ฌ ๋ฌด๊ธฐ์ ์ผ์นํ์ง ์์ต๋๋ค.
- 1๋ ์๋ฒ๊ฐ ๋ฆฌ์์ค๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ ์คํ๊ฑฐ๋ ์์ํ๋ ๊ฒ์ด ์๋๋ผ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์๋ฝํ๋ ๊ฒ์ ์ค๋ช ํฉ๋๋ค. ํ์ฌ ์ฃผ/๋ณด์กฐ ๋ฅ๋ ฅ์ด ์๋ ID๋ ๋๋ ํ ๋ฆฌ์ ์์ด๋ 0๋ฅผ ๋ฐํํฉ๋๋ค.
- GameActions.UsePrimaryAbility/UseSecondaryAbility 0x80 ๋นํธ๋ฅผ ํ์ธํ์ธ์. ๋นํธ๊ฐ ๊บผ์ง๋ฉด ๋ค๋ฅธ ์ต์ ์ ์ ํ ์ทจ์ํ๊ณ ์ ํํ ๋ฅ๋ ฅ์ ๋ณด๋ ๋๋ค. ์ด๋ฏธ ํ์ฑํ๋์ด ์์ผ๋ฉด ID 0๋ฅผ ๋ณด๋ด ๋นํ์ฑํํ์ธ์. ๊ทธ๋ฐ ๋ค์ ๋นํธ๊ฐ ์ ํ๋ฉ๋๋ค. 1๋ฅผ ๋ฐํํ๋ฉด ์ข ๋ฃ๋ฅผ ํฌํจํ์ฌ ์ด ํด๋ผ์ด์ธํธ ๋ถ๊ธฐ์ ๋ํ ํธ์ถ์ด ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.CastAbility(UO.GetAbilityID("Armor Ignore"));
UO.Print("CastAbility: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์นดํ๋ก๊ทธ์ ๊ฐ์ฉ์ฑ์ ๋ฌด๊ธฐ ๋งค์นญ๊ณผ ๋ณ๊ฐ์ ๋๋ค.
var id = UO.GetAbilityID("Armor Ignore");
if (Truth(id > 0))
{
var accepted = UO.CastAbility(id);
UO.Print(Convert.ToString(accepted));
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด๋ฆ์ ID๋ก ํ์ธ๋๊ณ ํ์ฌ ๋ฌด๊ธฐ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var accepted = UO.CastAbility("Armor Ignore");
UO.Print(Convert.ToString(accepted));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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 accepted = UO.CastAbility(0);
UO.Print(Convert.ToString(accepted));
return null;
}
}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 ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.CastToObject(object? spellName, object? objID);๋๊ธฐ ์ค์ธ ๋์์ ๋ฐฐ์นํ๊ณ ์ด๋ฆ์ด๋ ์ซ์ ID๋ก ์ฃผ๋ฌธ์ ๋ณด๋ ๋๋ค.
-
spellName- string ๊ณต๋ฐฑ ๋์ ๋ฐ์ค์ ํฌํจํ ์ฃผ๋ฌธ ์ด๋ฆ ๋๋ ๋ธ๋ฆฌ์ง์ ๊ฒฝ์ฐ ์ซ์ ID.Cast. -
objIDโ self/backpack/lasttarget/์ ์ฅ๋ ๊ฐ์ฒด์ ๊ฐ์ฒด ์ผ๋ จ๋ฒํธ ๋๋ ์ง์๋๋ ์ด๋ฆ์ ๋๋ค. ์ซ์ ๋ฌธ์์ด๊ณผ 0x ๋ฌธ์์ด์ ๋ฐํ์์ ์ํด ํด๊ฒฐ๋ฉ๋๋ค.
int/boolean ๊ฒฐ๊ณผ 1 โ ํด๋ผ์ด์ธํธ๊ฐ Cast ์์ฒญ์ ์๋ฝํ์ต๋๋ค. 0 โ ์์ฒญ์ด ๊ฑฐ๋ถ๋์์ต๋๋ค. ์ฃผ๋ฌธ์ ์ฑ๊ณต ์ฌ๋ถ๋ ์๋ฒ์์ ํ์ธ๋์ง ์์ต๋๋ค.
- ๋ฌธ์์ด ํ์์ CastAtTarget๋ฅผ ๊ฑฐ์นฉ๋๋ค. ์ซ์ ํ์์์๋ WaitTargetObject์ ์ ๋ ฅํ ๋ค์ ๋ธ๋ฆฌ์งCast๋ฅผ ์ ๋ ฅํฉ๋๋ค. Cast๊ฐ ์คํจํ๋ฉด ๋ณด๋ฅ ์ค์ธ ๋์์ด ์ทจ์๋ฉ๋๋ค. ์น์ธ๋๋ฉด ticksSpell๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
- Bridge๋ ๋น์์ฑ spellId, ์ฐ๊ฒฐ ์์ ๋ฐ ๋ฐ๋ ๋ฌธ์๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค. ํ์ด๋จธ๋ ์บ์คํธ์ ๋์ด ์๋๋ผ ์ ์ก์ ํ์ํฉ๋๋ค. ๊ฐ์ฒด์ ๋ํ ์ํฅ์ ๊ฒฐ๊ณผ๋ ์๋ฒ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.CastToObject("Heal", "self");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Heal์ self๋ฅผ ๋ค์ ์๋ฒ ์ปค์์ ๋์์ผ๋ก ๋ง๋ญ๋๋ค.
var accepted = UO.CastToObject("Heal", "self");
UO.Print(Convert.ToString(accepted));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ซ์ ํ์์ ID 4๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํฉ๋๋ค. 1๋ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var accepted = UO.CastToObject(4, UO.Self());
UO.Print(Convert.ToString(accepted));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ก์ปฌ ์กด์ฌ ํ์ธ์ ๋๋ฝ๋ lasttarget ์ฌ์ฉ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
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 target = UO.LastTarget();
if (Truth(UO.Exists(target)))
{
var accepted = UO.CastToObject("Greater Heal", target);
UO.Print(Convert.ToString(accepted));
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: spellName (Any), objID (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.CastAtTarget:CastAtTarget(arguments[0], arguments[1]). -
InjectionScript.Runtime.InjectionApiUO.WaitTargetObject:WaitTargetObject(Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Cast:bridge.Cast(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.Timer:Timer(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CancelTarget:bridge.CancelTarget().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "casttoobject":
if (arguments[0].Kind == InjectionValueKind.String)
return CastAtTarget(arguments[0], arguments[1]) != 0 ? InjectionValue.True : InjectionValue.False;
WaitTargetObject(Arg(1));
int castAccepted = bridge.Cast(Arg(0));
if (castAccepted != 0)
{
ticksSpell = Timer();
return InjectionValue.True;
}
bridge.CancelTarget();
return InjectionValue.False;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.IsActiveSpellAbility(object? spellName);์๋ฒ๊ฐ ์ ํํ ๋ฅ๋ ฅ/์ฃผ๋ฌธ์ ํ์ฑ ์ํ๋ฅผ ๋ณด๊ณ ํ๋์ง ํ์ธํฉ๋๋ค. ์ฑ๋๋ง ๋ฅ๋ ฅ์ ๋ค์ ํ์ฑํํ๊ธฐ ์ ์ ์ ์ฉํฉ๋๋ค. ์๋ฌด ๊ฒ๋ ์ผ์ง์ง ์์ผ๋ฉฐ, ๋์์ ์์ ํ๊ฑฐ๋ ์ ํํ์ง๋ ์์ต๋๋ค.
-
spellName- ์ ์ผํ ํ์ ๋งค๊ฐ๋ณ์: ์ฒ ์ ์นดํ๋ก๊ทธ์ ์์ด ์ด๋ฆ ๋๋ ์ ์ฒด ID. ์๋ฅผ ๋ค์ด, "Confidence"์ 402๋ ๋์ผํ Bushido ์ฃผ๋ฌธ์ ๋ํ๋ ๋๋ค. ๋์๋ฌธ์๋ ์ค์ํ์ง ์์ต๋๋ค. ์ด๋ฆ์ ๋ฐ์ค์ ๊ณต๋ฐฑ์ผ๋ก ๋์ฒด๋ฉ๋๋ค. ์์ง์ ๋ ์ธ์๋ฉ๋๋ค. ID ์บ๋ฆญํฐ, type ์์ดํ , ์คํฌ๋ฒํธ๋ฅผ ๋๊ธฐ์ง ๋ง์ธ์.
int: 1 - ์๋ฒ๊ฐ ์ด ID์ ํ์ฑ ์ํ๋ฅผ ๋ณด๊ณ ํ์ต๋๋ค. 0 - ํ์ฌ๋ ๊ทธ๋ฌํ ํ์ฑ ์ํ๊ฐ ์์ต๋๋ค. C#์์ ์ซ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค: if (UO.IsActiveSpellAbility(402) != 0) { ... }. ์ด๋ ๋ง์ง๋ง ์์ ํ์, ์๊ฐ, ๊ฒฐ๊ณผ๊ฐ ์๋ ๋ ผ๋ฆฌ์ ๊ธฐํธ์ ๋๋ค. ์ ์ ์๋ ์ด๋ฆ, ID ์ธ๋ถ 1โฆ65535 ๋ฐ ๊ฒฐ๊ณผ ์ํ๋ 0๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค.
- ๋ชฉ๋ก์ ์๋ฒ ํจํค์ง 0xBF/0x25๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ํ์ฑํํ๋ฉด ID๊ฐ ์ถ๊ฐ๋๊ณ , ๋นํ์ฑํํ๋ฉด ์ ๊ฑฐ๋ฉ๋๋ค. ๊ทธ๋ํฝ ์ฐฝ์ด๋ ํ๋ฉด์ ๋ง์ถค๋ฒ ๋ฒํผ ์์ด ์๋ํฉ๋๋ค. ์ฐฝ์ ๋ซ์ผ๋ฉด ์ํ๊ฐ ์ ์ฅ๋ฉ๋๋ค. ์ฐ๊ฒฐ์ ๋์ผ๋ฉด ์ฐ๊ฒฐ์ด ์ง์์ง๋๋ค. 0๋ผ๊ณ ๋๋ตํ๋ค๊ณ ํด์ ์บ๋ฆญํฐ๊ฐ ์ฃผ๋ฌธ์ ์์ ํ ์ ์๋ค๋ ๊ฒ์ ์ฆ๋ช ํ๋ ๊ฒ์ ์๋๋๋ค. ์๋ฒ๋ ์ด ์ํ๋ฅผ ๋ณด๋ด์ผ ํฉ๋๋ค. ์ด๋ ๋ชจ๋ ๋ฒํ์ ๋ํ ๋ณดํธ์ ์ธ ๊ฒ์ฌ๊ฐ ์๋๋๋ค. ์ฆ์ ์น์ /๊ทํ์ ๊ฒฝ์ฐ ์ด๋ฌํ ์์๋ ์์ ์ฑ๊ณต์ ํ์ธํ์ง ์์ต๋๋ค. ์ฃผ๋ฌธ์ ์ง์ ์๊ฐ, ๋จ์ ๋ง๋, ๊ฐ์ฉ์ฑ ๋ฐ ์ฑ๊ณต ์ฌ๋ถ๋ ์ด ๋ช ๋ น์ ์ํด ๊ฒฐ์ ๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.IsActiveSpellAbility(402);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 402 - ID ์์ ๊ฐ. ํ์ฑ ๋ณ์์๋ 1 ๋๋ 0๊ฐ ํฌํจ๋ฉ๋๋ค. ์ฌ๊ธฐ์ true์ 1์ ๋์ผํฉ๋๋ค. ๋ฉ์์ง๋ ์บ์คํธ ์๋์ ๊ฒฐ๊ณผ๊ฐ ์๋๋ผ ์์ ๋ ์ํ๋ฅผ ์ค๋ช ํฉ๋๋ค.
var active = UO.IsActiveSpellAbility(402);
if (Truth(Truth(active) == true))
{
UO.Print("Confidence is active");
}
else
{
UO.Print("No active Confidence state received");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- "์ ๋ขฐ" - ๋์ผ ID 402. Cast ์ด๋ฆ๋ง ํ์ฉ๋ฉ๋๋ค. ํ์ฑ ์ํ๊ฐ ์์ผ๋ฉด ์์ฒญ์ด ํ ๋ฒ ์ ์ก๋ฉ๋๋ค. ์๋ฒ์์์ ์ฑ๊ณต์ ๋ณด์ฅํ์ง๋ ์์ต๋๋ค. ๋น ๋ฅธ ๋ฃจํ์์ ์ด ์ฝ๋ ์กฐ๊ฐ์ ์คํํ์ง ๋ง์ธ์. ์๋ฒ ์๋ต์ด ์ง์ฐ๋ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.IsActiveSpellAbility("Confidence") == 0))
{
UO.Cast("Confidence");
}
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; ์์ โ true ์ผ๊ธฐ, false ๋๊ธฐ; timeoutMs โ ๋๊ธฐ ์ ํ(๋ฐ๋ฆฌ์ด). Main์ 25ms๋ง๋ค ํ์ธํ์ฌ 500ms๊น์ง ๊ธฐ๋ค๋ฆฌ๋ฉฐ ์๋ฌด๊ฒ๋ ์ ์กํ์ง ์์ต๋๋ค. ์ด ํจ์๋ ์ผ์นํ๋ ํญ๋ชฉ์ด ์์ผ๋ฉด true๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด false๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ ์ง๋ฐฉ์ ๋ถ์ ์ ํ๋ ๊ธฐ๋์ผ ๋ฟ, ๋ณ๊ฒฝ ์ด์ ๋ฅผ ์ ์ฆํ๋ ๊ฒ์ ์๋๋๋ค. ์คํฌ๋ฆฝํธ๊ฐ ์ผ์ ์ค์ง๋๊ฑฐ๋ ๋ก๋ ์ค์ธ ๊ฒฝ์ฐ ์ค์ ์๊ฐ์ด ๋์ด๋ ์ ์์ต๋๋ค.
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()
{
if (Truth(WaitAbilityState("Confidence", true, 500)))
{
UO.Print("Active state received");
}
else
{
UO.Print("No active state before timeout");
}
return null;
}
dynamic WaitAbilityState(dynamic spell, dynamic expected, dynamic timeoutMs)
{
var elapsed = 0;
while (Truth(elapsed < timeoutMs))
{
if (Truth((UO.IsActiveSpellAbility(spell) == 1) == expected))
{
return true;
}
UO.Wait(25);
elapsed = elapsed + 25;
}
return Truth((UO.IsActiveSpellAbility(spell) == 1) == expected);
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: spellName (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ConvertSpellName:ConvertSpellName(Text(0).Replace('_', ' ')). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsActiveSpell:bridge.IsActiveSpell(spellId.Value).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "isactivespellability":
{
int? spellId = arguments[0].Kind == InjectionValueKind.String
? ConvertSpellName(Text(0).Replace('_', ' '))
: (int?)Arg(0);
return new InjectionValue(spellId.HasValue ? bridge.IsActiveSpell(spellId.Value) : 0);
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.TicksSpell();์ ์ฅ๋ ๋งํฌ TicksSpell๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ๋ฐํ์ ์์๋ถํฐ 10๋ถ์ 1์ด ์์ UO.Timer๋ฅผ ํ์ํฉ๋๋ค. 0 - ๋งํฌ๊ฐ ์์ง ์ค์ ๋์ง ์์๊ฑฐ๋ ์ฒ์ 10๋ถ์ 1์ด์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ฐ๋ฆฌ์ด๋ ๋ฌ๋ ฅ ์๊ฐ์ด ์๋๋๋ค.
- ticksSpell ํ๋๋ฅผ ๋ฐํํฉ๋๋ค. ์ฑ๊ณต์ ์ผ๋ก ์๋ฝ๋ Cast/CastAtTarget์ ์ํด ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ๋ชจ๋ ์๋/์๋ฒ ํ๋์ ์๋์ผ๋ก ๊ด์ฐฐํ๋ ๊ฒ์ ์๋๋๋ค. ๋ช ๋ น ์์ฒด๋ ํ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
- UO.Timer() - ์ด ํ์๋ 10๋ถ์ 1์ด ๋จ์๋ก ๋์ด๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๋งํฌ๋ ์๋ก ๋ค๋ฅธ ๋ฐํ์ ๊ฐ์ ๋น๊ต๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.TicksSpell();
UO.Print("TicksSpell: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ฅ๋ ๋งํฌ TicksSpell๋ฅผ ์ฝ์ต๋๋ค.
var stamp = UO.TicksSpell();
UO.Print(stamp);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ticksSpell ํ๋๋ฅผ ๋ฐํํฉ๋๋ค. ์ฑ๊ณต์ ์ผ๋ก ์๋ฝ๋ Cast/CastAtTarget์ ์ํด ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ๋ชจ๋ ์๋/์๋ฒ ํ๋์ ์๋์ผ๋ก ๊ด์ฐฐํ๋ ๊ฒ์ ์๋๋๋ค. ๋ช ๋ น ์์ฒด๋ ํ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var stamp = UO.TicksSpell();
var ageTenths = UO.Timer() - stamp;
UO.Print(ageTenths);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.Timer() - ์ด ํ์๋ 10๋ถ์ 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()
{
var before = UO.TicksSpell();
UO.Wait(250);
var after = UO.TicksSpell();
UO.Print(before = after);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int TicksSpell() => ticksSpell;