KO UO Topic skills - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
์คํฌ ์ ์ฉ, ๊ฐ ์ฝ๊ธฐ ๋ฐ ์คํฌ ์ ๊ธ ๊ด๋ฆฌ. ์คํฌ์ ์ด๋ฆ๊ณผ ์์ ์ ๊ฐ์ฉ์ฑ์ ํด๋ผ์ด์ธํธ/์๋ฒ์์ ์ง์ํ๋ ๋ฐ์ดํฐ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
์ ์ฒด ์นดํ๋ก๊ทธ ๋ฐ ์์ ์ด๊ธฐ
| ์ฃผ์ | ๋ช ๋ น ๋ฐ ์ค๋ช |
|---|---|
| UseSkill | UO.UseSkill |
| Skill Value | UO.GetSkillValue ยท UO.SkillVal |
| Skill Current Value | UO.GetSkillCurrentValue |
| Skill Cap | UO.GetSkillCap |
| Skill Locks | UO.GetSkillLockState ยท UO.SetSkillLockState |
| Tracking | UO.Track |
| Snooping | UO.Snoop |
| Stealth | UO.StealthCnt ยท UO.UseSkill |
UO.UseSkill ยท UO.GetSkillCap ยท UO.GetSkillCurrentValue ยท UO.GetSkillValue ยท UO.GetSkillLockState ยท UO.SetSkillLockState ยท UO.SkillLockState ยท UO.SkillVal ยท UO.Track ยท UO.Snoop ยท UO.StealthCnt ยท UO.TicksSkill
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
if (!(Truth(UO.Connected())) || Truth(UO.Dead()) || Truth(UO.Hidden()))
{
return null;
}
if (!(Truth(UO.UseSkill("Hiding"))))
{
UO.Print("Hiding request rejected");
return null;
}
await Delay(1000);
if (Truth(UO.Hidden()))
{
UO.Print("Character is hidden");
}
else
{
UO.Print("Not hidden yet; check the game journal");
}
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;๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
var selector = "Mining";
var value = UO.GetSkillValue(selector);
UO.Print(Convert.ToString(value));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
double UO.GetSkillCap(object? skillName);์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์คํฌ ๋ฆฌ๋ฏธํธ๋ฅผ ์ฝ์ด์ต๋๋ค.
-
skillName- ํ์ ๊ธฐ์ : "Mining" ๋๋ "Animal Lore"์ ๊ฐ์ ํด๋ผ์ด์ธํธ ๋ฐ์ดํฐ์ ์ด๋ฆ ๋๋ 0์์ Skills.Lengthโ1๊น์ง์ ์ญ์ง์ ์์ธ, ์ซ์ ๋๋ ๋ฌธ์์ด. ์ด๋ฆ์ ๋/์๋ฌธ์๋ ์ค์ํ์ง ์์ผ๋ฉฐ ํํ ๊ณต๋ฐฑ์ด ์ ๊ฑฐ๋๊ณ _๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๋์ฒด๋ฉ๋๋ค. ์์ธ์ด ์ฃผ์ ์ ID ๋๋ 1์ ์์ธ์ด ์๋๋๋ค. ์ซ์ ๋ฌธ์์ด์ ํญ์ ์์ธ์ ์๋ฏธํฉ๋๋ค.
double (Double) - ์คํฌ ํฌ์ธํธ๊ฐ 0,1 ๋จ์๋ก ์ฆ๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด 951๊ฐ ์๋ 95,1์ ๋๋ค. CapFixed ํ๋๋ 10์ ์ํด ์ง์ Double๋ก ๋๋์ด์ง๋๋ค. 0๋ ์คํฌ์ด ์๊ฑฐ๋ ์บ๋ฆญํฐ/์คํฌ์ด ์์์ ์๋ฏธํฉ๋๋ค. ๊ฒฐ๊ณผ๋ bool๊ฐ ์๋๋๋ค. ๋ ๊ฑฐ์ SkillVal/BaseVal๋ ๊ท๋ชจ๊ฐ ๋ค๋ฆ ๋๋ค. ์ด๋ฌํ ๊ณ์ด์ ํผํฉํ์ง ๋ง์ญ์์ค.
- ์ด๋ฏธ ์์ ๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์ ์ค๋ ๋์์ Invoke๋ฅผ ํตํด ์ฝ๊ธฐ๊ฐ ์ํ๋ฉ๋๋ค. ๋คํธ์ํฌ ํจํท์ ์ ์ก๋์ง ์์ต๋๋ค. ์คํฌ์ ์ฌ์ฉํ๊ฑฐ๋ ํ๋ จํ์ง ์์ต๋๋ค. ๋ ๊ฐ์ ์์ฒญ - ๋ ๊ฐ์ ๊ฐ๋ณ ์ค๋ ์ท.
- ํ์ ๊ธฐ์ : "Mining" ๋๋ "Animal Lore"์ ๊ฐ์ ํด๋ผ์ด์ธํธ ๋ฐ์ดํฐ์ ์ด๋ฆ ๋๋ 0์์ Skills.Lengthโ1๊น์ง์ ์ญ์ง์ ์์ธ, ์ซ์ ๋๋ ๋ฌธ์์ด. ์ด๋ฆ์ ๋/์๋ฌธ์๋ ์ค์ํ์ง ์์ผ๋ฉฐ ํํ ๊ณต๋ฐฑ์ด ์ ๊ฑฐ๋๊ณ _๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๋์ฒด๋ฉ๋๋ค. ์์ธ์ด ์ฃผ์ ์ ID ๋๋ 1์ ์์ธ์ด ์๋๋๋ค. ์ซ์ ๋ฌธ์์ด์ ํญ์ ์์ธ์ ์๋ฏธํฉ๋๋ค.
- ExecuteClientApiCompatibility๋ ๋ช ๋ น ๋ถ๊ธฐ๋ฅผ ์ ํํฉ๋๋ค. Text๋ ์คํฌ ์ ํ๊ธฐ๋ฅผ ์ฝ๊ณ , Arg๋ ์ซ์์ ๋ชจ๋๋ฅผ ์ฝ์ต๋๋ค. ๋ณํํ ์ ์๋ ์ธ์๋ ๋ณํ ์ค๋ฅ๋ก ์ธํด ํธ์ถ์ด ์คํจํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetSkillCap("Mining");
UO.Print("GetSkillCap: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ์์์๋ ์ ํ๊ธฐ์ ๋ น์ ์ ๋ชจ๋๊ฐ ๋ช ์์ ์ผ๋ก ์ง์ ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ค์์๋ ์ด๋ฆ์ผ๋ก ์คํฌ์ ์ ํํ๊ฑฐ๋ ์ซ์๋ก ํน์ฑ์ ์ ํํฉ๋๋ค. Print ๊ฒฐ๊ณผ๋ง ํ์๋ฉ๋๋ค.
var selector = "Mining";
var value = UO.GetSkillCap(selector);
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๊ณ๊ฐ 95.1 ๋ฐ ๋ชจ๋ 0/1/2๊ฐ ์๋ก ์ ๊ณต๋ฉ๋๋ค. โ1๋ ๋ชจ๋ ๋ณ๊ฒฝ ์ ํ์ธ๋ฉ๋๋ค. ์ด ํ์๋ ๋ก์ปฌ ๋ณต์ฌ๋ณธ๋ง ์ฝํ์ง๋๋ค. ์๋ฒ๊ฐ ์๋ตํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.GetSkillLockState("Mining") >= 0))
{
var value = UO.GetSkillCap("Mining");
if (Truth(value >= 95.1))
{
UO.Print("Value >= 95.1: " + Convert.ToString(value));
}
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ชจ๋ ๋์ฐ๋ฏธ ์ฝ๋๋ Main ์๋์ ์ ๊ณต๋ฉ๋๋ค. ์ ๋ ํฐ๋ ์คํฌ/ํน์ฑ์ ์ ํํ๊ณ , ๋ชจ๋๋ ๋ นํ ๋ชจ๋๋ฅผ ์ค์ ํฉ๋๋ค. ReadValue/ReadMode ์๋ ๋ฒํธ๋ฅผ ๋ฐํํฉ๋๋ค. ApplyMode๋ ์ธ์๋ฅผ ํ์ธํ๊ณ ์์ ์ ์ํํ๋ฉฐ ๊ฐ์ ๋ฐํํ์ง ์์ต๋๋ค. ์ฝ๊ธฐ ์์์์ UO.Wait(1000)๋ ๋ ์ฅ์ ๊ทธ๋ฆผ์ ๋ถ๋ฆฌํฉ๋๋ค.
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 before = ReadValue("Animal_Lore");
await Delay(1000);
var after = ReadValue("Animal Lore");
UO.Print(Convert.ToString(after - before));
return null;
}
dynamic ReadValue(dynamic selector)
{
return UO.GetSkillCap(selector);
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: skillName (Any)
๊ฒฐ๊ณผ: double / Decimal.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetSkillValue:bridge.GetSkillValue(Text(0), false, true). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getskillcap": return new InjectionValue(bridge.GetSkillValue(Text(0), false, true));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
double UO.GetSkillCurrentValue(object? skillName);์์์ด๊ฐ ํฌํจ๋ ์คํฌ์ ์ ํจ ๊ฐ์ ์ฝ์ต๋๋ค.
-
skillName- ํ์ ๊ธฐ์ : "Mining" ๋๋ "Animal Lore"์ ๊ฐ์ ํด๋ผ์ด์ธํธ ๋ฐ์ดํฐ์ ์ด๋ฆ ๋๋ 0์์ Skills.Lengthโ1๊น์ง์ ์ญ์ง์ ์์ธ, ์ซ์ ๋๋ ๋ฌธ์์ด. ์ด๋ฆ์ ๋/์๋ฌธ์๋ ์ค์ํ์ง ์์ผ๋ฉฐ ํํ ๊ณต๋ฐฑ์ด ์ ๊ฑฐ๋๊ณ _๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๋์ฒด๋ฉ๋๋ค. ์์ธ์ด ์ฃผ์ ์ ID ๋๋ 1์ ์์ธ์ด ์๋๋๋ค. ์ซ์ ๋ฌธ์์ด์ ํญ์ ์์ธ์ ์๋ฏธํฉ๋๋ค.
double (Double) - ์คํฌ ํฌ์ธํธ๊ฐ 0,1 ๋จ์๋ก ์ฆ๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด 951๊ฐ ์๋ 95,1์ ๋๋ค. ValueFixed ํ๋๋ 10์ ์ํด ์ง์ Double๋ก ๋๋์ด์ง๋๋ค. 0๋ ์คํฌ์ด ์๊ฑฐ๋ ์บ๋ฆญํฐ/์คํฌ์ด ์์์ ์๋ฏธํฉ๋๋ค. ๊ฒฐ๊ณผ๋ bool๊ฐ ์๋๋๋ค. ๋ ๊ฑฐ์ SkillVal/BaseVal๋ ๊ท๋ชจ๊ฐ ๋ค๋ฆ ๋๋ค. ์ด๋ฌํ ๊ณ์ด์ ํผํฉํ์ง ๋ง์ญ์์ค.
- ์ด๋ฏธ ์์ ๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์ ์ค๋ ๋์์ Invoke๋ฅผ ํตํด ์ฝ๊ธฐ๊ฐ ์ํ๋ฉ๋๋ค. ๋คํธ์ํฌ ํจํท์ ์ ์ก๋์ง ์์ต๋๋ค. ์คํฌ์ ์ฌ์ฉํ๊ฑฐ๋ ํ๋ จํ์ง ์์ต๋๋ค. ๋ ๊ฐ์ ์์ฒญ - ๋ ๊ฐ์ ๊ฐ๋ณ ์ค๋ ์ท.
- ํ์ ๊ธฐ์ : "Mining" ๋๋ "Animal Lore"์ ๊ฐ์ ํด๋ผ์ด์ธํธ ๋ฐ์ดํฐ์ ์ด๋ฆ ๋๋ 0์์ Skills.Lengthโ1๊น์ง์ ์ญ์ง์ ์์ธ, ์ซ์ ๋๋ ๋ฌธ์์ด. ์ด๋ฆ์ ๋/์๋ฌธ์๋ ์ค์ํ์ง ์์ผ๋ฉฐ ํํ ๊ณต๋ฐฑ์ด ์ ๊ฑฐ๋๊ณ _๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๋์ฒด๋ฉ๋๋ค. ์์ธ์ด ์ฃผ์ ์ ID ๋๋ 1์ ์์ธ์ด ์๋๋๋ค. ์ซ์ ๋ฌธ์์ด์ ํญ์ ์์ธ์ ์๋ฏธํฉ๋๋ค.
- ExecuteClientApiCompatibility๋ ๋ช ๋ น ๋ถ๊ธฐ๋ฅผ ์ ํํฉ๋๋ค. Text๋ ์คํฌ ์ ํ๊ธฐ๋ฅผ ์ฝ๊ณ , Arg๋ ์ซ์์ ๋ชจ๋๋ฅผ ์ฝ์ต๋๋ค. ๋ณํํ ์ ์๋ ์ธ์๋ ๋ณํ ์ค๋ฅ๋ก ์ธํด ํธ์ถ์ด ์คํจํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetSkillCurrentValue("Mining");
UO.Print("GetSkillCurrentValue: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ์์์๋ ์ ํ๊ธฐ์ ๋ น์ ์ ๋ชจ๋๊ฐ ๋ช ์์ ์ผ๋ก ์ง์ ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ค์์๋ ์ด๋ฆ์ผ๋ก ์คํฌ์ ์ ํํ๊ฑฐ๋ ์ซ์๋ก ํน์ฑ์ ์ ํํฉ๋๋ค. Print ๊ฒฐ๊ณผ๋ง ํ์๋ฉ๋๋ค.
var selector = "Mining";
var value = UO.GetSkillCurrentValue(selector);
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๊ณ๊ฐ 95.1 ๋ฐ ๋ชจ๋ 0/1/2๊ฐ ์๋ก ์ ๊ณต๋ฉ๋๋ค. โ1๋ ๋ชจ๋ ๋ณ๊ฒฝ ์ ํ์ธ๋ฉ๋๋ค. ์ด ํ์๋ ๋ก์ปฌ ๋ณต์ฌ๋ณธ๋ง ์ฝํ์ง๋๋ค. ์๋ฒ๊ฐ ์๋ตํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.GetSkillLockState("Mining") >= 0))
{
var value = UO.GetSkillCurrentValue("Mining");
if (Truth(value >= 95.1))
{
UO.Print("Value >= 95.1: " + Convert.ToString(value));
}
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ชจ๋ ๋์ฐ๋ฏธ ์ฝ๋๋ Main ์๋์ ์ ๊ณต๋ฉ๋๋ค. ์ ๋ ํฐ๋ ์คํฌ/ํน์ฑ์ ์ ํํ๊ณ , ๋ชจ๋๋ ๋ นํ ๋ชจ๋๋ฅผ ์ค์ ํฉ๋๋ค. ReadValue/ReadMode ์๋ ๋ฒํธ๋ฅผ ๋ฐํํฉ๋๋ค. ApplyMode๋ ์ธ์๋ฅผ ํ์ธํ๊ณ ์์ ์ ์ํํ๋ฉฐ ๊ฐ์ ๋ฐํํ์ง ์์ต๋๋ค. ์ฝ๊ธฐ ์์์์ UO.Wait(1000)๋ ๋ ์ฅ์ ๊ทธ๋ฆผ์ ๋ถ๋ฆฌํฉ๋๋ค.
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 before = ReadValue("Animal_Lore");
await Delay(1000);
var after = ReadValue("Animal Lore");
UO.Print(Convert.ToString(after - before));
return null;
}
dynamic ReadValue(dynamic selector)
{
return UO.GetSkillCurrentValue(selector);
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: skillName (Any)
๊ฒฐ๊ณผ: double / Decimal.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetSkillValue:bridge.GetSkillValue(Text(0), true, false). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getskillcurrentvalue": return new InjectionValue(bridge.GetSkillValue(Text(0), true, false));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetSkillLockState(object? skillName);๋ก์ปฌ ์คํฌ ์ฒด์ธ์ง ๋ชจ๋๋ฅผ ์ฝ์ต๋๋ค.
-
skillName- ํ์ ๊ธฐ์ : "Mining" ๋๋ "Animal Lore"์ ๊ฐ์ ํด๋ผ์ด์ธํธ ๋ฐ์ดํฐ์ ์ด๋ฆ ๋๋ 0์์ Skills.Lengthโ1๊น์ง์ ์ญ์ง์ ์์ธ, ์ซ์ ๋๋ ๋ฌธ์์ด. ์ด๋ฆ์ ๋/์๋ฌธ์๋ ์ค์ํ์ง ์์ผ๋ฉฐ ํํ ๊ณต๋ฐฑ์ด ์ ๊ฑฐ๋๊ณ _๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๋์ฒด๋ฉ๋๋ค. ์์ธ์ด ์ฃผ์ ์ ID ๋๋ 1์ ์์ธ์ด ์๋๋๋ค. ์ซ์ ๋ฌธ์์ด์ ํญ์ ์์ธ์ ์๋ฏธํฉ๋๋ค.
int: 0 - ์ฆ๊ฐ, 1 - ๊ฐ์, 2 - ์ฐจ๋จ. true/false๊ฐ ์๋ ๋ชจ๋ ์ฝ๋์ ๋๋ค. ์ ์ ์๋ ์คํฌ์ด๋ ๋๋ฝ๋ ๋ฌธ์์ ๊ฒฝ์ฐ โ1๊ฐ ๋ฐํ๋ฉ๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์ ์ค๋ ๋์์ Invoke๋ฅผ ํตํด ์ฝ๊ธฐ๊ฐ ์ํ๋ฉ๋๋ค. ๋คํธ์ํฌ ํจํท์ ์ ์ก๋์ง ์์ต๋๋ค. ์คํฌ์ ์ฌ์ฉํ๊ฑฐ๋ ํ๋ จํ์ง ์์ต๋๋ค. ๋ ๊ฐ์ ์์ฒญ - ๋ ๊ฐ์ ๊ฐ๋ณ ์ค๋ ์ท.
- ํ์ ๊ธฐ์ : "Mining" ๋๋ "Animal Lore"์ ๊ฐ์ ํด๋ผ์ด์ธํธ ๋ฐ์ดํฐ์ ์ด๋ฆ ๋๋ 0์์ Skills.Lengthโ1๊น์ง์ ์ญ์ง์ ์์ธ, ์ซ์ ๋๋ ๋ฌธ์์ด. ์ด๋ฆ์ ๋/์๋ฌธ์๋ ์ค์ํ์ง ์์ผ๋ฉฐ ํํ ๊ณต๋ฐฑ์ด ์ ๊ฑฐ๋๊ณ _๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๋์ฒด๋ฉ๋๋ค. ์์ธ์ด ์ฃผ์ ์ ID ๋๋ 1์ ์์ธ์ด ์๋๋๋ค. ์ซ์ ๋ฌธ์์ด์ ํญ์ ์์ธ์ ์๋ฏธํฉ๋๋ค.
- ExecuteClientApiCompatibility๋ ๋ช ๋ น ๋ถ๊ธฐ๋ฅผ ์ ํํฉ๋๋ค. Text๋ ์คํฌ ์ ํ๊ธฐ๋ฅผ ์ฝ๊ณ , Arg๋ ์ซ์์ ๋ชจ๋๋ฅผ ์ฝ์ต๋๋ค. ๋ณํํ ์ ์๋ ์ธ์๋ ๋ณํ ์ค๋ฅ๋ก ์ธํด ํธ์ถ์ด ์คํจํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetSkillLockState("Mining");
UO.Print("GetSkillLockState: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ์์์๋ ์ ํ๊ธฐ์ ๋ น์ ์ ๋ชจ๋๊ฐ ๋ช ์์ ์ผ๋ก ์ง์ ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ค์์๋ ์ด๋ฆ์ผ๋ก ์คํฌ์ ์ ํํ๊ฑฐ๋ ์ซ์๋ก ํน์ฑ์ ์ ํํฉ๋๋ค. Print ๊ฒฐ๊ณผ๋ง ํ์๋ฉ๋๋ค.
var selector = "Mining";
var mode = UO.GetSkillLockState(selector);
UO.Print(Convert.ToString(mode));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๊ณ๊ฐ 95.1 ๋ฐ ๋ชจ๋ 0/1/2๊ฐ ์๋ก ์ ๊ณต๋ฉ๋๋ค. โ1๋ ๋ชจ๋ ๋ณ๊ฒฝ ์ ํ์ธ๋ฉ๋๋ค. ์ด ํ์๋ ๋ก์ปฌ ๋ณต์ฌ๋ณธ๋ง ์ฝํ์ง๋๋ค. ์๋ฒ๊ฐ ์๋ตํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var mode = UO.GetSkillLockState("Mining");
if (Truth(mode == 2))
{
UO.Print("Locked");
}
else
{
if (Truth(mode == -1))
{
UO.Print("Unknown selector");
}
else
{
UO.Print("Mode: " + Convert.ToString(mode));
}
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ชจ๋ ๋์ฐ๋ฏธ ์ฝ๋๋ Main ์๋์ ์ ๊ณต๋ฉ๋๋ค. ์ ๋ ํฐ๋ ์คํฌ/ํน์ฑ์ ์ ํํ๊ณ , ๋ชจ๋๋ ๋ นํ ๋ชจ๋๋ฅผ ์ค์ ํฉ๋๋ค. ReadValue/ReadMode ์๋ ๋ฒํธ๋ฅผ ๋ฐํํฉ๋๋ค. ApplyMode๋ ์ธ์๋ฅผ ํ์ธํ๊ณ ์์ ์ ์ํํ๋ฉฐ ๊ฐ์ ๋ฐํํ์ง ์์ต๋๋ค. ์ฝ๊ธฐ ์์์์ UO.Wait(1000)๋ ๋ ์ฅ์ ๊ทธ๋ฆผ์ ๋ถ๋ฆฌํฉ๋๋ค.
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 before = ReadMode("Mining");
await Delay(1000);
var after = ReadMode("Mining");
UO.Print(Convert.ToString(before) + " -> " + Convert.ToString(after));
return null;
}
dynamic ReadMode(dynamic selector)
{
return UO.GetSkillLockState(selector);
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: skillName (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetSkillLockState:bridge.GetSkillLockState(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getskilllockstate": return new InjectionValue(bridge.GetSkillLockState(Text(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
double UO.GetSkillValue(object? skillName);์์์ด ์์ด ์คํฌ์ ๊ธฐ๋ณธ ๊ฐ์ ์ฝ์ต๋๋ค.
-
skillName- ํ์ ๊ธฐ์ : "Mining" ๋๋ "Animal Lore"์ ๊ฐ์ ํด๋ผ์ด์ธํธ ๋ฐ์ดํฐ์ ์ด๋ฆ ๋๋ 0์์ Skills.Lengthโ1๊น์ง์ ์ญ์ง์ ์์ธ, ์ซ์ ๋๋ ๋ฌธ์์ด. ์ด๋ฆ์ ๋/์๋ฌธ์๋ ์ค์ํ์ง ์์ผ๋ฉฐ ํํ ๊ณต๋ฐฑ์ด ์ ๊ฑฐ๋๊ณ _๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๋์ฒด๋ฉ๋๋ค. ์์ธ์ด ์ฃผ์ ์ ID ๋๋ 1์ ์์ธ์ด ์๋๋๋ค. ์ซ์ ๋ฌธ์์ด์ ํญ์ ์์ธ์ ์๋ฏธํฉ๋๋ค.
double (Double) - ์คํฌ ํฌ์ธํธ๊ฐ 0,1 ๋จ์๋ก ์ฆ๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด 951๊ฐ ์๋ 95,1์ ๋๋ค. BaseFixed ํ๋๋ 10์ ์ํด ์ง์ Double๋ก ๋๋์ด์ง๋๋ค. 0๋ ์คํฌ์ด ์๊ฑฐ๋ ์บ๋ฆญํฐ/์คํฌ์ด ์์์ ์๋ฏธํฉ๋๋ค. ๊ฒฐ๊ณผ๋ bool๊ฐ ์๋๋๋ค. ๋ ๊ฑฐ์ SkillVal/BaseVal๋ ๊ท๋ชจ๊ฐ ๋ค๋ฆ ๋๋ค. ์ด๋ฌํ ๊ณ์ด์ ํผํฉํ์ง ๋ง์ญ์์ค.
- ์ด๋ฏธ ์์ ๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์ ์ค๋ ๋์์ Invoke๋ฅผ ํตํด ์ฝ๊ธฐ๊ฐ ์ํ๋ฉ๋๋ค. ๋คํธ์ํฌ ํจํท์ ์ ์ก๋์ง ์์ต๋๋ค. ์คํฌ์ ์ฌ์ฉํ๊ฑฐ๋ ํ๋ จํ์ง ์์ต๋๋ค. ๋ ๊ฐ์ ์์ฒญ - ๋ ๊ฐ์ ๊ฐ๋ณ ์ค๋ ์ท.
- ํ์ ๊ธฐ์ : "Mining" ๋๋ "Animal Lore"์ ๊ฐ์ ํด๋ผ์ด์ธํธ ๋ฐ์ดํฐ์ ์ด๋ฆ ๋๋ 0์์ Skills.Lengthโ1๊น์ง์ ์ญ์ง์ ์์ธ, ์ซ์ ๋๋ ๋ฌธ์์ด. ์ด๋ฆ์ ๋/์๋ฌธ์๋ ์ค์ํ์ง ์์ผ๋ฉฐ ํํ ๊ณต๋ฐฑ์ด ์ ๊ฑฐ๋๊ณ _๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๋์ฒด๋ฉ๋๋ค. ์์ธ์ด ์ฃผ์ ์ ID ๋๋ 1์ ์์ธ์ด ์๋๋๋ค. ์ซ์ ๋ฌธ์์ด์ ํญ์ ์์ธ์ ์๋ฏธํฉ๋๋ค.
- ExecuteClientApiCompatibility๋ ๋ช ๋ น ๋ถ๊ธฐ๋ฅผ ์ ํํฉ๋๋ค. Text๋ ์คํฌ ์ ํ๊ธฐ๋ฅผ ์ฝ๊ณ , Arg๋ ์ซ์์ ๋ชจ๋๋ฅผ ์ฝ์ต๋๋ค. ๋ณํํ ์ ์๋ ์ธ์๋ ๋ณํ ์ค๋ฅ๋ก ์ธํด ํธ์ถ์ด ์คํจํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetSkillValue("Mining");
UO.Print("GetSkillValue: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ์์์๋ ์ ํ๊ธฐ์ ๋ น์ ์ ๋ชจ๋๊ฐ ๋ช ์์ ์ผ๋ก ์ง์ ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ค์์๋ ์ด๋ฆ์ผ๋ก ์คํฌ์ ์ ํํ๊ฑฐ๋ ์ซ์๋ก ํน์ฑ์ ์ ํํฉ๋๋ค. Print ๊ฒฐ๊ณผ๋ง ํ์๋ฉ๋๋ค.
var selector = "Mining";
var value = UO.GetSkillValue(selector);
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๊ณ๊ฐ 95.1 ๋ฐ ๋ชจ๋ 0/1/2๊ฐ ์๋ก ์ ๊ณต๋ฉ๋๋ค. โ1๋ ๋ชจ๋ ๋ณ๊ฒฝ ์ ํ์ธ๋ฉ๋๋ค. ์ด ํ์๋ ๋ก์ปฌ ๋ณต์ฌ๋ณธ๋ง ์ฝํ์ง๋๋ค. ์๋ฒ๊ฐ ์๋ตํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.GetSkillLockState("Mining") >= 0))
{
var value = UO.GetSkillValue("Mining");
if (Truth(value >= 95.1))
{
UO.Print("Value >= 95.1: " + Convert.ToString(value));
}
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ชจ๋ ๋์ฐ๋ฏธ ์ฝ๋๋ Main ์๋์ ์ ๊ณต๋ฉ๋๋ค. ์ ๋ ํฐ๋ ์คํฌ/ํน์ฑ์ ์ ํํ๊ณ , ๋ชจ๋๋ ๋ นํ ๋ชจ๋๋ฅผ ์ค์ ํฉ๋๋ค. ReadValue/ReadMode ์๋ ๋ฒํธ๋ฅผ ๋ฐํํฉ๋๋ค. ApplyMode๋ ์ธ์๋ฅผ ํ์ธํ๊ณ ์์ ์ ์ํํ๋ฉฐ ๊ฐ์ ๋ฐํํ์ง ์์ต๋๋ค. ์ฝ๊ธฐ ์์์์ UO.Wait(1000)๋ ๋ ์ฅ์ ๊ทธ๋ฆผ์ ๋ถ๋ฆฌํฉ๋๋ค.
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 before = ReadValue("Animal_Lore");
await Delay(1000);
var after = ReadValue("Animal Lore");
UO.Print(Convert.ToString(after - before));
return null;
}
dynamic ReadValue(dynamic selector)
{
return UO.GetSkillValue(selector);
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: skillName (Any)
๊ฒฐ๊ณผ: double / Decimal.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetSkillValue:bridge.GetSkillValue(Text(0), false, false). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getskillvalue": return new InjectionValue(bridge.GetSkillValue(Text(0), false, false));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetSkillLockState(object? skillName, object? skillState);์คํฌ ๋ชจ๋๋ก์ ๋ณ๊ฒฝ์ ์์ฒญํฉ๋๋ค.
-
skillName- ํ์ ๊ธฐ์ : "Mining" ๋๋ "Animal Lore"์ ๊ฐ์ ํด๋ผ์ด์ธํธ ๋ฐ์ดํฐ์ ์ด๋ฆ ๋๋ 0์์ Skills.Lengthโ1๊น์ง์ ์ญ์ง์ ์์ธ, ์ซ์ ๋๋ ๋ฌธ์์ด. ์ด๋ฆ์ ๋/์๋ฌธ์๋ ์ค์ํ์ง ์์ผ๋ฉฐ ํํ ๊ณต๋ฐฑ์ด ์ ๊ฑฐ๋๊ณ _๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๋์ฒด๋ฉ๋๋ค. ์์ธ์ด ์ฃผ์ ์ ID ๋๋ 1์ ์์ธ์ด ์๋๋๋ค. ์ซ์ ๋ฌธ์์ด์ ํญ์ ์์ธ์ ์๋ฏธํฉ๋๋ค. -
skillStateโ ํ์ ๋ชจ๋: 0 โ ์ฆ๊ฐ, 1 โ ๊ฐ์, 2 โ ์ฐจ๋จ. ์ด๋ bool์ด ์๋ ์ธ ๊ฐ์ง ์ฝ๋์ ๋๋ค. true/false ๋ชจ๋ ๋ชจ๋์ ์ด๋ฆ์ ๋ฐ๊พธ์ง ๋ง์ธ์.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ์ฑ๊ณต/์คํจ๋ก ์ฌ์ฉ๋๊ฑฐ๋ true์ ๋น๊ตํ ์ ์์ต๋๋ค. ํ์ ์ฝ๊ธฐ์์๋ ์๋ฒ์ ํ์ธ์ด ์๋ ๋ก์ปฌ ๋ชจ๋ธ์ ๋ณด์ฌ์ค๋๋ค.
- ์ ํจํ ์์ฒญ์ GameActions๋ฅผ ํตํด ํ๋์ ํจํท์ ์ ์กํ๊ณ ์ฆ์ ๋ก์ปฌ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. ์๋ฒ๋ ์์ฒด ์ ํ ์ฌํญ์ ์ ์ฉํ ์ ์์ต๋๋ค. ์คํฌ์ด๋ ์คํ ์ ์ฆ๊ฐ๋ ๋ณด์ฅ๋์ง ์์ต๋๋ค. ์ ์ ์๋ ์คํฌ, ์๋ชป๋ ์ธ๋ฑ์ค/๋ชจ๋ ๋ฐ ๋๋ฝ๋ ๋ฌธ์๋ ํจํค์ง ์์ด ๋ฌด์๋ฉ๋๋ค.
- ํ์ ๊ธฐ์ : "Mining" ๋๋ "Animal Lore"์ ๊ฐ์ ํด๋ผ์ด์ธํธ ๋ฐ์ดํฐ์ ์ด๋ฆ ๋๋ 0์์ Skills.Lengthโ1๊น์ง์ ์ญ์ง์ ์์ธ, ์ซ์ ๋๋ ๋ฌธ์์ด. ์ด๋ฆ์ ๋/์๋ฌธ์๋ ์ค์ํ์ง ์์ผ๋ฉฐ ํํ ๊ณต๋ฐฑ์ด ์ ๊ฑฐ๋๊ณ _๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๋์ฒด๋ฉ๋๋ค. ์์ธ์ด ์ฃผ์ ์ ID ๋๋ 1์ ์์ธ์ด ์๋๋๋ค. ์ซ์ ๋ฌธ์์ด์ ํญ์ ์์ธ์ ์๋ฏธํฉ๋๋ค.
- ExecuteClientApiCompatibility๋ ๋ช ๋ น ๋ถ๊ธฐ๋ฅผ ์ ํํฉ๋๋ค. Text๋ ์คํฌ ์ ํ๊ธฐ๋ฅผ ์ฝ๊ณ , Arg๋ ์ซ์์ ๋ชจ๋๋ฅผ ์ฝ์ต๋๋ค. ๋ณํํ ์ ์๋ ์ธ์๋ ๋ณํ ์ค๋ฅ๋ก ์ธํด ํธ์ถ์ด ์คํจํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetSkillLockState");
UO.SetSkillLockState("Mining", 2);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ์์์๋ ์ ํ๊ธฐ์ ๋ น์ ์ ๋ชจ๋๊ฐ ๋ช ์์ ์ผ๋ก ์ง์ ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ค์์๋ ์ด๋ฆ์ผ๋ก ์คํฌ์ ์ ํํ๊ฑฐ๋ ์ซ์๋ก ํน์ฑ์ ์ ํํฉ๋๋ค. Print ๊ฒฐ๊ณผ๋ง ํ์๋ฉ๋๋ค.
var selector = "Mining";
var mode = 2;
UO.SetSkillLockState(selector, mode);
UO.Print(Convert.ToString(UO.GetSkillLockState(selector)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๊ณ๊ฐ 95.1 ๋ฐ ๋ชจ๋ 0/1/2๊ฐ ์๋ก ์ ๊ณต๋ฉ๋๋ค. โ1๋ ๋ชจ๋ ๋ณ๊ฒฝ ์ ํ์ธ๋ฉ๋๋ค. ์ด ํ์๋ ๋ก์ปฌ ๋ณต์ฌ๋ณธ๋ง ์ฝํ์ง๋๋ค. ์๋ฒ๊ฐ ์๋ตํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var selector = "Mining";
var before = UO.GetSkillLockState(selector);
if (Truth(before >= 0) && Truth(before <= 2))
{
UO.SetSkillLockState(selector, 0);
UO.Print(Convert.ToString(UO.GetSkillLockState(selector)));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ชจ๋ ๋์ฐ๋ฏธ ์ฝ๋๋ Main ์๋์ ์ ๊ณต๋ฉ๋๋ค. ์ ๋ ํฐ๋ ์คํฌ/ํน์ฑ์ ์ ํํ๊ณ , ๋ชจ๋๋ ๋ นํ ๋ชจ๋๋ฅผ ์ค์ ํฉ๋๋ค. ReadValue/ReadMode ์๋ ๋ฒํธ๋ฅผ ๋ฐํํฉ๋๋ค. ApplyMode๋ ์ธ์๋ฅผ ํ์ธํ๊ณ ์์ ์ ์ํํ๋ฉฐ ๊ฐ์ ๋ฐํํ์ง ์์ต๋๋ค. ์ฝ๊ธฐ ์์์์ UO.Wait(1000)๋ ๋ ์ฅ์ ๊ทธ๋ฆผ์ ๋ถ๋ฆฌํฉ๋๋ค.
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("Mining", 2);
return null;
}
void ApplyMode(dynamic selector, dynamic mode)
{
if (Truth(mode < 0) || Truth(mode > 2))
{
return;
}
if (Truth(UO.GetSkillLockState(selector) < 0))
{
return;
}
UO.SetSkillLockState(selector, mode);
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: skillName (Any), skillState (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetSkillLockState:bridge.SetSkillLockState(Text(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setskilllockstate":
case "skilllockstate": bridge.SetSkillLockState(Text(0), Arg(1)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SkillLockState(object? skillName, object? skillState);์คํฌ ๋ชจ๋๋ก์ ๋ณ๊ฒฝ์ ์์ฒญํฉ๋๋ค.
-
skillName- ํ์ ๊ธฐ์ : "Mining" ๋๋ "Animal Lore"์ ๊ฐ์ ํด๋ผ์ด์ธํธ ๋ฐ์ดํฐ์ ์ด๋ฆ ๋๋ 0์์ Skills.Lengthโ1๊น์ง์ ์ญ์ง์ ์์ธ, ์ซ์ ๋๋ ๋ฌธ์์ด. ์ด๋ฆ์ ๋/์๋ฌธ์๋ ์ค์ํ์ง ์์ผ๋ฉฐ ํํ ๊ณต๋ฐฑ์ด ์ ๊ฑฐ๋๊ณ _๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๋์ฒด๋ฉ๋๋ค. ์์ธ์ด ์ฃผ์ ์ ID ๋๋ 1์ ์์ธ์ด ์๋๋๋ค. ์ซ์ ๋ฌธ์์ด์ ํญ์ ์์ธ์ ์๋ฏธํฉ๋๋ค. -
skillStateโ ํ์ ๋ชจ๋: 0 โ ์ฆ๊ฐ, 1 โ ๊ฐ์, 2 โ ์ฐจ๋จ. ์ด๋ bool์ด ์๋ ์ธ ๊ฐ์ง ์ฝ๋์ ๋๋ค. true/false ๋ชจ๋ ๋ชจ๋์ ์ด๋ฆ์ ๋ฐ๊พธ์ง ๋ง์ธ์.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ์ฑ๊ณต/์คํจ๋ก ์ฌ์ฉ๋๊ฑฐ๋ true์ ๋น๊ตํ ์ ์์ต๋๋ค. ํ์ ์ฝ๊ธฐ์์๋ ์๋ฒ์ ํ์ธ์ด ์๋ ๋ก์ปฌ ๋ชจ๋ธ์ ๋ณด์ฌ์ค๋๋ค.
- ์ ํจํ ์์ฒญ์ GameActions๋ฅผ ํตํด ํ๋์ ํจํท์ ์ ์กํ๊ณ ์ฆ์ ๋ก์ปฌ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. ์๋ฒ๋ ์์ฒด ์ ํ ์ฌํญ์ ์ ์ฉํ ์ ์์ต๋๋ค. ์คํฌ์ด๋ ์คํ ์ ์ฆ๊ฐ๋ ๋ณด์ฅ๋์ง ์์ต๋๋ค. ์ ์ ์๋ ์คํฌ, ์๋ชป๋ ์ธ๋ฑ์ค/๋ชจ๋ ๋ฐ ๋๋ฝ๋ ๋ฌธ์๋ ํจํค์ง ์์ด ๋ฌด์๋ฉ๋๋ค.
- ํ์ ๊ธฐ์ : "Mining" ๋๋ "Animal Lore"์ ๊ฐ์ ํด๋ผ์ด์ธํธ ๋ฐ์ดํฐ์ ์ด๋ฆ ๋๋ 0์์ Skills.Lengthโ1๊น์ง์ ์ญ์ง์ ์์ธ, ์ซ์ ๋๋ ๋ฌธ์์ด. ์ด๋ฆ์ ๋/์๋ฌธ์๋ ์ค์ํ์ง ์์ผ๋ฉฐ ํํ ๊ณต๋ฐฑ์ด ์ ๊ฑฐ๋๊ณ _๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๋์ฒด๋ฉ๋๋ค. ์์ธ์ด ์ฃผ์ ์ ID ๋๋ 1์ ์์ธ์ด ์๋๋๋ค. ์ซ์ ๋ฌธ์์ด์ ํญ์ ์์ธ์ ์๋ฏธํฉ๋๋ค.
- ExecuteClientApiCompatibility๋ ๋ช ๋ น ๋ถ๊ธฐ๋ฅผ ์ ํํฉ๋๋ค. Text๋ ์คํฌ ์ ํ๊ธฐ๋ฅผ ์ฝ๊ณ , Arg๋ ์ซ์์ ๋ชจ๋๋ฅผ ์ฝ์ต๋๋ค. ๋ณํํ ์ ์๋ ์ธ์๋ ๋ณํ ์ค๋ฅ๋ก ์ธํด ํธ์ถ์ด ์คํจํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SkillLockState");
UO.SkillLockState("Mining", 2);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ์์์๋ ์ ํ๊ธฐ์ ๋ น์ ์ ๋ชจ๋๊ฐ ๋ช ์์ ์ผ๋ก ์ง์ ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ค์์๋ ์ด๋ฆ์ผ๋ก ์คํฌ์ ์ ํํ๊ฑฐ๋ ์ซ์๋ก ํน์ฑ์ ์ ํํฉ๋๋ค. Print ๊ฒฐ๊ณผ๋ง ํ์๋ฉ๋๋ค.
var selector = "Mining";
var mode = 2;
UO.SkillLockState(selector, mode);
UO.Print(Convert.ToString(UO.GetSkillLockState(selector)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๊ณ๊ฐ 95.1 ๋ฐ ๋ชจ๋ 0/1/2๊ฐ ์๋ก ์ ๊ณต๋ฉ๋๋ค. โ1๋ ๋ชจ๋ ๋ณ๊ฒฝ ์ ํ์ธ๋ฉ๋๋ค. ์ด ํ์๋ ๋ก์ปฌ ๋ณต์ฌ๋ณธ๋ง ์ฝํ์ง๋๋ค. ์๋ฒ๊ฐ ์๋ตํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var selector = "Mining";
var before = UO.GetSkillLockState(selector);
if (Truth(before >= 0) && Truth(before <= 2))
{
UO.SkillLockState(selector, 0);
UO.Print(Convert.ToString(UO.GetSkillLockState(selector)));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ชจ๋ ๋์ฐ๋ฏธ ์ฝ๋๋ Main ์๋์ ์ ๊ณต๋ฉ๋๋ค. ์ ๋ ํฐ๋ ์คํฌ/ํน์ฑ์ ์ ํํ๊ณ , ๋ชจ๋๋ ๋ นํ ๋ชจ๋๋ฅผ ์ค์ ํฉ๋๋ค. ReadValue/ReadMode ์๋ ๋ฒํธ๋ฅผ ๋ฐํํฉ๋๋ค. ApplyMode๋ ์ธ์๋ฅผ ํ์ธํ๊ณ ์์ ์ ์ํํ๋ฉฐ ๊ฐ์ ๋ฐํํ์ง ์์ต๋๋ค. ์ฝ๊ธฐ ์์์์ UO.Wait(1000)๋ ๋ ์ฅ์ ๊ทธ๋ฆผ์ ๋ถ๋ฆฌํฉ๋๋ค.
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("Mining", 2);
return null;
}
void ApplyMode(dynamic selector, dynamic mode)
{
if (Truth(mode < 0) || Truth(mode > 2))
{
return;
}
if (Truth(UO.GetSkillLockState(selector) < 0))
{
return;
}
UO.SkillLockState(selector, mode);
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: skillName (Any), skillState (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetSkillLockState:bridge.SetSkillLockState(Text(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setskilllockstate":
case "skilllockstate": bridge.SetSkillLockState(Text(0), Arg(1)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.SkillVal(object? skillName);
int UO.SkillVal(object? skill, object? variant);์คํฌ์ด๋ ๋ชจ๋/์ฑ์ฅ์ ๋ ๊ฑฐ์ ๊ฐ์น๋ฅผ ์ฝ์ต๋๋ค.
-
variant- ์ ํ ์ฌํญ int: 0 - ์ ํจ ๊ฐ(๊ธฐ๋ณธ๊ฐ), 1 - ๊ธฐ๋ณธ ๊ฐ, 2 - ๋ฐํ์์์ ์ด ์คํฌ์ ์ฒ์ ์ฝ์ ๋ ๊ธฐ๋ณธ ๊ฐ ์ฆ๊ฐ, 3 - ์ฐจ๋จ ๋ชจ๋. -
skillNameโ ๋ฐํ์ ์ฌ์ skillNameToSkillId์ ์ด๋ฆ(์: "Mining") ๋์๋ฌธ์๋ ์ค์ํ์ง ์์ง๋ง ๊ณต๋ฐฑ์ ์๋ฆฌ์ง ์์ผ๋ฉฐ _๋ ๋์ฒด๋์ง ์์ต๋๋ค. ์ด ๋ ๊ฑฐ์ ํจ์์ ์ซ์ ํ ์คํธ๋ ์์ธ์ด ์๋๋๋ค. ์ ์ ์๋ ์ด๋ฆ์ ๋ฉ์์ง๋ฅผ ํ์ํ๊ณ 0๋ฅผ ์ ๊ณตํฉ๋๋ค. -
skillโ ๋ฐํ์ ์ฌ์ skillNameToSkillId์ ์ด๋ฆ(์: "Mining") ๋์๋ฌธ์๋ ์ค์ํ์ง ์์ง๋ง ๊ณต๋ฐฑ์ ์๋ฆฌ์ง ์์ผ๋ฉฐ _๋ ๋์ฒด๋์ง ์์ต๋๋ค. ์ด ๋ ๊ฑฐ์ ํจ์์ ์ซ์ ํ ์คํธ๋ ์์ธ์ด ์๋๋๋ค. ์ ์ ์๋ ์ด๋ฆ์ ๋ฉ์์ง๋ฅผ ํ์ํ๊ณ 0๋ฅผ ์ ๊ณตํฉ๋๋ค.
int: ์ต์ 0/1/2 - ์คํฌ ํฌ์ธํธ์ 10๋ถ์ 1 (951 = 95.1); ์ต์ 3 - ๋ชจ๋ 0/1/2 ๋๋ -1 ํ๋ ์ด์ด/์คํฌ์ด ์๋ ๊ฒฝ์ฐ. ์ ์ ์๋ ์ด๋ฆ/๋ณ์ข ์ 0๋ฅผ ์ ๊ณตํฉ๋๋ค. Player๊ฐ ์๊ณ base=0์ธ ๊ฒฝ์ฐ๋ฅผ ํฌํจํ์ฌ base๊ฐ ์ ์ฅ๋ ๊ธฐ๋ณธ ๋ฐํ์๋ณด๋ค ๋ฎ์ ๊ฒฝ์ฐ ์ต์ 2์ ์์๊ฐ ๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ bool์ด ์๋๋๋ค.
- ๋ณํ์ ์ ํํ๊ธฐ ์ ์ SkillBaseVal๋ฅผ ์ทจํ๊ณ , ์คํฌ์ ์ฒ์ ์ฝ๋ ๊ฒฝ์ฐ ๊ธฐ์ค์ ์ด ์ ์ฅ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ณ์ข =0/1/3์ ์ฝ์ด๋ ๋ฏธ๋ ์ฑ์ฅ ๋ณ์ข =2์ ์ถ๋ฐ์ ์ด ์ค์ ๋ฉ๋๋ค.
- ์๋ชป๋ ๋ณํ์ ๋ฉ์์ง๋ฅผ ํ์ํ๊ณ 0์ ์ ๊ณตํ์ง๋ง ๊ธฐ์ค์ ์ด ์ด๋ฏธ ์์ฑ๋์์ ์ ์์ต๋๋ค. GetSkillValue/GetSkillCurrentValue ๊ฐ์ double ์๊ฒฝ์ผ๋ก ์ธก์ ๋๋ฉฐ ์ฒ๋๊ฐ ๋ค๋ฆ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.SkillVal("Mining");
UO.Print("SkillVal: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์คํฌ์ด๋ ๋ชจ๋/์ฑ์ฅ์ ๋ ๊ฑฐ์ ๊ฐ์น๋ฅผ ์ฝ์ต๋๋ค.
UO.Print(UO.SkillVal("Mining"));
UO.Print(UO.SkillVal("Mining", 1));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ณํ์ ์ ํํ๊ธฐ ์ ์ SkillBaseVal๋ฅผ ์ทจํ๊ณ , ์คํฌ์ ์ฒ์ ์ฝ๋ ๊ฒฝ์ฐ ๊ธฐ์ค์ ์ด ์ ์ฅ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ณ์ข =0/1/3์ ์ฝ์ด๋ ๋ฏธ๋ ์ฑ์ฅ ๋ณ์ข =2์ ์ถ๋ฐ์ ์ด ์ค์ ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var baseline = UO.SkillVal("Mining", 2);
UO.Wait(1000);
UO.Print(UO.SkillVal("Mining", 2) - baseline);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๋ชป๋ ๋ณํ์ ๋ฉ์์ง๋ฅผ ํ์ํ๊ณ 0์ ์ ๊ณตํ์ง๋ง ๊ธฐ์ค์ ์ด ์ด๋ฏธ ์์ฑ๋์์ ์ ์์ต๋๋ค. GetSkillValue/GetSkillCurrentValue ๊ฐ์ double ์๊ฒฝ์ผ๋ก ์ธก์ ๋๋ฉฐ ์ฒ๋๊ฐ ๋ค๋ฆ ๋๋ค.
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 lockMode = UO.SkillVal("Mining", 3);
if (Truth(lockMode == 2))
{
UO.Print("Skill locked");
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: skillName (String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.SkillVal. -
InjectionScript.Runtime.InjectionApiUO.SkillVal:SkillVal(skillName, 0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int SkillVal(string skillName) => SkillVal(skillName, 0);๋งค๊ฐ๋ณ์: skill (Any), variant (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [SkillVal]. -
InjectionScript.Runtime.InjectionApiUO.SkillVal:SkillVal(values[0].ToString(), NumberConversions.ToInt(values[1])). -
InjectionScript.Runtime.InjectionValue.ToString:values[0].ToString(). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[1]).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(SkillVal(values[0].ToString(), NumberConversions.ToInt(values[1])))ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Snoop();
void UO.Snoop(object? container);์ผ๋ฐ์ ์ผ๋ก ์ด๋๋ก ์์ฒญํ๋ ์ปจํ ์ด๋/๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
-
container- ์ ํ์ฌํญ serial/๋ณ์นญ. ๊ธฐ๋ณธ๊ฐ์ ๋ธ๋ฆฌ์ง์ ๋๋ค.LastTarget. ์ด ๋ช ๋ น์ IsContainer ๋๋ ์์์ ํ์ธํ์ง ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ExecuteLegacyManualAlias๋ ๋ธ๋ฆฌ์ง.UseObject(Arg(0,bridge.LastTarget))์ ํธ์ถํฉ๋๋ค. ์ด๋ ์ค๋ํ ์คํฌ์ ์ํ ๋ณ๋์ ํด๋ผ์ด์ธํธ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ ์ผ๋ฐ์ ์ธ double-ํด๋ฆญ ์์ฒญ์ ๋๋ค.
- Bridge๋ ๊ฒ์ ์คํธ๋ฆผ์ ๋ํ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์๋ฒ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ด์ฅ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Snoop");
UO.Snoop();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ผ๋ฐ์ ์ผ๋ก ์ด๋๋ก ์์ฒญํ๋ ์ปจํ ์ด๋/๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
UO.Snoop();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteLegacyManualAlias๋ ๋ธ๋ฆฌ์ง.UseObject(Arg(0,bridge.LastTarget))์ ํธ์ถํฉ๋๋ค. ์ด๋ ์ค๋ํ ์คํฌ์ ์ํ ๋ณ๋์ ํด๋ผ์ด์ธํธ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ ์ผ๋ฐ์ ์ธ double-ํด๋ฆญ ์์ฒญ์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.IsContainer("lasttarget")))
{
UO.Snoop("lasttarget");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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()
{
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.Snoop(id);
UO.Wait(500);
UO.Print(UO.GetContent(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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseObject:bridge.UseObject(Arg(0, bridge.LastTarget)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0, bridge.LastTarget). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastTarget:bridge.LastTarget.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "snoop": bridge.UseObject(Arg(0, bridge.LastTarget)); break;๋งค๊ฐ๋ณ์: container (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseObject:bridge.UseObject(Arg(0, bridge.LastTarget)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0, bridge.LastTarget). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastTarget:bridge.LastTarget.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "snoop": bridge.UseObject(Arg(0, bridge.LastTarget)); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.StealthCnt();์บ๋ฆญํฐ์ ๋ก์ปฌ ์คํ ์ค ์คํ์ ์นด์ดํฐ๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ IsHidden ํธ์ถ ๊ฐ ๋์ ํฉ๊ณ max(abs(deltaX),abs(deltaY)). ์ด๋ ๋ณด์ฅ๋ ์๋ฒ ์คํ ์ค ๋จ๊ณ ์๋ ๋จ์ ํ๋๊ฐ ์๋๋๋ค.
- ํ๋ ์ด์ด๊ฐ ์๊ฑฐ๋ ํ๋ ์ด์ด๊ฐ ์จ๊ฒจ์ ธ ์์ง ์์ผ๋ฉด count=0๋ฅผ ์ฌ์ค์ ํ๊ณ ํ์ฌ X/Y(๋๋ -1)์ ์ ์ฅํฉ๋๋ค. ์คํ ์ค ์ ์ด์ ์ ์ ์ฅ๋ X/Y์ ๋น๊ตํ์ฌ ์คํ์ ์ ์ถ๊ฐํ๊ณ ์ขํ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ์นด์ดํฐ๋ ์ฝํ์ง๋ฉด์ ๋ณ๊ฒฝ๋ฉ๋๋ค. ํตํ ๊ฐ ์๋ค ์ด๋์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค. X/Y ์์ด Z์ ๋ณ๊ฒฝํด๋ ์นด์ดํฐ๊ฐ ์ฆ๊ฐํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.StealthCnt();
UO.Print("StealthCnt: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์บ๋ฆญํฐ์ ๋ก์ปฌ ์คํ ์ค ์คํ์ ์นด์ดํฐ๋ฅผ ์ฝ์ต๋๋ค.
UO.Print(UO.StealthCnt());๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ๋ ์ด์ด๊ฐ ์๊ฑฐ๋ ํ๋ ์ด์ด๊ฐ ์จ๊ฒจ์ ธ ์์ง ์์ผ๋ฉด count=0๋ฅผ ์ฌ์ค์ ํ๊ณ ํ์ฌ X/Y(๋๋ -1)์ ์ ์ฅํฉ๋๋ค. ์คํ ์ค ์ ์ด์ ์ ์ ์ฅ๋ X/Y์ ๋น๊ตํ์ฌ ์คํ์ ์ ์ถ๊ฐํ๊ณ ์ขํ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var before = UO.StealthCnt();
UO.Wait(500);
UO.Print(UO.StealthCnt() - before);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์นด์ดํฐ๋ ์ฝํ์ง๋ฉด์ ๋ณ๊ฒฝ๋ฉ๋๋ค. ํตํ ๊ฐ ์๋ค ์ด๋์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค. X/Y ์์ด Z์ ๋ณ๊ฒฝํด๋ ์นด์ดํฐ๊ฐ ์ฆ๊ฐํ์ง ์์ต๋๋ค.
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(UO.Hidden()))
{
UO.Print(UO.StealthCnt());
}
else
{
UO.Print(UO.StealthCnt());
}
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.StealthCnt. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.StealthCnt:bridge.StealthCnt().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int StealthCnt() => bridge.StealthCnt();ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.TicksSkill();์ ์ฅ๋ ๋งํฌ TicksSkill๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ๋ฐํ์ ์์๋ถํฐ 10๋ถ์ 1์ด ์์ UO.Timer๋ฅผ ํ์ํฉ๋๋ค. 0 - ๋งํฌ๊ฐ ์์ง ์ค์ ๋์ง ์์๊ฑฐ๋ ์ฒ์ 10๋ถ์ 1์ด์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ฐ๋ฆฌ์ด๋ ๋ฌ๋ ฅ ์๊ฐ์ด ์๋๋๋ค.
- ticksSkill ํ๋๋ฅผ ๋ฐํํฉ๋๋ค. ์ฑ๊ณต์ ์ผ๋ก ์น์ธ๋ UseSkill/UseSkillAtTarget์ ์ํด ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ๋ชจ๋ ์๋/์๋ฒ ํ๋์ ์๋์ผ๋ก ๊ด์ฐฐํ๋ ๊ฒ์ ์๋๋๋ค. ๋ช ๋ น ์์ฒด๋ ํ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
- UO.Timer() - ์ด ํ์๋ 10๋ถ์ 1์ด ๋จ์๋ก ๋์ด๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๋งํฌ๋ ์๋ก ๋ค๋ฅธ ๋ฐํ์ ๊ฐ์ ๋น๊ต๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.TicksSkill();
UO.Print("TicksSkill: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ฅ๋ ๋งํฌ TicksSkill๋ฅผ ์ฝ์ต๋๋ค.
var stamp = UO.TicksSkill();
UO.Print(stamp);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ticksSkill ํ๋๋ฅผ ๋ฐํํฉ๋๋ค. ์ฑ๊ณต์ ์ผ๋ก ์น์ธ๋ UseSkill/UseSkillAtTarget์ ์ํด ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ๋ชจ๋ ์๋/์๋ฒ ํ๋์ ์๋์ผ๋ก ๊ด์ฐฐํ๋ ๊ฒ์ ์๋๋๋ค. ๋ช ๋ น ์์ฒด๋ ํ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var stamp = UO.TicksSkill();
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.TicksSkill();
UO.Wait(250);
var after = UO.TicksSkill();
UO.Print(before = after);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int TicksSkill() => ticksSkill;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Track();
void UO.Track(object? flag);
void UO.Track(object? flagRaw, object? x, object? y);์ขํ์ ๋ํ ๋ก์ปฌ ํ์ดํ๋ฅผ ์์ฑํ๊ฑฐ๋ ์ ๊ฑฐํฉ๋๋ค. ๋ฐํ ์ฅ์๋ฅผ ํ์ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ถ์ ์คํฌ์ ๋ฐ๋ํ์ง ์์ผ๋ฉฐ, ์๋ฌผ์ ๊ฒ์ํ์ง ์์ผ๋ฉฐ, ์บ๋ฆญํฐ๋ฅผ ์์ง์ด์ง ์์ต๋๋ค.
-
flagโ 0 โ ๋ก์ปฌ ํ์ดํ๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ๋ค๋ฅธ ์ ์ฒด - ์ผ. UO.Track() ๋ฐ UO.Track(1)๋ ๊ทธ๋ ๋ฅผ ํ์ฌ X/Y ์บ๋ฆญํฐ์ ๋ฐฐ์นํฉ๋๋ค. UO.Track(1, x, y) ํ์๋ ์ง์ ์ ๋ฐฐ์นํฉ๋๋ค. UO.Track(0, x, y)๋ ์ขํ๋ฅผ ๋ฌด์ํฉ๋๋ค. ๋ฑ๋ก๋ API์๋ 2๊ฐ์ ๋งค๊ฐ๋ณ์ ํ์์ด ํฌํจ๋์ด ์์ง ์์ต๋๋ค. -
flagRawโ 0 โ ๋ก์ปฌ ํ์ดํ๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ๋ค๋ฅธ ์ ์ฒด - ์ผ. UO.Track() ๋ฐ UO.Track(1)๋ ๊ทธ๋ ๋ฅผ ํ์ฌ X/Y ์บ๋ฆญํฐ์ ๋ฐฐ์นํฉ๋๋ค. UO.Track(1, x, y) ํ์๋ ์ง์ ์ ๋ฐฐ์นํฉ๋๋ค. UO.Track(0, x, y)๋ ์ขํ๋ฅผ ๋ฌด์ํฉ๋๋ค. ๋ฑ๋ก๋ API์๋ 2๊ฐ์ ๋งค๊ฐ๋ณ์ ํ์์ด ํฌํจ๋์ด ์์ง ์์ต๋๋ค. -
xโ ์ฐฝ ํฝ์ ์ด ์๋ ํ์ฌ ์ง๋์ ์ ์ขํ์ ๋๋ค. Z ๋ฐ ์นด๋๋ฒํธ๋ ํ์ฉ๋์ง ์์ต๋๋ค. ์ง๋์์ ๊ธฐ์กด ์ง์ ์ ์ ํํฉ๋๋ค. ํ์ ์งํ์ ํ์ธํ๊ฑฐ๋ ๊ฒฝ๋ก๋ฅผ ๊ณํํ๊ฑฐ๋ ์์ง์ด๋ ํ์ ์ ๋ฐ๋ฅด์ง ์์ต๋๋ค. -
yโ ์ฐฝ ํฝ์ ์ด ์๋ ํ์ฌ ์ง๋์ ์ ์ขํ์ ๋๋ค. Z ๋ฐ ์นด๋๋ฒํธ๋ ํ์ฉ๋์ง ์์ต๋๋ค. ์ง๋์์ ๊ธฐ์กด ์ง์ ์ ์ ํํฉ๋๋ค. ํ์ ์งํ์ ํ์ธํ๊ฑฐ๋ ๊ฒฝ๋ก๋ฅผ ๊ณํํ๊ฑฐ๋ ์์ง์ด๋ ํ์ ์ ๋ฐ๋ฅด์ง ์์ต๋๋ค.
void - ๊ฐ ์์; ์ด ๋ช ๋ น์ ์ด๋ ์ฑ๊ณต ๋๋ bool์ ๋ฐํํ์ง ์์ต๋๋ค. ๋ก์ปฌ ํ ํฐ๋ง ๋ณ๊ฒฝ๋ฉ๋๋ค.
- ์๋ฒ ๋ฐ ๋ก์ปฌ ํ์ดํ๋ ๋ณ๋๋ก ์ ์ฅ๋ฉ๋๋ค. Track(0)์ ์๋ฒ ํ์ดํ๋ฅผ ์ ๊ฑฐํ์ง ์์ต๋๋ค. ๊ทธ๋ํฝ์ด ์์ผ๋ฉด ๋ง์ปค๊ฐ ์ ์ฅ๋๊ณ ์ฐฝ์ด ์ด๋ฆด ๋ ๋ํ๋ฉ๋๋ค. ๊ฒ์ ์ฐฝ์ ๋ซ์๋ ๋ง์ปค๋ ์ ๊ฑฐ๋์ง ์์ต๋๋ค. ์ฐ๊ฒฐ์ ๋์ผ๋ฉด ์ฐ๊ฒฐ์ด ์ง์์ง๋๋ค. ์๋ฒ๋ ํ์ดํ๋ฅผ ์ด๋ํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์ขํ๋ ๋ชฉํ๊ฐ ๋ฌ์ฑ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
- ์ฐฝ ํฝ์ ์ด ์๋ ํ์ฌ ์ง๋์ ์ ์ขํ์ ๋๋ค. Z ๋ฐ ์นด๋๋ฒํธ๋ ํ์ฉ๋์ง ์์ต๋๋ค. ์ง๋์์ ๊ธฐ์กด ์ง์ ์ ์ ํํฉ๋๋ค. ํ์ ์งํ์ ํ์ธํ๊ฑฐ๋ ๊ฒฝ๋ก๋ฅผ ๊ณํํ๊ฑฐ๋ ์์ง์ด๋ ํ์ ์ ๋ฐ๋ฅด์ง ์์ต๋๋ค.
- 0 โ ๋ก์ปฌ ํ์ดํ๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ๋ค๋ฅธ ์ ์ฒด - ์ผ. UO.Track() ๋ฐ UO.Track(1)๋ ๊ทธ๋ ๋ฅผ ํ์ฌ X/Y ์บ๋ฆญํฐ์ ๋ฐฐ์นํฉ๋๋ค. UO.Track(1, x, y)๋ ํ์๋ ์ง์ ์ ๋ฐฐ์นํฉ๋๋ค. UO.Track(0, x, y)๋ ์ขํ๋ฅผ ๋ฌด์ํฉ๋๋ค. ๋ฑ๋ก๋ API์๋ 2๊ฐ์ ๋งค๊ฐ๋ณ์ ํ์์ด ํฌํจ๋์ด ์์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Track");
UO.Track();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.Track()๋ ํ์ฌ ์ง์ ์ ๊ธฐ์ตํฉ๋๋ค. ๋ ๋ ํ์๋ ํ์ดํ๊ฐ ๋ค๋ก ํฅํฉ๋๋ค. ํฌ์ธํธ๋ ๋ฌธ์ ๋ค์์ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค.
UO.Track();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ์ง๋์์ 1450,1690๊น์ง ์ง์ญ ํ์ดํ๋ฅผ ํ์ํฉ๋๋ค. ์ด๋ฏธ ํ๋์ ์ฌ๊ฐํ ์์ ์์ผ๋ฉด Track(0)์ ์ฌ์ฉํ์ฌ ํด๋น ์ฌ๊ฐํ์ ์ ๊ฑฐํฉ๋๋ค. ์ขํ๋ฅผ ๋์ฒดํ์ญ์์ค.
return RunScenario();
object? RunScenario()
{
var x = 1450;
var y = 1690;
UO.Track(1, x, y);
if (Truth(UO.GetDistance(x, y) <= 1))
{
UO.Track(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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- MarkIfDistant ํจ์๋ ๋์ผํ X/Y ๋ฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋์์ด ๋ ์ ๋ณด๋ค ๋ฉ๋ฉด ํ์ดํ๋ฅผ ํ์ํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ๊ฑฐํฉ๋๋ค. ์ ์ฒด ๊ธฐ๋ฅ์ ์๋์ ๊ฐ์ต๋๋ค. ์ฌ๊ธฐ์๋ ์์ง์์ด๋ ์ฑ์ทจ์ ๋ํ ๊ธฐ๋๊ฐ ์์ต๋๋ค.
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()
{
MarkIfDistant(1450, 1690);
return null;
}
void MarkIfDistant(dynamic x, dynamic y)
{
if (Truth(UO.GetDistance(x, y) > 2))
{
UO.Track(1, x, y);
}
else
{
UO.Track(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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Track. -
InjectionScript.Runtime.InjectionApiUO.Track:Track(1, GetX(), GetY()). -
InjectionScript.Runtime.InjectionApiUO.GetX:GetX(). -
InjectionScript.Runtime.InjectionApiUO.GetY:GetY().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void Track() => Track(1, GetX(), GetY());๋งค๊ฐ๋ณ์: flag (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Track. -
InjectionScript.Runtime.InjectionApiUO.Track:Track(NumberConversions.ToInt(flag), GetX(), GetY()). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(flag). -
InjectionScript.Runtime.InjectionApiUO.GetX:GetX(). -
InjectionScript.Runtime.InjectionApiUO.GetY:GetY().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void Track(InjectionValue flag) => Track(NumberConversions.ToInt(flag), GetX(), GetY());๋งค๊ฐ๋ณ์: flagRaw (Any), x (Any), y (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Track. -
InjectionScript.Runtime.InjectionApiUO.Track:Track(NumberConversions.ToInt(flagRaw), NumberConversions.ToInt(x), NumberConversions.ToInt(y)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(flagRaw).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void Track(InjectionValue flagRaw, InjectionValue x, InjectionValue y)
=> Track(NumberConversions.ToInt(flagRaw), NumberConversions.ToInt(x), NumberConversions.ToInt(y));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.UseSkill(object? skillName);์๋ฒ์ ์ด๋ฆ์ผ๋ก ์คํฌ์ ์ฌ์ฉํ๋๋ก ์์ฒญํฉ๋๋ค. ์ ํํ ํ๋์ ๋งค๊ฐ๋ณ์: skillName. UO.UseSkill("Hiding")๋ ์์ ์ ์บ๋ฆญํฐ๋ฅผ ์จ๊ธฐ๋ ค๊ณ ํฉ๋๋ค. ์คํฌ์ ํ๊ฒ์ด ํ์ํ ๊ฒฝ์ฐ ๊ฒ์ ์กฐ์ค๊ฒฝ์ผ๋ก ์ ํํ๊ฑฐ๋ ๋ณ๋์ ๋ช ๋ น WaitTargetObject๋ก ๋ฏธ๋ฆฌ ์ ํํ์ธ์.
-
skillName- ํ์ ๋ฌธ์์ด - "Hiding", "Anatomy" ๋๋ "Meditation"๊ณผ ๊ฐ์ ์คํฌ์ ์ ํํ ์์ด ์ด๋ฆ์ ๋๋ค. ๋์๋ฌธ์๋ ์ค์ํ์ง ์์ต๋๋ค. ๊ณต๋ฐฑ๊ณผ ๋ฐ์ค์ ์๋์ผ๋ก ์์ ๋์ง ์์ต๋๋ค. ์คํฌ๋ฒํธ, serial, self, ๊ฑฐ๋ฆฌ, ์ ๋ช , maxZ ๋ฐ ๋๊ธฐ๋ ์ฌ๊ธฐ์ ์ ์ก๋์ง ์์ต๋๋ค. ๋ชจ๋ ์ด๋ฆ.
int: 1/true โ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ์๋ฝํ์ต๋๋ค. 0/false - ์ด๋ฆ์ ์ ์ ์๊ฑฐ๋ ๋ก์ปฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ด๊ฒ์ ์คํฌ ์ฑ๊ณต, ์คํฌ ์ฑ์ฅ, ์คํ ์ค์ ์งํ๊ฐ ์๋๋๋ค. ์๋ฐํ๊ฒ ์ฝ์ผ๋ ค๋ฉด Hidden()๋ฅผ ์ฝ์ด๋ณด์ธ์. if UO.UseSkill("Hiding") { ... }๋ผ๊ณ ์ฐ๊ฑฐ๋ 1/true์ ๋น๊ตํ ์ ์์ต๋๋ค. ๋๋ฝ๋๊ฑฐ๋ ์ถ๊ฐ๋ ์ธ์๋ ํธ์ถ ์ค๋ฅ์ ๋๋ค.
- ๋จ์ผ ํ์: UO.UseSkill(skillName). ๋ ๋ฒ์งธ ๋๋ ํ์ ๋งค๊ฐ๋ณ์๋ ์์ต๋๋ค. ๊ฒ์, ๋์ ๋ฐ ๋๊ธฐ๋ ๋ค๋ฅธ ๋ช ๋ น์ผ๋ก ์ํ๋ฉ๋๋ค.
- ์จ๊ธฐ๊ธฐ์ ๋ช ์์๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ ํํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ค์ ์ํด WaitTargetObject๋ฅผ ์ค๋นํ์ง ๋ง์ญ์์ค. ๋จ์ ํญ๋ฐ์ ๋ค์ ์ธ๋ถ์ธ์ ์์ผ์ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ํด๋ถํ์ ๋ฒ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. UseSkill("Anatomy")๋ฅผ ํธ์ถํ๊ณ ๋ง์ฐ์ค๋ก ์บ๋ฆญํฐ๋ฅผ ์ ํํฉ๋๋ค. ์๋์ผ๋ก ์๋ตํ๋ ค๋ฉด ๋จผ์ WaitTargetObject๋ฅผ ์คํํ ๋ค์ UseSkill๋ฅผ ์คํํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์๋ฒ์ ๋น ๋ฅธ ์๋ต์ ๋์น์ง ์์ ์ ์์ต๋๋ค.
- UseSkill๋ ๋์ ๋๊ธฐ์ด์ ์์ฑํ๊ฑฐ๋ ์ง์ฐ์ง ์์ต๋๋ค. ์๋ต์ ์ค๋นํ๋ค๋ฉด ์คํจ/์๊ฐ ์ด๊ณผ ์ CancelWaitTarget๋ฅผ ์ง์ฐ์ธ์. ๋์์ ๋ค๋ฅธ ๊ด์ฐฐ ์๋๋ฆฌ์ค๋ฅผ ์คํํ์ง ๋ง์ญ์์ค.
- ์ค๋ , ๋๋ฐ ๋ฑ ๋ค๋จ๊ณ ์คํฌ์ ๋ณ๋์ ์ถ๊ฐ ํ๊ฒ/๋๊ตฌ ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. ๋ฏธ๋ฆฌ ์ ํ๋ ํ๋์ ๊ฐ์ฒด๋ ์ด๋ค ์คํฌ๋ ์๋ฃํ์ง ์์ต๋๋ค.
- ์ฌ์ ์ ๋์จ ์ด๋ฆ์ ๋๊ตฌ ์์ด ์ฌ์ฉํ๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ฑ๊ตด์๋ ๋๊ตฌ๊ฐ ํ์ํฉ๋๋ค. ์ฃผ๋ฌธ์ Cast์ ์ํด ์์ ๋ฉ๋๋ค. ๊ท์น๊ณผ ์ฑ๊ณต์ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค.
- ์๋ฝ๋ ์์ฒญ์ด TicksSkill๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ํ์ ์คํ ์ค, ํจ๊ณผ, ์คํฌ ์ฆ๊ฐ ๋๋ ๋๊ธฐ์ด ์๋น๋ฅผ ๊ธฐ๋ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.UseSkill("Hiding");
UO.Print("UseSkill: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์จ๋ ๊ฒ์ด ์ ์ผํ ์ฃผ์ฅ์ ๋๋ค. UO.Wait(1000) ์๋ตํ ์๊ฐ์ ์ค๋๋ค. Hidden๋ ์์ ๋ ํ๋๊ทธ๋ฅผ ์ฝ์ต๋๋ค. UseSkill์์ 1๋ก ๋์์๋ค๊ณ ํด์ ํ์ถํ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
if (!(Truth(UO.Connected())) || Truth(UO.Dead()) || Truth(UO.Hidden()))
{
return null;
}
if (!(Truth(UO.UseSkill("Hiding"))))
{
UO.Print("Hiding request rejected");
return null;
}
await Delay(1000);
if (Truth(UO.Hidden()))
{
UO.Print("Character is hidden");
}
else
{
UO.Print("Not hidden yet; check the game journal");
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํด๋ถํ์ด ์ ์ผํ ๋งค๊ฐ๋ณ์์ ๋๋ค UseSkill; mobile๋ WaitTargetObject์ ์๋ฏธํฉ๋๋ค. ASC๋ 16์ง์ ๋ฌธ์์ด GetSerial์ ๋ฒ์ ํ์ธ์ ์ํ ์ซ์๋ก ๋ณํํฉ๋๋ค. 1500 โ ์์์์๋ ๋๊ธฐ ์๊ฐ์ด ๋ฐ๋ฆฌ์ด์ ๋๋ค. ๋ง์ง๋ง์ผ๋ก ๋จ์ ๋๊ธฐ์ด์ ์ง์๋๋ค. ๊ฒ์์์ ํด๋ถํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var mobile = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(mobile <= 0) || Truth(mobile >= 0x40000000) || !(Truth(UO.Exists(mobile))))
{
return null;
}
UO.CancelWaitTarget();
try
{
UO.WaitTargetObject(mobile);
if (Truth(UO.UseSkill("Anatomy")))
{
await Delay(1500);
}
}
finally
{
UO.CancelWaitTarget();
}
return null;
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ช ์์ ๋ชฉ์ ์์ด ํธ์ถ๋ฉ๋๋ค. ์ด์ ๋ง๋๋ฅผ ์ ์ฅํ๊ธฐ ์ , 2000๊ฐ ๊ด์ฐฐ ๊ธฐ๊ฐ์ ๋๋ค. ๋ง๋ ์ฆ๊ฐ์๋ ๋ค๋ฅธ ์ด์ ๊ฐ ์์ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ช ์์ ์ฆ๊ฑฐ๋ ์๋๊ณ ํ๋ณต ์๋๊ฐ ๊ณ ์ ๋์ด ์๋ค๋ ์ฝ์๋ ์๋๋๋ค.
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()
{
if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
{
return null;
}
var before = UO.Mana();
if (!(Truth(UO.UseSkill("Meditation"))))
{
UO.Print("Meditation request rejected");
return null;
}
await Delay(2000);
if (Truth(UO.Mana() > before))
{
UO.Print("Mana increased");
}
else
{
UO.Print("No mana increase observed yet");
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: skillName (String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UseSkill. -
InjectionScript.Runtime.InjectionApiUO.UseSkillCore:UseSkillCore(skillName).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int UseSkill(string skillName)
{
return UseSkillCore(skillName) ? 1 : 0;
}