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

์ฃผ์ œ์— ๋Œ€ํ•œ ์˜ˆ

๊ฐ ๋ช…๋ น ์นด๋“œ์—๋Š” ์ง์ ‘ ์ฝ”๋“œ, ํ•จ์ˆ˜ ๋ฐ ํด๋ž˜์Šค ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋…๋ฆฝ์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์„ ํƒ๋œ ์งง์€ ์‹œ๋‚˜๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค. ์ œํ•œ์‚ฌํ•ญ๊ณผ ์ „์ฒด ๋ถ„์„์ด ์นด๋“œ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

UO.UseSkill

๋งค๊ฐœ๋ณ€์ˆ˜, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค

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;

UO.GetSkillValue

๋งค๊ฐœ๋ณ€์ˆ˜, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค

var selector = "Mining";
var value = UO.GetSkillValue(selector);
UO.Print(Convert.ToString(value));

์ „์ฒด ๋ช…๋ น ์ฐธ์กฐ


UO.GetSkillCap

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋Š” ์ˆซ์ž์™€ ๋ชจ๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ์ธ์ˆ˜๋Š” ๋ณ€ํ™˜ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ํ˜ธ์ถœ์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.GetSkillCap("Mining");
UO.Print("GetSkillCap: " + Convert.ToString(result));

1. ์ฝ๊ธฐ ๋ฐ ์ถœ๋ ฅ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ด ์˜ˆ์—์„œ๋Š” ์„ ํƒ๊ธฐ์™€ ๋…น์Œ ์‹œ ๋ชจ๋“œ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ค„์—์„œ๋Š” ์ด๋ฆ„์œผ๋กœ ์Šคํ‚ฌ์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์ˆซ์ž๋กœ ํŠน์„ฑ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Print ๊ฒฐ๊ณผ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
var selector = "Mining";
var value = UO.GetSkillCap(selector);
UO.Print(Convert.ToString(value));

2. ์กฐ๊ฑด ๋˜๋Š” ๋น„๊ต์— ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ž„๊ณ„๊ฐ’ 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;

3. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋ชจ๋“  ๋„์šฐ๋ฏธ ์ฝ”๋“œ๋Š” 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetSkillCap(skillName) โ€” UO.GetSkillCap(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: skillName (Any)

๊ฒฐ๊ณผ: double / Decimal.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "getskillcap": return new InjectionValue(bridge.GetSkillValue(Text(0), false, true));

UO.GetSkillCurrentValue

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋Š” ์ˆซ์ž์™€ ๋ชจ๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ์ธ์ˆ˜๋Š” ๋ณ€ํ™˜ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ํ˜ธ์ถœ์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.GetSkillCurrentValue("Mining");
UO.Print("GetSkillCurrentValue: " + Convert.ToString(result));

1. ์ฝ๊ธฐ ๋ฐ ์ถœ๋ ฅ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ด ์˜ˆ์—์„œ๋Š” ์„ ํƒ๊ธฐ์™€ ๋…น์Œ ์‹œ ๋ชจ๋“œ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ค„์—์„œ๋Š” ์ด๋ฆ„์œผ๋กœ ์Šคํ‚ฌ์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์ˆซ์ž๋กœ ํŠน์„ฑ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Print ๊ฒฐ๊ณผ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
var selector = "Mining";
var value = UO.GetSkillCurrentValue(selector);
UO.Print(Convert.ToString(value));

2. ์กฐ๊ฑด ๋˜๋Š” ๋น„๊ต์— ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ž„๊ณ„๊ฐ’ 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;

3. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋ชจ๋“  ๋„์šฐ๋ฏธ ์ฝ”๋“œ๋Š” 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetSkillCurrentValue(skillName) โ€” UO.GetSkillCurrentValue(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: skillName (Any)

๊ฒฐ๊ณผ: double / Decimal.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "getskillcurrentvalue": return new InjectionValue(bridge.GetSkillValue(Text(0), true, false));

UO.GetSkillLockState

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋Š” ์ˆซ์ž์™€ ๋ชจ๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ์ธ์ˆ˜๋Š” ๋ณ€ํ™˜ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ํ˜ธ์ถœ์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.GetSkillLockState("Mining");
UO.Print("GetSkillLockState: " + Convert.ToString(result));

1. ์ฝ๊ธฐ ๋ฐ ์ถœ๋ ฅ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ด ์˜ˆ์—์„œ๋Š” ์„ ํƒ๊ธฐ์™€ ๋…น์Œ ์‹œ ๋ชจ๋“œ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ค„์—์„œ๋Š” ์ด๋ฆ„์œผ๋กœ ์Šคํ‚ฌ์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์ˆซ์ž๋กœ ํŠน์„ฑ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Print ๊ฒฐ๊ณผ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
var selector = "Mining";
var mode = UO.GetSkillLockState(selector);
UO.Print(Convert.ToString(mode));

2. ์กฐ๊ฑด ๋˜๋Š” ๋น„๊ต์— ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ž„๊ณ„๊ฐ’ 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;

3. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋ชจ๋“  ๋„์šฐ๋ฏธ ์ฝ”๋“œ๋Š” 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetSkillLockState(skillName) โ€” UO.GetSkillLockState(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: skillName (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "getskilllockstate": return new InjectionValue(bridge.GetSkillLockState(Text(0)));

UO.GetSkillValue

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋Š” ์ˆซ์ž์™€ ๋ชจ๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ์ธ์ˆ˜๋Š” ๋ณ€ํ™˜ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ํ˜ธ์ถœ์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.GetSkillValue("Mining");
UO.Print("GetSkillValue: " + Convert.ToString(result));

1. ์ฝ๊ธฐ ๋ฐ ์ถœ๋ ฅ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ด ์˜ˆ์—์„œ๋Š” ์„ ํƒ๊ธฐ์™€ ๋…น์Œ ์‹œ ๋ชจ๋“œ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ค„์—์„œ๋Š” ์ด๋ฆ„์œผ๋กœ ์Šคํ‚ฌ์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์ˆซ์ž๋กœ ํŠน์„ฑ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Print ๊ฒฐ๊ณผ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
var selector = "Mining";
var value = UO.GetSkillValue(selector);
UO.Print(Convert.ToString(value));

2. ์กฐ๊ฑด ๋˜๋Š” ๋น„๊ต์— ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ž„๊ณ„๊ฐ’ 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;

3. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋ชจ๋“  ๋„์šฐ๋ฏธ ์ฝ”๋“œ๋Š” 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetSkillValue(skillName) โ€” UO.GetSkillValue(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: skillName (Any)

๊ฒฐ๊ณผ: double / Decimal.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "getskillvalue": return new InjectionValue(bridge.GetSkillValue(Text(0), false, false));

UO.SetSkillLockState

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋Š” ์ˆซ์ž์™€ ๋ชจ๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ์ธ์ˆ˜๋Š” ๋ณ€ํ™˜ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ํ˜ธ์ถœ์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.Print("Calling UO.SetSkillLockState");
UO.SetSkillLockState("Mining", 2);

1. ์ฝ๊ธฐ ๋ฐ ์ถœ๋ ฅ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ด ์˜ˆ์—์„œ๋Š” ์„ ํƒ๊ธฐ์™€ ๋…น์Œ ์‹œ ๋ชจ๋“œ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ค„์—์„œ๋Š” ์ด๋ฆ„์œผ๋กœ ์Šคํ‚ฌ์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์ˆซ์ž๋กœ ํŠน์„ฑ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Print ๊ฒฐ๊ณผ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
var selector = "Mining";
var mode = 2;
UO.SetSkillLockState(selector, mode);
UO.Print(Convert.ToString(UO.GetSkillLockState(selector)));

2. ์กฐ๊ฑด ๋˜๋Š” ๋น„๊ต์— ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ž„๊ณ„๊ฐ’ 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;

3. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋ชจ๋“  ๋„์šฐ๋ฏธ ์ฝ”๋“œ๋Š” 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.SetSkillLockState(skillName, skillState) โ€” UO.SetSkillLockState(Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: skillName (Any), skillState (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "setskilllockstate":

                case "skilllockstate": bridge.SetSkillLockState(Text(0), Arg(1)); return InjectionValue.Unit;

UO.SkillLockState

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋Š” ์ˆซ์ž์™€ ๋ชจ๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ์ธ์ˆ˜๋Š” ๋ณ€ํ™˜ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ํ˜ธ์ถœ์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.Print("Calling UO.SkillLockState");
UO.SkillLockState("Mining", 2);

1. ์ฝ๊ธฐ ๋ฐ ์ถœ๋ ฅ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ด ์˜ˆ์—์„œ๋Š” ์„ ํƒ๊ธฐ์™€ ๋…น์Œ ์‹œ ๋ชจ๋“œ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ค„์—์„œ๋Š” ์ด๋ฆ„์œผ๋กœ ์Šคํ‚ฌ์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์ˆซ์ž๋กœ ํŠน์„ฑ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Print ๊ฒฐ๊ณผ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
var selector = "Mining";
var mode = 2;
UO.SkillLockState(selector, mode);
UO.Print(Convert.ToString(UO.GetSkillLockState(selector)));

2. ์กฐ๊ฑด ๋˜๋Š” ๋น„๊ต์— ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ž„๊ณ„๊ฐ’ 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;

3. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋ชจ๋“  ๋„์šฐ๋ฏธ ์ฝ”๋“œ๋Š” 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.SkillLockState(skillName, skillState) โ€” UO.SkillLockState(Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: skillName (Any), skillState (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "setskilllockstate":

                case "skilllockstate": bridge.SetSkillLockState(Text(0), Arg(1)); return InjectionValue.Unit;

UO.SkillVal

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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 ์•ˆ๊ฒฝ์œผ๋กœ ์ธก์ •๋˜๋ฉฐ ์ฒ™๋„๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.SkillVal("Mining");
UO.Print("SkillVal: " + Convert.ToString(result));

1. ์ง์ ‘ ํ†ตํ™” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์Šคํ‚ฌ์ด๋‚˜ ๋ชจ๋“œ/์„ฑ์žฅ์˜ ๋ ˆ๊ฑฐ์‹œ ๊ฐ€์น˜๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
UO.Print(UO.SkillVal("Mining"));
UO.Print(UO.SkillVal("Mining", 1));

2. ๋ช…์‹œ์  ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋ณ€ํ˜•์„ ์„ ํƒํ•˜๊ธฐ ์ „์— 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;
}

3. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ž˜๋ชป๋œ ๋ณ€ํ˜•์€ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ณ  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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.SkillVal(skillName) โ€” UO.SkillVal(String)

๋งค๊ฐœ๋ณ€์ˆ˜: skillName (String)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int SkillVal(string skillName) => SkillVal(skillName, 0);

UO.SkillVal(skill, variant) โ€” UO.SkillVal(Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: skill (Any), variant (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

values => new InjectionValue(SkillVal(values[0].ToString(), NumberConversions.ToInt(values[1])))

UO.Snoop

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

void UO.Snoop();
void UO.Snoop(object? container);

์ผ๋ฐ˜์ ์œผ๋กœ ์—ด๋„๋ก ์š”์ฒญํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ/๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • container - ์„ ํƒ์‚ฌํ•ญ serial/๋ณ„์นญ. ๊ธฐ๋ณธ๊ฐ’์€ ๋ธŒ๋ฆฌ์ง€์ž…๋‹ˆ๋‹ค.LastTarget. ์ด ๋ช…๋ น์€ IsContainer ๋˜๋Š” ์†Œ์†์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ์™„๋ฃŒ๋Š” ์„œ๋ฒ„์˜ ์ž‘์—…์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ExecuteLegacyManualAlias๋Š” ๋ธŒ๋ฆฌ์ง€.UseObject(Arg(0,bridge.LastTarget))์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์Šค๋ˆ„ํ•‘ ์Šคํ‚ฌ์„ ์œ„ํ•œ ๋ณ„๋„์˜ ํด๋ผ์ด์–ธํŠธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹Œ ์ผ๋ฐ˜์ ์ธ double-ํด๋ฆญ ์š”์ฒญ์ž…๋‹ˆ๋‹ค.
  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.Print("Calling UO.Snoop");
UO.Snoop();

1. ์ง์ ‘ ํ†ตํ™” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์—ด๋„๋ก ์š”์ฒญํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ/๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
UO.Snoop();

2. ๋ช…์‹œ์  ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;

3. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Snoop() โ€” UO.Snoop()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "snoop": bridge.UseObject(Arg(0, bridge.LastTarget)); break;

UO.Snoop(container) โ€” UO.Snoop(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: container (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "snoop": bridge.UseObject(Arg(0, bridge.LastTarget)); break;

UO.StealthCnt

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

int UO.StealthCnt();

์บ๋ฆญํ„ฐ์˜ ๋กœ์ปฌ ์Šคํ…”์Šค ์˜คํ”„์…‹ ์นด์šดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int โ€” IsHidden ํ˜ธ์ถœ ๊ฐ„ ๋ˆ„์  ํ•ฉ๊ณ„ max(abs(deltaX),abs(deltaY)). ์ด๋Š” ๋ณด์žฅ๋œ ์„œ๋ฒ„ ์Šคํ…”์Šค ๋‹จ๊ณ„ ์ˆ˜๋‚˜ ๋‚จ์€ ํ•œ๋„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์—†๊ฑฐ๋‚˜ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ˆจ๊ฒจ์ ธ ์žˆ์ง€ ์•Š์œผ๋ฉด count=0๋ฅผ ์žฌ์„ค์ •ํ•˜๊ณ  ํ˜„์žฌ X/Y(๋˜๋Š” -1)์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์Šคํ…”์Šค ์‹œ ์ด์ „์— ์ €์žฅ๋œ X/Y์™€ ๋น„๊ตํ•˜์—ฌ ์˜คํ”„์…‹์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ขŒํ‘œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  • ์นด์šดํ„ฐ๋Š” ์ฝํ˜€์ง€๋ฉด์„œ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ํ†ตํ™” ๊ฐ„ ์•ž๋’ค ์ด๋™์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. X/Y ์—†์ด Z์„ ๋ณ€๊ฒฝํ•ด๋„ ์นด์šดํ„ฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.StealthCnt();
UO.Print("StealthCnt: " + Convert.ToString(result));

1. ์ง์ ‘ ํ†ตํ™” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์บ๋ฆญํ„ฐ์˜ ๋กœ์ปฌ ์Šคํ…”์Šค ์˜คํ”„์…‹ ์นด์šดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
UO.Print(UO.StealthCnt());

2. ๋ช…์‹œ์  ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์—†๊ฑฐ๋‚˜ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ˆจ๊ฒจ์ ธ ์žˆ์ง€ ์•Š์œผ๋ฉด 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;
}

3. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์นด์šดํ„ฐ๋Š” ์ฝํ˜€์ง€๋ฉด์„œ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ํ†ตํ™” ๊ฐ„ ์•ž๋’ค ์ด๋™์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.StealthCnt() โ€” UO.StealthCnt()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int StealthCnt() => bridge.StealthCnt();

UO.TicksSkill

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

int UO.TicksSkill();

์ €์žฅ๋œ ๋งˆํฌ TicksSkill๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int โ€” ๋Ÿฐํƒ€์ž„ ์‹œ์ž‘๋ถ€ํ„ฐ 10๋ถ„์˜ 1์ดˆ ์•ˆ์— UO.Timer๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. 0 - ๋งˆํฌ๊ฐ€ ์•„์ง ์„ค์ •๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์ฒ˜์Œ 10๋ถ„์˜ 1์ดˆ์— ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ€๋ฆฌ์ดˆ๋‚˜ ๋‹ฌ๋ ฅ ์‹œ๊ฐ„์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ticksSkill ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๊ณต์ ์œผ๋กœ ์Šน์ธ๋œ UseSkill/UseSkillAtTarget์— ์˜ํ•ด ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ˆ˜๋™/์„œ๋ฒ„ ํ™œ๋™์„ ์ž๋™์œผ๋กœ ๊ด€์ฐฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ช…๋ น ์ž์ฒด๋Š” ํ‘œ์‹œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • UO.Timer() - ์ด ํ‘œ์‹œ๋Š” 10๋ถ„์˜ 1์ดˆ ๋‹จ์œ„๋กœ ๋‚˜์ด๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋งˆํฌ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋Ÿฐํƒ€์ž„ ๊ฐ„์— ๋น„๊ต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.TicksSkill();
UO.Print("TicksSkill: " + Convert.ToString(result));

1. ์ง์ ‘ ํ†ตํ™” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ €์žฅ๋œ ๋งˆํฌ TicksSkill๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
var stamp = UO.TicksSkill();
UO.Print(stamp);

2. ๋ช…์‹œ์  ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ticksSkill ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๊ณต์ ์œผ๋กœ ์Šน์ธ๋œ UseSkill/UseSkillAtTarget์— ์˜ํ•ด ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ˆ˜๋™/์„œ๋ฒ„ ํ™œ๋™์„ ์ž๋™์œผ๋กœ ๊ด€์ฐฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ช…๋ น ์ž์ฒด๋Š” ํ‘œ์‹œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var stamp = UO.TicksSkill();
    var ageTenths = UO.Timer() - stamp;
    UO.Print(ageTenths);
    return null;
}

3. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.TicksSkill() โ€” UO.TicksSkill()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int TicksSkill() => ticksSkill;

UO.Track

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ˜•์‹์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.Print("Calling UO.Track");
UO.Track();

1. ์ง์ ‘ ์‹ ์ฒญ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • UO.Track()๋Š” ํ˜„์žฌ ์ง€์ ์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ๋– ๋‚œ ํ›„์—๋Š” ํ™”์‚ดํ‘œ๊ฐ€ ๋’ค๋กœ ํ–ฅํ•ฉ๋‹ˆ๋‹ค. ํฌ์ธํŠธ๋Š” ๋ฌธ์ž ๋‹ค์Œ์— ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
UO.Track();

2. ๊ฒŒ์ž„ ์กฐ๊ฑด - ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ˜„์žฌ ์ง€๋„์—์„œ 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;

3. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Track() โ€” UO.Track()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public void Track() => Track(1, GetX(), GetY());

UO.Track(flag) โ€” UO.Track(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: flag (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public void Track(InjectionValue flag) => Track(NumberConversions.ToInt(flag), GetX(), GetY());

UO.Track(flagRaw, x, y) โ€” UO.Track(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: flagRaw (Any), x (Any), y (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public void Track(InjectionValue flagRaw, InjectionValue x, InjectionValue y)

            => Track(NumberConversions.ToInt(flagRaw), NumberConversions.ToInt(x), NumberConversions.ToInt(y));

UO.UseSkill

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ํŒ€์€ ์Šคํ…”์Šค, ํšจ๊ณผ, ์Šคํ‚ฌ ์ฆ๊ฐ€ ๋˜๋Š” ๋Œ€๊ธฐ์—ด ์†Œ๋น„๋ฅผ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.UseSkill("Hiding");
UO.Print("UseSkill: " + Convert.ToString(result));

1. ์ˆจ๊ธฐ๊ธฐ๋ฅผ ํ†ตํ•ด ์ˆจ๊ธฐ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ˆจ๋Š” ๊ฒƒ์ด ์œ ์ผํ•œ ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค. 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;

2. ๋ณ„๋„๋กœ ์ค€๋น„๋œ ํƒ€๊ฒŸ์„ ์ด์šฉํ•œ ํ•ด๋ถ€ํ•™ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ•ด๋ถ€ํ•™์ด ์œ ์ผํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค 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;

3. ๋ช…์ƒ๊ณผ ๋งˆ๋‚˜ ๊ด€์ฐฐ - ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์—…

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋ช…์ƒ์€ ๋ชฉ์  ์—†์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด์ „ ๋งˆ๋‚˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์ „, 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.UseSkill(skillName) โ€” UO.UseSkill(String)

๋งค๊ฐœ๋ณ€์ˆ˜: skillName (String)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int UseSkill(string skillName)

        {

            return UseSkillCore(skillName) ? 1 : 0;

        }
โš ๏ธ **GitHub.com Fallback** โš ๏ธ