KO UO Topic containers - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

์ปจํ…Œ์ด๋„ˆ

ํ™ˆ ยท C# ยท IDE ยท UO API ยท Aโ€“Z ยท ์˜ˆ ยท ์–ธ์–ด

๋‚ด์šฉ์„ ์ฝ๊ณ  ๋Œ€์ƒ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์—ด๊ณ  ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋‹ซํ˜€ ์žˆ๊ฑฐ๋‚˜ ์•„์ง ๋กœ๋“œ๋˜์ง€ ์•Š์€ ์ปจํ…Œ์ด๋„ˆ๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์ฒด ํ•ญ๋ชฉ ๋ชฉ๋ก์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„น์…˜

์ฃผ์ œ ๋ช…๋ น ๋ฐ ์„ค๋ช…
Backpack UO.Backpack
Bank UO.ObjAtLayerEx ยท UO.OpenContainer
OpenContainer UO.OpenContainer
LastContainer UO.LastContainer
ContainerOf UO.ContainerOf ยท UO.GetParent
IsContainer UO.IsContainer
์ค‘์ฒฉ๋œ ์ปจํ…Œ์ด๋„ˆ UO.GetContent ยท UO.FindTypeEx ยท UO.FindTypesArrayEx
Receiving Container UO.SetReceivingContainer ยท UO.UnsetReceivingContainer
Catch Bag UO.SetCatchBag ยท UO.UnsetCatchBag
Container Transfers UO.MoveItem ยท UO.MoveItems ยท UO.MassMove ยท UO.EmptyContainer

๋ชจ๋“  ํ…Œ๋งˆ ๋ช…๋ น

Backpack / Ground

UO.Backpack ยท UO.Ground

OpenContainer

UO.OpenContainer

LastContainer

UO.LastContainer

ContainerOf

UO.ContainerOf ยท UO.GetParent ยท UO.ContainerOff

IsContainer

UO.IsContainer

์ค‘์ฒฉ๋œ ์ปจํ…Œ์ด๋„ˆ

UO.GetContent

์ปจํ…Œ์ด๋„ˆ ์ˆ˜๋ น

UO.SetReceivingContainer ยท UO.UnsetReceivingContainer

์บ์น˜๋ฐฑ

UO.SetCatchBag ยท UO.UnsetCatchBag

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

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

UO.OpenContainer

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

UO.OpenContainer("lasttarget");

UO.EmptyContainer

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

UO.Print("Select a chest or corpse");
var sent = UO.EmptyContainer(350);
if (Truth(sent == 0))
{
    UO.Print("Cancelled, empty, unavailable, or a transfer failed");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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


UO.Backpack

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

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

int UO.Backpack();

ํ˜„์žฌ ์บ๋ฆญํ„ฐ๊ฐ€ ์žฅ์ฐฉํ•œ ๋ฐฐ๋‚ญ์˜ ID๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int - serial/ID, graphic/type, ๋ ˆ์ด์–ด, ํ•ญ๋ชฉ ์ˆ˜ ๋˜๋Š” bool๊ฐ€ ์•„๋‹˜. 0โ€”ํ˜„์žฌ ๊ฐœ์ฒด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  32 ๋น„ํŠธ serial๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. != 0๋ฅผ ํ™•์ธํ•˜์„ธ์š”. == true ๋˜๋Š” > 0๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ €์žฅ๋œ ๊ฒฐ๊ณผ๋Š” ์ž์ฒด์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด์˜ Backpack ๋ ˆ์ด์–ด์—์„œ ์‚ญ์ œ๋˜์ง€ ์•Š์€ ํ•ญ๋ชฉ์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด ์—†์Œ/ํŒŒ๊ดด๋จ, ๋ฐฐ๋‚ญ์ด๋‚˜ ๊ฐ€๋ฐฉ ์ œ๊ฑฐ ์—†์Œ - 0. ๋‚ด์šฉ์ด ์•„๋‹Œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๊ฐ€๋ฐฉ์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์—์„œ Invoke๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ทจ์†Œํ•˜๋ฉด ํ•ด๋‹น ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ๋Œ€๊ธฐ๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๊ณ , ์ปจํ…Œ์ด๋„ˆ/๋Œ€์ƒ์„ ์—ด์ง€ ์•Š์œผ๋ฉฐ, ์•„์ดํ…œ์„ ์ „์†กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ด„ํ˜ธ ์—†์ด ๋‚ด์žฅ๋œ self/backpack๋Š” ์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜๋กœ ์žฌ์ •์˜๋˜์ง€ ์•Š๋Š” ํ•œ ๋‹ค์‹œ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ์ด๋ฆ„์€ ์ˆ˜์‹  ๋ช…๋ น์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์šด๋ฐ˜ ๋Œ€์ƒ์—์„œ "self"๋Š” ๋ฐฐ๋‚ญ์„ ์˜๋ฏธํ•˜๊ณ , UO.Self()๋Š” ์บ๋ฆญํ„ฐ์˜ serial๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ID ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ์šฐ UO.Backpack()๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • World.Clear๋Š” ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ํ›„์† ํŒ๋… ๊ฒฐ๊ณผ๋Š” 0์ž…๋‹ˆ๋‹ค. ์„ธ๊ณ„์— ์ž…์žฅํ•˜๊ฑฐ๋‚˜ ์žฅ์ฐฉํ•œ ๊ฐ€๋ฐฉ์„ ๋ฐ”๊พธ๋ฉด ID๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ๋Š” ์›์ž์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ID๋Š” ์—ฐ๊ฒฐ, ์„œ๋ฒ„ ํ™•์ธ ๋˜๋Š” ์ฝ˜ํ…์ธ  ๋กœ๋”ฉ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • id๋Š” ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์šฉ HEX ํ˜•์‹ serial. ์ด ์˜ˆ์—์„œ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var id = UO.Backpack();
UO.Print("ID: " + Hex(id));

string Hex(object? value) => Convert.ToInt64(value).ToString("X");

2. ๋ณ€๊ฒฝ ๊ฐ์ง€ ID - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด์ „/์ดํ›„๋Š” 250 ms ๊ฐ„๊ฒฉ์œผ๋กœ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค. UO.Wait๋Š” ์˜ˆ์‹œ์šฉ์œผ๋กœ๋งŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ‰๋“ฑ์€ ๋™์ผํ•œ ์ตœ์ข… ID์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ค‘๊ฐ„ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋ˆ„๋ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.Backpack();
    await Delay(250);
    var after = UO.Backpack();
    if (Truth(before != after))
    {
        UO.Print("ID changed: " + Hex(after));
    }

    return null;
}

Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • ํ›„๋ณด์ž - ์ €์žฅ๋จ ID LastTarget. IsOwnSerial(ํ›„๋ณด์ž)๋Š” ํ•˜๋‚˜์˜ serial๋ฅผ ์ทจํ•˜๊ณ  bool๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ 0์ด ์•„๋‹Œ ์ž์ฒด ID์— ๋Œ€ํ•ด true, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ •์˜๊ฐ€ ์ „์ฒด์ ์œผ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋ชฉํ‘œ๋Š” ๋ณ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var candidate = UO.LastTarget();
        if (Truth(Truth(IsOwnSerial(candidate)) == true))
        {
            UO.Print("Own object selected");
        }
        else
        {
            UO.Print("Different object or no own object");
        }

        return null;
    }

    dynamic IsOwnSerial(dynamic candidate)
    {
        var current = UO.Backpack();
        return Truth(current != 0) && Truth(current == candidate);
    }

    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.Backpack() โ€” UO.Backpack()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "backpack": return new InjectionValue(bridge.Backpack);

UO.ContainerOf

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

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

string UO.ContainerOf(object? name);

ํ•ญ๋ชฉ์˜ ์ง๊ณ„ ์ƒ์œ„ ํ•ญ๋ชฉ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • name โ€” ํŠน์ • ๊ฐ์ฒด์˜ ์ผ๋ จ๋ฒˆํ˜ธ/ID: int, 10์ง„์ˆ˜/16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ๋ณ„์นญ ์„ค์ • self, backpack, lasttarget, lastobject ๋˜๋Š” ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ graphic/type๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

"0x40001234" ํ˜•์‹์˜ string - ์ปจํ…Œ์ด๋„ˆ/์บ๋ฆญํ„ฐ ์†Œ์œ ์ž์˜ serial. ์ง€์ƒ์— ์žˆ๋Š” ์•„์ดํ…œ์˜ ๊ฒฝ์šฐ "0x00000000" ๋˜๋Š” "0xFFFFFFFF"์ž…๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„/๊ฐœ์ฒด ๋˜๋Š” ๋ชจ๋ฐ”์ผ์˜ ๊ฒฝ์šฐ - "0x00000000". ์ปจํ…Œ์ด๋„ˆ์˜ graphic๋„ ์•„๋‹ˆ๊ณ , ์•„์ดํ…œ ์ž์ฒด์˜ ID๋„ ์•„๋‹ˆ๊ณ , ์ค‘์ฒฉ๋œ ๊ฐ€๋ฐฉ์˜ ๋ฃจํŠธ ์†Œ์œ ์ž๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์žฌ๊ท€ ์ˆœํšŒ ๋ฐ ์„œ๋ฒ„ ํ˜ธ์ถœ ์—†์ด ๋กœ์ปฌ ํ•ญ๋ชฉ์˜ ์ปจํ…Œ์ด๋„ˆ ํ•„๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. null ๊ฒฐ๊ณผ๋ฅผ ํ•ด์„ํ•˜๊ธฐ ์ „์— Exists๋ฅผ ํ™•์ธํ•˜์„ธ์š”. Ground๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํšจํ•œ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ํ•ญ๋ชฉ์˜ ์ปจํ…Œ์ด๋„ˆ ์ฐพ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ•ญ๋ชฉ์€ ๋ฐœ๊ฒฌ๋œ ์Šคํƒ์˜ serial์ž…๋‹ˆ๋‹ค. type=0x0EED๋Š” FindType๋กœ๋งŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
  • parent๋Š” ๋ฐฐ๋‚ญ์„ ํฌํ•จํ•˜๋Š” ์บ๋ฆญํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ค์ œ ๋ฐฐ๋‚ญ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
var item = UO.FindType(0x0EED, -1, "backpack");
if (Truth(item != ""))
{
    var parent = UO.ContainerOf(item);
    UO.Print(Convert.ToString(parent));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. ๋ฐฐ๋‚ญ์˜ ์ฃผ์ธ์„ ์ฐพ์•„๋ณด์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋…ผ์Ÿ์€ ๋ฐฐ๋‚ญ ์ž์ฒด์ž…๋‹ˆ๋‹ค.
  • ์žฅ์ฐฉ๋œ ๋ฐฐ๋‚ญ์˜ ๋ถ€๋ชจ๋Š” ์บ๋ฆญํ„ฐ์˜ serial๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var bag = UO.GetSerial("backpack");
    if (Truth(UO.Exists(bag)))
    {
        UO.Print(Convert.ToString(UO.ContainerOf(bag)));
    }

    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. ์ง€์ƒ์˜ ๋ฌผ๊ฑด ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • GetContent("ground")๋Š” ID ์ปจํ…Œ์ด๋„ˆ ๋ฐ–์˜ ์•„์ดํ…œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ์ง€์— ๋Œ€ํ•œ ๋‘ ํ‘œํ˜„ ๋ชจ๋‘ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. Exists๊ฐ€ ์—†๋Š” ํ•˜๋‚˜์˜ null ๋ถ€๋ชจ๋งŒ์œผ๋กœ๋Š” ๊ฐ์ฒด์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹์ถ”๋ก ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var items = UO.GetContent("ground");
        if (Truth(ArrayLength(items) > 0))
        {
            var item = items[0];
            if (Truth(UO.Exists(item)))
            {
                UO.Print(Convert.ToString(UO.ContainerOf(item)));
            }
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.ContainerOf(name) โ€” UO.ContainerOf(Any)

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string ContainerOf(InjectionValue name)

        {

            if (TryGetObject(name, out int id))

            {

                var containerId = bridge.ContainerOf(id);

                if (containerId < 0)

                    return "0xFFFFFFFF";



                return $"0x{containerId:X8}";

            }



            return "0x00000000";

        }

UO.ContainerOff

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

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

void UO.ContainerOff();

์ง€์ •๋œ ์ˆ˜์‹  ๋Ÿฐํƒ€์ž„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • UnsetReceivingContainer๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  State.ReceivingContainer=0๋ฅผ ์”๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ ํ• ๋‹น์ด ์—†๋Š” ๋‹ค์Œ Grab ์ž‘์—…์—์„œ๋Š” ๋ฐฐ๋‚ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฐฐ๋‚ญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์ด ์ด๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ปจํ…Œ์ด๋„ˆ ์ฐฝ์ด ๋‹ซํžˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ํ• ๋‹น ์žฌ์„ค์ • - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ƒํƒœ ReceivingContainer๋Š” 0๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
UO.ContainerOff();

2. ํ• ๋‹น ํ›„ ์žฌ์„ค์ • - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ํ• ๋‹น์ด ์ง€์›Œ์กŒ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ž‘์—…์€ ์ฝ˜ํ…์ธ ๋ฅผ ์ด๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.SetReceivingContainer("backpack");
    UO.ContainerOff();
    return null;
}

3. ์žฌ์„ค์ • - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • null ์ƒํƒœ์—์„œ๋Š” ๋ฐ˜๋ณต์ ์ธ ์žฌ์„ค์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.ContainerOff();
        UO.ContainerOff();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.ContainerOff() โ€” UO.ContainerOff()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void UnsetReceivingContainer() => bridge.UnsetReceivingContainer();

UO.GetContent

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

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

dynamic UO.GetContent(object? id);

์ปจํ…Œ์ด๋„ˆ๋‚˜ ์ง€์ƒ์— ์ ์žฌ๋œ ๋ฌผํ’ˆ์˜ ๋‚ด์šฉ๋ฌผ์„ ์ง์ ‘ ์ฝ์–ด๋ƒ…๋‹ˆ๋‹ค.

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

  • id โ€” ํŠน์ • ๊ฐœ์ฒด์˜ ์ผ๋ จ๋ฒˆํ˜ธ/ID: int, 10์ง„์ˆ˜/16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ๋ณ„์นญ ์„ค์ • self, backpack, lasttarget, lastobject ๋˜๋Š” ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ graphic/type์ด ์•„๋‹™๋‹ˆ๋‹ค. my/backpack ๋ผ์ธ์€ ๋ฐฐ๋‚ญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ 0, "0" ๋˜๋Š” "ground"๋กœ๋งŒ ๋Œ€์ง€๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ๋ณ„์นญ, ๋ˆ„๋ฝ๋œ ๋ฐฐ๋‚ญ, ์Œ์ˆ˜ ID ๋˜๋Š” ๋ถ€์ ์ ˆํ•œ ๊ฐ’ ์œ ํ˜•์œผ๋กœ ์ธํ•ด ๋นˆ ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

๊ฐ ์ง๊ณ„ ํ•˜์œ„ ํ•ญ๋ชฉ์˜ ๋ฐฐ์—ด - serial. ground/0์˜ ๊ฒฝ์šฐ - ์ปจํ…Œ์ด๋„ˆ ์™ธ๋ถ€ ํ’ˆ๋ชฉ; ์ผ๋ฐ˜ ์ ‘์ง€ ํ‘œ์‹œ 0 ๋ฐ 0xFFFFFFFF๊ฐ€ ๋ชจ๋‘ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์ด ์—†์œผ๋ฉด ๋นˆ ๋ฐฐ์—ด์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋ชฉ๋ก์—๋Š” type๊ฐ€ ์•„๋‹Œ ID๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ๋ ˆ์ด์–ด๋„ ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ „์ฒด ์„œ๋ฒ„์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์—ด๊ฑฐ๋‚˜ ํ•ญ๋ชฉ์„ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๊ฐœ์ฒด๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด - 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. var์— ์ €์žฅํ•˜๊ณ , ArrayLength๋ฅผ ํ™•์ธํ•œ ํ›„ ์ ‘์†ํ•˜์„ธ์š”. ์Šค๋ƒ…์ƒท์„ ์ฐ์€ ํ›„ ์š”์†Œ๊ฐ€ ์„ธ๊ณ„์—์„œ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— Exists(serial)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • ์ค‘์ฒฉ๋œ ๋ฐฑ์˜ ์žฌ๊ท€ ์ˆœํšŒ, ๊ฑฐ๋ฆฌ ์ •๋ ฌ, Ignore ๋˜๋Š” FindDistance/FindVertical ํ•„ํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ FindType ์Šค๋ƒ…์ƒท์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์—ด์ง€ ์•Š์€ ์ƒ์ž๋Š” ๋น„์–ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์‹ ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๊ณ  ํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ๋น„์–ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋จผ์ € ์—ด๋ฆฐ ์šฉ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋‚ด์šฉ๋ฌผ์ด ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.GetContent("backpack");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ๋ชฉ๋ก ํฌ๊ธฐ ๊ฐ€์ ธ์˜ค๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ID="backpack" - ํ˜„์žฌ ์บ๋ฆญํ„ฐ์˜ ๋ฐฐ๋‚ญ, ์ง์ ‘ ์ค‘์ฒฉ๋œ ํ•ญ๋ชฉ๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.
  • ๊ธธ์ด - ๋ ˆ์ฝ”๋“œ ์ˆ˜/ID. ์ด๊ฒƒ์€ ์Šคํƒ์˜ ์–‘์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋นˆ ๋ชฉ๋ก์€ 0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
var items = UO.GetContent("backpack");
UO.Print(Convert.ToString(ArrayLength(items)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. ๋ฐœ๊ฒฌ๋œ ๋ชจ๋“  ํ•ญ๋ชฉ ํƒ์ƒ‰ ID - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ID="backpack" - ํ˜„์žฌ ์บ๋ฆญํ„ฐ์˜ ๋ฐฐ๋‚ญ, ์ง์ ‘ ์ค‘์ฒฉ๋œ ํ•ญ๋ชฉ๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.
  • items[i] โ€” ์ˆซ์ž serial. 16์ง„์ˆ˜๋Š” ์ถœ๋ ฅ์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฃจํ”„๋Š” ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— ์•ก์„ธ์Šคํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var items = UO.GetContent("backpack");
    var i = 0;
    while (Truth(i < ArrayLength(items)))
    {
        UO.Print("0x" + Hex(items[i]));
        i = i + 1;
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. ์ฝ๊ธฐ ์ „์— ์ฒซ ๋ฒˆ์งธ ๊ธฐ๋ก์„ ํ™•์ธํ•˜์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์—…

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

  • ID="backpack" - ํ˜„์žฌ ์บ๋ฆญํ„ฐ์˜ ๋ฐฐ๋‚ญ, ์ง์ ‘ ์ค‘์ฒฉ๋œ ํ•ญ๋ชฉ๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.
  • ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์‚ฌํ•ญ, ์ฆ‰ ์Šค๋ƒ…์ƒท์˜ ๊ธฐ๋ก๊ณผ ํ˜„์žฌ ๊ฐœ์ฒด์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ ์ •๋ ฌ์ด ์—†๋Š” ์ˆœ์„œ๋Š” ์นœ๋ฐ€ํ•จ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 items = UO.GetContent("backpack");
        if (Truth(ArrayLength(items) > 0))
        {
            var first = items[0];
            if (Truth(UO.Exists(first)))
            {
                UO.Print(UO.GetName(first));
            }
        }
        else
        {
            UO.Print("Empty list");
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

4. ๋‹ค์šด๋กœ๋“œํ•œ ๋ชจ๋“  ํ† ์ง€ ์•„์ดํ…œ ๊ฐ€์ ธ์˜ค๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ID="ground"๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์ง€๋ฉด์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. NPC/players๋Š” ์ด ๋ชฉ๋ก์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ๊ฒ€์ƒ‰ ๋ฐ˜๊ฒฝ์€ FindDistance๋กœ ์ œํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„ํ„ฐ type ๋ฐ ๊ฑฐ๋ฆฌ์˜ ๊ฒฝ์šฐ GetWorldItems(type,color,distance)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
var groundItems = UO.GetContent("ground");
UO.Print(Convert.ToString(ArrayLength(groundItems)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetContent(id) โ€” UO.GetContent(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getcontent":

                case "getequipment":

                {

                    InjectionValue selection = arguments[0];

                    bool ground = false, explicitZero;

                    int container;

                    if (selection.Kind == InjectionValueKind.String)

                    {

                        string text = Text(0).Trim();

                        ground = text.Equals("ground", StringComparison.OrdinalIgnoreCase);

                        explicitZero = NumberConversions.TryStr2Int(text, out int literal) && literal == 0;

                        container = ground ? 0 : text.Equals("my", StringComparison.OrdinalIgnoreCase)

                            ? bridge.Backpack : GetObject(text);

                    }

                    else

                    {

                        if (selection.Kind != InjectionValueKind.Integer && selection.Kind != InjectionValueKind.Decimal)

                            return new InjectionValue(Array.Empty<InjectionValue>());

                        container = Arg(0);

                        explicitZero = selection.Kind == InjectionValueKind.Integer ? selection.Integer == 0 : selection.Decimal == 0d;

                    }

                    // Only an explicit ground/zero selector may query world items.

                    if (container < 0 || container == 0 && !ground && !explicitZero)

                        return new InjectionValue(Array.Empty<InjectionValue>());

                    bool equipment = name.Equals("GetEquipment", StringComparison.OrdinalIgnoreCase);

                    int[] items = equipment

                        ? container == 0 ? Array.Empty<int>() : bridge.GetEquipment(container)

                        : bridge.GetContent(container);

                    return new InjectionValue(items.Select(serial => new InjectionValue(serial)).ToArray());

                }

UO.GetParent

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

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

dynamic UO.GetParent(object? objID);

ํ•ญ๋ชฉ์˜ ์ง๊ณ„ ์ƒ์œ„ ํ•ญ๋ชฉ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • objID โ€” ํŠน์ • ๊ฐ์ฒด์˜ ์ผ๋ จ๋ฒˆํ˜ธ/ID: int, 10์ง„์ˆ˜/16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ๋ณ„์นญ ์„ค์ • self, backpack, lasttarget, lastobject ๋˜๋Š” ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ graphic/type๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int - serial ์ปจํ…Œ์ด๋„ˆ/์บ๋ฆญํ„ฐ ์†Œ์œ ์ž. ์ง€์ƒ์— ์žˆ๋Š” ์•„์ดํ…œ์˜ ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ์˜ ์ž…๋ ฅ์— ๋”ฐ๋ผ 0 ๋˜๋Š” -1(๋น„ํŠธ 0xFFFFFFFF)์ž…๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ๋ฌผ์ฒด ๋˜๋Š” ๋ชจ๋ฐ”์ผ์˜ ๊ฒฝ์šฐ - 0. ์ปจํ…Œ์ด๋„ˆ์˜ graphic๋„ ์•„๋‹ˆ๊ณ , ์•„์ดํ…œ ์ž์ฒด์˜ ID๋„ ์•„๋‹ˆ๊ณ , ์ค‘์ฒฉ๋œ ๊ฐ€๋ฐฉ์˜ ๋ฃจํŠธ ์†Œ์œ ์ž๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์žฌ๊ท€ ์ˆœํšŒ ๋ฐ ์„œ๋ฒ„ ํ˜ธ์ถœ ์—†์ด ๋กœ์ปฌ ํ•ญ๋ชฉ์˜ ์ปจํ…Œ์ด๋„ˆ ํ•„๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. null ๊ฒฐ๊ณผ๋ฅผ ํ•ด์„ํ•˜๊ธฐ ์ „์— Exists๋ฅผ ํ™•์ธํ•˜์„ธ์š”. Ground๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํšจํ•œ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.GetParent("backpack");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ํ•ญ๋ชฉ์˜ ์ปจํ…Œ์ด๋„ˆ ์ฐพ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ•ญ๋ชฉ์€ ๋ฐœ๊ฒฌ๋œ ์Šคํƒ์˜ serial์ž…๋‹ˆ๋‹ค. type=0x0EED๋Š” FindType๋กœ๋งŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
  • parent๋Š” ๋ฐฐ๋‚ญ์„ ํฌํ•จํ•˜๋Š” ์บ๋ฆญํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ค์ œ ๋ฐฐ๋‚ญ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
var item = UO.FindType(0x0EED, -1, "backpack");
if (Truth(item != ""))
{
    var parent = UO.GetParent(item);
    UO.Print(Convert.ToString(parent));
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. ๋ฐฐ๋‚ญ์˜ ์ฃผ์ธ์„ ์ฐพ์•„๋ณด์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋…ผ์Ÿ์€ ๋ฐฐ๋‚ญ ์ž์ฒด์ž…๋‹ˆ๋‹ค.
  • ์žฅ์ฐฉ๋œ ๋ฐฐ๋‚ญ์˜ ๋ถ€๋ชจ๋Š” ์บ๋ฆญํ„ฐ์˜ serial๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var bag = UO.GetSerial("backpack");
    if (Truth(UO.Exists(bag)))
    {
        UO.Print(Convert.ToString(UO.GetParent(bag)));
    }

    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. ์ง€์ƒ์˜ ๋ฌผ๊ฑด ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • GetContent("ground")๋Š” ID ์ปจํ…Œ์ด๋„ˆ ๋ฐ–์˜ ์•„์ดํ…œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ์ง€์— ๋Œ€ํ•œ ๋‘ ํ‘œํ˜„ ๋ชจ๋‘ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. Exists๊ฐ€ ์—†๋Š” ํ•˜๋‚˜์˜ null ๋ถ€๋ชจ๋งŒ์œผ๋กœ๋Š” ๊ฐ์ฒด์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹์ถ”๋ก ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var items = UO.GetContent("ground");
        if (Truth(ArrayLength(items) > 0))
        {
            var item = items[0];
            if (Truth(UO.Exists(item)))
            {
                UO.Print(Convert.ToString(UO.GetParent(item)));
            }
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetParent(objID) โ€” UO.GetParent(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getparent": return new InjectionValue(bridge.ContainerOf(Arg(0)));

UO.Ground

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

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

int UO.Ground();

๊ฒ€์ƒ‰ ์ปจํ…Œ์ด๋„ˆ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋˜๋Š” ์ „์†ก ๋Œ€์ƒ์— ๋Œ€ํ•œ ํŠน์ˆ˜ ํ† ์ง€ ์ง€์ •์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int, ํ•ญ์ƒ 0. ์ด 0์€ false, ๊ฒ€์ƒ‰ ์˜ค๋ฅ˜, ID ํ•ญ๋ชฉ, graphic, ์ง€๋„ ๋ฒˆํ˜ธ ๋˜๋Š” ์ขŒํ‘œ๊ฐ€ ์•„๋‹Œ ์œ ํšจํ•œ ์ง€์ƒ ์ง€์ •์ž์ž…๋‹ˆ๋‹ค. Ground()๋ฅผ ์„ฑ๊ณต์˜ ํ‘œ์‹œ๋กœ ํ™•์ธํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด ๊ฐ’์„ ์ „๋‹ฌํ•œ ๊ฒ€์ƒ‰ ๋˜๋Š” ์ „์†ก ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๋™์ž‘

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Ground() ํ˜ธ์ถœ ์ž์ฒด๋Š” ์•„๋ฌด๊ฒƒ๋„ ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š๊ณ , ์•„๋ฌด๊ฒƒ๋„ ์ด๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋Œ€์ƒ์„ ์—ด์ง€ ์•Š์œผ๋ฉฐ, ํŒจํ‚ท์„ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉฐ, ์ด์ „ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—๋Š” 0๋„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • FindType, FindList, Count, FindTypeEx, FindTypesArrayEx, CountEx ๋˜๋Š” MoveItem ๋ช…๋ น์„ ์ปจํ…Œ์ด๋„ˆ/๋Œ€์ƒ ์œ„์น˜๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰์—์„œ๋Š” ๋กœ๋“œ๋œ ์›”๋“œ ๊ฐœ์ฒด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฉ€๋ฆฌ ์žˆ๋Š” ์…€์€ ๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€์ƒ์œผ๋กœ ์ „์†กํ•˜๋Š” ๊ฒฝ์šฐ X/Y/Z - ์ปจํ…Œ์ด๋„ˆ ์ฐฝ ํ”ฝ์…€์ด ์•„๋‹Œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • FindType(type, color)๋Š” ์—ฌ์ „ํžˆ ์ธ๋ฒคํ† ๋ฆฌ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” color์ž…๋‹ˆ๋‹ค. ํ† ์ง€์˜ ๊ฒฝ์šฐ FindType(type, color, UO.Ground())๋ผ๊ณ  ์ ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์ปดํŒฉํŠธ FindType/MoveItem์—์„œ ์ˆซ์ž -1๋Š” ์žฌ๊ณ ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํ˜ธํ™˜๋˜๋Š” FindTypeEx/FindTypesArrayEx/CountEx - 1๋„ ์ ‘์ง€๋กœ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. UO.Ground() ๋˜๋Š” ๋ช…์‹œ์ ์ธ ์ด๋ฆ„ ground์„ ์‚ฌ์šฉํ•˜๊ณ , ํ™•์ธํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋ช…๋ น ๊ฐ„์— ์ˆซ์ž ์ง€์ •์„ ์ „์†กํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  • ์œ„์˜ ๋ช…๋ น๊ณผ ์˜ˆ์ œ ๊ฐ„์˜ ํ‘œ๊ธฐ๋ฒ• ์ฐจ์ด๋Š” ์ด ํด๋ผ์ด์–ธํŠธ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ํ† ์ง€ ๊ธฐํ˜ธ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋ชฉ์ ์ง€๋Š” int 0๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ , Print๋Š” ์ด ์ˆซ์ž๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์ž์ฒด๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ฒ„๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var destination = UO.Ground();
UO.Print(Convert.ToString(destination));

2. ๋•…์—์„œ ๊ธˆ๋”๋ฏธ ์ฐพ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 0x0EED - ๊ณจ๋“œ ๊ทธ๋ž˜ํ”ฝ; ๋‘ ๋ฒˆ์งธ -1๋Š” hue๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Ground()๋Š” ์ „ ์„ธ๊ณ„์—์„œ ๊ฒ€์ƒ‰์„ ์„ค์ •ํ•˜๊ณ , false๋Š” ์ปจํ…Œ์ด๋„ˆ ์žฌ๊ท€๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. FindTypeEx๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด serial ๋˜๋Š” 0 ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. != 0๋Š” serial๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ FindDistance/FindVertical ๋ฐ ๋ชฉ๋ก Ignore์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.FindTypeEx(0x0EED, -1, UO.Ground(), false);
    if (Truth(id != 0))
    {
        UO.Print(Hex(id));
    }
    else
    {
        UO.Print("0");
    }

    return null;
}

string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. ์ง€๊ตฌ์ƒ์—์„œ ๋‘ ๊ฐœ์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ์ฐพ๋Š” ์™„์ „ํ•œ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • FindGroundTypes(firstType, secondType, ๋ฐ˜๊ฒฝ, ๋†’์ด)๋Š” ๋ฐ˜๊ฒฝ=5 ๋ฐ ๋†’์ด=10๋กœ ๊ธˆ 0x0EED ๋ฐ ํ‘์ง„์ฃผ 0x0F7A๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ์œ ํ˜•[1]์„ ์„ ์–ธํ•˜๋ฉด ๋‘ ๊ฐœ์˜ ์…€์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ƒ‰์ƒ[0] ๋ฐ ์ปจํ…Œ์ด๋„ˆ[0] - ๊ฐ๊ฐ ํ•˜๋‚˜์”ฉ. ์ „์ฒด ์Šคํƒ์€ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์œ ํ˜•/์ƒ‰์ƒ์€ ๋Œ€์ฒด ๊ฐ€๋Šฅํ•˜๋ฉฐ ๊ต์ฐจํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ID. ์ด ํ•จ์ˆ˜๋Š” ์ €์žฅ๋œ ๋ฐฐ์—ด serial๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‘ ํ•œ๊ณ„๋ฅผ ๋ชจ๋‘ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ID๋งˆ๋‹ค ๋ฉ”์ธ ์ถœ๋ ฅ์ด ๋‚˜์˜ต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ์ฝ”๋“œ๊ฐ€ ์ „์ฒด์ ์œผ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
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 ids = FindGroundTypes(0x0EED, 0x0F7A, 5, 10);
        foreach (var id in ids)
        {
            UO.Print(Hex(id));
        }

        return null;
    }

    dynamic FindGroundTypes(dynamic firstType, dynamic secondType, dynamic radius, dynamic height)
    {
        var oldDistance = UO.FindDistance();
        var oldVertical = UO.FindVertical();
        dynamic[] types = new dynamic[checked((int)(1) + 1)];
        types[0] = firstType;
        types[1] = secondType;
        dynamic[] colors = new dynamic[checked((int)(0) + 1)];
        colors[0] = -1;
        dynamic[] containers = new dynamic[checked((int)(0) + 1)];
        containers[0] = UO.Ground();
        try
        {
            UO.FindDistance(radius);
            UO.FindVertical(height);
            UO.FindTypesArrayEx(types, colors, containers, false);
            return UO.GetFoundItems();
        }
        finally
        {
            UO.FindDistance(oldDistance);
            UO.FindVertical(oldVertical);
        }
    }

    string Hex(object? value) => Convert.ToInt64(value).ToString("X");
}

4. ์•Œ๋ ค์ง„ ํ•ญ๋ชฉ์„ ์บ๋ฆญํ„ฐ์˜ ์…€๋กœ ์ด๋™ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 0x40001001๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•ญ๋ชฉ์˜ serial๋กœ ๋ฐ”๊พธ์„ธ์š”. IsObjectExists ๋จผ์ € ๋กœ๋“œ๋œ ๊ฐ์ฒด๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. MoveItem(์•„์ดํ…œ, ๊ธˆ์•ก, ๋ชฉ์ ์ง€, X, Y, Z): ๊ธˆ์•ก=0 - ์ „์ฒด ์Šคํƒ, Ground() - ํ† ์ง€, GetX/GetY/GetZ - ์บ๋ฆญํ„ฐ์˜ ์›”๋“œ ์…€. ๊ฒฐ๊ณผ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „์†ก ์š”์ฒญ์„ ์ˆ˜๋ฝํ•œ ๊ฒฝ์šฐ 1์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ 0์ž…๋‹ˆ๋‹ค. ์ด๋Š” Ground()์ด ์•„๋‹Œ MoveItem์˜ ๊ฒฐ๊ณผ์ด๋ฉฐ, ์„œ๋ฒ„์˜ ์ „์†ก ํ™•์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค.
var item = 0x40001001;
if (Truth(UO.IsObjectExists(item)))
{
    var result = UO.MoveItem(item, 0, UO.Ground(), UO.GetX("self"), UO.GetY("self"), UO.GetZ("self"));
}

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.Ground() โ€” UO.Ground()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "ground": return new InjectionValue(0);

UO.IsContainer

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

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

int UO.IsContainer(object? objID);

๋กœ๋“œ๋œ ํ•ญ๋ชฉ์˜ ๊ทธ๋ž˜ํ”ฝ ์œ ํ˜• ํƒ€์ผ๋ฐ์ดํ„ฐ์—์„œ ์ปจํ…Œ์ด๋„ˆ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

  • objID โ€” ํŠน์ • ๊ฐœ์ฒด์˜ ํ•„์ˆ˜ serial/ID: int, 16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ๋ณ„์นญ self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse ๋˜๋Š” ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ graphic/type์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ง€์ •๋˜์ง€ ์•Š์€ ์ด๋ฆ„์€ 0๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ƒˆ ๋Œ€์ƒ์„ ์—ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int 1 - ์•Œ๋ ค์ง„ ํ•ญ๋ชฉ์˜ graphic ๋ฐ์ดํ„ฐ์— ์ปจํ…Œ์ด๋„ˆ ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. int 0 - ํ•ด๋‹น ๊ธฐํ˜ธ๊ฐ€ ์—†์œผ๋ฉฐ ๊ฐœ์ฒด๋Š” mobile์ด๋ฉฐ ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์šฉ๊ธฐ์— ๋‹ด๊ธด ๋ฌผ๊ฑด์˜ ๊ฐœ์ˆ˜๋„ ์•„๋‹ˆ๊ณ , ์—ด๋ฆฐ ๊ฒ€ํ”„์˜ ํ‘œ์‹œ๋„ ์•„๋‹ˆ๋ฉฐ, ๋‚ด์šฉ๋ฌผ์— ๋Œ€ํ•œ ์ ‘๊ทผ ํ™•์ธ๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋ช…๋ น์˜ ๊ฒฐ๊ณผ๋Š” ์ˆซ์ž ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. 1๋Š” ์ถฉ์กฑ๋œ ์กฐ๊ฑด์„ ์˜๋ฏธํ•˜๊ณ , 0๋Š” ์ถฉ์กฑ๋˜์ง€ ์•Š์€ ์กฐ๊ฑด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. var result = command(...) ํ›„์— (๊ฒฐ๊ณผ != 0) ๋˜๋Š” (๊ฒฐ๊ณผ == 0)์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”. ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ํ•ด๋‹น ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ด๋ฏธ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋กœ์ปฌ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ๋„ ์—†๊ณ  ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ ์ด๋™ํ•  ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ์ฝ๋Š” ์ˆœ๊ฐ„์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. UO.Wait ๋˜๋Š” ๋‹ค๋ฅธ ์ž‘์—… ํ›„์— ๊ฐœ์ฒด์™€ ํ•ด๋‹น ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

var result = UO.IsContainer(UO.GetSerial("lastobject"));
UO.Print("IsContainer: " + Convert.ToString(result));

1. ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•œ ํ•ญ๋ชฉ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ•ญ๋ชฉ์€ ๊ฐœ์ฒด type๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐœ์ฒด lastobject์˜ serial์ž…๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ์ปจํ…Œ์ด๋„ˆ ์†์„ฑ๋งŒ ์ฝ๊ณ  ์—ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
var item = UO.GetSerial("lastobject");
if (Truth(UO.IsContainer(item)))
{
    UO.Print("Known container: " + item);
}
else
{
    UO.Print("Not a known container");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. ๊ฒ€์ƒ‰ ์ „ ์ปจํ…Œ์ด๋„ˆ ์„ ํƒ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๊ฐ€๋ฐฉ์€ ์‚ฌ์ „์— ์„ ํƒํ•ด์•ผ ํ•˜๋ฉฐ, ๋‚ด์šฉ๋ฌผ์„ ๊ณ ๊ฐ์—๊ฒŒ ์•Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • FindType๋Š” type ๊ณจ๋“œ, hue ๋ฐ serial ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋นˆ ๊ฒฐ๊ณผ๋Š” ์„œ๋ฒ„ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋น„์–ด ์žˆ์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var bag = UO.GetSerial("lasttarget");
    if (Truth(UO.IsContainer(bag)))
    {
        var found = UO.FindType(0x0EED, -1, bag);
        UO.Print("Known gold item: " + found);
    }

    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. ์œ ๋ฌด ๋ฐ ๋ถ„๋ฅ˜ ๋ณ„๋„ ํ™•์ธ - ์‹œ๋‚˜๋ฆฌ์˜ค ๋“ฑ๊ธ‰

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

  • Exists๊ณผ IsContainer๋Š” ๋™์ผํ•œ serial์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์งˆ๋ฌธ์— ๋‹ตํ•ฉ๋‹ˆ๋‹ค.
  • ํƒ€์ผ โ€‹โ€‹๋ฐ์ดํ„ฐ๊ฐ€ ์ ํ•ฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์•„์ง ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ถ„๋ฅ˜๊ฐ€ ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์Šด ๊ถŒ๋ฆฌ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var bag = UO.GetSerial("backpack");
        var exists = UO.Exists(bag);
        var container = UO.IsContainer(bag);
        UO.Print("Loaded: " + Convert.ToString(exists));
        UO.Print("Container flag: " + Convert.ToString(container));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.IsContainer(objID) โ€” UO.IsContainer(Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "iscontainer": return new InjectionValue(bridge.IsContainer(Arg(0)));

UO.LastContainer

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

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

dynamic UO.LastContainer();

๋งˆ์ง€๋ง‰ ์ปจํ…Œ์ด๋„ˆ์˜ serial๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int โ€” ์ €์žฅ๋จ serial; 0์€ serial์ด ์„ค์น˜๋˜์ง€ ์•Š์•˜์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. bool๋„ ์•„๋‹ˆ๊ณ  graphic/type๋„ ์•„๋‹™๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ID๋Š” ์„ธ์ƒ์— ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ํ•„๋“œ ์†Œ์Šค: _world.LastContainer. ์ด ๋ช…๋ น์€ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ณต๊ฒฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€, ๋Œ€์ƒ ๋˜๋Š” ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ์ƒํƒœ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.LastContainer();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

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

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

  • ๋งˆ์ง€๋ง‰ ์ปจํ…Œ์ด๋„ˆ์˜ serial๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
var id = UO.LastContainer();
UO.Print(Hex(id));

string Hex(object? value) => Convert.ToInt64(value).ToString("X");

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

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

  • ํ•„๋“œ ์†Œ์Šค: _world.LastContainer. ์ด ๋ช…๋ น์€ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ณต๊ฒฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.LastContainer();
    if (Truth(id != 0) && Truth(UO.Exists(id)))
    {
        UO.Print(UO.GetName(id));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • ํ˜„์žฌ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€, ๋Œ€์ƒ ๋˜๋Š” ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ์ƒํƒœ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var before = UO.LastContainer();
        UO.Wait(500);
        var after = UO.LastContainer();
        UO.Print(before = after);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.LastContainer() โ€” UO.LastContainer()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "lastcontainer": return new InjectionValue(bridge.GetLastContainer());

UO.OpenContainer

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

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

void UO.OpenContainer(object? id);
void UO.OpenContainer(object? id, object? timeout);

์ปจํ…Œ์ด๋„ˆ ์—ด๊ธฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

  • id โ€” ์ง๋ ฌ/ID ๊ฐœ์ฒด: int, ์ˆซ์ž/16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ์„ค์ •๋œ ๋ณ„์นญ(์˜ˆ: "lasttarget"). ์ด๊ฒƒ์€ graphic/type๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— ๋กœ๋“œ๋œ ๊ฐœ์ฒด๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
  • timeout โ€” ์„ ํƒ ์‚ฌํ•ญ int, ๋ฐ€๋ฆฌ์ดˆ; ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค. ์Œ์ˆ˜ ๊ฐ’์€ ๊ธฐ๋Œ€๊ฐ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • Bridge.OpenContainer๋Š” UseObject(id)๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ ์‹œ๊ฐ„ ์ดˆ๊ณผ>0์ธ ๊ฒฝ์šฐ์—๋งŒ UO.Wait(timeout)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ผ์‹œ ์ค‘์ง€๋Š” ๊ณ ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์˜ ์œ ๋ฌด/๋‚ด์šฉ๋ฌผ์€ ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ์—†์œผ๋ฉด ์ผ์‹œ ์ค‘์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ผ์‹œ ์ค‘์ง€๊ฐ€ ๋๋‚ฌ๋‹ค๊ณ  ํ•ด์„œ ์ฝ˜ํ…์ธ ๊ฐ€ ์—ด๋ ธ๊ฑฐ๋‚˜ ์™„์ „ํžˆ ๋กœ๋“œ๋˜์—ˆ๋‹ค๋Š” ์ฆ๊ฑฐ๋กœ ๊ฐ„์ฃผ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.OpenContainer");
UO.OpenContainer("lasttarget");

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

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

  • ์ปจํ…Œ์ด๋„ˆ ์—ด๊ธฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
UO.OpenContainer("lasttarget");

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

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

  • Bridge.OpenContainer๋Š” UseObject(id)๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ ์‹œ๊ฐ„ ์ดˆ๊ณผ>0์ธ ๊ฒฝ์šฐ์—๋งŒ UO.Wait(timeout)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ผ์‹œ ์ค‘์ง€๋Š” ๊ณ ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์˜ ์œ ๋ฌด/๋‚ด์šฉ๋ฌผ์€ ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        UO.OpenContainer("lasttarget", 1000);
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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

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

  • ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ์—†์œผ๋ฉด ์ผ์‹œ ์ค‘์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ผ์‹œ ์ค‘์ง€๊ฐ€ ๋๋‚ฌ๋‹ค๊ณ  ํ•ด์„œ ์ฝ˜ํ…์ธ ๊ฐ€ ์—ด๋ ธ๊ฑฐ๋‚˜ ์™„์ „ํžˆ ๋กœ๋“œ๋˜์—ˆ๋‹ค๋Š” ์ฆ๊ฑฐ๋กœ ๊ฐ„์ฃผ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var id = UO.GetSerial("lasttarget");
        if (Truth(UO.Exists(id)))
        {
            UO.OpenContainer(id, 1000);
            UO.Print(UO.GetName(id));
        }

        return null;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.OpenContainer(id) โ€” UO.OpenContainer(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void OpenContainer(InjectionValue id) => bridge.OpenContainer(GetObject(id), 0);

UO.OpenContainer(id, timeout) โ€” UO.OpenContainer(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void OpenContainer(InjectionValue id, InjectionValue timeout) => bridge.OpenContainer(GetObject(id), NumberConversions.ToInt(timeout));

UO.SetCatchBag

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

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

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

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

  • container โ€” ์ปจํ…Œ์ด๋„ˆ์˜ ์ผ๋ จ๋ฒˆํ˜ธ, ์ €์žฅ๋œ ์ด๋ฆ„("backpack" ๋˜๋Š” "my")์ž…๋‹ˆ๋‹ค. 0 ํ• ๋‹น์ด ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด lastobject๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์žฌ์„ค์ •๋˜์ง€ ์•Š๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์ ์šฉ๋œ ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์ด ๊ธ์ •์ ์ธ serial๋กœ ํ™•์ธ๋˜์ง€ ์•Š์œผ๋ฉด ํ• ๋‹น์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์„ค์น˜ ์ž์ฒด์—์„œ๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๊ฐœ์ฒด์˜ ์„œ๋ฒ„ ๊ฐ€์šฉ์„ฑ๊ณผ ์ ํ•ฉ์„ฑ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void: ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. UO.SetCatchBag(...)์ธ ๊ฒฝ์šฐ var ๊ฒฐ๊ณผ = UO.SetCatchBag(...)๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ˆซ์ž 1๋ฅผ ํ™•์ธ์œผ๋กœ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์ด๋™์€ ๋ณ„๋„์˜ ๋ช…๋ น(์˜ˆ: Grab)์— ์˜ํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • UO.SetCatchBag() ๋ฐ UO.SetReceivingContainer()๋Š” ์ธ์ˆ˜ ์—†์ด ์„œ๋กœ ๋‹ค๋ฅธ ํ˜•์‹ ๊ฐ’์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” lastobject๋ฅผ ์ทจํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ช…์‹œ์  ์žฌ์„ค์ •: UO.UnsetCatchBag(), UO.UnsetReceivingContainer() ๋˜๋Š” UO.SetCatchBag(0). ์ดˆ๊ธฐํ™” ํ›„ Grab๋Š” ๋ณ„๋„์˜ ๋ชฉ์  ์—†์ด ๋ฐฐ๋‚ญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • serial๋ฅผ ์„ค์ •ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ํ•ญ๋ชฉ์„ ํ•ด๋‹น ์œ„์น˜์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์‹ค์ œ ์ „์†ก ์ค‘์— ๊ฑฐ๋ฆฌ, ์œ ๋ฌด ๋ฐ ๊ฐ€์šฉ์„ฑ์ด ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ๋ฐฐ๋‚ญ์„ ๋ช…์‹œ์ ์œผ๋กœ ํ• ๋‹น - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋‹จ์ผ ์ปจํ…Œ์ด๋„ˆ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” "backpack" ๋ฌธ์ž์—ด์„ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์—์„œ๋Š” ๋ฐฐ๋‚ญ์˜ serial์—์„œ ์ด๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœ์€ Unit์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— var ๊ฒฐ๊ณผ ์—†์ด ๋ณ„๋„์˜ ์ค„์— ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค. Print ๋ฉ”์‹œ์ง€๋Š” ์„ค์ •์„ ์„ค๋ช…ํ•˜๋ฉฐ ํ•ญ๋ชฉ ์ „์†ก์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var destination = "backpack";
UO.SetCatchBag(destination);
UO.Print("Receiving container: own backpack");

2. ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•œ ์ปจํ…Œ์ด๋„ˆ ์„ ํƒ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด ์˜ค๋ฒ„๋กœ๋“œ์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ์ด๋ฆ„์€ lastobject์ž…๋‹ˆ๋‹ค.
  • ๋นˆ ๊ด„ํ˜ธ๋Š” ์žฌ์„ค์ •์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋‘ ๋ฒˆ ํด๋ฆญํ•˜์—ฌ ์ ์ ˆํ•œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฏธ๋ฆฌ ์„ ํƒํ•˜์„ธ์š”. ์‹ค์ œ ํœด๋Œ€์šฉ ๊ฐ€๋ฐฉ์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋Š” ํ˜„์žฌ ๊ฒŒ์ž„ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.SetCatchBag();
    UO.Print("Destination taken from lastobject");
    return null;
}

3. ํŠน์ • serial๋ฅผ ์„ค์ •ํ•œ ๋‹ค์Œ ๊ธฐ๋ณธ ๋Œ€์ƒ์ธ ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

  • ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์—์„œ ์ปจํ…Œ์ด๋„ˆ=bag์—๋Š” 16์ง„์ˆ˜ ๋ฌธ์ž์—ด serial์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 0x40001234์€ ์˜ˆ์‹œ์ด๋ฏ€๋กœ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ์—์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ=0๊ฐ€ ํ• ๋‹น์„ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—†๋Š” ๋‹ค์Œ Grab์€ ๋ฐฐ๋‚ญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์žฌ์„ค์ •์€ ์˜๋„ํ•œ ์บ๋ฆฌ ๋ธ”๋ก ๋’ค์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • ๋ฐ ์žฌ์„ค์ •์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ•ญ๋ชฉ์„ ์ž์ฒด์ ์œผ๋กœ ์ด๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 bag = "0x40001234";
        UO.SetCatchBag(bag);
        UO.Print("Configured destination: " + bag);
        UO.SetCatchBag(0);
        UO.Print("Destination reset to the normal backpack fallback");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.SetCatchBag() โ€” UO.SetCatchBag()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setcatchbag":

                    SetReceivingContainer(arguments.Length > 0 ? arguments[0].ToString() : "lastobject");

                    break;

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setcatchbag":

                    SetReceivingContainer(arguments.Length > 0 ? arguments[0].ToString() : "lastobject");

                    break;

UO.SetReceivingContainer

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

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

void UO.SetReceivingContainer();
void UO.SetReceivingContainer(object? id);

ํ–ฅํ›„ Grab์— ๋Œ€ํ•œ ์ˆ˜์‹  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

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

  • id - ์„ ํƒ์‚ฌํ•ญ serial/๋ณ„์นญ. "my"/"backpack" - ํ˜„์žฌ ๋ฐฐ๋‚ญ. ๊ธ์ • ID์€ ์กด์žฌ ํ™•์ธ ์—†์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. 0/negative/no ์ธ์ˆ˜๋Š” ์„ค์ •์„ ์ง€์›๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ํŠน์ˆ˜ํ•œ my/backpack๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ฌธ์ž์—ด์€ GetObject๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. Bridge.SetReceivingContainer๋Š” State.ReceivingContainer๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด ํ˜ธ์ถœ๋กœ๋Š” ํ•ญ๋ชฉ์ด ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํด๋ฆฌ์–ด ํ›„ Grab๋Š” ๋ช…์‹œ์ ์ธ ๋ชฉ์  ์—†์ด ๋ฐฐ๋‚ญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธ์ •์ ์ธ ID ์ž์ฒด๋งŒ์œผ๋กœ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋กœ๋“œ๋˜์—ˆ๊ฑฐ๋‚˜ ์„œ๋ฒ„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Œ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ํ–ฅํ›„ Grab์— ๋Œ€ํ•œ ์ˆ˜์‹  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
UO.SetReceivingContainer("backpack");

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

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

  • ํŠน์ˆ˜ํ•œ my/backpack๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ฌธ์ž์—ด์€ GetObject๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. Bridge.SetReceivingContainer๋Š” State.ReceivingContainer๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด ํ˜ธ์ถœ๋กœ๋Š” ํ•ญ๋ชฉ์ด ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.SetReceivingContainer();
    return null;
}

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

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

  • ํด๋ฆฌ์–ด ํ›„ Grab๋Š” ๋ช…์‹œ์ ์ธ ๋ชฉ์  ์—†์ด ๋ฐฐ๋‚ญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธ์ •์ ์ธ ID ์ž์ฒด๋งŒ์œผ๋กœ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋กœ๋“œ๋˜์—ˆ๊ฑฐ๋‚˜ ์„œ๋ฒ„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Œ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 bag = UO.GetSerial("lastcontainer");
        if (Truth(UO.IsContainer(bag)))
        {
            UO.SetReceivingContainer(bag);
        }

        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.SetReceivingContainer() โ€” UO.SetReceivingContainer()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void SetReceivingContainer() => UnsetReceivingContainer();

UO.SetReceivingContainer(id) โ€” UO.SetReceivingContainer(Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: id (Integer/String)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void SetReceivingContainer(int id)

        {

            if (id <= 0)

                bridge.UnsetReceivingContainer();

            else

                bridge.SetReceivingContainer(id);

        }

UO.SetReceivingContainer(id) โ€” UO.SetReceivingContainer(String)

๋งค๊ฐœ๋ณ€์ˆ˜: id (Integer/String)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void SetReceivingContainer(string id)

        {

            string name = (id ?? string.Empty).Trim();

            if (name.Equals("my", StringComparison.OrdinalIgnoreCase)

                || name.Equals("backpack", StringComparison.OrdinalIgnoreCase))

            {

                SetReceivingContainer(bridge.Backpack);

                return;

            }

            SetReceivingContainer(GetObject(id));

        }

UO.UnsetCatchBag

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

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

void UO.UnsetCatchBag();

Grab์— ๋Œ€ํ•œ ์ˆ˜์‹  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง€์›๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ExecuteLegacyManualAlias๊ฐ€ UnsetReceivingContainer์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ฆฌ์ง€๋Š” ReceivingContainer=0๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ํ›„์† Grab๋Š” ๋ฐฐ๋‚ญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ€๋ฐฉ ์ œ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ง€์ •๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋งŒ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ์„œ๋ฒ„ ํ™•์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • Grab์— ๋Œ€ํ•œ ์ˆ˜์‹  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง€์›๋‹ˆ๋‹ค.
UO.UnsetCatchBag();

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

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

  • ExecuteLegacyManualAlias๊ฐ€ UnsetReceivingContainer์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ฆฌ์ง€๋Š” ReceivingContainer=0๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ํ›„์† Grab๋Š” ๋ฐฐ๋‚ญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ€๋ฐฉ ์ œ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.SetCatchBag("backpack");
    UO.UnsetCatchBag();
    return null;
}

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

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

  • ์ง€์ •๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋งŒ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ์„œ๋ฒ„ ํ™•์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.UnsetCatchBag();
        UO.Print(UO.Backpack());
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.UnsetCatchBag() โ€” UO.UnsetCatchBag()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "unsetcatchbag": UnsetReceivingContainer(); break;

UO.UnsetReceivingContainer

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

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

void UO.UnsetReceivingContainer();

์ €์žฅ๋œ ์ˆ˜์‹  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง€์›๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • UnsetReceivingContainer๋Š” ReceivingContainer=0์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด์–ด์ง€๋Š” Grab์—์„œ๋Š” ๋ช…์‹œ์ ์ธ ๋ชฉ์  ์—†์ด ๋ฐฐ๋‚ญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์ด ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ง€์ •๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋งŒ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ์„œ๋ฒ„ ํ™•์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์ €์žฅ๋œ ์ˆ˜์‹  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง€์›๋‹ˆ๋‹ค.
UO.UnsetReceivingContainer();

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

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

  • UnsetReceivingContainer๋Š” ReceivingContainer=0์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด์–ด์ง€๋Š” Grab์—์„œ๋Š” ๋ช…์‹œ์ ์ธ ๋ชฉ์  ์—†์ด ๋ฐฐ๋‚ญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์ด ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.SetReceivingContainer("backpack");
    UO.UnsetReceivingContainer();
    return null;
}

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

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

  • ์ง€์ •๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋งŒ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ์„œ๋ฒ„ ํ™•์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.UnsetReceivingContainer();
        UO.Print(UO.Backpack());
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.UnsetReceivingContainer() โ€” UO.UnsetReceivingContainer()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void UnsetReceivingContainer() => bridge.UnsetReceivingContainer();
โš ๏ธ **GitHub.com Fallback** โš ๏ธ