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

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

์•„์ดํ…œ

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

๊ฐ์ฒด์˜ ์†์„ฑ, ์‚ฌ์šฉ ๋ฐ ์ „์†ก. ์‹œ๋ฆฌ์–ผ์€ ํŠน์ • ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. type/graphic ๋ณด๊ธฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ ๋‹จ์œ„์˜ ์ „์†ก๊ณผ ์ „์†ก๋œ ํ•ญ๋ชฉ ์ˆ˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

์„น์…˜

์ฃผ์ œ ๋ช…๋ น ๋ฐ ์„ค๋ช…
Item Properties UO.GetSerial ยท UO.GetType ยท UO.GetGraphic ยท UO.GetColor ยท UO.GetQuantity ยท UO.GetName ยท UO.GetTooltip ยท UO.ContainerOf ยท UO.GetParent ยท UO.GetLayer ยท UO.IsMovable ยท UO.GetX ยท UO.GetY ยท UO.GetZ
์•„์ดํ…œ ์ฐพ๊ธฐ UO.FindType ยท UO.FindTypeEx ยท UO.FindTypesArrayEx ยท UO.FindItem ยท UO.FindAnyType ยท UO.FindAtCoord ยท UO.FindList ยท UO.FindDistance ยท UO.FindVertical
์•„์ดํ…œ ์‚ฌ์šฉ UO.UseObject ยท UO.UseType ยท UO.UseFromGround ยท UO.UseWorldObject ยท UO.UseItemOnMobile
Moving ์•„์ดํ…œ UO.Grab ยท UO.Drag ยท UO.Drop ยท UO.MoveItem ยท UO.MoveItems ยท UO.MassMove ยท UO.EmptyContainer
Ground ์•„์ดํ…œ UO.GetWorldItems ยท UO.FindType ยท UO.CountGround ยท UO.MoveItem
์ปจํ…Œ์ด๋„ˆ ํ’ˆ๋ชฉ UO.GetContent ยท UO.FindTypeEx ยท UO.OpenContainer
๊ฐ€์งœ/ํด๋ผ์ด์–ธํŠธ ํ’ˆ๋ชฉ UO.MakeFakeItem ยท UO.DeleteObject
Dye UO.Dye

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

์•„์ดํ…œ ์†์„ฑ

UO.Exists ยท UO.IsObjectExists ยท UO.GetSerial ยท UO.GetType ยท UO.GetGraphic ยท UO.GetColor ยท UO.GetQuantity ยท UO.Name ยท UO.GetName ยท UO.GetAltName ยท UO.GetTooltip ยท UO.GetTooltipRec ยท UO.GetLayer ยท UO.GetLocked ยท UO.IsMovable ยท UO.GetFlags ยท UO.ReceiveObjectName ยท UO.UpdateObject

์•„์ดํ…œ ์‚ฌ์šฉ

UO.UseObject ยท UO.UseType ยท UO.UseFromGround ยท UO.UseWorldObject ยท UO.UseItemOnMobile ยท UO.ClickOnObject ยท UO.TicksUse

Moving ์•„์ดํ…œ

UO.Grab ยท UO.Drag ยท UO.DragItem ยท UO.Drop ยท UO.DropHere ยท UO.DropItem ยท UO.MoveItem ยท UO.MoveItems ยท UO.MassMove ยท UO.EmptyContainer ยท UO.DropDelay ยท UO.DropCheckCoord ยท UO.Picking

๊ฐ€์งœ / ๊ณ ๊ฐ ํ’ˆ๋ชฉ

UO.MakeFakeItem ยท UO.DeleteObject

Dye

UO.Dye

์ €์žฅ๋œ ๊ฐ์ฒด

UO.AddObject ยท UO.AddType ยท UO.EasyObject ยท UO.UserObject ยท UO.LastObject ยท UO.Forget

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

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

UO.MoveItem

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

var ok = UO.MoveItem("loot");
UO.Print("Move request: " + Convert.ToString(ok));

UO.MassMove

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

UO.MassMove(350, 0);
UO.Print("Drag one sample item to the destination container");

์ฐธ์กฐ ๊ตฌ์„ฑ

1 ยท 2

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


UO.AddObject

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

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

void UO.AddObject(object? name);
void UO.AddObject(object? name, object? objectRawId);

๋‚˜์ค‘์— ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช…๋ช…๋œ serial ๊ฐœ์ฒด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜ ํ˜•์‹์€ ๊ฐœ์ฒด๋ฅผ ์ฆ‰์‹œ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์ธ์ˆ˜๋Š” ์ปค์„œ๋กœ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•˜๋„๋ก ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

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

  • name๋Š” ๋Ÿฐํƒ€์ž„์— ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋น„์–ด ์žˆ์ง€ ์•Š์€ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • objectRawId - serial ๋˜๋Š” ์ด๋ฏธ ์ €์žฅ๋œ ๊ฐœ์ฒด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋‹จ์ผ ์ธ์ˆ˜ ์˜ค๋ฒ„๋กœ๋“œ๋Š” ์ด ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ๋Œ€์‹  ๊ฐœ์ฒด ์„ ํƒ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void. ์ด๋ฆ„๋ณ„๋กœ ๊ฐœ์ฒด๋ฅผ ์ฝ์–ด์„œ ์ €์žฅ๋œ ๋ฐ”์ธ๋”ฉ์„ ํ™•์ธํ•˜์„ธ์š”. ํ˜ธ์ถœ์ด serial๋กœ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ๋Ÿฐํƒ€์ž„์€ objectRawId๋ฅผ ํ™•์ธํ•˜๊ณ  serial๋ฅผ name ์•„๋ž˜์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฐœ์ฒด ์„ ํƒ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ•ญ๋ชฉ ๋˜๋Š” mobile์ด ์„ ํƒ๋˜์ง€๋งŒ ์นด๋“œ ์…€์€ ์„ ํƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ ํƒํ•˜๊ธฐ ์ „์— ๋™์ผํ•œ ์ด๋ฆ„์˜ ์ด์ „ ๋ฐ”์ธ๋”ฉ์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ์ปค์„œ๋ฅผ ์ทจ์†Œํ•˜๊ฑฐ๋‚˜ ์žƒ์–ด๋„ ์ปค์„œ๊ฐ€ ๋ณต์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.AddObject");
UO.AddObject("target");

1. ์•Œ๋ ค์ง„ ํ•ญ๋ชฉ์˜ serial๋ฅผ ํŽธ๋ฆฌํ•œ ์ด๋ฆ„์œผ๋กœ ์ €์žฅํ•˜์„ธ์š”. - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์•Œ๋ ค์ง„ ํ•ญ๋ชฉ์˜ serial๋ฅผ ํŽธ๋ฆฌํ•œ ์ด๋ฆ„์œผ๋กœ ์ €์žฅํ•˜์„ธ์š”.
UO.AddObject("supplyBox", "0x40012345");

2. ํ•ญ๋ชฉ ์„ ํƒ์„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ์ปค์„œ๋กœ mobile๋ฅผ ๋ˆ„๋ฅด๊ณ  ๋Œ€์ƒ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ํ•ญ๋ชฉ ์„ ํƒ์„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ์ปค์„œ๋กœ mobile๋ฅผ ๋ˆ„๋ฅด๊ณ  ๋Œ€์ƒ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.AddObject("target");
    return null;
}

3. ์ด๋ฆ„์„ ๋‹ค์‹œ ์ €์žฅํ•˜๋ฉด ๋ฐ”์ธ๋”ฉ์ด ์ƒˆ serial๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ด๋ฆ„์„ ๋‹ค์‹œ ์ €์žฅํ•˜๋ฉด ๋ฐ”์ธ๋”ฉ์ด ์ƒˆ 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 selectedSerial = "0x40012345";
        UO.AddObject("supplyBox", selectedSerial);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.AddObject(name) โ€” UO.AddObject(String)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void AddObject(string name)

        {

            SystemMessage($"What is {name}");

            bridge.AddObject(name);

        }

UO.AddObject(name, objectRawId) โ€” UO.AddObject(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void AddObject(InjectionValue name, InjectionValue objectRawId) 

            => ObjectChecked(objectRawId, id => AddObject((string)name, id));

UO.AddType

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

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

void UO.AddType(object? name);
void UO.AddType(object? name, object? @type);

ํ•ญ๋ชฉ ๋˜๋Š” ๋ณธ๋ฌธ ๊ทธ๋ž˜ํ”ฝ ์œ ํ˜• mobile์— ๋Œ€ํ•œ ์นœ์ˆ™ํ•œ ์ด๋ฆ„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, UO.AddType("bandage", 0x0E21) ๋’ค์—๋Š” ๊ฐ ์ค„์— ์ˆซ์ž type๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๊ณ ๋„ "bandage"๋ผ๋Š” ์ด๋ฆ„์„ ํ†ตํ•ด bandages๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋ฆ„ ์„ค์ • โ†’ ๊ทธ๋ž˜ํ”ฝ ๋งคํ•‘์ด๋ฉฐ, ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ํŠน์ • ํ•ญ๋ชฉ์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค(ID).

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

  • name - ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์ธ ํ•„์ˆ˜ ๋ฌธ์ž์—ด - ์œ ํ˜• ์ด๋ฆ„. ๊ฐ€์žฅ์ž๋ฆฌ ๊ณต๊ฐ„์€ ์ œ๊ฑฐ๋˜๋ฉฐ ๋Œ€์†Œ๋ฌธ์ž๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "Bandage"์™€ "bandage"๋Š” ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ๋นˆ ๋ฌธ์ž์—ด, ์ˆซ์ž ์ด๋ฆ„, ์ž„์˜์˜ ๋‹จ์–ด, ๋ฌธ์ž | ๋ฐ ์ œ์–ด ๋ฌธ์ž๋Š” ๊ธˆ์ง€๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ƒˆ ๋ณ€์ˆ˜๋‚˜ UO ๋ช…๋ น์ด ์•„๋‹Œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. ํ›„์† ํ˜ธ์ถœ์—๋„ ๋”ฐ์˜ดํ‘œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • type - ์„ ํƒ ์‚ฌํ•ญ int 0..65535: ๊ทธ๋ž˜ํ”ฝ/type(์˜ˆ: 0x0E21 ๋˜๋Š” 3617). 10์ง„์ˆ˜/16์ง„์ˆ˜ ์ˆซ์ž ๋˜๋Š” ์ด๋ฏธ ์ €์žฅ๋œ ์œ ํ˜•์˜ ์ด๋ฆ„์ด ํฌํ•จ๋œ ๋ฌธ์ž์—ด์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ›„์ž๋Š” ํ˜„์žฌ ๋ฒˆํ˜ธ๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  ์ด๋ฆ„ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0x40001001 ํ˜•์‹์˜ ID, ์Œ์ˆ˜, ๋ถ„์ˆ˜ ๋ฐ ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ์„ ํƒ ์ปค์„œ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€๋ฅผ ํฌํ•จํ•˜์—ฌ ๋กœ๋“œ๋œ ํ•ญ๋ชฉ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ mobile๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•œ ๊ฐœ์ฒด์˜ ๊ทธ๋ž˜ํ”ฝ์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ง€ํ‘œ๋ฉด๊ณผ ์ •์  ํƒ€์ผ์€ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. var ๊ฒฐ๊ณผ = ๋ฐ true/1์™€์˜ ๋น„๊ต ์—†์ด ๋ณ„๋„์˜ ์ค„์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์„ ํƒํ•œ type, serial ๋˜๋Š” ์„ฑ๊ณต ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šค๋กœ ์ทจ์†Œํ•˜๋ฉด ์ด์ „ ํ•ญ๋ชฉ์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ด์ „์— ์ด๋ฆ„์ด ์—†์œผ๋ฉด ์ •์˜๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ทจ์†Œ ํ›„์— ์Šคํฌ๋ฆฝํŠธ์˜ ๋‹ค์Œ ์ค„์ด ์‹คํ–‰๋˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ํ™•์‹คํžˆ ์ƒˆ ํ•ญ๋ชฉ์„ ์„ ํƒํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ž‘์—…์„ ์ž๋™์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ๋งˆ์„ธ์š”.

๋™์ž‘

  • AddType(name, type) ํ˜•์‹์€ ์ปค์„œ๋‚˜ ๋„คํŠธ์›Œํฌ ์ž‘์—… ์—†์ด ์ฆ‰์‹œ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ฐ˜๋ณต์ด ํ•ด๋‹น ์œ ํ˜•์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฐ’์€ ์ด์ „ ํ•ญ๋ชฉ์„ ํŒŒ๊ดดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. AddType(์ด๋ฆ„) ์–‘์‹์ด ์„ ํƒ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Esc, ์ปค์„œ๋ฅผ ๋‹ค๋ฅธ ์ž‘์—…์œผ๋กœ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ๋ถ€์ ์ ˆํ•œ ๋Œ€์ƒ์œผ๋กœ ์ธํ•ด ํ•ญ๋ชฉ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐ•์ œ๋กœ ์ค‘์ง€ํ•˜๋ฉด ๋Œ€๊ธฐ๊ฐ€ ์ค‘๋‹จ๋˜๊ณ  ํ•ด๋‹น ๋Œ€๊ธฐ์— ์†ํ•œ ์ปค์„œ๋งŒ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.
  • ์œ ํ˜• ์ด๋ฆ„์€ AddObject์™€ ๋ณ„๋„๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋‹จ์–ด๊ฐ€ FindType์—์„œ๋Š” type์„, UseObject์—์„œ๋Š” serial๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. AddType("๊ณต๊ธ‰", 0x0E21) ์ž์ฒด๋งŒ์œผ๋กœ๋Š” UseObject("๊ณต๊ธ‰")์ด ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠน์ • ํ•ญ๋ชฉ์˜ ๊ฒฝ์šฐ AddObject/GetSerial๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ํ•ญ๋ชฉ๊ตฐ - AddType ๋ฐ ๋งค๊ฐœ๋ณ€์ˆ˜ type.
  • ์ด๋ฆ„์€ ๋งค๊ฐœ๋ณ€์ˆ˜ type FindType(๋ชจ๋“  ํ˜•์‹), FindTypeEx, FindTypesArrayEx, FindList, FindNotoriety, GetWorldItems, UseType, UseFromGround, Count, CountGround, CountEx, EquipT, WaitTargetType, WaitTargetGround ๋ฐ WaitTargetObjectType. GetMobiles/FindAnyType/WaitTarget ์œ ํ˜•์˜ ๋งˆ์Šคํฌ์—์„œ๋Š” |๋ฅผ ํ†ตํ•ด ์ด๋ฆ„์„ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋ฐฐ์—ด; ์•…๋ช…์— ๋Œ€ํ•œ ๊ทœ์น™์€ ๋ณ„๋„๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ธ๊ฐ„/๊ฐ€๊นŒ์šด ๋‹จ์–ด ๋ฐ ๊ธฐํƒ€ FindMobile ํ•„ํ„ฐ๋Š” ์žฌ์ •์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜ํ”ฝ๋งŒ ์ €์žฅ๋˜๋ฉฐ ์ƒ‰์ƒ, ์ˆ˜๋Ÿ‰, ์ปจํ…Œ์ด๋„ˆ, ํ•ญ๋ชฉ ์ด๋ฆ„, ๋ ˆ์ด์–ด ๋˜๋Š” ์†์„ฑ์€ ์ €์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒ‰์ƒ์ด ๋‹ค๋ฅธ ๋™์ผํ•œ ์œ ํ˜•์˜ ๋‘ ํ•ญ๋ชฉ์€ ๊ฒ€์ƒ‰ ์‹œ ๋ณ„๋„์˜ ์ƒ‰์ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์€ ํ•ญ๋ชฉ์ด ํ˜„์žฌ ์กด์žฌํ•˜๋Š”์ง€, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ๋˜๋Š” ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ์ž‘์—…์„ ํ—ˆ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.AddType");
UO.AddType("my_tool");

1. ๋ฐœ๊ฒฌ๋œ ๊ธˆ ๋”๋ฏธ ํ•˜๋‚˜ ์˜ฌ๋ฆฌ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • gold_stack - ์ด๋ฆ„; 0x0EED โ€“ ๊ทธ๋ž˜ํ”ฝ ๊ณจ๋“œ. FindType: -1 - ๋ชจ๋“  ์ƒ‰์ƒ, ground - ์ง€๊ตฌ, 2 - ๊ฒ€์ƒ‰ ๋ฐ˜๊ฒฝ. ๋ฌธ์ž์—ด serial ๋˜๋Š” ๋นˆ ๋ฌธ์ž์—ด์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • MoveItem๋Š” ๋ฐœ๊ฒฌ๋œ serial, ์ „์ฒด ์Šคํƒ์— ๋Œ€ํ•œ 0, ๊ทธ๋ฆฌ๊ณ  ๋Œ€์ƒ์œผ๋กœ backpack๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฐ˜๊ฒฝ ๋‚ด ๋ชจ๋“  ์Šคํƒ์ด ์•„๋‹Œ ํ•˜๋‚˜์˜ ์Šคํƒ์ž…๋‹ˆ๋‹ค. ์ „์†ก ๊ฐ€๋Šฅ ์—ฌ๋ถ€์™€ ์‹ค์ œ ๊ฒฐ๊ณผ๋Š” ์„œ๋ฒ„์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์œ ํ˜• ์ •์˜ ์ž์ฒด์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
UO.AddType("gold_stack", 0x0EED);
var item = UO.FindType("gold_stack", -1, "ground", 2);
if (Truth(item == ""))
{
    UO.Print("No loaded gold stack within 2 tiles");
    return null;
}
var moved = UO.MoveItem(item, 0, "backpack");
if (Truth(moved == 0))
{
    UO.Print("Move request failed");
}

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

2. ์ฒด๋ ฅ์ด ๋‚ฎ์„ ๋•Œ๋งŒ ๋ถ•๋Œ€๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋ฌธ์ž์—ด ๋ฒˆํ˜ธ 0x0E21๋Š” int Graphic๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. Life/MaxHP HP ๋ฌธ์ž๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. FindType ๋ฐฐ๋‚ญ์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ƒ‰์ƒ์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. -1 ๊ฑฐ๋ฆฌ์—์„œ๋Š” ํ‘œ์ค€ ๊ฒ€์ƒ‰ ๋™์ž‘์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • self์€ ์ ์šฉ ๋ชฉ์ ์ด๊ณ , FindType ์ดํ›„์˜ ๋ถ•๋Œ€๋Š” serial๋กœ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์•„์ดํ…œ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋Œ€์ƒ์˜ ๋Œ€๊ธฐ์—ด์ด ์ค€๋น„๋ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋Š” ์‚ฌ์šฉ๋ฒ•์„ ๋ณด๋‚ด๊ณ  ์ฒ˜๋ฆฌ๊ฐ€ ์ด๋ฏธ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํƒ€์ด๋จธ/์ฒ˜๋ฆฌ ๊ทœ์น™์€ ์„œ๋ฒ„์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.AddType("bandage", "0x0E21");
    if (Truth(UO.Life() >= UO.MaxHP()))
    {
        return null;
    }

    var bandage = UO.FindType("bandage", -1, "backpack", -1, true);
    if (Truth(bandage == ""))
    {
        UO.Print("No loaded bandages in backpack");
        return null;
    }

    UO.WaitTargetObject("self");
    UO.UseObject(bandage);
    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์—๋Š” ์ด๋ฆ„๋งŒ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ปค์„œ๊ฐ€ ์—ด๋ฆฝ๋‹ˆ๋‹ค. ๋„๊ตฌ ์œ ํ˜•์€ ID ๋ฐ ์ƒ‰์ƒ์ด ์•„๋‹Œ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. UseSavedTool์€ ๊ธฐ๋ณธ ์ œ๊ณต ๋ช…๋ น์ด ์•„๋‹Œ ์ผ๋ฐ˜์ ์ธ ๋…๋ฆฝ ์‹คํ–‰ํ˜• ์ ˆ์ฐจ C#์ž…๋‹ˆ๋‹ค.
  • UseType ๋ฐฐ๋‚ญ์— ์ €์žฅ๋œ ๋ชจ๋“  ์ƒ‰์ƒ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ int serial ๋˜๋Š” 0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์ด ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ 0์˜ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹Œ ์ธ์ˆ˜ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ํ• ๋‹น ํ•ด์ œ ํ›„ Main์€ UseSavedTool๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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.AddType("my_tool");
        return null;
    }

    void UseSavedTool()
    {
        var used = UO.UseType("my_tool", -1, "backpack");
        if (Truth(used == 0))
        {
            UO.Print("No matching loaded tool in backpack");
        }
    }

    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.AddType(name) โ€” UO.AddType(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "addtype":

                    AddType(arguments);

                    break;

UO.AddType(name, type) โ€” UO.AddType(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "addtype":

                    AddType(arguments);

                    break;

UO.ClickOnObject

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

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

void UO.ClickOnObject(object? objID);

GameActions.SingleClick๋ฅผ ํ†ตํ•ด ๊ฐœ์ฒด์— ๋Œ€ํ•œ ๋‹จ์ผ ํด๋ฆญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

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

  • objID โ€” self/backpack/lasttarget/์ €์žฅ๋œ ๊ฐ์ฒด์˜ ๊ฐ์ฒด ์ผ๋ จ๋ฒˆํ˜ธ ๋˜๋Š” ์ง€์›๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ˆซ์ž ๋ฌธ์ž์—ด๊ณผ 0x ๋ฌธ์ž์—ด์€ ๋Ÿฐํƒ€์ž„์— ์˜ํ•ด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • Click๋Š” ObjectChecked๋ฅผ ํ†ตํ•ด ๋งํฌ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ClickOnObject๋Š” ๋จผ์ € serial์— Arg๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  Click(int)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” DoubleClick ๋˜๋Š” ์•„์ดํ…œ ์‚ฌ์šฉ์ด ์•„๋‹Œ ์•„์ดํ…œ์˜ ์„œ๋ช…/์ •๋ณด์— ๋Œ€ํ•œ ์š”์ฒญ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‘๋‹ต์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.ClickOnObject");
UO.ClickOnObject("self");

1. ์บ๋ฆญํ„ฐ ํด๋ฆญ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ•œ ๋ฒˆ์˜ ํด๋ฆญ์€ self๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
UO.ClickOnObject("self");

2. ๋งˆ์ง€๋ง‰ ๋Œ€์ƒ ํด๋ฆญ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ „์†กํ•˜๊ธฐ ์ „์— ๋Œ€์ƒ์˜ ๋กœ์ปฌ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.LastTarget();
    if (Truth(UO.Exists(target)))
    {
        UO.ClickOnObject(target);
    }

    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 bag = UO.Backpack();
        if (Truth(bag != 0))
        {
            UO.ClickOnObject(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.ClickOnObject(objID) โ€” UO.ClickOnObject(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "clickonobject": Click(Arg(0)); return InjectionValue.Unit;

UO.DeleteObject

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

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

void UO.DeleteObject(object? name);

๋Ÿฐํƒ€์ž„ ํ…Œ์ด๋ธ”์—์„œ ์ €์žฅ๋œ ๊ฐœ์ฒด ์ด๋ฆ„์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

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

  • name - string ๊ฐœ์ฒด ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด ํ•ญ๋ชฉ๋งŒ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ์ด๋ฆ„์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•˜๊ณ  ํ™•์ธ ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์ด ์—†์œผ๋ฉด ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ฐœ์ฒด์™€ ํ•ด๋‹น ๋‚ด์šฉ์€ ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.DeleteObject");
UO.DeleteObject("temporary");

1. ์ƒ์„ฑ๋œ ์ด๋ฆ„ ์‚ญ์ œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ•ด๋‹น ์บ๋ฆญํ„ฐ์˜ serial์™€์˜ ์ž„์‹œ ์—ฐ๊ฒฐ๋งŒ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.
UO.AddObject("temporary",UO.Self());
UO.DeleteObject("temporary");

2. ์ด๋ฆ„ ๋ˆ„๋ฝ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด๋ฆ„์ด ๋ˆ„๋ฝ๋˜๋ฉด ์ง„๋‹จ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.DeleteObject("missing-example-name");
    return null;
}

3. ๋ณ€์ˆ˜์— ์ด๋ฆ„ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • string ๋ณ€์ˆ˜๋Š” ์‚ญ์ œํ•  ์ •ํ™•ํ•œ ํ•ญ๋ชฉ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var name = "temporary";
        UO.AddObject(name, UO.Self());
        UO.DeleteObject(name);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.DeleteObject(name) โ€” UO.DeleteObject(String)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void DeleteObject(string name)

        {

            if (objects.TryGet(name, out int value))

            {

                objects.Remove(name);

                SystemMessage($"Object {name} has been deleted");

            }

            else

                SystemMessage($"Object {name} not found");

        }

UO.Drag

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

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

int UO.Drag(object? id);
int UO.Drag(object? id, object? amount);
int UO.Drag(object? id, object? amount, object? timeout);
void UO.Drag(object? fromX, object? fromY, object? toX, object? toY);

ํŠน์ • ํ•ญ๋ชฉ์„ ์ปค์„œ๋กœ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ 4๊ฐœ ์ธ์ˆ˜ ํ˜•์‹์€ Windows ์ฐฝ์—์„œ ๋งˆ์šฐ์Šค๋ฅผ ๋“œ๋ž˜๊ทธํ•ฉ๋‹ˆ๋‹ค.

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

  • id โ€” ํŠน์ • ํ•ญ๋ชฉ/๋ฌธ์ž์˜ ์ผ๋ จ๋ฒˆํ˜ธ: ์ˆซ์ž, 16์ง„์ˆ˜/10์ง„์ˆ˜ ๋ฌธ์ž์—ด, self/backpack/lasttarget/lastobject/lastcontainer/lastcorpse/finditem/laststatus ๋˜๋Š” ์ €์žฅ๋œ ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ type์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐœ์ฒด๋ฅผ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—… ์ „์— Exists๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • amount โ€” ํ•œ ์Šคํƒ ์•ˆ์— ์žˆ๋Š” ๋‹จ์œ„ ์ˆ˜์ž…๋‹ˆ๋‹ค. 0 ๋˜๋Š” ์Œ์ˆ˜ ๊ฐ’์€ ์ „์ฒด ์Šคํƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ธ์ •์ ์ธ ๊ฒƒ์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ˆ˜๋Ÿ‰์— ์˜ํ•ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. MassMove๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒƒ์€ ์Šคํƒ ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์—†์œผ๋ฉด 0์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • timeout - ์„ ํƒ์ ์ธ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜: ์ง€์ •๋œ ๋ฐ€๋ฆฌ์ดˆ ์ˆ˜๊นŒ์ง€ ๊ด€์ฐฐ ๊ฐ€๋Šฅ Picking์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค. ์Œ์ˆ˜ ๊ฐ’์€ 0์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • fromX - 4๊ฐœ์˜ int ํ˜•์‹๋งŒ ํ•ด๋‹น: ํด๋ผ์ด์–ธํŠธ ์ฐฝ ํ”ฝ์…€์—์„œ ๋งˆ์šฐ์Šค์˜ ์ดˆ๊ธฐ X.
  • fromY โ€” ํด๋ผ์ด์–ธํŠธ ์ฐฝ ํ”ฝ์…€์— ์žˆ๋Š” ๋งˆ์šฐ์Šค์˜ ์ดˆ๊ธฐ Y์ž…๋‹ˆ๋‹ค.
  • toX โ€” ๋งˆ์šฐ์Šค์˜ ๋ X(ํ”ฝ์…€ ๋‹จ์œ„)์ž…๋‹ˆ๋‹ค.
  • toY โ€” ๋งˆ์šฐ์Šค์˜ ๋ Y(ํ”ฝ์…€ ๋‹จ์œ„)์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

1..3 ์ธ์ˆ˜ int: 1 โ€” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌํ”„ํŠธ ์š”์ฒญ์„ ์ˆ˜๋ฝํ–ˆ์Šต๋‹ˆ๋‹ค(์‹œ๊ฐ„ ์ดˆ๊ณผ>0 ์‚ฌ์šฉ ์ค‘์ธ ์ปค์„œ๋„ ๊ด€์ฐฐ๋จ). 0 - ๋ฆฌํ”„ํŠธ๊ฐ€ ๊ฑฐ๋ถ€๋˜์—ˆ๊ฑฐ๋‚˜ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋งŒ๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 4๊ฐœ์˜ ์ธ์ˆ˜ ์‚ฌ์šฉ null: ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ID ์•„์ดํ…œ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฒŒ์ž„ ์ „์†ก์˜ ๊ฒฝ์šฐ ์„ ํ˜ธ๋˜๋Š” ํ˜•์‹์€ id[,amount[,timeout]] ๋’ค์— DropItem ๋˜๋Š” ๋‹จ์ผ MoveItem์ด ์˜ค๋Š” ํ˜•์‹์ž…๋‹ˆ๋‹ค.
  • fromX/fromY/toX/toY ํ˜•์‹์€ Windows ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ(์ด๋™, ๋ˆ„๋ฅด๊ธฐ, ์ด๋™, ๋†“๊ธฐ)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ํ™•์ธ์ด ์—†์œผ๋ฉฐ ์ฐฝ์˜ ์‹ค์ œ ๋‚ด์šฉ/์ดˆ์ ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ ์ค‘์ธ ์ปค์„œ๋Š” ๋Œ€์ƒ์œผ๋กœ์˜ ์„ฑ๊ณต์ ์ธ ์ „์†ก๊ณผ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์บก์ฒ˜์™€ ๋ฆด๋ฆฌ์Šค๋Š” ๋ณ„๋„์˜ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ „์ฒด ์Šคํƒ์„ ์ง‘์–ด ๋ฐฐ๋‚ญ์— ๋„ฃ์Šต๋‹ˆ๋‹ค - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ „๋ฆฌํ’ˆ - serial๋ถ€ํ„ฐ AddObject๊นŒ์ง€. amount=0๋Š” ์ „์ฒด ์Šคํƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. -1/-1 ๊ฒ€ํ”„์˜ ์ž๋™ ์œ„์น˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • DropItem๋Š” ๋™์ผํ•œ ๋Ÿฐํƒ€์ž„ ์บก์ฒ˜๋ฅผ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์„œ๋ฒ„์˜ ํ™•์ธ์ด ์•„๋‹ˆ๋ผ ์š”์ฒญ์ด ์ „์†ก๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
if (Truth(UO.Drag("loot", 0)))
{
    var dropped = UO.DropItem("backpack", -1, -1, 0);
    UO.Print("Drop request: " + Convert.ToString(dropped));
}

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

2. ์ œํ•œ๋œ ๋Œ€๊ธฐ๋กœ ์Šคํƒ์— ์ฐธ์—ฌ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • amount=10 โ€” ํ•œ ์Šคํƒ์˜ ์ตœ๋Œ€ 10๊ฐœ ๋‹จ์œ„; ์‹œ๊ฐ„ ์ดˆ๊ณผ=500ms.
  • 44/55 - ์ง€๋„๊ฐ€ ์•„๋‹Œ ๋ฐฐ๋‚ญ ๋‚ด๋ถ€์˜ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์œผ๋ฉด DropItem๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Drag("loot", 10, 500)))
    {
        var dropped = UO.DropItem("backpack", 44, 55, 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. ๊ทธ๋ฆฝ ์ „ ๋ฐ”์œ ์† ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์—…

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

  • ํ•˜๋‚˜์˜ ์ธ์ˆ˜ Drag๋Š” ์ „์ฒด ์Šคํƒ์„ ์˜๋ฏธํ•˜๋ฉฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ=0์ž…๋‹ˆ๋‹ค.
  • Picking ํด๋ผ์ด์–ธํŠธ์˜ ๊ณต์œ  ์ปค์„œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ๋‘ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‹คํ–‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
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.Picking() == 0))
        {
            if (Truth(UO.Drag("loot")))
            {
                var dropped = UO.DropItem("backpack", -1, -1, 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;
}

4. 4๊ฐœ์˜ ๋งˆ์šฐ์Šค ์ขŒํ‘œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ฐฝ ํ”ฝ์…€์€ ์‹œ์ž‘(100,120), ๋(260,180)์ž…๋‹ˆ๋‹ค. serial, ๊ธˆ์•ก ๋˜๋Š” ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์›ํ•˜๋Š” ์š”์†Œ๊ฐ€ ์ด ์œ„์น˜์— ์žˆ์„ ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ serial๋กœ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ๋” ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค.
UO.Drag(100, 120, 260, 180);

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Drag(InjectionValue id) => Drag(id, InjectionValue.Zero, InjectionValue.Zero);

UO.Drag(id, amount) โ€” UO.Drag(Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Drag(InjectionValue id, InjectionValue amount) => Drag(id, amount, InjectionValue.Zero);

UO.Drag(id, amount, timeout) โ€” UO.Drag(Any,Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Drag(InjectionValue id, InjectionValue amount, InjectionValue timeout)

        {

            int serial = GetObject(id);

            if (serial == 0)

                return 0;

            int requestedAmount = NumberConversions.ToInt(amount);

            int timeoutMs = Math.Max(0, NumberConversions.ToInt(timeout));

            int result = bridge.DragItem(serial, requestedAmount);

            if (result == 0 || timeoutMs <= 0)

                return result;



            DateTime deadline = DateTime.UtcNow.AddMilliseconds(timeoutMs);

            do

            {

                if (bridge.Picking() != 0)

                    return 1;

                if (DateTime.UtcNow >= deadline)

                    break;

                bridge.Wait(10);

            }

            while (true);



            SystemMessage($"UO.Drag: item pickup was not observable within {timeoutMs} ms.");

            return 0;

        }

UO.Drag(fromX, fromY, toX, toY) โ€” UO.Drag(Integer,Integer,Integer,Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: fromX (Integer), fromY (Integer), toX (Integer), toY (Integer)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void Drag(int fromX, int fromY, int toX, int toY) => bridge.Drag(fromX, fromY, toX, toY);

UO.DragItem

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

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

dynamic UO.DragItem(object? objID, object? count);

ํŠน์ • ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜๊ณ  ์ด๋ฒˆ ๋Ÿฐํƒ€์ž„ ๋™์•ˆ DropItem ๋™์•ˆ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค.

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

  • objID โ€” ํŠน์ • ํ•ญ๋ชฉ/๋ฌธ์ž์˜ ์ผ๋ จ๋ฒˆํ˜ธ: ์ˆซ์ž, 16์ง„์ˆ˜/10์ง„์ˆ˜ ๋ฌธ์ž์—ด, self/backpack/lasttarget/lastobject/lastcontainer/lastcorpse/finditem/laststatus ๋˜๋Š” ์ €์žฅ๋œ ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ type์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐœ์ฒด๋ฅผ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—… ์ „์— Exists๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • count โ€” ํ•œ ์Šคํƒ ์•ˆ์— ์žˆ๋Š” ๋‹จ์œ„ ์ˆ˜์ž…๋‹ˆ๋‹ค. 0 ๋˜๋Š” ์Œ์ˆ˜ ๊ฐ’์€ ์ „์ฒด ์Šคํƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ธ์ •์ ์ธ ๊ฒƒ์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ˆ˜๋Ÿ‰์— ์˜ํ•ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. MassMove๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒƒ์€ ์Šคํƒ ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int 1 โ€” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ƒ์Šน์„ ์ˆ˜๋ฝํ–ˆ์Šต๋‹ˆ๋‹ค. 0 - ํ•ญ๋ชฉ์„ ์ฐพ์„ ์ˆ˜ ์—†๊ฑฐ๋‚˜ PickUp ๊ฑฐ๋ถ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ object? ์ž„์˜์˜ ๊ฒฐ๊ณผ ์œ ํ˜•์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ serial๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

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

๋™์ž‘

  • ๋‘ ์ธ์ˆ˜๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ ๊ธฐ๋Šฅ์€ ์—†์Šต๋‹ˆ๋‹ค. Drag(id,amount,timeout) ํ˜•์‹์€ ๋กœ์ปฌ Picking์— ๋Œ€ํ•œ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ฑ๊ณต์ ์ธ ์บก์ฒ˜ ํ›„ ์ž‘์—… DropItem์„ ์™„๋ฃŒํ•˜์„ธ์š”. ๋งˆ์šฐ์Šค๋กœ ์ˆ˜๋™์œผ๋กœ ์„ ํƒํ•œ ํ•ญ๋ชฉ์€ ์ด ๋Ÿฐํƒ€์ž„์˜ DragItem ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ „์ฒด ์Šคํƒ ์˜ฌ๋ฆฌ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ObjID=loot via AddObject, Count=0๋Š” ์ „์ฒด ์Šคํƒ์ž…๋‹ˆ๋‹ค.
  • ๋‘ ๋ฒˆ์งธ ํŒ€์€ ๋™์ผํ•œ ์ฃผ์šด ์•„์ดํ…œ์„ ๋–จ์–ด๋œจ๋ฆฝ๋‹ˆ๋‹ค.
if (Truth(UO.DragItem("loot", 0)))
{
    var ok = UO.DropItem("backpack", -1, -1, 0);
}

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

2. ๋‹ค์„ฏ ์œ ๋‹› ํ‚ค์šฐ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ObjID๋ฅผ serial๋กœ ๋ฐ”๊พธ์„ธ์š”. Count=5๋Š” ๋™์ผํ•œ ์Šคํƒ์˜ ๋‹จ์œ„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ์œ„์น˜ 44/55๋Š” ๋ฐฑํŒฉ ๊ฒ€ํ”„ ๋‚ด๋ถ€์ž…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.DragItem(0x40001234, 5)))
    {
        var ok = UO.DropItem("backpack", 44, 55, 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. ์‹คํŒจํ•œ ์บก์ฒ˜ ํ‘œ์‹œ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • picked โ€” int 1/0.
  • ์บก์ฒ˜๊ฐ€ ์‹คํŒจํ•œ ํ›„์—๋Š” DropItem๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ๋งˆ์„ธ์š”. ์ปค์„œ๊ฐ€ ๋‹ค๋ฅธ ํ™œ๋™์— ์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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 picked = UO.DragItem("loot", 0);
        if (Truth(picked == 0))
        {
            UO.Print("Item was not picked up");
        }
        else
        {
            var ok = UO.DropItem("backpack", -1, -1, 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;
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.DragItem(objID, count) โ€” UO.DragItem(Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "dragitem": return new InjectionValue(bridge.DragItem(Arg(0), Arg(1)));

UO.Drop

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

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

int UO.Drop(object? @object);
int UO.Drop(object? @object, object? count);
int UO.Drop(object? @object, object? count, object? destination);
dynamic UO.Drop(object? objID, object? count, object? x, object? y, object? z);

๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์ •๋œ ์•„์ดํ…œ์„ ์บ๋ฆญํ„ฐ ์•„๋ž˜์˜ ์ง€๋ฉด์œผ๋กœ ์™„์ „ํžˆ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

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

  • object โ€” ํŠน์ • ํ•ญ๋ชฉ/๋ฌธ์ž์˜ ์ผ๋ จ๋ฒˆํ˜ธ: ์ˆซ์ž, 16์ง„์ˆ˜/10์ง„์ˆ˜ ๋ฌธ์ž์—ด, self/backpack/lasttarget/lastobject/lastcontainer/lastcorpse/finditem/laststatus ๋˜๋Š” ์ €์žฅ๋œ ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ type์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐœ์ฒด๋ฅผ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—… ์ „์— Exists๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • objID โ€” ํŠน์ • ํ•ญ๋ชฉ/๋ฌธ์ž์˜ ์ผ๋ จ๋ฒˆํ˜ธ: ์ˆซ์ž, 16์ง„์ˆ˜/10์ง„์ˆ˜ ๋ฌธ์ž์—ด, self/backpack/lasttarget/lastobject/lastcontainer/lastcorpse/finditem/laststatus ๋˜๋Š” ์ €์žฅ๋œ ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ type์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐœ์ฒด๋ฅผ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—… ์ „์— Exists๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • count โ€” ํ•œ ์Šคํƒ ์•ˆ์— ์žˆ๋Š” ๋‹จ์œ„ ์ˆ˜์ž…๋‹ˆ๋‹ค. 0 ๋˜๋Š” ์Œ์ˆ˜ ๊ฐ’์€ ์ „์ฒด ์Šคํƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ธ์ •์ ์ธ ๊ฒƒ์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ˆ˜๋Ÿ‰์— ์˜ํ•ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. MassMove๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒƒ์€ ์Šคํƒ ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์…€ ์ˆ˜ ์—†๋Š” ์งง์€ ํ˜•์‹์€ 0์ž…๋‹ˆ๋‹ค.
  • destination - ์„ธ ๊ฐœ์˜ ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ๋งŒ ์‚ฌ์šฉ: ์ปจํ…Œ์ด๋„ˆ์˜ ์ผ๋ จ๋ฒˆํ˜ธ ๋˜๋Š” ์„ธํŠธ ์ด๋ฆ„ AddObject; backpack/self/my ๋ฐฐ๋‚ญ์„ ์„ ํƒํ•˜๊ณ , receiving/catchbag - SetCatchBag๋ฅผ ์„ ํƒํ•˜๊ณ , ๋ฐฐ๋‚ญ์ด ์—†์œผ๋ฉด ๋ฐฐ๋‚ญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. lastcontainer/lastobject/lasttarget/lastcorpse/finditem/laststatus๋Š” ์˜ฌ๋ฐ”๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋กœ ํ™•์ธ๋˜๋ฉด ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ground ๋˜๋Š” 0๋Š” ํ† ์ง€๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. -1โ€”๋™์ผํ•œ ๋ฐฐ๋‚ญ ์„ ํƒ๊ธฐ. ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ง€์ •๋˜์ง€ ์•Š์€ ์ด๋ฆ„์œผ๋กœ ์ธํ•ด ํ•ญ๋ชฉ์ด ์บก์ฒ˜๋˜๊ธฐ ์ „์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ชฉ์ ์ง€ ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ๋ฐฐ๋‚ญ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • x - 5๊ฐœ์˜ ์ธ์ˆ˜ ํ˜•์‹์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค: ์„ธ๊ณ„ X ์ง€๊ตฌ์ƒ์˜ ๋ชฉ์ ์ง€.
  • y โ€” 5๊ฐœ ์ธ์ˆ˜ ํ˜•์‹์˜ ๊ฒฝ์šฐ World Y์ž…๋‹ˆ๋‹ค.
  • z โ€” 5๊ฐœ ์ธ์ˆ˜ ํ˜•์‹์˜ ํ‘œ์ค€ ๋†’์ด์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int 1โ€”ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „์ฒด ์ „์†ก ์š”์ฒญ์„ ์ˆ˜๋ฝํ–ˆ์Šต๋‹ˆ๋‹ค. 0 - ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. 5๊ฐœ ์ธ์ˆ˜ ํ˜ธํ™˜ ํ˜•์‹์—๋Š” object?๋ผ๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” int 1/0๋„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ด์ „์— ์ˆ˜ํ–‰ํ•œ DragItem์˜ ์žฌ์„ค์ •์ด ์•„๋‹™๋‹ˆ๋‹ค. DropItem๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

๋™์ž‘

  • 1, 2, 3 ๋ฐ 5 ์ธ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ์–‘์‹์ด ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ 4๊ฐœ ์žˆ๋Š” ํ˜•์‹์€ ์—†์Šต๋‹ˆ๋‹ค.
  • Drop(item)์€ ์ „์ฒด ์Šคํƒ์„ ๊ทธ ์•„๋ž˜์˜ ๋•…์œผ๋กœ ์˜ฎ๊น๋‹ˆ๋‹ค. Drop(item,count)๋Š” ๋‹จ์œ„๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. Drop(item,count,destination) ์€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Drop(item,count,X,Y,Z)๋Š” ํ•ญ์ƒ ํ† ์ง€๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€ํ”„ ์ขŒํ‘œ๊ฐ€ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ์šฐ MoveItem๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๋ฆฌํ”„ํŒ…, DropCheckCoord ๋ฐ ์„œ๋ฒ„ ์ ๊ฒ€ ์ œํ•œ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํŒ€์—์„œ๋Š” ๋ณ„๋„์˜ ๋ฐฐ์†ก ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ „์ฒด ์Šคํƒ์ด ๋‹น์‹ ์˜ ๋ฐœ ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • object=AddObject๋ฅผ ํ†ตํ•œ ์ „๋ฆฌํ’ˆ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐœ์ˆ˜=0.
  • ๋ชฉ์ ์ง€ - ์บ๋ฆญํ„ฐ๊ฐ€ ํ˜„์žฌ ์ง€์ƒ์— ์žˆ๋Š” ์ง€์ ์ž…๋‹ˆ๋‹ค.
var ok = UO.Drop("loot");

2. ๋ฐฐ๋‚ญ์— 5๊ฐœ ์œ ๋‹› - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • count=5 ํ•œ ์Šคํƒ์˜ ๋‹จ์œ„; ๋ชฉ์ ์ง€=backpack.
  • ์—ฌ๊ธฐ์„œ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” X๊ฐ€ ์•„๋‹Œ ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var ok = UO.Drop("loot", 5, "backpack");
    return null;
}

3. ์ง€์ƒ์˜ ๋ช…์‹œ์  ์ง€์  - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • ObjID๋ฅผ serial๋กœ ๋ฐ”๊พธ์„ธ์š”. Count=0 ์ „์ฒด ์Šคํƒ; X/Y/Z=1445/1690/0.
  • ์ด ํ˜•์‹์˜ ๊ฒฝ์šฐ ์„ธ ๋ฒˆ์งธ ๊ฐ’์€ X์ž…๋‹ˆ๋‹ค. ์˜ˆ๋น„ Drag๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 ok = UO.Drop(0x40001234, 0, 1445, 1690, 0);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.Drop(object) โ€” UO.Drop(Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "drop":

                    if (arguments.Length > 0)

                        return new InjectionValue(MoveItem(arguments[0], arguments.Length > 1 ? arguments[1] : InjectionValue.Zero, arguments.Length > 2 ? arguments[2] : new InjectionValue("ground")));

                    return InjectionValue.False;

UO.Drop(object, count) โ€” UO.Drop(Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "drop":

                    if (arguments.Length > 0)

                        return new InjectionValue(MoveItem(arguments[0], arguments.Length > 1 ? arguments[1] : InjectionValue.Zero, arguments.Length > 2 ? arguments[2] : new InjectionValue("ground")));

                    return InjectionValue.False;

UO.Drop(object, count, destination) โ€” UO.Drop(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: object (Any), count (Any), destination (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "drop":

                    if (arguments.Length > 0)

                        return new InjectionValue(MoveItem(arguments[0], arguments.Length > 1 ? arguments[1] : InjectionValue.Zero, arguments.Length > 2 ? arguments[2] : new InjectionValue("ground")));

                    return InjectionValue.False;

UO.Drop(objID, count, x, y, z) โ€” UO.Drop(Any,Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "drop": return new InjectionValue(MoveItemChecked(Arg(0), Arg(1), 0, Arg(2), Arg(3), Arg(4)) ? 1 : 0);

UO.DropCheckCoord

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

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

dynamic UO.DropCheckCoord();
dynamic UO.DropCheckCoord(object? value);

์•„์ดํ…œ์„ ๋•…์— ๋–จ์–ด๋œจ๋ฆด ๋•Œ ์ขŒํ‘œ ๋ฒ”์œ„ ํ™•์ธ์„ ์ฝ๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

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

  • value โ€” ์„ ํƒ ๊ฐ’: 0 ๋น„ํ™œ์„ฑํ™”, 0์ด ์•„๋‹Œ int ํ™œ์„ฑํ™”. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ์ƒํƒœ๋Š” ์ฝ๊ธฐ๋งŒ ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int 0/1 โ€” ๊ฐ€๋Šฅํ•œ ๋…นํ™” ํ›„ ํ˜„์žฌ ์ƒํƒœ; ๋‘ ํ˜•์‹ ๋ชจ๋‘ ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • MoveItemChecked ์ง€๋ฉด์— ํ• ๋‹น๋˜๊ณ  ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ผœ์ง€๋ฉด ์บ๋ฆญํ„ฐ๋กœ๋ถ€ํ„ฐ 2 ์…€๋ณด๋‹ค ํฐ ์ฒด๋น„์‡ผํ”„ X/Y ๊ฑฐ๋ฆฌ๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ํ™•์ธ์€ ์ขŒํ‘œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„ ์ „์†ก ๊ถŒํ•œ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ํ• ๋‹น์€ ์ด ํ”Œ๋ž˜๊ทธ๋กœ ์ œํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ํ”Œ๋ž˜๊ทธ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ฝ๊ธฐ๋Š” ํ˜„์žฌ ํ‘œ์ค€ํ™”๋œ ์„ค์ •์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
var enabled = UO.DropCheckCoord();
UO.Print(Convert.ToString(enabled));

2. ๋ฒ”์œ„ ๋ณดํ˜ธ ํ™œ์„ฑํ™” - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • MoveItemChecked๋ฅผ ํ†ตํ•œ ์ง€์ƒ ์ด๋™์€ ์ด์ œ ๋‘ ๊ฐœ์˜ ์‚ฌ๊ฐํ˜•์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var enabled = UO.DropCheckCoord(1);
    UO.Print(Convert.ToString(enabled));
    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()
    {
        var old = UO.DropCheckCoord();
        var temporary = UO.DropCheckCoord(0);
        var restored = UO.DropCheckCoord(old);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.DropCheckCoord() โ€” UO.DropCheckCoord()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "dropcheckcoord":

                    if (arguments.Length > 0) state.DropCheckCoord = Arg(0) != 0 ? 1 : 0;

                    return new InjectionValue(state.DropCheckCoord);

UO.DropCheckCoord(value) โ€” UO.DropCheckCoord(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "dropcheckcoord":

                    if (arguments.Length > 0) state.DropCheckCoord = Arg(0) != 0 ? 1 : 0;

                    return new InjectionValue(state.DropCheckCoord);

UO.DropDelay

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

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

dynamic UO.DropDelay();
dynamic UO.DropDelay(object? value);

์•„์ดํ…œ ์ „์†ก์— ์‚ฌ์šฉ๋˜๋Š” GrabDelay ๋Ÿฐํƒ€์ž„ ์ง€์—ฐ์„ ์ฝ๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

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

  • value โ€” ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„์˜ ์„ ํƒ์  ์ง€์—ฐ; ํ•œ๊ณ„๋ฅผ 50..10000๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์ธ์ˆ˜ int๊ฐ€ ์—†๊ณ  ํ˜„์žฌ GrabDelay๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ์–‘์‹ ๋ชจ๋‘์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— object?๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ ํ•ญ๋ชฉ ์–‘์‹์€ null๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • SetDropDelay ๋ฐ GetDropDelay๋Š” ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. GrabDelay. ์ด ์„ค์ •์€ ์„œ๋ฒ„์—์„œ ์ „์†ก ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜๋Š” ๋Œ€์‹  ํด๋ผ์ด์–ธํŠธ ์ „์†ก ์ง€์—ฐ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์ฝ๊ธฐ๋Š” ๋ฐ€๋ฆฌ์ดˆ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
var ms = UO.DropDelay();
UO.Print(Convert.ToString(ms));

2. ์ง€์—ฐ ์„ค์ • - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ํ•ญ๋ชฉ์€ 250 ms๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.DropDelay(250);
    return null;
}

3. ํ…Œ๋‘๋ฆฌ ํ•˜๋‹จ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • 0์€ 50 ms๋กœ ์ œํ•œ๋˜๋ฉฐ, ์ดํ›„์—๋Š” ์ด์ „ ๊ฐ’์œผ๋กœ ๋ณต์›๋ฉ๋‹ˆ๋‹ค.
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 previous = UO.DropDelay();
        UO.DropDelay(0);
        UO.Print(Convert.ToString(UO.DropDelay()));
        UO.DropDelay(previous);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.DropDelay() โ€” UO.DropDelay()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "dropdelay":

                    if (arguments.Length > 0) { bridge.SetDropDelay(Arg(0)); return InjectionValue.Unit; }

                    return new InjectionValue(bridge.GetDropDelay());

UO.DropDelay(value) โ€” UO.DropDelay(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "dropdelay":

                    if (arguments.Length > 0) { bridge.SetDropDelay(Arg(0)); return InjectionValue.Unit; }

                    return new InjectionValue(bridge.GetDropDelay());

UO.DropHere

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

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

int UO.DropHere(object? @object);

์ง€์ •๋œ ์•„์ดํ…œ/์Šคํƒ ์ „์ฒด๋ฅผ ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ์ง€์ ์— ์žˆ๋Š” ์ง€๋ฉด์œผ๋กœ ์˜ฎ๊น๋‹ˆ๋‹ค.

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

  • object โ€” ํŠน์ • ํ•ญ๋ชฉ/๋ฌธ์ž์˜ ์ผ๋ จ๋ฒˆํ˜ธ: ์ˆซ์ž, 16์ง„์ˆ˜/10์ง„์ˆ˜ ๋ฌธ์ž์—ด, self/backpack/lasttarget/lastobject/lastcontainer/lastcorpse/finditem/laststatus ๋˜๋Š” ์ €์žฅ๋œ ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ type์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐœ์ฒด๋ฅผ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—… ์ „์— Exists๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๋ฐ˜ํ™˜๊ฐ’

int 1 โ€” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „์†ก ์š”์ฒญ์„ ์ˆ˜๋ฝํ–ˆ์Šต๋‹ˆ๋‹ค. 0 - ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Š” serial์ด๋‚˜ ์„œ๋ฒ„ ํ™•์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค.

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

๋™์ž‘

  • ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ์ธ์ˆ˜๋กœ ์–‘์‹์ด ๋“ฑ๋ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ์˜ ์ผ๋ถ€์—๋Š” Drop(item,count) ๋˜๋Š” MoveItem๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • X/Y/Z๋Š” ์ฑŒ๋ฆฐ์ง€ ์ค‘์— ์บ๋ฆญํ„ฐ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์‚ฌ์ „ DragItem๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์•Œ๋ ค์ง„ ํ•ญ๋ชฉ ๋˜์ง€๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • object - serial, ์‹ค์ œ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.
  • ์ „์ฒด ์Šคํƒ์ด ์บ๋ฆญํ„ฐ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
var ok = UO.DropHere(0x40001234);

2. ์ €์žฅ๋œ ์ด๋ฆ„ ์‚ฌ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ „๋ฆฌํ’ˆ์€ AddObject๋ฅผ ํ†ตํ•ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค.
  • Exists๋Š” ์„œ๋ฒ„ ๊ถŒํ•œ๋ณด๋‹ค๋Š” ๊ฐ€์šฉ์„ฑ์„ ํ™•์ธํ•˜์—ฌ ์ด์ „ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("loot")))
    {
        var ok = UO.DropHere("loot");
    }

    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. ํด๋ผ์ด์–ธํŠธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ok โ€” int 1/0.
  • ์„œ๋ฒ„ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ์•„์ดํ…œ์˜ ์œ„์น˜์™€ ์šฉ๊ธฐ๋ฅผ ๋ณ„๋„๋กœ ํ™•์ธํ•˜์„ธ์š”.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var ok = UO.DropHere("loot");
        if (Truth(ok == 0))
        {
            UO.Print("Drop request was not accepted");
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.DropHere(object) โ€” UO.DropHere(Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "drophere":

                    if (arguments.Length > 0)

                        return new InjectionValue(MoveItem(arguments[0], arguments.Length > 1 ? arguments[1] : InjectionValue.Zero, new InjectionValue("ground"), new InjectionValue(GetX()), new InjectionValue(GetY()), new InjectionValue(GetZ())));

                    return InjectionValue.False;

UO.DropItem

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

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

dynamic UO.DropItem(object? moveIntoID, object? x, object? y, object? z);

๋™์ผํ•œ ๋Ÿฐํƒ€์ž„์—์„œ ์ด์ „์— Drag/DragItem๋กœ ์„ ํƒํ•œ ํ•ญ๋ชฉ์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

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

  • moveIntoID โ€” ์ง๋ ฌ ๋Œ€์ƒ, backpack ๋˜๋Š” ์„ธํŠธ ์ด๋ฆ„ AddObject. ์ˆซ์ž 0๋Š” ์ง€๊ตฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. self ๋Œ€์‹  backpack ์‚ฌ์šฉ: ์ด ํ•˜์œ„ ์ˆ˜์ค€ ์ธ์ˆ˜๋Š” self๋ฅผ ์บ๋ฆญํ„ฐ์˜ serial๋กœ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค.
  • x โ€” ์šฉ๊ธฐ์˜ ๊ฒฝ์šฐ โ€” ๊ฒ€ํ”„ ์•ˆ์— ๋„ฃ์Šต๋‹ˆ๋‹ค(-1/65535 ์ž๋™). ์ง€๊ตฌ๋ฅผ ์œ„ํ•ด - ์„ธ๊ณ„ X.
  • y โ€” ์šฉ๊ธฐ์˜ ๊ฒฝ์šฐ โ€” ๊ฒ€ํ”„ ์•ˆ์— ๋„ฃ์Šต๋‹ˆ๋‹ค(-1/65535 ์ž๋™). ์ง€๊ตฌ๋ฅผ ์œ„ํ•ด - ์„ธ๊ณ„ Y.
  • z โ€” ๋†’์ด ์žฌ์„ค์ •; ์ปจํ…Œ์ด๋„ˆ์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ 0, ์ง€์ƒ์—์„œ๋Š” ์‹ค์ œ Z ์ง€์ ์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int 1 - ์žฌ์„ค์ •์ด ์ „์†ก๋˜์—ˆ์œผ๋ฉฐ ์ปค์„œ๊ฐ€ ์‚ญ์ œ๋จ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. 0 - ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. DragItem, ์ปค์„œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๊ฑฐ๋‚˜ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ํ• ๋‹น์ด ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ object? ํ˜ธํ™˜์„ฑ์€ ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆ˜๋Ÿ‰๋„ ์•„๋‹ˆ๊ณ  serial๋„ ์•„๋‹™๋‹ˆ๋‹ค.

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

๋™์ž‘

  • ๋„ค ๊ฐ€์ง€ ์ธ์ˆ˜๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์€ ํ•ญ๋ชฉ์„ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Drop ๋ฐ MoveItem๋Š” serial๋ฅผ ์™„์ „ํžˆ ์ด์›”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์ด๋ฒˆ ๋Ÿฐํƒ€์ž„์— ๊ธฐ์–ต๋œ ํ•ญ๋ชฉ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๊ฐ€์ ธ๊ฐ€๊ฑฐ๋‚˜ ์†์œผ๋กœ ๊ฐ€์ ธ๊ฐ„ ๋ฌผ๊ฑด์„ ์‹ค์ˆ˜๋กœ ๋–จ์–ด๋œจ๋ฆฌ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
  • ์ „์†ก ํ›„์—๋Š” ์บก์ฒ˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค. GrabDelay๋ฅผ ์„ค์ •ํ•˜๋ฉด ์Šคํฌ๋ฆฝํŠธ ํ๋ฆ„์— ์ผ์‹œ ์ค‘์ง€๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋‚ฉ ํ›„ ์„œ๋ฒ„ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.DropItem("backpack", -1, -1, 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ์ž๋™ ๋ฐฐ๋‚ญ ๊ณต๊ฐ„ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • MoveIntoID=backpack, X/Y=-1, Z=0.
  • ์„ฑ๊ณต์ ์ธ ์บก์ฒ˜๋Š” ๋ฆด๋ฆฌ์Šค ์ „์— ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
if (Truth(UO.DragItem("loot", 0)))
{
    var ok = UO.DropItem("backpack", -1, -1, 0);
}

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

2. ๊ฐ€์Šด ์•ˆ์ชฝ ๊ณต๊ฐ„ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๊ฐ€์Šด์€ AddObject๋ฅผ ํ†ตํ•ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค. X=60/Y=70 โ€” ๊ฒ€ํ”„์˜ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • amount=10๋Š” Drag์„ ์˜๋ฏธํ•˜๋ฉฐ, DropItem๋Š” ์ž์ฒด ์ˆ˜๋Ÿ‰์ด ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Drag("loot", 10)))
    {
        var ok = UO.DropItem("chest", 60, 70, 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. ์บ๋ฆญํ„ฐ ์•„๋ž˜ ๋ฐ”๋‹ฅ์— ๋†“๊ธฐ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • MoveIntoID=0 ํ† ์ง€๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • 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()
    {
        var x = UO.GetX();
        var y = UO.GetY();
        var z = UO.GetZ();
        if (Truth(UO.DragItem("loot", 0)))
        {
            var ok = UO.DropItem(0, x, y, z);
        }

        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.DropItem(moveIntoID, x, y, z) โ€” UO.DropItem(Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "dropitem": return new InjectionValue(bridge.DropDraggedItem(Arg(0), Arg(1), Arg(2), Arg(3)));

UO.Dye

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

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

void UO.Dye(object? dyeObject);
void UO.Dye(object? dyeObject, object? target);

์ „์†ก๋œ ์ปฌ๋Ÿฌ๋ง ์•„์ดํ…œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” UO.Wait-target ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

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

  • dyeObject โ€” self/backpack/lasttarget/์ €์žฅ๋œ ๊ฐ์ฒด์˜ ๊ฐ์ฒด ์ผ๋ จ๋ฒˆํ˜ธ ๋˜๋Š” ์ง€์›๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ˆซ์ž ๋ฌธ์ž์—ด๊ณผ 0x ๋ฌธ์ž์—ด์€ ๋Ÿฐํƒ€์ž„์— ์˜ํ•ด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  • target - ์„ ํƒ์  ๊ฐœ์ฒด/serial ๋‹ค์Œ ๋Œ€์ƒ. ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ์ƒˆ ๋ชฉํ‘œ๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜ ํ˜•์‹์€ ๋จผ์ € WaitTargetObject(target)์„ ํ˜ธ์ถœํ•œ ๋‹ค์Œ UseObject(dyeObject)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์ธ์ˆ˜ ํ˜•์‹์€ ์ฃผ์–ด๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์กฐ์น˜๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒ‰์ƒ, ์ƒ‰์ƒ๊ถŒ, ํ•ฉ๊ณ„๋Š” ์„œ๋ฒ„์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.Dye");
UO.Dye(UO.LastObject());

1. ์—ผ์ƒ‰ ์•„์ดํ…œ ์‚ฌ์šฉ - ๋‹ค์ด๋ ‰ํŠธ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋‹จ์ผ ์ธ์ˆ˜ ํ˜ธ์ถœ์€ ๋Œ€์ƒ์„ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var dye = UO.LastObject();
if (Truth(UO.Exists(dye)))
{
    UO.Dye(dye);
}

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

2. ์ƒ‰์ƒ์ด ์„ ํƒ๋œ ๋Œ€์ƒ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • Target๋Š” ์—ผ๋ฃŒ๋ฅผ ๋”๋ธ”ํด๋ฆญํ•˜๊ธฐ ์ „์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var dye = UO.LastObject();
    var target = UO.LastTarget();
    if (Truth(UO.Exists(dye)) && Truth(UO.Exists(target)))
    {
        UO.Dye(dye, target);
    }

    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()
    {
        if (Truth(UO.Exists("dye")) && Truth(UO.Exists("cloth")))
        {
            UO.Dye("dye", "cloth");
        }

        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.Dye(dyeObject) โ€” UO.Dye(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "dye":

                    if (arguments.Length > 1) bridge.WaitTargetObject(Arg(1));

                    bridge.UseObject(Arg(0, bridge.GetLastObject()));

                    break;

UO.Dye(dyeObject, target) โ€” UO.Dye(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "dye":

                    if (arguments.Length > 1) bridge.WaitTargetObject(Arg(1));

                    bridge.UseObject(Arg(0, bridge.GetLastObject()));

                    break;

UO.EasyObject

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

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

void UO.EasyObject(object? name);
void UO.EasyObject(object? name, object? @object);

๋Œ€ํ™”ํ˜• ๋Œ€์ƒ ์ฟผ๋ฆฌ ์—†์ด ๊ฐœ์ฒด ์ด๋ฆ„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

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

  • name โ€” string๋กœ ํ™•์ธ๋˜๋Š” ๋Ÿฐํƒ€์ž„ ๊ฐœ์ฒด ํ•ญ๋ชฉ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • object - ์„ ํƒ์‚ฌํ•ญ serial/๋งํฌ. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด GetLastObject๊ฐ€ ๋ณด์กด๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • State.Objects.Set๋Š” ์ด๋ฆ„ ํ•ญ๋ชฉ์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์ธ์ˆ˜ ํ˜•์‹์€ LastTarget ๋Œ€์‹  ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉ๋œ ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถ„๊ธฐ์—์„œ๋Š” ์„ธ๊ณ„์— ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ๋ณ„๋„๋กœ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.EasyObject");
UO.EasyObject("last-used");

1. ๋งˆ์ง€๋ง‰ ๊ฐœ์ฒด ์ €์žฅ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ด๋ฆ„์€ ํ˜„์žฌ LastObject์— ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.
UO.EasyObject("last-used");

2. ์ž์‹ ์„ ๊ตฌํ•˜์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜ ํ˜•์‹์€ ์ „๋‹ฌ๋œ serial๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.EasyObject("me", UO.Self());
    return null;
}

3. ์ž„์‹œ ํ•ญ๋ชฉ ์‚ญ์ œ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • Forget๋Š” ์ €์žฅ๋œ ์ด๋ฆ„ ์—ฐ๊ด€๋งŒ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
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.EasyObject("temporary", UO.Self());
        UO.Forget("temporary");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "easyobject":

                    if (arguments.Length > 1) state.Objects.Set(Text(0), Arg(1));

                    else if (arguments.Length > 0) state.Objects.Set(Text(0), bridge.GetLastObject());

                    break;

UO.EasyObject(name, object) โ€” UO.EasyObject(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "easyobject":

                    if (arguments.Length > 1) state.Objects.Set(Text(0), Arg(1));

                    else if (arguments.Length > 0) state.Objects.Set(Text(0), bridge.GetLastObject());

                    break;

UO.EmptyContainer

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

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

int UO.EmptyContainer(object? delay);
int UO.EmptyContainer(object? delay, object? source);
int UO.EmptyContainer(object? delay, object? source, object? destination);

์ƒ์ž, ๊ฐ€๋ฐฉ, ์‹œ์ฒด ๋“ฑ์˜ ์ง์ ‘์ ์ธ ๋‚ด์šฉ๋ฌผ์„ ๋ชจ๋‘ ์ง€์ •๋œ ์šฉ๊ธฐ๋กœ ์˜ฎ๊น๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ•ญ์ƒ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„์˜ ์ง€์—ฐ์ž…๋‹ˆ๋‹ค. ์†Œ์Šค๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์œผ๋ฉด ๋กœ์ปฌ ๋ฒ”์œ„๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ชฉ์ ์ง€๋Š” ํ˜„์žฌ ์บ๋ฆญํ„ฐ์˜ ๋ฐฐ๋‚ญ์ž…๋‹ˆ๋‹ค.

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

  • delay โ€” ์ฒซ ๋ฒˆ์งธ ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜: ์ „์†ก ๊ฐ„ ์ง€์—ฐ(๋ฐ€๋ฆฌ์ดˆ). ์˜ˆ๋ฅผ ๋“ค์–ด 350 - 0,35 ์ดˆ์ž…๋‹ˆ๋‹ค. ์ •์ˆ˜ ๊ฐ’์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ถ€์ •์ ์ธ ๊ฒƒ์€ 0๋กœ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. GrabDelay๋Š” ์ด ์ง€์—ฐ์— ๋ณ„๋„๋กœ ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ค„์ด ๋งˆ์ง€๋ง‰ ์š”์ฒญ์„ ๋”ฐ๋ผ์žก์ง€ ์•Š๋„๋ก ๋งˆ์ง€๋ง‰ ์ผ์‹œ ์ค‘์ง€๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • source โ€” ๋‘ ๋ฒˆ์งธ ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜: ์†Œ์Šค ์ปจํ…Œ์ด๋„ˆ์˜ serial, ์ˆซ์ž/16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ์ €์žฅ๋œ ๊ฐœ์ฒด ์ด๋ฆ„. lastobject, lastcontainer, lasttarget, lastcorpse, backpack/my๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๊ฑฐ๋‚˜ 0์™€ ๊ฐ™์œผ๋ฉด ์‹ญ์ž์„ ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์•„์ดํ…œ์ด๋‚˜ ์‹œ์ฒด๋ฅผ ์„ ํƒํ•˜์„ธ์š”. Esc๋Š” ์ž‘์—…์„ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค.
  • destination - ์„ธ ๋ฒˆ์งธ ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” serial ๋˜๋Š” ๋Œ€์ƒ ์ปจํ…Œ์ด๋„ˆ์˜ ์ €์žฅ๋œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. backpack/self/my ์บ๋ฆญํ„ฐ์˜ ๋ฐฐ๋‚ญ์„ ์„ ํƒํ•˜์„ธ์š”. receiving/catchbag ์„ค์น˜๋œ SetCatchBag ์ปจํ…Œ์ด๋„ˆ(๋˜๋Š” ์„ค์น˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฐฐ๋‚ญ)๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. lastcontainer/lastobject/lasttarget/lastcorpse/finditem/laststatus๋Š” ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•œ ์ปจํ…Œ์ด๋„ˆ๋กœ ํ™•์ธ๋˜๋Š” ๊ฒฝ์šฐ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์„ค์ •๋˜์ง€ ์•Š์€ ๋ณ„์นญ์œผ๋กœ ์ธํ•ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์œผ๋ฉด ๋ฐฐ๋‚ญ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. receiving ์ปจํ…Œ์ด๋„ˆ ์„ค์ •์€ ์ด ์„ ํƒ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ ์†Œ์Šค์™€ ๋‹ฌ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค. Ground/0๋Š” ์—ฌ๊ธฐ์„œ ์œ ํšจํ•œ ๋Œ€์ƒ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int: 1 ์†Œ์Šค๊ฐ€ ๋น„์–ด ์žˆ์ง€ ์•Š์•˜๊ณ  ์„ ํƒํ•œ ๊ฐ ์ง์ ‘ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์ „์†ก ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ; 0 ์†Œ์Šค๊ฐ€ ๋น„์–ด ์žˆ๊ฑฐ๋‚˜, ๋ฒ”์œ„๊ฐ€ ์ทจ์†Œ๋˜์—ˆ๊ฑฐ๋‚˜, ๋Œ€์ƒ์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š๊ฑฐ๋‚˜, ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜์—ˆ๊ฑฐ๋‚˜, ๋ถ€๋ถ„/์ „์ฒด ์ „์†ก ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์˜ ๊ฒฐ๊ณผ์ด์ง€ ์„œ๋ฒ„์—์„œ ๋น„์›€์„ ํ™•์ธํ–ˆ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ •ํ™•ํ•œ ํ˜•์‹: EmptyContainer(์ง€์—ฐ), EmptyContainer(์ง€์—ฐ, ์†Œ์Šค), EmptyContainer(์ง€์—ฐ, ์†Œ์Šค, ๋Œ€์ƒ). ํ‘œ์ค€ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ์ž„ ์ฑ„ํŒ…: ,emptycontainer 350; ์Šคํฌ๋ฆฝํŠธ์—์„œ: UO.EmptyContainer(350).
  • ์กฐ์ค€ ์‹œ ๋ช…๋ น์€ ์„ ํƒ, ์ทจ์†Œ ๋˜๋Š” ๋น„์ƒ ์ •์ง€๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ๊ณ„์†ํ•ด์„œ ์ด๋ฏธ์ง€์™€ ๋„คํŠธ์›Œํฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. Esc๋Š” ์บ๋ฆฌ๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ์ด์ „ ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ 0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์กฐ์ค€๊ฒฝ์ด ์ด ์„ ํƒ ์‚ฌํ•ญ์„ ๋Œ€์ฒดํ•˜๋Š” ๊ฒฝ์šฐ ์ž‘์—…๋„ ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค.
  • ์ฝ˜ํ…์ธ ๊ฐ€ ์•„์ง ๋‹ค์šด๋กœ๋“œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ๋Š” ์†Œ์Šค๋ฅผ ์—ด๊ณ  ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•  ๋•Œ๊นŒ์ง€ 3000 ms๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์—์„œ ์ˆจ๊ฒจ์ง„ ์ฝ˜ํ…์ธ ๋Š” ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์ง€ ์•Š์œผ๋ฉด ์ „์†กํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ƒ์ž๊ฐ€ ๋„ˆ๋ฌด ๋ฉ€๊ฑฐ๋‚˜ ์„œ๋ฒ„๊ฐ€ ๊ธˆ์ง€๋˜๋ฉด ๋‹ค๋ฅธ ์ƒ์ž๋ฅผ ์„ ํƒํ•˜๋Š” ๋Œ€์‹  ์‹คํŒจํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์€ ํ›„ ์ง์ ‘ ํ•ญ๋ชฉ ๋ชฉ๋ก์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์Šคํƒ์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์บก์ฒ˜ ๋ฐ ์žฌ์„ค์ • ์š”์ฒญ์„ ํ†ตํ•ด ์ „์ฒด์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋ฉ๋‹ˆ๋‹ค. ๋™๋ด‰๋œ ๊ฐ€๋ฐฉ์€ ์™„์ „ํžˆ ํœด๋Œ€๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๋‚ด์šฉ์€ ๋ณ„๋„๋กœ ๊ฒ€์ƒ‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์ถ”๊ฐ€๋œ ์ƒˆ ํ•ญ๋ชฉ์€ ํ˜„์žฌ ๋ชฉ๋ก์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฐ ์š”์ฒญ ์ „์— ํ•ด๋‹น ํ•ญ๋ชฉ์ด ์›๋ž˜ ์ปจํ…Œ์ด๋„ˆ์— ์•„์ง ์žˆ๋Š”์ง€ ๋‹ค์‹œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์ž์ฒด ๋˜๋Š” ์ž์ฒด ํ•˜์œ„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘์ฒฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ปค์„œ๊ฐ€ ๋‹ค๋ฅธ ํ•ญ๋ชฉ์— ์˜ํ•ด ์ ์œ ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ช…๋ น์€ ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ์ปค์„œ๋ฅผ ์žฌ์„ค์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ˆ„๋ฝ๋œ ๋ชฉ์ ์ง€ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ฐฐ๋‚ญ์œผ๋กœ ๋Œ€์ฒด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 1 ๊ฒฐ๊ณผ๋Š” ์„œ๋ฒ„๊ฐ€ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜๋ฝํ–ˆ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์„œ๋ฒ„๋ฅผ ์—…๋ฐ์ดํŠธํ•œ ํ›„ ๋‚ด์šฉ์„ ํ™•์ธํ•˜์„ธ์š”. ๋น„์ƒ ์ •์ง€๋Š” ๋Œ€๊ธฐ๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์ „์†ก๋œ ์ž‘์—…์€ ๋กค๋ฐฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์•Œ ์ˆ˜ ์—†๋Š” ์ €์žฅ๋œ ์ด๋ฆ„์ด๋‚˜ ์ž˜๋ชป๋œ ์ธ์ˆ˜ ํ˜•์‹์œผ๋กœ ์ธํ•ด 0 ๋ฐ˜ํ™˜์ด ์•„๋‹Œ API ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ ํšจํ•œ serial ๋ˆ„๋ฝ ๊ฐœ์ฒด์™€ ๊ตฌ๋ณ„ํ•˜์„ธ์š”. ์ด์— ๋Œ€ํ•ด ์ž‘์—…์€ 0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์กฐ์ค€๊ฒฝ์ด ์žˆ๋Š” ์ƒ์ž๋‚˜ ์‹œ์ฒด๋ฅผ ์„ ํƒํ•˜๊ณ  ๋ฐฐ๋‚ญ์œผ๋กœ ์˜ฎ๊น๋‹ˆ๋‹ค. - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์œ ์ผํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์ธ Delay=350๋Š” ๊ฐ„๊ฒฉ 350 ms๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Šค๊ฐ€ ๋ˆ„๋ฝ๋˜์–ด ์‹ญ์ž์„ ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
  • ๋ชฉ์ ์ง€๋„ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด์šฉ๋ฌผ์ด ์บ๋ฆญํ„ฐ์˜ ๋ฐฐ๋‚ญ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์•ˆ์— ์žˆ๋Š” ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์ด ์•„๋‹ˆ๋ผ ์šฉ๊ธฐ/์‹œ์ฒด ์ž์ฒด๋ฅผ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.
  • ์ „์†ก๋œ ๋‚ด์šฉ์€ 1 ๋˜๋Š” 0์„ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. 0์˜ ์˜๋ฏธ๋Š” ์ทจ์†Œ, ๊ณตํ—ˆํ•จ, ์‹คํŒจ๋ฅผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์žก์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
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;

2. ์œ ๋ช…ํ•œ ๊ฐ€์Šด๋ถ€ํ„ฐ ์Šค์ฝ”ํ”„ ์—†๋Š” ๋ฐฑํŒฉ๊นŒ์ง€ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ง€์—ฐ=350; ์†Œ์Šค๋Š” ๊ฐ€์Šด์˜ ์‹ค์ œ serial์ž…๋‹ˆ๋‹ค. ๋Œ€๋žต์ ์ธ ID๋ฅผ ๊ท€ํ•˜์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”. ๊ด‘๊ฒฝ์€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์„ธ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ง€์ •๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋Œ€์ƒ=backpack์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ง์ ‘ ์•„์ดํ…œ๊ณผ ํ’€ ์Šคํƒ์ด ์ด์›”์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • Print์—๋Š” ํ•ญ๋ชฉ ์ˆ˜๋‚˜ ์„œ๋ฒ„์˜ ํ™•์ธ์ด ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ์˜ ์ œ์ถœ ๊ฒฐ๊ณผ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var source = "0x40001234";
    var sent = UO.EmptyContainer(350, source);
    UO.Print("Client request result: " + Convert.ToString(sent));
    return null;
}

3. ์„ ํƒํ•œ ๋‘ ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์ด - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • AddObject ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜ ์žˆ์œผ๋ฉด ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  ํ•ด๋‹น ์ด๋ฆ„์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์„ ํƒ์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
  • ์œ  EmptyContainer delay=350; ์†Œ์Šค=source_bag; ๋ชฉ์ ์ง€=destination_bag. ์„ธ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ฐฐ๋‚ญ ๋Œ€์‹  ํŠน์ • ๊ฐ€๋ฐฉ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฆ„์€ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ทจ์†Œ๋œ AddObject๋Š” ์ด๋ฆ„์˜ ์ด์ „ ์˜๋ฏธ๋ฅผ ์ œ๊ฑฐํ•˜๋ฏ€๋กœ ์ด์ „ ๊ฐ€๋ฐฉ์ด ์‹ค์ˆ˜๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค.
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.Print("Select source");
        UO.AddObject("source_bag");
        UO.Print("Select destination");
        UO.AddObject("destination_bag");
        var sent = UO.EmptyContainer(350, "source_bag", "destination_bag");
        UO.Print("Client request result: " + Convert.ToString(sent));
        return null;
    }
}

4. ๋งˆ์ง€๋ง‰์œผ๋กœ ์—ด๋ฆฐ ์ปจํ…Œ์ด๋„ˆ๋ถ€ํ„ฐ ํŠน์ • ์ƒ์ž๊นŒ์ง€ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • Delay=500 โ€” 0.5์ดˆ ๊ฐ„๊ฒฉ. source=lastcontainer - ์ด ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๊ฐ€ ์—ฐ ๋งˆ์ง€๋ง‰ ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค.
  • ๋ชฉ์ ์ง€ - ๊ฐ€์Šด์˜ ๋ช…์‹œ์ ์ธ ID; ์˜ˆ๋ฅผ ๊ต์ฒดํ•˜์‹ญ์‹œ์˜ค. lastcontainer ๋ฐ lastobject๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ์—ด๋ฆฐ ์ปจํ…Œ์ด๋„ˆ์™€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉ๋œ ๊ฐœ์ฒด๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  • ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋งˆ์ง€๋ง‰์œผ๋กœ ์—ด์–ด๋ณธ ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•œ ์†Œ์Šค์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”. ์บ๋ฆฌ๋Š” ์ค‘์ฒฉ๋œ ๋ฐฑ์„ ์žฌ๊ท€์ ์œผ๋กœ ์—ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var destination = "0x40005678";
UO.EmptyContainer(500, "lastcontainer", destination);

5. ์†Œ์Šค๋ฅผ ๋ˆˆ์œผ๋กœ ์„ ํƒํ•˜๊ณ  ๋ชฉ์ ์ง€๋ฅผ ๋ฏธ๋ฆฌ ์ง€์ • - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ง€์—ฐ=350; source=0๋Š” ์„ธ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ๋ฒ”์œ„๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชฉ์ ์ง€=์ €์žฅ์†Œ๋Š” ์ด์ „์— ์ €์žฅ๋œ ์ƒ์ž๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ์†Œ์Šค๋ฅผ ์„ ํƒํ•˜๋ฉด ์ฝ˜ํ…์ธ ๊ฐ€ ํ•ด๋‹น ์†Œ์Šค๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
  • Esc๋Š” ๋ž˜ํ•‘ ์—†์ด sent=0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ์„ ํƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.AddObject("storage", "0x40005678");
    var sent = UO.EmptyContainer(350, 0, "storage");
    return null;
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.EmptyContainer(delay) โ€” UO.EmptyContainer(Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "emptycontainer": return ExecuteEmptyContainer(arguments);

UO.EmptyContainer(delay, source) โ€” UO.EmptyContainer(Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "emptycontainer": return ExecuteEmptyContainer(arguments);

UO.EmptyContainer(delay, source, destination) โ€” UO.EmptyContainer(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: delay (Any), source (Any), destination (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "emptycontainer": return ExecuteEmptyContainer(arguments);

UO.Exists

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

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

int UO.Exists(object? id);

ํด๋ผ์ด์–ธํŠธ์˜ ๋กœ์ปฌ ์„ธ๊ณ„์— ์‚ญ์ œ๋˜์ง€ ์•Š์€ ๊ฐœ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 1 - serial๋Š” ์ด์ œ ๋กœ๋“œ๋œ ํ•ญ๋ชฉ ๋˜๋Š” mobile๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. int 0 - ๊ฐœ์ฒด๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ ค์ง€์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜์—ˆ๊ฑฐ๋‚˜ ๋ณ„์นญ์ด ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ์ฒด์˜ ์กด์žฌ์— ๋Œ€ํ•œ ์„œ๋ฒ„ ์‘๋‹ต์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ€์‹œ ์˜์—ญ ์™ธ๋ถ€์˜ ํ•ญ๋ชฉ์ด ์„œ๋ฒ„์— ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— 0๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

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

๋™์ž‘

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

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

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

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

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

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

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

1. ๋ฐฐ๋‚ญ์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜ backpack๋Š” ์ž์‹ ์˜ ์บ๋ฆญํ„ฐ ๋ฐฐ๋‚ญ์˜ ๋ณ„์นญ serial์ž…๋‹ˆ๋‹ค.
  • 1๋Š” ๋ฐฑํŒฉ์˜ ๋‚ด์šฉ๋ฌผ์ด ์ด๋ฏธ ์™„์ „ํžˆ ์ˆ˜๋ น๋˜์—ˆ๊ฑฐ๋‚˜ ๊ฐœ๋ด‰๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
var present = UO.Exists("backpack");
if (Truth(present))
{
    UO.Print("Backpack is loaded");
}
else
{
    UO.Print("Backpack is unavailable");
}

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

2. ์ €์žฅ๋œ serial ๋‹ค์‹œ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • target์€ ํŠน์ • serial๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ฐ’ lasttarget์€ ์ด๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ์‹œ์ •์ง€ 500ms ์ดํ›„์—๋Š” ๊ฐ์ฒด๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฒ€์‚ฌ๊ฐ€ ๋‹ค์‹œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var target = UO.GetSerial("lasttarget");
    await Delay(500);
    if (Truth(UO.Exists(target)))
    {
        UO.Print(UO.GetName(target));
    }
    else
    {
        UO.Print("Saved target is no longer loaded");
    }

    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;

3. ID ํ˜•์‹๊ณผ ๊ฐ์ฒด ์กด์žฌ ๊ตฌ๋ณ„ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • GetSerial๋Š” ๊ฐœ์ฒด๊ฐ€ ์—†๋”๋ผ๋„ ์ˆซ์ž 1073746484๋ฅผ 0x40001234๋กœ ํ˜•์‹ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์Œ ํ™•์ธ์—์„œ๋งŒ ํ˜„์žฌ ๋กœ์ปฌ ์„ธ๊ณ„์— ์ด 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 serial = UO.GetSerial("1073746484");
        UO.Print("Serial: " + serial);
        var present = UO.Exists(serial);
        UO.Print("Present 1/0: " + Convert.ToString(present));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Exists(int id) => bridge.Exists(id);

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Exists(string id) => Exists(GetObject(id));

UO.Forget

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

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

void UO.Forget(object? name);

๋ฉ”์‹œ์ง€ ์—†์ด ๋Ÿฐํƒ€์ž„ ๊ฐœ์ฒด์—์„œ ์ €์žฅ๋œ ์ด๋ฆ„์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

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

  • name โ€” string๋กœ ๋ณ€ํ™˜๋˜๋Š” ํ•ญ๋ชฉ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋ถ„๊ธฐ๋Š” state.Objects.Remove๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. DeleteObject์™€ ๋‹ฌ๋ฆฌ ์ด ์–‘์‹์€ ํ™•์ธ์„ ์ธ์‡„ํ•˜๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ์ด๋ฆ„์„ ๋ณด๊ณ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์›”๋“œ ๊ฐœ์ฒด๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.Forget");
UO.Forget("temporary");

1. ์ž„์‹œ ์ด๋ฆ„ ์‚ญ์ œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • serial์™€์˜ ์ด๋ฆ„ ์—ฐ๊ฒฐ๋งŒ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
UO.EasyObject("temporary",UO.Self());
UO.Forget("temporary");

2. ์ด๋ฆ„ ๋ˆ„๋ฝ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋ฉ”์‹œ์ง€ ์—†์ด ๋ˆ„๋ฝ๋œ ์ด๋ฆ„์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Forget("missing-example-name");
    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()
    {
        var name = "temporary";
        UO.EasyObject(name, UO.Self());
        UO.Forget(name);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "forget": if (arguments.Length > 0) state.Objects.Remove(Text(0)); break;

UO.GetAltName

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

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

dynamic UO.GetAltName(object? objID);

ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์•Œ๋ ค์ง„ ์บ๋ฆญํ„ฐ์˜ ์งํ•จ(์˜ˆ: ์ด๋ฆ„ ๋’ค์˜ ์ง์—… ๋˜๋Š” ์„œ๋ช…)์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • objID โ€” ํ•„์ˆ˜ serial/ID ๊ฐ์ฒด. type๋„ ์•„๋‹ˆ๊ณ  cliloc๋„ ์•„๋‹™๋‹ˆ๋‹ค. int, 10์ง„์ˆ˜/16์ง„์ˆ˜ ๋ฌธ์ž์—ด, self, backpack, lasttarget, finditem ๋˜๋Š” ์ด๋ฆ„ AddObject๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. 0๋Š” ๊ฐœ์ฒด๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string โ€” ๋ชจ๋ฐ”์ผ์šฉ ์ œ๋ชฉ ํ•„๋“œ์˜ ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์ œ๋ชฉ์„ ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ๊ฐœ์ฒด๊ฐ€ ๋ฌธ์ž๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ID๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. serial, ์ „์ฒด ์ด๋ฆ„ ๋˜๋Š” ์†์„ฑ ๋ฐฐ์—ด์ด ์•„๋‹™๋‹ˆ๋‹ค. GetAltName์€ GetTitle์™€ ๋™์ผํ•œ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ํ˜ธ์ถœ ์ž์ฒด๋Š” ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์„œ๋ฒ„๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์œผ๋ฉฐ ๋‹จ์ผ ํด๋ฆญ์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„/์งํ•จ์„ ์š”์ฒญํ•˜๋ ค๋ฉด ClickOnObject๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”. ์‘๋‹ต์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์˜ต๋‹ˆ๋‹ค.
  • ๊ธฐ์กด ๋ฌธ์ž์—๋Š” ๋นˆ ๋ฌธ์ž์—ด๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. Exists ๊ฒ€์‚ฌ๋Š” ๊ฐ์ฒด๊ฐ€ ๋กœ๋“œ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ผ๋Š” ๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์— ๋‹ตํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ตฌํ˜„์—์„œ๋Š” ๋Œ€์ฒด ์ด๋ฆ„์ด ์บ๋ฆญํ„ฐ์˜ ์ œ๋ชฉ ํ•„๋“œ์— ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ ์ด๋ฆ„ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ObjID=self โ€” ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ์˜ ๋ฌธ์ž์ž…๋‹ˆ๋‹ค.
  • ์ œ๋ชฉ์—๋Š” ์ œ๋ชฉ๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋นˆ ํ•„๋“œ๋Š” ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๋ฅผ โ€‹โ€‹์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var title = UO.GetAltName("self");
UO.Print(title);

2. ์„ ํƒํ•œ ์บ๋ฆญํ„ฐ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ObjID=id โ€” ๋งˆ์ง€๋ง‰ ๋Œ€์ƒ์˜ serial GetName์™€ ์ œ๋ชฉ์€ ๋”ฐ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ํ•ญ๋ชฉ ๋Œ€์ƒ์—๋Š” ์ œ๋ชฉ ํ•„๋“œ๊ฐ€ ์—†์œผ๋ฉฐ ๋นˆ ๋ฌธ์ž์—ด์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(id)))
    {
        var title = UO.GetAltName(id);
        if (Truth(title != ""))
        {
            UO.Print(UO.GetName(id) + " " + title);
        }
    }

    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. ์ฝ๊ธฐ ์ „์— ์ด๋ฆ„์„ ๋ฌป๋Š” ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • 350 โ€” ํ•œ ๋ฒˆ ํด๋ฆญํ•œ ํ›„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ผ์‹œ ์ค‘์ง€๋˜๋Š” ์˜ˆ; ์ด๋Š” getter ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„๊ฐ€ ๋‚˜์ค‘์— ์‘๋‹ตํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์†Œ์œ ๊ถŒ์„ ์ „์†กํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นˆ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
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.ClickOnObject(id);
            UO.Wait(350);
            UO.Print(UO.GetAltName(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.GetAltName(objID) โ€” UO.GetAltName(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getaltname": return new InjectionValue(bridge.GetAltName(Arg(0)));

UO.GetColor

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

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

string UO.GetColor();
string UO.GetColor(object? id);

hue ๊ฐœ์ฒด๋ฅผ ์ฝ๊ณ  16์ง„์ˆ˜ ๋ฌธ์ž์—ด๋กœ ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

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

  • id๋Š” graphic/type๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ์ฒด์˜ Serial/ID์ž…๋‹ˆ๋‹ค. ์ˆซ์ž, 16์ง„์ˆ˜ ๋ฌธ์ž์—ด, ํ‘œ์ค€ ์ด๋ฆ„ self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse ๋˜๋Š” ์ด๋ฆ„ AddObject. ๋ณ„์นญ์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์กด์žฌ ์—ฌ๋ถ€๋Š” Exists๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๋“ฑ๋ก ์–‘์‹์€ self์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string ํ˜•์‹ "0x0481" - ์ฝ”๋“œ hue/color, 0x ๋’ค์˜ 4์ž๋ฆฌ 16์ง„์ˆ˜. ๋ˆ„๋ฝ๋œ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ "0x0000"๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋„์ƒ‰๋˜์ง€ ์•Š์€ ํ•ญ๋ชฉ์—๋„ ๋™์ผํ•œ ์ฝ”๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ƒ‰์ƒ์ด graphic/type ๋˜๋Š” ๊ณ ์œ ํ•œ serial๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ํด๋ผ์ด์–ธํŠธ์— ์ด๋ฏธ ์•Œ๋ ค์ง„ ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ์š”์ฒญ์ด ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด์™€ ์•„์ง ๊ฒ€์ƒ‰๋˜์ง€ ์•Š์€ ์†์„ฑ์€ null/๋นˆ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Exists์™€ ํŠน์ • ๋™์ž‘์˜ ์กฐ๊ฑด์„ ํ™•์ธํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์˜ ์ƒ‰์ƒ ์•Œ์•„๋ณด๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • id=lastobject - ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉ๋œ ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ์ด๋ฏธ 16์ง„์ˆ˜ ๋ฌธ์ž์—ด์ด๋ฏ€๋กœ Int2Hex๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var hue = UO.GetColor("lastobject");
UO.Print(hue);

2. ๊ฐ™์€ ์ƒ‰์˜ ๋ฌผ์ฒด ์ฐพ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • type๊ณผ hue๋Š” ์ƒ˜ํ”Œ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํŠน์„ฑ์ž…๋‹ˆ๋‹ค. FindType๋Š” ๋‘ ๊ฐ€์ง€ 16์ง„์ˆ˜ ํ‘œํ˜„์„ ๋ชจ๋‘ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ์น˜ - serial ๋˜๋Š” ๋นˆ ๋ฌธ์ž์—ด์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ƒ‰์ƒ์€ type์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var sample = UO.GetSerial("lastobject");
    if (Truth(UO.Exists(sample)))
    {
        var type = UO.GetGraphic(sample);
        var hue = UO.GetColor(sample);
        var match = UO.FindType(type, hue, "backpack");
        UO.Print(match);
    }

    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. ๋น„๊ต๋ฅผ ์œ„ํ•ด hue๋ฅผ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • GetColor๋Š” self์„ ์ฝ์Šต๋‹ˆ๋‹ค. Hex2Int๋Š” 16์ง„์ˆ˜ ํ…์ŠคํŠธ๋ฅผ int๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • null hue ์ž์ฒด๋งŒ์œผ๋กœ๋Š” ์บ๋ฆญํ„ฐ๊ฐ€ ์„ธ๊ณ„์— ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
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 hue = UO.Hex2Int(UO.GetColor("self"));
        if (Truth(hue == 0))
        {
            UO.Print("Hue is zero");
        }

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

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string GetColor() => GetColor(new InjectionValue(bridge.Self));

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

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string GetColor(InjectionValue id) => NumberConversions.ToHex((short)bridge.GetColor(GetObject(id)));

UO.GetFlags

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

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

int UO.GetFlags(object? id);

์•Œ๋ ค์ง„ ๋กœ์ปฌ ๊ฐœ์ฒด์—์„œ Entity.Flags ๋น„ํŠธ๋งˆ์Šคํฌ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • id โ€” self/backpack/lasttarget/์ €์žฅ๋œ ๊ฐ์ฒด์˜ ๊ฐ์ฒด ์ผ๋ จ๋ฒˆํ˜ธ ๋˜๋Š” ์ง€์›๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ˆซ์ž ๋ฌธ์ž์—ด๊ณผ 0x ๋ฌธ์ž์—ด์€ ๋Ÿฐํƒ€์ž„์— ์˜ํ•ด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int - ์›๋ณธ Entity.Flags. ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ์—”ํ„ฐํ‹ฐ๊ฐ€ 0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋…ผ๋ฆฌ์  ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ ๋งˆ์Šคํฌ์ž…๋‹ˆ๋‹ค.

๋™์ž‘

  • GetObject๊ฐ€ ๋งํฌ๋ฅผ ํ™•์ธํ•œ ๋‹ค์Œ bridge.World.Get์ด ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์—์„œ Entity.Flags๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. null ๊ฐ’์€ ํ”Œ๋ž˜๊ทธ๋‚˜ ๋ชจ๋ธ์ด ์—†๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Exists๋Š” ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์Šค์Šค๋กœ ํ”Œ๋ž˜๊ทธ ์ง€์ • - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ˜„์žฌ ์บ๋ฆญํ„ฐ์˜ ๋งˆ์Šคํฌ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
var flags = UO.GetFlags("self");
UO.Print(Convert.ToString(flags));

2. ์•Œ๋ ค์ง„ ๋Œ€์ƒ ํ”Œ๋ž˜๊ทธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • Exists ํ…Œ์ŠคํŠธ๋Š” ๋ˆ„๋ฝ๋œ ๋ชจ๋ธ์„ ๊ตฌ๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.LastTarget();
    if (Truth(UO.Exists(id)))
    {
        var flags = UO.GetFlags(id);
        UO.Print(Convert.ToString(flags));
    }

    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. serial ๋ˆ„๋ฝ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • null serial๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์—”ํ„ฐํ‹ฐ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ 0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var flags = UO.GetFlags(0);
        UO.Print(Convert.ToString(flags));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetFlags(InjectionValue id) => bridge.GetFlags(GetObject(id));

UO.GetGraphic

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

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

string UO.GetGraphic();
string UO.GetGraphic(object? id);

ํ•ญ๋ชฉ์˜ graphic ๋˜๋Š” ๋ฌธ์ž์˜ body์„ ์ฝ๊ณ  16์ง„์ˆ˜ ํ…์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

  • id โ€” ํŠน์ • ๊ฐœ์ฒด์˜ ์ผ๋ จ ๋ฒˆํ˜ธ ๋˜๋Š” ํ™•์ธ ๊ฐ€๋Šฅํ•œ ๋ณ„์นญ(์˜ˆ: "self", "backpack", "lasttarget" ๋˜๋Š” AddObject์—์„œ ์ €์žฅํ•œ ์ด๋ฆ„)์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”ฝ/type๋Š” ์—ฌ๊ธฐ๋กœ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜ ์—†๋Š” ํ˜•์‹์—์„œ๋Š” self๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string "0x0EED" ํ˜•์‹ - ๊ทธ๋ž˜ํ”ฝ type/body ๊ฐœ์ฒด. ์ด๋Š” ๊ณ ์œ ํ•œ ID/serial๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ ๋ธŒ๋ฆฌ์ง€๋Š” "0x0000" ํ˜•์‹์˜ graphic 0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ true/false๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ํด๋ผ์ด์–ธํŠธ์˜ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ์„ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„์˜ ๊ฐœ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ˆซ์ž 0๋Š” ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ ๊ฐ’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์†์„ฑ ๊ฐ’๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Exists(serial)๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ฐพ์€ ํ•ญ๋ชฉ์˜ type ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • FindType๋Š” type ๊ณจ๋“œ๋ฅผ ๋ฐ›๊ณ  serial๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • GetGraphic(serial)๋Š” "0x0EED" ํ…์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ํ•ญ๋ชฉ๊ณผ graphic๋Š” ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.
var item = UO.FindType(0x0EED, -1, "backpack");
if (Truth(item != ""))
{
    var graphic = UO.GetGraphic(item);
    UO.Print("Graphic: " + graphic);
}

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

2. ์บ๋ฆญํ„ฐ์˜ body ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ธ์ˆ˜ ์—†๋Š” ํ˜•์‹์—์„œ๋Š” self๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • body๋Š” serial์ด ์•„๋‹Œ ์บ๋ฆญํ„ฐ์˜ ์™ธ๋ชจ์— ๋Œ€ํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var body = UO.GetGraphic();
    UO.Print("Body graphic: " + body);
    return null;
}

3. ์ฝ๊ธฐ graphic๋ฅผ ์ƒˆ ๊ฒ€์ƒ‰์— ์ „๋‹ฌ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • lastobjectโ€”์ƒ˜ํ”Œ; graphic๋Š” FindType๊ฐ€ type๋กœ ํ—ˆ์šฉํ•˜๋Š” 16์ง„์ˆ˜ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
  • -1๋Š” ๋ชจ๋“  ์ƒ‰์ƒ์„ ํ—ˆ์šฉํ•˜๊ณ , backpack๋Š” ๊ฒ€์ƒ‰ ์˜์—ญ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. sameType๋Š” ๋‹ค์‹œ 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 graphic = UO.GetGraphic("lastobject");
        var sameType = UO.FindType(graphic, -1, "backpack");
        if (Truth(sameType != ""))
        {
            UO.Print("Matching serial: " + sameType);
        }

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

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string GetGraphics() => GetGraphics(bridge.Self);

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

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string GetGraphics(int id) => $"0x{bridge.GetGraphics(id):X4}";

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

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string GetGraphics(string id) => GetGraphics(GetObject(id));

UO.GetLayer

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

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

string UO.GetLayer();
string UO.GetLayer(object? id);

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

  • id โ€” ํŠน์ • ๊ฐœ์ฒด์˜ ์ผ๋ จ ๋ฒˆํ˜ธ ๋˜๋Š” ํ™•์ธ ๊ฐ€๋Šฅํ•œ ๋ณ„์นญ(์˜ˆ: "self", "backpack", "lasttarget" ๋˜๋Š” AddObject์—์„œ ์ €์žฅํ•œ ์ด๋ฆ„)์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”ฝ/type๋Š” ์—ฌ๊ธฐ๋กœ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜ ์—†๋Š” ํ˜•์‹์—์„œ๋Š” self๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string๋Š” "Rhand", "Lhand", "Hat", "Bpack" ๋˜๋Š” "Mount"๊ณผ ๊ฐ™์€ ๋ ˆ์ด์–ด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด ๋ฒˆํ˜ธ์˜ ์ฒซ ๋ฒˆ์งธ ์ •์‹ ์ด๋ฆ„์ด ๋ฐ˜ํ™˜๋˜๋ฏ€๋กœ ํ—ฌ๋ฉง์€ "Hat"์œผ๋กœ, Backpack๋Š” "Bpack"์œผ๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด 0, ์•Œ ์ˆ˜ ์—†๋Š” ํ•ญ๋ชฉ ๋˜๋Š” self๋Š” "์ž˜๋ชป๋จ"์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ์•Œ ์ˆ˜ ์—†๋Š” ์ˆซ์ž๋Š” "0xNN" ํ˜•์‹์œผ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. serial๋„ ์•„๋‹ˆ๊ณ  graphic๋„ ์•„๋‹ˆ๊ณ  ๋†’์ด Z๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ํด๋ผ์ด์–ธํŠธ์˜ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ์„ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„์˜ ๊ฐœ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ˆซ์ž 0๋Š” ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ ๊ฐ’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์†์„ฑ ๊ฐ’๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Exists(serial)๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์˜ค๋ฅธ์†์— ์žˆ๋Š” ๊ฐ์ฒด์˜ ๋ ˆ์ด์–ด ๊ฒฐ์ • - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ObjAtLayer("Rhand")๋Š” ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. 0์€ ๋นˆ ์Šฌ๋กฏ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • GetLayer๋Š” ๋ฐœ๊ฒฌ๋œ ํ•ญ๋ชฉ์˜ serial์„ ์ˆ˜์‹ ํ•˜๊ณ  "Rhand" ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
object? item = UO.ObjAtLayer("Rhand");
if (item is string serial)
{
    var layer = UO.GetLayer(serial);
    UO.Print(layer);
}

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

2. Backpack ๋ ˆ์ด์–ด ์ด๋ฆ„ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • id="backpack" โ€” ํ˜„์žฌ ์บ๋ฆญํ„ฐ ๋ฐฐ๋‚ญ์˜ serial
  • ๋ณ„์นญ Backpack์ด ์•„๋‹Œ ํ‘œ์ค€ ์ด๋ฆ„ Bpack์ด ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var layer = UO.GetLayer("backpack");
    if (Truth(layer == "Bpack"))
    {
        UO.Print("Player backpack layer");
    }
    else
    {
        UO.Print("Layer: " + layer);
    }

    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. ์žฅ๋น„ ๋ถ€์กฑ โ€‹โ€‹์ฒ˜๋ฆฌ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

     public object? RunScenario()
    {
        var layer = UO.GetLayer("lastobject");
        if (Truth(layer == "Invalid"))
        {
            UO.Print("No equipment layer");
        }
        else
        {
            UO.Print("Equipment layer: " + layer);
        }

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

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string GetLayer() => GetLayer(new InjectionValue(bridge.Self));

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

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string GetLayer(InjectionValue id) => ConvertLayer(bridge.GetLayer(GetObject(id)));

UO.GetLocked

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

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

int UO.GetLocked(object? id);

mobile ๋งˆ๋น„๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 1 - ๋กœ๋“œ๋จ mobile์—๋Š” IsParalyzed ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. int 0 - ์†์„ฑ์ด ๋ˆ„๋ฝ๋˜์—ˆ๊ฑฐ๋‚˜ ๊ฐ์ฒด๊ฐ€ mobile๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Locked๋ผ๋Š” ์ด๋ฆ„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๊ฒƒ์€ ๊ฐ€์Šด ์ž๋ฌผ์‡ ๋‚˜ ๋ฌผ๊ฑด์ด ๊ณ ์ •๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ์›€์ง์ผ ์ˆ˜ ์—†๋Š” ์–ด๋–ค ์ด์œ ๋„ ์•„๋‹™๋‹ˆ๋‹ค. ๋™์ผํ•œ ํ”Œ๋ž˜๊ทธ๋Š” Paralyzed๋กœ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.

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

๋™์ž‘

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

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

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

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

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

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

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

1. ์ž์‹ ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • self ์ธ์ˆ˜๋Š” ํ•ด๋‹น ๋ฌธ์ž๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ - 1/0์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.
  • Locked๋ผ๋Š” ์ด๋ฆ„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๊ฒƒ์€ ๊ฐ€์Šด ์ž๋ฌผ์‡ ๋‚˜ ๋ฌผ๊ฑด์ด ๊ณ ์ •๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ์›€์ง์ผ ์ˆ˜ ์—†๋Š” ์–ด๋–ค ์ด์œ ๋„ ์•„๋‹™๋‹ˆ๋‹ค. Paralyzed์™€ ๋™์ผํ•œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
var state = UO.GetLocked("self");
var paralyzed = UO.Paralyzed();
UO.Print("GetLocked: " + Convert.ToString(state));
UO.Print("Paralyzed: " + Convert.ToString(paralyzed));

2. ์„ ํƒ๋จ ํ™•์ธ mobile - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • IsNpc ์ œ๋ชฉ ๋ฐ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. target์€ ๋ณ€๊ฒฝ๋˜๋Š” lasttarget์— ๋Œ€ํ•œ ์‹ค์‹œ๊ฐ„ ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ๋‹จ์ผ serial์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” IsParalyzed ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ์ ˆํ•œ ์ƒํƒœ๋ฅผ ์ˆ˜์‹ ํ•œ ํ›„์—๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.GetLocked(target);
        UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    return null;
}

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

3. ์ผ์‹œ ์ค‘์ง€ ์ „๊ณผ ํ›„์˜ ์ƒํƒœ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

    async public Task<object?> RunScenarioAsync()
    {
        var target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.GetLocked(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.GetLocked(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetLocked(InjectionValue id) => bridge.GetLocked(GetObject(id));

UO.GetName

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

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

string UO.GetName();
string UO.GetName(object? id);

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์•„์ดํ…œ์ด๋‚˜ ์บ๋ฆญํ„ฐ์˜ ์ด๋ฆ„์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • id๋Š” graphic/type๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ์ฒด์˜ Serial/ID์ž…๋‹ˆ๋‹ค. ์ˆซ์ž, 16์ง„์ˆ˜ ๋ฌธ์ž์—ด, ํ‘œ์ค€ ์ด๋ฆ„ self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse ๋˜๋Š” ์ด๋ฆ„ AddObject. ๋ณ„์นญ์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์กด์žฌ ์—ฌ๋ถ€๋Š” Exists๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๋“ฑ๋ก ์–‘์‹์€ self์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string โ€” ๊ฐ์ฒด ์ด๋ฆ„. ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด ๋˜๋Š” ์•„์ง ํš๋“๋˜์ง€ ์•Š์€ ์ด๋ฆ„์˜ ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด ""์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ serial๋„ ์•„๋‹ˆ๊ณ  type๋„ ์•„๋‹ˆ๋ฉฐ, ํˆดํŒ์— ์žˆ๋Š” ์ „์ฒด ์†์„ฑ ๋ชฉ๋ก๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ํด๋ผ์ด์–ธํŠธ์— ์ด๋ฏธ ์•Œ๋ ค์ง„ ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ์š”์ฒญ์ด ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด์™€ ์•„์ง ๊ฒ€์ƒ‰๋˜์ง€ ์•Š์€ ์†์„ฑ์€ null/๋นˆ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Exists์™€ ํŠน์ • ๋™์ž‘์˜ ์กฐ๊ฑด์„ ํ™•์ธํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ ์ด๋ฆ„ ์ธ์‡„ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด self๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ์ด๋ฆ„ ํ…์ŠคํŠธ์ด๋ฉฐ ์ง์ ‘ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
var name = UO.GetName();
UO.Print(name);

2. ํ”„๋กœ์„ธ์Šค ์•Œ ์ˆ˜ ์—†๋Š” ๋Œ€์ƒ ์ด๋ฆ„ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • lasttarget โ€” ๊ฐ์ฒด ๋ณ„์นญ. GetName๋Š” ์ƒˆ ๋Œ€์ƒ์„ ์—ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋นˆ ์ด๋ฆ„์€ ๊ฐ์ฒด๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์ด ์—†๋Š” serial์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋จผ์ € ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var name = UO.GetName("lasttarget");
    if (Truth(name == ""))
    {
        UO.Print("Name is not available");
    }
    else
    {
        UO.Print("Target: " + name);
    }

    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. ์ด๋ฆ„ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

     public object? RunScenario()
    {
        var name = UO.GetName("lastobject");
        if (Truth(Convert.ToString(name) == "gold"))
        {
            UO.Print("Known name matches");
        }

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

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string GetName() => GetName("self");

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

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

๊ฒฐ๊ณผ: string / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getname":

                case "charname": return new InjectionValue(bridge.GetName(Arg(0, bridge.Self)));

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

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string GetName(int id) => bridge.GetName(id);

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

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string GetName(string id) => GetName(GetObject(id));

UO.GetQuantity

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

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

int UO.GetQuantity(object? id);

ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ ์Šคํƒ์— ์žˆ๋Š” ๋‹จ์œ„ ์ˆ˜๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • id๋Š” graphic/type๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ์ฒด์˜ Serial/ID์ž…๋‹ˆ๋‹ค. ์ˆซ์ž, 16์ง„์ˆ˜ ๋ฌธ์ž์—ด, ํ‘œ์ค€ ์ด๋ฆ„ self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse ๋˜๋Š” ์ด๋ฆ„ AddObject. ๋ณ„์นญ์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์กด์žฌ ์—ฌ๋ถ€๋Š” Exists๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๋“ฑ๋ก ์–‘์‹์€ self์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ID๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int โ€” ํŠน์ • ํ•ญ๋ชฉ์˜ ๊ธˆ์•ก ํ•„๋“œ์ž…๋‹ˆ๋‹ค. 1000 ๋‹จ์œ„ ์Šคํƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ 1000๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹จํ’ˆ - 1. ์•Œ ์ˆ˜ ์—†๋Š” serial ๋ฐ ๋ฌธ์ž์˜ ๊ฒฝ์šฐ 0๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ƒ์ž์˜ ํ•˜์œ„ ์•„์ดํ…œ ๊ฐœ์ˆ˜๋„ ์•„๋‹ˆ๊ณ  MassMove ๋ช…๋ น์˜ ์•„์ดํ…œ ์ œํ•œ๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ํด๋ผ์ด์–ธํŠธ์— ์ด๋ฏธ ์•Œ๋ ค์ง„ ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ์š”์ฒญ์ด ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด์™€ ์•„์ง ๊ฒ€์ƒ‰๋˜์ง€ ์•Š์€ ์†์„ฑ์€ null/๋นˆ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Exists์™€ ํŠน์ • ๋™์ž‘์˜ ์กฐ๊ฑด์„ ํ™•์ธํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ๋ฐœ๊ฒฌ๋œ ์Šคํƒ์˜ ํฌ๊ธฐ ๋ณด๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • FindType๋Š” ๋ฐฐ๋‚ญ์—์„œ ์–ด๋–ค ์ƒ‰๊น”์˜ ๊ธˆ์ƒ‰ type์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธˆ์—๋Š” ํ•˜๋‚˜์˜ serial์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๊ธˆ์•ก์€ ๋ฐœ๊ฒฌ๋œ ํ•˜๋‚˜์˜ ์Šคํƒ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
var gold = UO.FindType(0x0EED, -1, "backpack");
if (Truth(gold != ""))
{
    var amount = UO.GetQuantity(gold);
    UO.Print("Units in this stack: " + Convert.ToString(amount));
}

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

2. ์ตœ์†Œ ์ˆ˜๋Ÿ‰ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • id=sample - ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•œ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.
  • 50๋Š” ์ฃผ์–ด์ง„ ์Šคํƒ์— ์žˆ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 50 ๊ฐœ๋ณ„ ํ’ˆ๋ชฉ์€ ์—ฌ๊ธฐ์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var sample = UO.GetSerial("lastobject");
    if (Truth(UO.Exists(sample)))
    {
        if (Truth(UO.GetQuantity(sample) >= 50))
        {
            UO.Print("At least 50 units in this item");
        }
    }

    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. ์Šคํƒ ์ˆ˜์™€ ์Šคํƒ ์ˆ˜ ๊ตฌ๋ณ„ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • FindCount๋Š” ๋งˆ์ง€๋ง‰ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. GetQuantity - ํ•˜๋‚˜์˜ serial๋กœ.
  • ์ˆซ์ž๋Š” ํฌ๊ฒŒ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MassMove ์ˆ˜๋Ÿ‰์€ ์Šคํƒ์„ ํฌํ•จํ•œ ์ „์ฒด ํ•ญ๋ชฉ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
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 item = UO.FindType(0x0EED, -1, "backpack");
        var stacks = UO.FindCount();
        if (Truth(item != ""))
        {
            var units = UO.GetQuantity(item);
            UO.Print("Matching items: " + Convert.ToString(stacks));
            UO.Print("Units in selected item: " + Convert.ToString(units));
        }

        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.GetQuantity(id) โ€” UO.GetQuantity(Any)

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

๊ฒฐ๊ณผ: int / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getquantity": return new InjectionValue(bridge.GetQuantity(Arg(0)));

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetQuantity(int id) => bridge.GetQuantity(id);

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetQuantity(string id) => GetQuantity(GetObject(id));

UO.GetSerial

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

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

string UO.GetSerial();
string UO.GetSerial(object? id);

๊ฐœ์ฒด ์ด๋ฆ„์„ serial๋กœ ํ™•์ธํ•˜๊ณ  serial ํ˜•์‹์„ 16์ง„์ˆ˜ ๋ฌธ์ž์—ด๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

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

  • id - ์„ ํƒ์  ๋ฌธ์ž์—ด: ํ‘œ์ค€ ๋ณ„์นญ, ์ด๋ฆ„ AddObject ๋˜๋Š” ์ˆซ์ž ํ…์ŠคํŠธ(10์ง„์ˆ˜/16์ง„์ˆ˜). ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ํ˜„์žฌ ๋ฌธ์ž์˜ serial๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

"0x40001234" ํ˜•์‹์˜ string๋Š” ๊ณ ์œ ํ•œ serial/ID ๊ฐœ์ฒด๋กœ, 0x ๋’ค์— 8์ž๋ฆฌ 16์ง„์ˆ˜๊ฐ€ ๋ถ™์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์ด๋ฆ„์€ "0x00000000"์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ type๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ ์ˆซ์ž ํ…์ŠคํŠธ์˜ ํ˜•์‹์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค. GetSerial ์ž์ฒด๋Š” Exists๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋ณ„์นญ ์ด๋ฆ„์€ ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ/ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ณ„์นญ์ด ์ดํ›„์— ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ ์ €์žฅ๋œ ๋ฌธ์ž์—ด serial์€ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ์˜ ID ์–ป๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์œผ๋ฉฐ self๊ฐ€ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • serial โ€” 16์ง„์ˆ˜ ๋ฌธ์ž์—ด. 0x00000000 ๊ฐ’์€ serial ๋ฌธ์ž๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
var serial = UO.GetSerial();
UO.Print(serial);

2. ์„ ํƒํ•œ ์„ฑ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • id="lasttarget"๋Š” serial ๋งˆ์ง€๋ง‰ ๋Œ€์ƒ์œผ๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
  • Exists๋Š” ๊ฐ์ฒด์˜ ์กด์žฌ๋ฅผ ํ™•์ธํ•˜๊ณ , GetName๋Š” ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ ค์ง„ ์ด๋ฆ„์„ ์ฝ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var serial = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(serial)))
    {
        UO.Print(UO.GetName(serial));
    }
    else
    {
        UO.Print("Target is not loaded");
    }

    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. ์ˆซ์ž ํ‘œํ˜„ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • id๋Š” 10์ง„์ˆ˜ serial 1073746484์„ ํฌํ•จํ•˜๋Š” ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ 0x40001234์—๋Š” ์„œ์‹์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ˆซ์ž์˜ ์˜ˆ์ด๋ฉฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ฐ์ฒด์˜ ์กด์žฌ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 serial = UO.GetSerial("1073746484");
        UO.Print(serial);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetSerial() โ€” UO.GetSerial()

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string GetSerial() => NumberConversions.ToHex(bridge.Self);

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

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string GetSerial(string id) => NumberConversions.ToHex(GetObject(id));

UO.GetTooltip

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

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

dynamic UO.GetTooltip(object? objID);

OPL์—์„œ ์™„์„ฑ๋œ ๊ฐœ์ฒด ์†์„ฑ ํ…์ŠคํŠธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. GetTooltip ๋ฐ GetCliloc๋Š” ๋™์˜์–ด์ž…๋‹ˆ๋‹ค.

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

  • objID โ€” ํ•„์ˆ˜ serial/ID ๊ฐ์ฒด. type๋„ ์•„๋‹ˆ๊ณ  cliloc๋„ ์•„๋‹™๋‹ˆ๋‹ค. int, 10์ง„์ˆ˜/16์ง„์ˆ˜ ๋ฌธ์ž์—ด, self, backpack, lasttarget, finditem ๋˜๋Š” ์ด๋ฆ„ AddObject๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. 0๋Š” ๊ฐœ์ฒด๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string โ€” ์†์„ฑ์˜ ์ด๋ฆ„๊ณผ ํ…์ŠคํŠธ๋ฅผ ์ค„ ๋ฐ”๊ฟˆ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๊ฑฐ๋‚˜ ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋ถ€๋ถ„๋งŒ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ObjID=0์ด๊ฑฐ๋‚˜ ์†์„ฑ์ด ์ˆ˜์‹ ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž ID cliloc ๋ฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” GetTooltipRec์— ์˜ํ•ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ํ•ญ๋ชฉ์ด OPL์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํ…์ŠคํŠธ๊ฐ€ ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์ด ์—†์œผ๋ฉด ์†์„ฑ ์š”์ฒญ์ด ์ „์†ก๋˜๊ณ  10ms๋งˆ๋‹ค ํ™•์ธํ•˜์—ฌ ์ตœ๋Œ€ 200ms๊นŒ์ง€ ์‘๋‹ต์ด ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ผ์‹œ ์ค‘์ง€๊ฐ€ ์‘๋‹ต์„ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์™€ ์„œ๋ฒ„์˜ ์†์„ฑ ์ง€์›์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋นˆ ๊ฒฐ๊ณผ๋Š” ๊ฐ์ฒด๊ฐ€ ์—†๋‹ค๋Š” ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. Exists๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ํ…์ŠคํŠธ์—๋Š” ์„œ๋ฒ„ ๋งˆํฌ์—…์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆซ์ž ์†์„ฑ์„ ์ค„ ์œ„์น˜๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด๋ฅผ ์œ„ํ•ด GetTooltipRec๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

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

1. ๋ฐฐ๋‚ญ์— ์žˆ๋Š” ์•„์ดํ…œ์˜ ์†์„ฑ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • FindType: ๊ณจ๋“œ 0x0EED, ๋ชจ๋“  hue=-1, ์ง์ ‘ ์ฝ˜ํ…์ธ  backpack. ObjID=ํ•ญ๋ชฉ - serial์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.
  • getter ๊ฒฐ๊ณผ๋Š” ๊ธˆ์˜ ์–‘์ด ์•„๋‹ˆ๋ผ ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์ˆ˜๋Ÿ‰์€ FindCount(ํ•ญ๋ชฉ)์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
var item = UO.FindType(0x0EED, -1, "backpack");
if (Truth(item != ""))
{
    UO.Print(UO.GetTooltip(item));
}

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

2. ์‘๋‹ต ์—†์Œ ์ฒ˜๋ฆฌ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ObjID=lasttarget๋Š” ์›ํ•˜๋Š” ๊ฐœ์ฒด๋ฅผ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋นˆ ๋ฌธ์ž์—ด์€ ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋ฌดํ•œ ๋ฃจํ”„์—์„œ ์š”์ฒญ์„ ์ž๋™์œผ๋กœ ๋ฐ˜๋ณตํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var text = UO.GetTooltip("lasttarget");
    if (Truth(text == ""))
    {
        UO.Print("No properties received");
    }
    else
    {
        UO.Print(text);
    }

    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. ๋‹ค์Œ ์ž‘์—…๊นŒ์ง€ ํ…์ŠคํŠธ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • id์™€ save๋Š” ๋ณ„๋„์˜ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐœ์ฒด์˜ ๊ณ ์œ ํ•œ 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 id = UO.GetSerial("lasttarget");
        var saved = UO.GetTooltip(id);
        UO.Print("Object: 0x" + Hex(id));
        UO.Print(saved);
        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getcliloc":

                case "gettooltip":

                    return new InjectionValue(bridge.GetTooltip(Arg(0)));

UO.GetTooltipRec

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

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

dynamic UO.GetTooltipRec(object? objID);

๊ตฌ์กฐํ™”๋œ ์†์„ฑ์„ ์ฝ์Šต๋‹ˆ๋‹ค: cliloc ID ๋ฐ ๊ฐ ํ•ญ๋ชฉ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ OPL.

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

  • objID โ€” ํ•„์ˆ˜ serial/ID ๊ฐ์ฒด. type๋„ ์•„๋‹ˆ๊ณ  cliloc๋„ ์•„๋‹™๋‹ˆ๋‹ค. int, 10์ง„์ˆ˜/16์ง„์ˆ˜ ๋ฌธ์ž์—ด, self, backpack, lasttarget, finditem ๋˜๋Š” ์ด๋ฆ„ AddObject๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. 0๋Š” ๊ฐœ์ฒด๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

Array๋Š” ์†์„ฑ ํ–‰์˜ ๋‹จ์ผ ์Šค๋ƒ…์ƒท์ž…๋‹ˆ๋‹ค. ๊ฐ ์ค„์€ [clilocID:int, ๋งค๊ฐœ๋ณ€์ˆ˜:Array]๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. rows[i][0]๋Š” ํ˜„์ง€ํ™”๋œ ๋ฉ”์‹œ์ง€์˜ ์ˆ˜์ด๊ณ ,rows[i][1]๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ArrayLength(ํ–‰) โ€” ์†์„ฑ ์ˆ˜; ArrayLength(parameters) โ€” ํ•˜๋‚˜์˜ ์†์„ฑ์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆ˜์ž…๋‹ˆ๋‹ค. ObjID=0์ด๊ฑฐ๋‚˜ ์ˆ˜์‹ ๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋นˆ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ID ํ•ญ๋ชฉ ๋ชฉ๋ก์ด๋‚˜ ์™„์„ฑ๋œ ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์บ์‹œ ํ•ญ๋ชฉ์ด ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. OPL๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ ์ตœ๋Œ€ 120ms ๋™์•ˆ ๋Œ€๊ธฐํ•˜๋ฉด์„œ ์†์„ฑ์ด ์ฟผ๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์‹œ์ €๋ฅผ ์ทจ์†Œํ•˜๋ฉด ๋Œ€๊ธฐ๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์•Œ๋ ค์ง„ ๋นˆ OPL๋Š” ๊ธฐ๋Œ€๋ฅผ ์œ ๋ฐœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ClilocLoader์™€ ๊ฐ™์ด ์ดˆ๊ธฐ ์„œ๋น„์Šค ํƒญ์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ๋นˆ ๋‚ด๋ถ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์œ„์น˜๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. #๋ฒˆํ˜ธ๋Š” ์ดํ›„ ํ˜„์ง€ํ™”๋ฅผ ์œ„ํ•ด ๋ฌธ์ž์—ด๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋นˆ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ˜ํ™˜๋œ ๋ฐฐ์—ด์„ ๋ณ€๊ฒฝํ•ด๋„ ํด๋ผ์ด์–ธํŠธ์˜ ์บ์‹œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ ์‚ฌ์šฉ์˜ ๊ฒฝ์šฐ GetTooltip/GetCliloc; ํ•œ ์ค„์„ ๋ฒˆ์—ญํ•˜๋ ค๋ฉด - GetClilocByID(clilocID, ๋งค๊ฐœ๋ณ€์ˆ˜).

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

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

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

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

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

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

1. ๋ชจ๋“  ๋ถ€๋™์‚ฐ ๋ฒˆํ˜ธ ๋ณด๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ObjID=lasttarget โ€” ๊ฐœ์ฒด. ํ–‰์—๋Š” ์†์„ฑ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ i๋Š” 0์˜ ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค. row[0]๋Š” serial์ด ์•„๋‹ˆ๋ผ cliloc์ž…๋‹ˆ๋‹ค.
  • ๋นˆ ๋ฐฐ์—ด์—์„œ ๋ฃจํ”„๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ ˆ์ฝ”๋“œ๋Š” ํ•œ ๋ฒˆ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
var rows = UO.GetTooltipRec("lasttarget");
var i = 0;
while (Truth(i < ArrayLength(rows)))
{
    var row = rows[i];
    UO.Print("Cliloc: " + Convert.ToString(row[0]));
    i = i + 1;
}

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;

2. ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๋ ˆ์ฝ”๋“œ ๋ฒˆ์—ญ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • GetClilocByID๋Š” clilocID=ํ–‰[0] ๋ฐ ๋Œ€์ฒด ๋ฐฐ์—ด=ํ–‰[1]์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐฐ์—ด ๋Œ€์‹  ์ „์ฒด ํ–‰์„ ์ „๋‹ฌํ•˜์ง€ ๋งˆ์„ธ์š”.
return  RunScenario();
 object? RunScenario()
{
    var rows = UO.GetTooltipRec("lasttarget");
    var i = 0;
    while (Truth(i < ArrayLength(rows)))
    {
        var row = rows[i];
        var text = UO.GetClilocByID(row[0], row[1]);
        UO.Print(text);
        i = i + 1;
    }

    return null;
}

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

3. ์•Œ๋ ค์ง„ ์†์„ฑ์˜ ์ˆซ์ž ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ€์ ธ์˜ค๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์›ํ•จ - ID ์†์„ฑ์˜ ์˜ˆ; ์›ํ•˜๋Š” cliloc์œผ๋กœ ๊ต์ฒดํ•˜์„ธ์š”. args[0]๋Š” ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์ด๋ฉฐ ์ฒ˜์Œ์—๋Š” string์ž…๋‹ˆ๋‹ค.
  • Val ์ด์ „์— ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐœ์ˆ˜์™€ ์ˆซ์ž ํ˜•์‹์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ…์ŠคํŠธ ๋˜๋Š” #cliloc ๋งํฌ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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 rows = UO.GetTooltipRec("lasttarget");
        var wanted = 1060401;
        var i = 0;
        while (Truth(i < ArrayLength(rows)))
        {
            var row = rows[i];
            var args = row[1];
            if (Truth(row[0] == wanted) && Truth(ArrayLength(args) > 0))
            {
                if (Truth(IsNumeric(args[0])))
                {
                    UO.Print("Value: " + Convert.ToString(Val(args[0])));
                }
            }

            i = i + 1;
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool IsNumeric(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out _);
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
    double Val(object? value) => double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out var number) ? number : 0;
}

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: dynamic / Array.

ํ˜ธ์ถœ ์‹œ:

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

case "gettooltiprec":

                    return new InjectionValue(bridge.GetTooltipRecords(Arg(0)).Select(entry =>

                        new InjectionValue(new[]

                        {

                            new InjectionValue(entry.ClilocID),

                            new InjectionValue(entry.Parameters.Select(value => new InjectionValue(value)).ToArray())

                        })).ToArray());

UO.GetType

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

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

dynamic UO.GetType(object? objID);

ํ•ญ๋ชฉ์˜ ์ˆซ์ž graphic ๋˜๋Š” ๋ฌธ์ž์˜ body๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

๋ฐ˜ํ™˜๊ฐ’

int - ์•„์ดํ…œ์˜ graphic/type ๋˜๋Š” ์บ๋ฆญํ„ฐ์˜ body(์˜ˆ: ๊ณจ๋“œ์˜ ๊ฒฝ์šฐ 0x0EED (3821)). ๊ฐ์ฒด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฉด 0 ๊ฐ’์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. GetType๋Š” serial ๋˜๋Š” "0x..." ํ…์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ํ˜•์‹์€ GetGraphic๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ํด๋ผ์ด์–ธํŠธ์˜ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ์„ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„์˜ ๊ฐœ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ˆซ์ž 0๋Š” ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ ๊ฐ’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์†์„ฑ ๊ฐ’๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Exists(serial)๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ˆซ์ž type๋ฅผ ์ƒ์ˆ˜์™€ ๋น„๊ต - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ObjID="lastobject" - ํŠน์ • ๊ฐœ์ฒด์˜ ๋ณ„์นญ์ž…๋‹ˆ๋‹ค.
  • 0x0EED๋Š” graphic์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋น„๊ต์—์„œ๋Š” serial๊ณผ ๊ฐ™์€ ๊ฐœ์ฒด๋ฅผ ์ฐพ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var graphic = UO.GetType("lastobject");
if (Truth(graphic == 0x0EED))
{
    UO.Print("Gold graphic");
}

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

2. type ๋‚˜๋งŒ์˜ ๋ฐฑํŒฉ ๋ฐ›๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ObjID="backpack" - ํ˜„์žฌ ๋ฐฐ๋‚ญ.
  • Convert.ToString๋Š” ์ถœ๋ ฅ์„ ์œ„ํ•ด ๋ฐ˜ํ™˜๋œ ์ˆซ์ž์˜ ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var graphic = UO.GetType("backpack");
    UO.Print("Backpack type: " + Convert.ToString(graphic));
    return null;
}

3. ์ฝ๊ธฐ ์ „์— ๊ฐ์ฒด ์กด์žฌ๋ฅผ ํ™•์ธํ•˜์„ธ์š” type - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋นˆ ๋ฌธ์ž์—ด FindType์€ Exists ์ด์ „์— ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
  • Exists๋Š” ๋ถ€์šธ 1/0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. GetType๋Š” ์ˆซ์ž graphic๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
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 item = UO.FindType(0x0EED, -1, "backpack");
        if (Truth(item != ""))
        {
            if (Truth(UO.Exists(item)))
            {
                UO.Print("Type: " + Convert.ToString(UO.GetType(item)));
            }
        }

        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.GetType(objID) โ€” UO.GetType(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "gettype": return new InjectionValue(bridge.GetGraphics(Arg(0)));

UO.Grab

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

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

int UO.Grab();
int UO.Grab(object? id);
int UO.Grab(object? amount, object? id);
int UO.Grab(object? amount, object? item, object? container);
int UO.Grab(object? amount, object? item, object? container, object? timeout);

์ง€์ •๋œ/์ˆ˜์‹  ์ปจํ…Œ์ด๋„ˆ๋กœ ํ•ญ๋ชฉ์„ ์ „์†กํ•˜๊ฑฐ๋‚˜ ํ•ญ๋ชฉ ์„ ํƒ์„ ์—ฝ๋‹ˆ๋‹ค.

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

  • id โ€” ํ•ญ๋ชฉ์˜ ์ผ๋ จ๋ฒˆํ˜ธ/๋ณ„์นญ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ๋Œ€ํ™”ํ˜• ์„ ํƒ์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ์ธ์ˆ˜๋กœ 1 ์ด ํ•ญ๋ชฉ์˜ ๋‹จ์œ„๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • item โ€” ํ•ญ๋ชฉ์˜ ์ผ๋ จ๋ฒˆํ˜ธ/๋ณ„์นญ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ๋Œ€ํ™”ํ˜• ์„ ํƒ์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ์ธ์ˆ˜๋กœ 1 ์ด ํ•ญ๋ชฉ์˜ ๋‹จ์œ„๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • id / item โ€” ํ•ญ๋ชฉ์˜ ์ผ๋ จ๋ฒˆํ˜ธ/๋ณ„์นญ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ๋Œ€ํ™”ํ˜• ์„ ํƒ์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ์ธ์ˆ˜๋กœ 1 ์ด ํ•ญ๋ชฉ์˜ ๋‹จ์œ„๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • amount - ์–‘์‹ 2..4 - ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ˆ˜๋Ÿ‰, ๊ทธ๋‹ค์Œ ํ•ญ๋ชฉ. 0๋Š” MoveItem ๊ทœ์น™์— ๋”ฐ๋ฅธ ์ „์ฒด ์Šคํƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Grab(item) ํ˜•์‹์œผ๋กœ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์„ธ์š”.
  • container - ์–‘์‹ 3/4์—๋งŒ ํ•ด๋‹น: ๋ช…์‹œ์  ํ• ๋‹น. ๊ทธ๊ฒƒ์ด ์—†์œผ๋ฉด ์ƒํƒœ.ReceivingContainer, >0์ด๋ฉด, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด backpack์ž…๋‹ˆ๋‹ค. ๋ชฉ์ ์ง€์˜ self/my/backpack ์„ ์€ ๋ฐฐ๋‚ญ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ground - ์ง€์ƒ.
  • timeout - 4 ํ˜•์‹๋งŒ, ๋ฐ€๋ฆฌ์ดˆ์ž…๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ CompactMoveItem๋กœ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ขŒํ‘œ ground๋Š” self, ์ปจํ…Œ์ด๋„ˆ - 0xFFFF/0xFFFF/0์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์ˆซ์ž ํ”Œ๋ž˜๊ทธ int: 1 โ€” ๋Œ€ํ™”ํ˜• ์„ ํƒ์ด ํ—ˆ์šฉ๋˜๊ฑฐ๋‚˜ ์„ ํƒํ•œ ์–‘์‹์— ๋”ฐ๋ผ ์ „์†ก์ด ํ—ˆ์šฉ/ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. 0 - ์‹คํŒจ/์ ํ•ฉํ•œ ํ•ญ๋ชฉ ์—†์Œ. ์ธ์ˆ˜๊ฐ€ ์—†๋‹ค๋Š” ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ๋ชฉ์ด ์ด๋ฏธ ์ „์†ก๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • CompactGrab๋Š” Grab(ํ•ญ๋ชฉ)=1 ๋‹จ์œ„์˜ ์—ญ์‚ฌ์  ํ˜•ํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ์—†๋Š” ์–‘์‹์€ ํ™•์ธ ๋Œ€๊ธฐ๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š๊ณ  CompactMoveItem๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ์žˆ๋Š” ์–‘์‹์€ UO.Wait=true๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์ง๋ ฌ 0์€ ์ฆ‰์‹œ 0๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€/๋ถ€์ ์ ˆํ•œ ๊ฐœ์ฒด๋Š” MoveItem๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™, ์Šคํƒ ์–‘ ๋ฐ ํ˜„์žฌ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. 3/4๊ฐœ์˜ ์ธ์ˆ˜๋Š” ๋†“๊ธฐ ์ขŒํ‘œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • amount<=0๋Š” ์ „์ฒด ์Šคํƒ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ์žˆ๋Š” ํ˜•์‹์—์„œ๋Š” ๋ถ€์ •์ ์ธ ์ผ์‹œ ์ค‘์ง€๊ฐ€ 0๊ฐ€ ๋˜์ง€๋งŒ ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ๋กœ์ปฌ ํ™•์ธ์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ˆ˜ํ‘œ ์‚ฌ์ด UO.Wait(10). ๋ถ€๋ถ„ ์ด์ „์€ ์ดˆ๊ธฐ ์ˆ˜๋Ÿ‰ ๊ฐ์†Œ๋กœ ํ™•์ •๋˜๋ฉฐ, ์™„์ „ ์ด์ „์€ ๊ณผ์ œ ๋ฐ ground X/Y/Z์— ๋Œ€ํ•ด ํ™•์ •๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ID ์š”์ฒญ์˜ ์ƒˆ๋กœ์šด ํ”„๋กœํ† ์ฝœ ์‘๋‹ต์ด ์•„๋‹ˆ๋ผ ์„ธ๊ณ„ ์ƒํƒœ๋ฅผ ๊ด€์ฐฐํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ์ ํ•ฉํ•œ ์ƒํƒœ๋Š” ์ฆ‰์‹œ 1๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์ด ์ด๋ฏธ ์ „์†ก๋˜์—ˆ๋”๋ผ๋„ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋กœ ์ธํ•ด 0๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์ง€์ •๋œ/์ˆ˜์‹  ์ปจํ…Œ์ด๋„ˆ๋กœ ํ•ญ๋ชฉ์„ ์ „์†กํ•˜๊ฑฐ๋‚˜ ํ•ญ๋ชฉ ์„ ํƒ์„ ์—ฝ๋‹ˆ๋‹ค.
var accepted = UO.Grab();
UO.Print(accepted);

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

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

  • CompactGrab๋Š” Grab(ํ•ญ๋ชฉ)=1 ๋‹จ์œ„์˜ ์—ญ์‚ฌ์  ํ˜•ํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ์—†๋Š” ์–‘์‹์€ ํ™•์ธ ๋Œ€๊ธฐ๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š๊ณ  CompactMoveItem๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ์žˆ๋Š” ์–‘์‹์€ UO.Wait=true๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lastobject")))
    {
        UO.Print(UO.Grab("lastobject"));
    }

    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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ง๋ ฌ 0์€ ์ฆ‰์‹œ 0๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€/๋ถ€์ ์ ˆํ•œ ๊ฐœ์ฒด๋Š” MoveItem๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™, ์Šคํƒ ์–‘ ๋ฐ ํ˜„์žฌ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. 3/4๊ฐœ์˜ ์ธ์ˆ˜๋Š” ๋†“๊ธฐ ์ขŒํ‘œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
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.Exists("lastobject")))
        {
            UO.Print(UO.Grab(0, "lastobject", "backpack", 2000));
        }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Grab() => bridge.RequestInteractiveGrabTarget();

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Grab(InjectionValue id) => CompactGrab(new[] { id });

UO.Grab(amount, id) โ€” UO.Grab(Any,Any)

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

๊ฒฐ๊ณผ: int / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "grab": return new InjectionValue(CompactGrab(arguments));

UO.Grab(amount, id) โ€” UO.Grab(Integer,Integer)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Grab(int amount, int id) => CompactGrab(new[] { new InjectionValue(amount), new InjectionValue(id) });

UO.Grab(amount, id) โ€” UO.Grab(Integer,String)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Grab(int amount, string id) => CompactGrab(new[] { new InjectionValue(amount), new InjectionValue(id) });

UO.Grab(amount, id) โ€” UO.Grab(String,String)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int Grab(string amount, string id) => CompactGrab(new[] { new InjectionValue(amount), new InjectionValue(id) });

UO.Grab(amount, item, container) โ€” UO.Grab(Any,Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactGrab(values))

UO.Grab(amount, item, container, timeout) โ€” UO.Grab(Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactGrab(values))

UO.IsMovable

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

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

int UO.IsMovable(object? objID);

ํด๋ž˜์‹ UO ์„ ํƒ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ์•Œ๋ ค์ง„ ํ•ญ๋ชฉ์˜ ์ด์‹์„ฑ์˜ ๋กœ์ปฌ ์ง•ํ›„๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 1 - ์•„์ดํ…œ์ด ์ œ๊ฑฐ๋˜์ง€ ์•Š๊ณ , ๋ฉ€ํ‹ฐ๊ฐ€ ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ง€์ƒ์— ์žˆ๋Š” ์•„์ดํ…œ์— ๋Œ€ํ•œ ๋กœ์ปฌ ๋ฌด๊ฒŒ/์ด๋™ ๊ทœ์น™์— ์˜ํ•ด ์ฐจ๋‹จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. int 0 - mobile, ์ง€์ƒ์— ์žˆ๋Š” ๋‹ค์ค‘, ์•Œ ์ˆ˜ ์—†๋Š”/์ œ๊ฑฐ๋œ ๋ฌผ์ฒด ๋˜๋Š” ๋ง‰ํžŒ ๋ฌผ์ฒด. 1๋Š” ์„ฑ๊ณต์ ์ธ Drag/MoveItem์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฒ”์œ„, ์•ก์„ธ์Šค, ์ปค์„œ ์ƒํƒœ ๋ฐ ์ตœ์ข… ์„œ๋ฒ„ ๊ฒฐ์ •์€ ๋ณ„๋„๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

๋™์ž‘

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

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

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

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

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

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

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

1. ์ด๋™ํ•˜์ง€ ์•Š๊ณ  ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • item โ€” ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•œ ์•„์ดํ…œ์˜ serial. ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋Š” ๊ทธ ์ˆ˜๋Ÿ‰์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ด ์˜ˆ์ œ์—์„œ๋Š” ์•„๋ฌด๊ฒƒ๋„ ์„ ํƒํ•˜์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„์— ์•„๋ฌด๊ฒƒ๋„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var item = UO.GetSerial("lastobject");
var movable = UO.IsMovable(item);
UO.Print("Locally movable 1/0: " + Convert.ToString(movable));

2. ๋ถ€ํ˜ธ์™€ ๊ฑฐ๋ฆฌ๋ฅผ ๋ณ„๋„๋กœ ์ถ”์ • - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ง€์ƒ์— ์žˆ๋Š” ์•„์ดํ…œ์˜ ๊ฒฝ์šฐ GetDistance๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์•Œ๋ ค์ง„ ๋ฒ”์œ„๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • moveable=1์„ ์‚ฌ์šฉํ•ด๋„ ํ•ญ๋ชฉ์ด ๋„ˆ๋ฌด ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธ์ •์ ์ธ ๊ฒฐ๊ณผ๋Š” ์„œ๋ฒ„์˜ ์ „์†ก ๊ถŒํ•œ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(item)))
    {
        var movable = UO.IsMovable(item);
        var distance = UO.GetDistance(item);
        UO.Print("Movable: " + Convert.ToString(movable));
        UO.Print("Distance: " + Convert.ToString(distance));
    }

    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. ๋ฐœ๊ฒฌ๋œ ์ „์ฒด ์Šคํƒ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • FindType๋Š” ๋ฐฐ๋‚ญ์—์„œ ์›ํ•˜๋Š” ์ƒ‰์ƒ์˜ ๊ธˆ์ƒ‰ serial ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • IsMovable ์ „์ฒด ํ•ญ๋ชฉ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. GetQuantity๋Š” ๋‹จ์œ„ ์ˆ˜๋ฅผ ๋ณ„๋„๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ IsMovable๋Š” ์ด ์นด์šดํ„ฐ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 item = UO.FindType(0x0EED, -1, "backpack");
        if (Truth(item != ""))
        {
            if (Truth(UO.IsMovable(item)))
            {
                var units = UO.GetQuantity(item);
                UO.Print("Selected stack units: " + Convert.ToString(units));
            }
        }

        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.IsMovable(objID) โ€” UO.IsMovable(Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "ismovable": return new InjectionValue(bridge.IsMovable(Arg(0)));

UO.IsObjectExists

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

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

int UO.IsObjectExists(object? objID);

ํด๋ผ์ด์–ธํŠธ์˜ ๋กœ์ปฌ ์„ธ๊ณ„์— ์‚ญ์ œ๋˜์ง€ ์•Š์€ ๊ฐœ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 1 - serial๋Š” ์ด์ œ ๋กœ๋“œ๋œ ํ•ญ๋ชฉ ๋˜๋Š” mobile๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. int 0 - ๊ฐœ์ฒด๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ ค์ง€์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜์—ˆ๊ฑฐ๋‚˜ ๋ณ„์นญ์ด ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ์ฒด์˜ ์กด์žฌ์— ๋Œ€ํ•œ ์„œ๋ฒ„ ์‘๋‹ต์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ€์‹œ ์˜์—ญ ์™ธ๋ถ€์˜ ํ•ญ๋ชฉ์ด ์„œ๋ฒ„์— ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— 0๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

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

๋™์ž‘

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

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

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

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

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

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

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

1. ๋ฐฐ๋‚ญ์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜ backpack๋Š” ์ž์‹ ์˜ ์บ๋ฆญํ„ฐ ๋ฐฐ๋‚ญ์˜ ๋ณ„์นญ serial์ž…๋‹ˆ๋‹ค.
  • 1๋Š” ๋ฐฑํŒฉ์˜ ๋‚ด์šฉ๋ฌผ์ด ์ด๋ฏธ ์™„์ „ํžˆ ์ˆ˜๋ น๋˜์—ˆ๊ฑฐ๋‚˜ ๊ฐœ๋ด‰๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
var present = UO.IsObjectExists("backpack");
if (Truth(present))
{
    UO.Print("Backpack is loaded");
}
else
{
    UO.Print("Backpack is unavailable");
}

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

2. ์ €์žฅ๋œ serial ๋‹ค์‹œ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • target์€ ํŠน์ • serial๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ฐ’ lasttarget์€ ์ด๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ์‹œ์ •์ง€ 500ms ์ดํ›„์—๋Š” ๊ฐ์ฒด๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฒ€์‚ฌ๊ฐ€ ๋‹ค์‹œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var target = UO.GetSerial("lasttarget");
    await Delay(500);
    if (Truth(UO.IsObjectExists(target)))
    {
        UO.Print(UO.GetName(target));
    }
    else
    {
        UO.Print("Saved target is no longer loaded");
    }

    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;

3. ID ํ˜•์‹๊ณผ ๊ฐ์ฒด ์กด์žฌ ๊ตฌ๋ณ„ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • GetSerial๋Š” ๊ฐœ์ฒด๊ฐ€ ์—†๋”๋ผ๋„ ์ˆซ์ž 1073746484๋ฅผ 0x40001234๋กœ ํ˜•์‹ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์Œ ํ™•์ธ์—์„œ๋งŒ ํ˜„์žฌ ๋กœ์ปฌ ์„ธ๊ณ„์— ์ด 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 serial = UO.GetSerial("1073746484");
        UO.Print("Serial: " + serial);
        var present = UO.IsObjectExists(serial);
        UO.Print("Present 1/0: " + Convert.ToString(present));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "isobjectexists": return new InjectionValue(bridge.Exists(Arg(0)));

UO.LastObject

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

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

dynamic UO.LastObject();

๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•œ ๊ฐ์ฒด์˜ serial๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•œ ๊ฐ์ฒด์˜ serial๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
var id = UO.LastObject();
UO.Print(Hex(id));

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

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

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

  • ํ•„๋“œ ์†Œ์Šค: _world.LastObject. ์ด ๋ช…๋ น์€ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ณต๊ฒฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.LastObject();
    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.LastObject();
        UO.Wait(500);
        var after = UO.LastObject();
        UO.Print(before = after);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.LastObject() โ€” UO.LastObject()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "lastobject": return new InjectionValue(bridge.GetLastObject());

UO.MakeFakeItem

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

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

void UO.MakeFakeItem(object? @type);
void UO.MakeFakeItem(object? @type, object? serial);
void UO.MakeFakeItem(object? @type, object? serial, object? count);
void UO.MakeFakeItem(object? @type, object? serial, object? count, object? color);
void UO.MakeFakeItem(object? @type, object? serial, object? count, object? color, object? x);
void UO.MakeFakeItem(object? @type, object? serial, object? count, object? color, object? x, object? y);

๋กœ์ปฌ ํด๋ผ์ด์–ธํŠธ ํ•ญ๋ชฉ๋งŒ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

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

  • type - ํ•„์ˆ˜ graphic 1..65535; ์ด๋ฆ„์ด ์ง€์ •๋˜์ง€ ์•Š์€ type๋ถ€ํ„ฐ ResolveType๊นŒ์ง€: ์ด ๋ ˆ๊ฑฐ์‹œ ๋ธŒ๋žœ์น˜๋Š” Arg/int๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • serial - ์„ ํƒ์‚ฌํ•ญ serial ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. 0(๊ธฐ๋ณธ๊ฐ’)์€ 0x7FFEFFFF ์ฃผ๋ณ€์˜ ๋กœ์ปฌ ๋ฒ”์œ„์—์„œ ๋ฌด๋ฃŒ ID๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์  ํ•ญ๋ชฉ serial๋Š” ์ด๋ฏธ ๋กœ๋“œ๋œ ํ•ญ๋ชฉ๊ณผ ์ผ์น˜ํ•˜๊ณ  ๋กœ์ปฌ ๋ชจ๋ธ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • count - ์„ ํƒ ์ˆ˜๋Ÿ‰, ๊ธฐ๋ณธ๊ฐ’ 1. ์–‘์„ฑ์ด ์•„๋‹Œ ๊ฒƒ์€ 1๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ตœ๋Œ€ 65535.
  • color - ์„ ํƒ ์‚ฌํ•ญ hue, ๊ธฐ๋ณธ๊ฐ’ 0; 0..65535๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • x โ€” ์„ ํƒ์  ์„ธ๊ณ„ ์ขŒํ‘œ, ๊ธฐ๋ณธ๊ฐ’ self; ๋ถ€์ •์ ์ธ ๊ฒƒ๋“ค์€ self๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ 0..65535๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. Z๋Š” ํ•ญ์ƒ ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด์ž…๋‹ˆ๋‹ค.Z.
  • y โ€” ์„ ํƒ์  ์„ธ๊ณ„ ์ขŒํ‘œ, ๊ธฐ๋ณธ๊ฐ’ self; ๋ถ€์ •์ ์ธ ๊ฒƒ๋“ค์€ self๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ 0..65535๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. Z๋Š” ํ•ญ์ƒ ํ˜„์žฌ ํ”Œ๋ ˆ์ด์–ด์ž…๋‹ˆ๋‹ค.Z.

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • CreateFakeItem์—๋Š” ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์œ ํšจํ•œ graphic/item serial์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. GetOrCreateItem์€ ๋กœ์ปฌ ๋ชจ๋ธ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์— ์žˆ์œผ๋ฉด ์—ฐ๊ฒฐ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ground ์ปจํ…Œ์ด๋„ˆ 0xFFFFFFFF, graphic/amount/hue/X/Y/Z, Layer.Invalid, AllowedToDraw=true ํ• ๋‹น, IsDamageable=false ๋ฐ IsMulti=false.
  • Legacy ๋ช…๋ น์€ ๋ฐ˜ํ™˜๋œ serial๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. 0๊ฐ€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒฝ์šฐ. ์„œ๋ฒ„๋Š” ์•„์ดํ…œ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ก์…˜์€ ์‹ค์ œ ์•„์ดํ…œ, ์ „๋ฆฌํ’ˆ ๋˜๋Š” ์–‘๋„ ๊ถŒํ•œ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด serial=0๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.MakeFakeItem");
UO.MakeFakeItem(0x0E21);

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

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

  • ๋กœ์ปฌ ํด๋ผ์ด์–ธํŠธ ํ•ญ๋ชฉ๋งŒ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
UO.MakeFakeItem(0x0E21);

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

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

  • CreateFakeItem์—๋Š” ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์œ ํšจํ•œ graphic/item serial์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. GetOrCreateItem์€ ๋กœ์ปฌ ๋ชจ๋ธ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์— ์žˆ์œผ๋ฉด ์—ฐ๊ฒฐ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ground ์ปจํ…Œ์ด๋„ˆ 0xFFFFFFFF, graphic/amount/hue/X/Y/Z, Layer.Invalid, AllowedToDraw=true ํ• ๋‹น, IsDamageable=false ๋ฐ IsMulti=false.
return  RunScenario();
 object? RunScenario()
{
    UO.MakeFakeItem(0x0E21, 0, 5, 0);
    return null;
}

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

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

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

     public object? RunScenario()
    {
        UO.MakeFakeItem(0x0E21, 0, 1, 0, UO.GetX(), UO.GetY());
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.MakeFakeItem(type) โ€” UO.MakeFakeItem(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "makefakeitem":

                {

                    int graphic = Arg(0);

                    int serial = Arg(1, 0);

                    int amount = Arg(2, 1);

                    int hue = Arg(3, 0);

                    int x = Arg(4, bridge.GetX(bridge.Self));

                    int y = Arg(5, bridge.GetY(bridge.Self));

                    int createdSerial = bridge.CreateFakeItem(graphic, serial, amount, hue, x, y);

                    if (createdSerial == 0)

                        SystemMessage("MakeFakeItem: invalid graphic/serial or no active player.");

                    break;

                }

UO.MakeFakeItem(type, serial) โ€” UO.MakeFakeItem(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "makefakeitem":

                {

                    int graphic = Arg(0);

                    int serial = Arg(1, 0);

                    int amount = Arg(2, 1);

                    int hue = Arg(3, 0);

                    int x = Arg(4, bridge.GetX(bridge.Self));

                    int y = Arg(5, bridge.GetY(bridge.Self));

                    int createdSerial = bridge.CreateFakeItem(graphic, serial, amount, hue, x, y);

                    if (createdSerial == 0)

                        SystemMessage("MakeFakeItem: invalid graphic/serial or no active player.");

                    break;

                }

UO.MakeFakeItem(type, serial, count) โ€” UO.MakeFakeItem(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), serial (Any), count (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "makefakeitem":

                {

                    int graphic = Arg(0);

                    int serial = Arg(1, 0);

                    int amount = Arg(2, 1);

                    int hue = Arg(3, 0);

                    int x = Arg(4, bridge.GetX(bridge.Self));

                    int y = Arg(5, bridge.GetY(bridge.Self));

                    int createdSerial = bridge.CreateFakeItem(graphic, serial, amount, hue, x, y);

                    if (createdSerial == 0)

                        SystemMessage("MakeFakeItem: invalid graphic/serial or no active player.");

                    break;

                }

UO.MakeFakeItem(type, serial, count, color) โ€” UO.MakeFakeItem(Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), serial (Any), count (Any), color (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "makefakeitem":

                {

                    int graphic = Arg(0);

                    int serial = Arg(1, 0);

                    int amount = Arg(2, 1);

                    int hue = Arg(3, 0);

                    int x = Arg(4, bridge.GetX(bridge.Self));

                    int y = Arg(5, bridge.GetY(bridge.Self));

                    int createdSerial = bridge.CreateFakeItem(graphic, serial, amount, hue, x, y);

                    if (createdSerial == 0)

                        SystemMessage("MakeFakeItem: invalid graphic/serial or no active player.");

                    break;

                }

UO.MakeFakeItem(type, serial, count, color, x) โ€” UO.MakeFakeItem(Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), serial (Any), count (Any), color (Any), x (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "makefakeitem":

                {

                    int graphic = Arg(0);

                    int serial = Arg(1, 0);

                    int amount = Arg(2, 1);

                    int hue = Arg(3, 0);

                    int x = Arg(4, bridge.GetX(bridge.Self));

                    int y = Arg(5, bridge.GetY(bridge.Self));

                    int createdSerial = bridge.CreateFakeItem(graphic, serial, amount, hue, x, y);

                    if (createdSerial == 0)

                        SystemMessage("MakeFakeItem: invalid graphic/serial or no active player.");

                    break;

                }

UO.MakeFakeItem(type, serial, count, color, x, y) โ€” UO.MakeFakeItem(Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), serial (Any), count (Any), color (Any), x (Any), y (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "makefakeitem":

                {

                    int graphic = Arg(0);

                    int serial = Arg(1, 0);

                    int amount = Arg(2, 1);

                    int hue = Arg(3, 0);

                    int x = Arg(4, bridge.GetX(bridge.Self));

                    int y = Arg(5, bridge.GetY(bridge.Self));

                    int createdSerial = bridge.CreateFakeItem(graphic, serial, amount, hue, x, y);

                    if (createdSerial == 0)

                        SystemMessage("MakeFakeItem: invalid graphic/serial or no active player.");

                    break;

                }

UO.MassMove

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

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

void UO.MassMove();
void UO.MassMove(object? delay);
void UO.MassMove(object? delay, object? quantity);
void UO.MassMove(object? delay, object? quantity, object? @type);
void UO.MassMove(object? delay, object? quantity, object? @type, object? destination);
void UO.MassMove(object? delay, object? quantity, object? @type, object? destination, object? x, object? y, object? z);

์„ ํƒํ•œ ์œ ํ˜•์˜ ํ•ญ๋ชฉ์„ ์ผํšŒ์„ฑ์œผ๋กœ ๋Œ€๋Ÿ‰ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MassMove๋ฅผ ํ™œ์„ฑํ™”ํ•œ ํ›„ ๋งˆ์šฐ์Šค๋กœ ์ ์ ˆํ•œ ํ•ญ๋ชฉ ํ•˜๋‚˜๋ฅผ ๋“œ๋ž˜๊ทธํ•˜๋ฉด ์†Œ์Šค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ์†Œ์Šค์—์„œ ์ด ์œ ํ˜•์˜ ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ์ž๋™์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ•ญ๋ชฉ์˜ ID๊ฐ€ ์•„๋‹Œ TYPE/Graphic์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์–‘์‹์—๋Š” ์ฒซ ๋ฒˆ์งธ ์ˆ˜๋™ ์ „์†ก์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ ๋ชฉ์ ์ง€๋Š” ์–ด๋””๋กœ ๊ฐˆ์ง€ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

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

  • delay โ€” ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ „์†ก ์š”์ฒญ ๊ฐ„ ์ง€์—ฐ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)์œผ๋กœ, 0๋ถ€ํ„ฐ 2147483647๊นŒ์ง€์˜ ์ •์ˆ˜์ž…๋‹ˆ๋‹ค. 350๋Š” 0,35์ดˆ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 0๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒŒ์ž„ ํ”„๋ ˆ์ž„๋‹น ๋‹ค์Œ ์บ๋ฆฌ๊ฐ€ ํ•˜๋‚˜๋งŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. GrabDelay์—๋Š” ์ง€์—ฐ์ด ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Œ์ˆ˜ ๊ฐ’์€ ๋ชจ๋“œ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ๋Œ€๊ธฐ์—ด์„ ์ง€์›๋‹ˆ๋‹ค. ๋„๋ ค๋ฉด ๋ช…ํ™•ํ•œ UO.MassMove() ํ‘œ๊ธฐ๊ฐ€ ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค.
  • quantity - ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ฒซ ๋ฒˆ์งธ ์ˆ˜๋™ ์ „์†ก์„ ํฌํ•จํ•œ ๊ฐœ๋ณ„ ํ•ญ๋ชฉ(ํ•ญ๋ชฉ)์˜ ์ด ํ•œ๋„์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์Šคํƒ/์Šคํƒ์€ ๋‚ด๋ถ€ ์ˆ˜๋Ÿ‰์— ๊ด€๊ณ„์—†์ด ํ•˜๋‚˜์˜ ํ’ˆ๋ชฉ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. 50๋Š” ์ตœ๋Œ€ 50 ์ „์ฒด ์Šคํƒ ๋˜๋Š” 50 ๋‹จ์ผ ํ•ญ๋ชฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ์€ ์ด ์ œํ•œ์œผ๋กœ ๋ถ„ํ• ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0 ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์Œ - ๋ชจ๋“  ์ ํ•ฉํ•œ ํ•ญ๋ชฉ. ์Œ์ˆ˜ ๊ฐ’์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • type - ์„ธ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์•„์ดํ…œ ์œ ํ˜• ์ฝ”๋“œ(๊ทธ๋ž˜ํ”ฝ/์œ ํ˜•), ์ •์ˆ˜ 0..65535(์˜ˆ: 0x0EED ๋˜๋Š” ๊ธˆ์˜ ๊ฒฝ์šฐ "0x0EED" ๋ฌธ์ž์—ด)์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ serial/ID๋„ ์•„๋‹ˆ๊ณ  ์ด๋ฆ„ AddObject๋„ ์•„๋‹™๋‹ˆ๋‹ค. 0 ์œ ๋ฌด์— ๋”ฐ๋ผ ์ฒซ ๋ฒˆ์งธ ์ˆ˜๋™ ์ „์†ก์œผ๋กœ ์œ ํ˜•์ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์  ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ์œ ํ˜•์„ ๋“œ๋ž˜๊ทธํ•ด๋„ ๋Œ€๊ธฐ์—ด์ด ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“œ๋Š” ์ ํ•ฉํ•œ ํ•ญ๋ชฉ์„ ๊ณ„์†ํ•ด์„œ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  • destination โ€” ๋„ค ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ชฉ์ ์ž…๋‹ˆ๋‹ค. ๊ฐ€์Šด ์ผ๋ จ๋ฒˆํ˜ธ(์ˆซ์ž/16์ง„์ˆ˜ ๋ฌธ์ž์—ด) ๋˜๋Š” ์ €์žฅ๋œ ์ด๋ฆ„ AddObject์€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. X/Y๋Š” ์ฐฝ ์•ˆ์ชฝ์— ์žˆ๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. backpack, self ๋ฐ my ํ˜„์žฌ ์บ๋ฆญํ„ฐ์˜ ๋ฐฐ๋‚ญ์„ ์„ ํƒํ•˜๊ณ  ๋ฐฐ๋‚ญ ๋‚ด๋ถ€์˜ ์ขŒํ‘œ๋„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ground ๋˜๋Š” 0 ํ† ์ง€ ์„ ํƒ: X/Y/Z - ์ง€๋„์˜ ์ ˆ๋Œ€ ์œ„์น˜, ์„ธ ๊ฐ€์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. lastcontainer โ€” ๋งˆ์ง€๋ง‰์œผ๋กœ ์—ด๋ฆฐ ์ปจํ…Œ์ด๋„ˆ; lastobject, lasttarget, lastcorpse, finditem, laststatus๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. receiving ๋ฐ catchbag๋Š” ์„ค์น˜๋œ SetCatchBag ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„ ํƒํ•˜๊ณ , ์„ค์น˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฐฑํŒฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. self/my ์—ฌ๊ธฐ์„œ๋Š” ๋ฐฐ๋‚ญ์„ ์˜๋ฏธํ•˜์ง€๋งŒ GetX(self)๋Š” ์บ๋ฆญํ„ฐ์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹์ฝ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ๋น„๊ต๋ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์•„์ง ์„ค์ •๋˜์ง€ ์•Š์€ ์ด๋ฆ„์€ ํ•ญ๋ชฉ์„ ๋•…์— ๋–จ์–ด๋œจ๋ฆฌ๋Š” ๋Œ€์‹  ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋Œ€์ƒ์ด ์—†์œผ๋ฉด ์ฒซ ๋ฒˆ์งธ ์ˆ˜๋™ ์žฌ์„ค์ •๋ถ€ํ„ฐ ์œ„์น˜๊ฐ€ ๊ธฐ์–ต๋ฉ๋‹ˆ๋‹ค. ์ƒ˜ํ”Œ์„ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ๋†“๊ฑฐ๋‚˜ ๋ฐ”๋‹ฅ์— ๋†“์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ตฌ์—๊ฒŒ๋Š” ์ฒซ ๋ฒˆ์งธ ์ดˆ๊ธฐํ™”์˜ ์„ธ๊ณ„ X/Y/Z๊ฐ€ ๊ธฐ์–ต๋ฉ๋‹ˆ๋‹ค.
  • x โ€” ๋‹ค์„ฏ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜. ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. -1 ๋˜๋Š” 65535๋Š” ์ž๋™ ๋ฐฐ์น˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ† ์ง€์˜ ๊ฒฝ์šฐ 0๋ถ€ํ„ฐ 65535๊นŒ์ง€์˜ ์ ˆ๋Œ€ ์ง€๋„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. X/Y/Z๊ฐ€ ์—†๋Š” ์–‘์‹์˜ ๊ฒฝ์šฐ -1๊ฐ€ ๋ช…์‹œ์  ์ปจํ…Œ์ด๋„ˆ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • y โ€” ์—ฌ์„ฏ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜. ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ์šฐ - ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ์ขŒํ‘œ, ์ž๋™ ๋ฐฐ์น˜์˜ ๊ฒฝ์šฐ -1/65535; ์ง€์ƒ์˜ ๊ฒฝ์šฐ - ์ ˆ๋Œ€ ์ง€๋„ ์ขŒํ‘œ 0..65535. ๋ช…์‹œ์  ์ปจํ…Œ์ด๋„ˆ์— ์ขŒํ‘œ๊ฐ€ ์—†๋Š” ์–‘์‹์˜ ๊ฒฝ์šฐ -1๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • z โ€” ์ผ๊ณฑ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋Œ€์ƒ ๋†’์ด, ์ •์ˆ˜ -128..127์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ 0๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ง€์ƒ์— ์‹ค์ œ ๋†’์ด๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์งง์€ ํ˜•์‹์—์„œ๋Š” ๋†’์ด์™€ X/Y๊ฐ€ ์ˆ˜๋™ ์ „์†ก์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void: ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. MassMove ํ™œ์„ฑํ™”๋Š” ์ˆ˜๋™ ํ™˜์Šน ๋Œ€๊ธฐ๋ฅผ ํ™œ์„ฑํ™”ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ด๊ณ„ ํ–‰์€ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜์—ฌ ์š”์ฒญ์ด ์ „์†ก๋œ ๊ฐœ๋ณ„ ํ•ญ๋ชฉ์˜ ์ˆ˜๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ์€ ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์„œ๋ฒ„์˜ ๊ฐ ์š”์ฒญ ์ˆ˜๋ฝ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • 0, 1, 2, 3, 4 ๋ฐ 7 ์ธ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ์–‘์‹์ด ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค. X/Y/Z๋Š” ํ•จ๊ป˜๋งŒ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. 5, 6 ๋˜๋Š” 8 ์ธ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ์–‘์‹์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ๋ฌธ: ์ง€์—ฐ, ์ˆ˜๋Ÿ‰, type, ๋ชฉ์ ์ง€, x, y, z.
  • BEFORE ๋งˆ์šฐ์Šค ์บก์ฒ˜ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜์‹ญ์‹œ์˜ค. ์ฒซ ๋ฒˆ์งธ ์ˆ˜๋™ ์ „์†ก์€ ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. 1000์˜ ์Šคํƒ์ด ์™„์ „ํžˆ ์ „์†ก๋˜๊ณ  ํ•œ๋„ 50์—์„œ ํ•œ ๊ณต๊ฐ„๋งŒ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”๋œ ๋ชจ๋“œ๋Š” ๋ถ„ํ•  ๋Œ€ํ™” ์ƒ์ž ์—†์ด ์ „์ฒด ์Šคํƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํฌํ•จํ•˜๊ธฐ ์ „์— ์Šคํƒ์˜ ์ผ๋ถ€๋ฅผ ๊ฐ€์ ธ์˜จ ๊ฒฝ์šฐ ์ „์†ก์ด ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ถ€๋ถ„์„ ๋‹ค์‹œ ๋„ฃ๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค.
  • ํ™œ์„ฑํ™” 1ํšŒ๋Š” ์ˆ˜๋™ ์ „์†ก 1ํšŒ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ƒ˜ํ”Œ์„ ์„ ํƒํ•œ ํ›„ ์„ ํƒ ๋ชจ๋“œ๊ฐ€ ๊บผ์ง‘๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ๋Œ€๊ธฐ์—ด์€ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ์—์„œ MoveItem์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ํ˜ธ์ถœ์€ ์ˆ˜๋™ ์ƒ˜ํ”Œ ์„ ํƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜ํ”ฝ ์œ ํ˜•์ด ๋น„๊ต๋ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—์„œ๋Š” ์ƒ‰์ƒ์ด ํ•„ํ„ฐ๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์†Œ์Šค ์ปจํ…Œ์ด๋„ˆ์˜ ์ง์ ‘ ์ฝ˜ํ…์ธ ๋งŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋™๋ด‰๋œ ๊ฐ€๋ฐฉ์€ ์—ด๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€๊ธฐ์—ด์ด ์ƒ์„ฑ๋œ ํ›„์— ๋‚˜ํƒ€๋‚˜๋Š” ์ƒˆ ํ•ญ๋ชฉ์€ ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒ˜ํ”Œ์ด ๋ฐ”๋‹ฅ์— ๋†“์—ฌ ์žˆ๋Š” ๊ฒฝ์šฐ ์บก์ฒ˜ ๋ฐ˜๊ฒฝ ๋‚ด์—์„œ ๋™์ผํ•œ ์œ ํ˜•์˜ ๋กœ๋“œ๋œ ๋ฌผ์ฒด๊ฐ€ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.
  • ์ˆ˜๋Ÿ‰์€ ์š”์ฒญ์˜ ์ƒํ•œ์„ ์ž…๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์„œ๋ฒ„์—์„œ ๊ฑฐ๋ถ€ํ•œ ์ „์†ก์„ ์ž๋™์œผ๋กœ ์žฌ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์žฅ์• , ๋ชฉ์ ์ง€ ์ด์šฉ ๋ถˆ๊ฐ€, ์บ๋ฆญํ„ฐ ์‚ฌ๋ง, ๋‹ค์Œ ์•„์ดํ…œ ํš๋“ ๋ถˆ๊ฐ€ ๋“ฑ์˜ ๊ฒฝ์šฐ ์ž‘์—…์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ปค์„œ๊ฐ€ ์‚ฌ์šฉ ์ค‘์ด๋ฉด ๋Œ€๊ธฐ์—ด์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์งˆ ๋•Œ๊นŒ์ง€ ์ตœ๋Œ€ 5์ดˆ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  • UO.MassMove() ๋ชจ๋“œ๋ฅผ ๋„๊ณ  ๋‚จ์€ ๋Œ€๊ธฐ์—ด์„ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค. UO.TerminateAll() ๋ฐ ์บ๋ฆญํ„ฐ ํƒˆํ‡ด๋„ ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์ „์†ก๋œ ์š”์ฒญ์€ ์ทจ์†Œ๋กœ ์ธํ•ด ๋กค๋ฐฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ๋Š” ๋ช…๋ น์ด ๋ฐ˜ํ™˜๋œ ํ›„ ํด๋ผ์ด์–ธํŠธ์— ์˜ํ•ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ์˜ ๋‹ค์Œ ์ค„์€ ์„œ๋ฒ„๊ฐ€ ์ด๋ฏธ ์ „์†ก์„ ์™„๋ฃŒํ–ˆ์Œ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์™„์ „ํžˆ ์ด์ „ํ•˜๋ ค๋ฉด EmptyContainer๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ํŠน์ • ํ’ˆ๋ชฉ ํ•˜๋‚˜๋ฅผ ์šด๋ฐ˜ํ•˜๋ ค๋ฉด - MoveItem. 8๊ฐœ์˜ ์ธ์ˆ˜ source, type, color, Destination, x, y, z, Delay๋Š” MassMove๊ฐ€ ์•„๋‹ˆ๋ผ MoveItems๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“œ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋งˆ์šฐ์Šค ๋“œ๋ž˜๊ทธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋™์ผํ•œ ๋ช…๋ น์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๋Œ€๊ธฐ๊ฐ€ ๊บผ์ง‘๋‹ˆ๋‹ค. ๋น„ํ™œ์„ฑํ™” MassMove/MassPriceMove๊ฐ€ ๊ฒŒ์ž„ ์ฐฝ์— ์ง์ ‘ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ํ˜ธ์ถœ์€ ๋ชจ๋“œ๋ฅผ ๋‹ค์‹œ ์ผญ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ „์†ก ํ›„ ์ธ์ˆ˜ ์—†๋Š” ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚˜๋จธ์ง€ ๋Œ€๊ธฐ์—ด์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์ „์†ก๋œ ์š”์ฒญ์€ ๋กค๋ฐฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.MassMove");
UO.MassMove(350, 0);

1. ์ˆ˜ ์ œํ•œ ์—†์ด ๋งˆ์šฐ์Šค ์ „์†ก ํ™œ์„ฑํ™” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ง€์—ฐ=350: ๋‹ค์Œ ์š”์ฒญ์€ ์ตœ์†Œ 350 ms๋งŒํผ ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ˆ˜๋Ÿ‰=0: ์ƒํ•œ ์‚ฌ์šฉ์ž ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • type, ๋ชฉ์ ์ง€ ๋ฐ X/Y/Z๋Š” ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. MassMove๋ฅผ ํ™œ์„ฑํ™”ํ•œ ํ›„ ์ƒ˜ํ”Œ์„ ๊ฐ€๋ฐฉ์—์„œ ์ƒ์ž๋กœ ๋“œ๋ž˜๊ทธํ•˜์„ธ์š”. ์œ ํ˜•๊ณผ ์†Œ์Šค๋Š” ์ƒ˜ํ”Œ์—์„œ ๊ฐ€์ ธ์˜ค๊ณ  ๋Œ€์ƒ์€ ๋“œ๋กญ ์œ„์น˜์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ์ƒ˜ํ”Œ์ด ๊ธˆ์ธ ๊ฒฝ์šฐ ๋™์ผํ•œ ์›๋ž˜ ์šฉ๊ธฐ์— ๋กœ๋“œ๋œ ๊ธˆ ๋”๋ฏธ๊ฐ€ ์ด๋™๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์œ ํ˜•์˜ ํ•ญ๋ชฉ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. Print๋Š” ํ›„์† ์ง์ ‘ ์กฐ์น˜๋งŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
UO.MassMove(350, 0);
UO.Print("Drag one sample item to the destination container");

2. 100์—์„œ 50 ์ „์ฒด ์Šคํƒ ์ „์†ก - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ง€์—ฐ์€ 350 ms๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์ด๊ณ„๋Š” ๋‘ ๋ฒˆ์งธ ์ˆ˜๋Ÿ‰ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋˜๊ณ  ์ „์ฒด ์—ฐ์‚ฐ 50์„ ๊ฐœ๋ณ„ ํ•ญ๋ชฉ์œผ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
  • ์†Œ์Šค์— ๋™์ผํ•œ ์œ ํ˜•์˜ 100 ์Šคํƒ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ 50 ์ „์ฒด ์Šคํƒ์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค(์ฒซ ๋ฒˆ์งธ ์ˆ˜๋™ ์Šคํƒ๊ณผ ๋‹ค๋ฅธ ์Šคํƒ 49). ๊ฐ ์Šคํƒ์—๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์–‘์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์นด์šดํ„ฐ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จํ’ˆ์ธ ๊ฒฝ์šฐ 50 ๋‹จํ’ˆ์œผ๋กœ ์ด์ „๋ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ์˜ต์…˜์€ ์—†์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์บก์ฒ˜ ๋ฐ ํ• ๋‹น์€ ํ˜ธ์ถœ ํ›„ ๋งˆ์šฐ์Šค๋กœ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var delay = 350;
    var total = 50;
    UO.MassMove(delay, total);
    return null;
}

3. ๊ธˆ ์ข…๋ฅ˜ ์„ ํƒ ๋ฐ ์ƒ์ž ๋ฏธ๋ฆฌ ์„ธํŒ… - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

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

  • goldType - TYPE ๊ณจ๋“œ, ID ๋ณ„๋„์˜ ์Šคํƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. AddObject๋Š” ๊ฐ€์Šด์˜ serial๋ฅผ ๊ฐ€์Šด์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. 0x40005678๋ฅผ ID๋กœ ๋ฐ”๊พธ์„ธ์š”.
  • ์ง€์—ฐ=350 ms, ์ˆ˜๋Ÿ‰=50 ๊ฐœ๋ณ„ ํ’ˆ๋ชฉ, type=0x0EED, ๋ชฉ์ ์ง€=๊ฐ€์Šด. ํ•œ๋„์—๋Š” ์ฒซ ๋ฒˆ์งธ ๋”๋ฏธ๊ฐ€ ํฌํ•จ๋˜๋ฉฐ 49 ์ดํ•˜์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ.
  • x=-1 ๋ฐ y=-1๋Š” ๊ฐ€์Šด์— ์ž๋™ ๋ฐฐ์น˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค(z=0). ์ด๋Š” ๋ชจ๋‘ 7๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ๊ธˆ์„ ์ˆ˜๋™์œผ๋กœ ๋“œ๋ž˜๊ทธํ•˜๋ฉด ๋Œ€๊ธฐ์—ด์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๊ทธ์˜ ์›๋ž˜ ๊ฐ€๋ฐฉ์ด ์†Œ์Šค๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ ์ƒ์ž๊ฐ€ ๋งˆ์šฐ์Šค ์žฌ์„ค์ • ์œ„์น˜๋ฅผ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์œ ํ˜•์˜ ํ•ญ๋ชฉ์€ ๋Œ€๊ธฐ์—ด์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 goldType = "0x0EED";
        UO.AddObject("chest", "0x40005678");
        UO.MassMove(350, 50, goldType, "chest", -1, -1, 0);
        UO.Print("Now drag one gold stack from the source bag");
        return null;
    }
}

4. ๋งˆ์šฐ์Šค๋กœ ์ƒ˜ํ”Œ์„ ์„ ํƒํ•˜๋˜ ์‚ฌ์ „์— ๊ธฐ๋ฐ˜์„ ์„ค์ • - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ง€์—ฐ=350 ms, ์ˆ˜๋Ÿ‰=0 โ€” ๋ชจ๋“  ์ ํ•ฉํ•œ ํ•ญ๋ชฉ. type=0๋Š” ํ–ฅํ›„ ์ˆ˜๋™ ์ „์†ก์—์„œ ์œ ํ˜•์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ๋ชฉ์ ์ง€=0๋Š” ํ† ์ง€๋ฅผ ์˜๋ฏธํ•˜๋ฏ€๋กœ ์ „์ฒด ์‚ผ์ค‘ x,y,z๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. GetX/GetY/GetZ ์—ฌ๊ธฐ์„œ๋Š” ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœ ํ›„ ๋งˆ์šฐ์Šค๋กœ ์ƒ˜ํ”Œ์„ ์ง‘์–ด์„œ ๋–จ์–ด๋œจ๋ฆฝ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋งˆ์šฐ์Šค๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ์œ„์— ์žˆ๋”๋ผ๋„ ํ•ด๋‹น ํ•ญ๋ชฉ๊ณผ ์ผ์น˜ํ•˜๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์„ ์ง€์ •๋œ ์ขŒํ‘œ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ํ† ์ง€์˜ ๊ฐ€์šฉ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
UO.MassMove(350, 0, 0, 0, x, y, z);

5. ์•Œ๋ ค์ง„ ์œ ํ˜•์˜ ํ•ญ๋ชฉ์„ ์ตœ๋Œ€ 10๊ฐœ๊นŒ์ง€ ๋ฐฐ๋‚ญ์œผ๋กœ ์ด๋™ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • Delay=500 โ€” 0.5์ดˆ; ์ˆ˜๋Ÿ‰=10 - ์ „์ฒด ์ž‘์—…์— ๋Œ€ํ•œ 10๊ฐœ์˜ ๊ฐœ๋ณ„ ํ•ญ๋ชฉ/์Šคํƒ.
  • type=0x0F7A โ€” ํ•ญ๋ชฉ์˜ ๊ทธ๋ž˜ํ”ฝ ์œ ํ˜•. ๊ท€ํ•˜์˜ ์œ ํ˜•์„ ํ‘œ์‹œํ•ด ์ฃผ์‹ญ์‹œ์˜ค. 0x40001234 ํ˜•์‹์˜ ์ผ๋ จ๋ฒˆํ˜ธ๋Š” ์—ฌ๊ธฐ์— ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ชฉ์ ์ง€=backpack โ€” ์บ๋ฆญํ„ฐ์˜ ๋ฐฐ๋‚ญ. ์ขŒํ‘œ๋Š” ์ „์†ก๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ทธ ๋‚ด๋ถ€์—๋Š” x=-1, y=-1, z=0๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์†Œ์Šค๋Š” ๋จผ์ € ์ ์ ˆํ•œ ํ•ญ๋ชฉ์„ ์ˆ˜๋™์œผ๋กœ ์ „์†กํ•˜์—ฌ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์†Œ์Šค๊ฐ€ ์ด๋ฏธ ๋ฐฐ๋‚ญ์ธ ๊ฒฝ์šฐ ์œ ์šฉํ•˜๊ฒŒ ํœด๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์†Œ์Šค ๊ฐ€๋ฐฉ์„ ์„ ํƒํ•˜์„ธ์š”.
return  RunScenario();
 object? RunScenario()
{
    UO.MassMove(500, 10, "0x0F7A", "backpack");
    UO.Print("Drag one matching item from the source chest");
    return null;
}

6. ์ด๋ฏธ ๋†“์—ฌ ์žˆ๋Š” ์•„์ดํ…œ์„ ๊ธฐ์ค€์œผ๋กœ ์ƒ์ž ์•ˆ์˜ ์žฅ์†Œ๋ฅผ ์„ ํƒํ•˜์„ธ์š” - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • ๋จผ์ €, ๊ฐ€์Šด์˜ ์›ํ•˜๋Š” ์œ„์น˜์— ํ•ญ๋ชฉ์„ ์ˆ˜๋™์œผ๋กœ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ AddObject๋Š” ๊ฐ€์Šด ์ž์ฒด๋ฅผ ์„ ํƒํ•˜๊ณ  ์ด๋ฅผ ๊ฐ€์Šด์— ID ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ๊ทธ ์•ˆ์— ์žˆ๋Š” ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜๊ณ  position_sample์— ID๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ํ•ญ๋ชฉ์˜ GetX/GetY๋Š” ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ์ขŒํ‘œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์Šด ์ฐฝ์ด ํ™”๋ฉด์—์„œ ์–ด๋””์— ์œ„์น˜ํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ง€์—ฐ=350 ms, ์ˆ˜๋Ÿ‰=50 ์ •์ˆ˜ ํ•ญ๋ชฉ, type=0 ์†Œ์Šค์—์„œ ํ–ฅํ›„ ์ˆ˜๋™ ์ „์†ก์— ์˜ํ•ด ๊ฒฐ์ •๋จ, ๋Œ€์ƒ=chest.
  • x์™€ y๋Š” ๊ฐ€์Šด ๋‚ด๋ถ€์˜ ์„ ํƒ๋œ ์œ„์น˜๋ฅผ ์ •์˜ํ•˜๋ฉฐ, ๋งˆ์ง€๋ง‰ z=0์ž…๋‹ˆ๋‹ค. position_sample ๊ฐ์ฒด๋Š” ์ขŒํ‘œ๋ฅผ ์ฝ๋Š” ์—ญํ• ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋˜๋Š” ์†Œ์Šค์™€ ์œ ํ˜•์€ ํ›„์† ์ˆ˜๋™ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐ๋‚ญ์˜ ๊ฒฝ์šฐ ๊ฐ€์Šด์„ backpack ๋˜๋Š” self๋กœ ๋ฐ”๊พธ์„ธ์š”. ์œก์ง€์˜ ๊ฒฝ์šฐ ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ์œ„์น˜์— ๋Œ€ํ•œ ์ธ์ˆ˜ ์—†์ด ground ๋ฐ UO.GetX(), UO.GetY(), UO.GetZ()์™€ ๊ฐ™์€ ์ง€๋„ ์ขŒํ‘œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
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.Print("Select the destination chest");
        UO.AddObject("chest");
        UO.Print("Select an item already at the desired position inside that chest");
        UO.AddObject("position_sample");
        var x = UO.GetX("position_sample");
        var y = UO.GetY("position_sample");
        UO.MassMove(350, 50, 0, "chest", x, y, 0);
        UO.Print("Drag one source item to start the transfer");
        return null;
    }
}

7. ๊ฐ€์Šด์—์„œ ๋•…๋ฐ”๋‹ฅ๊นŒ์ง€: ๋งˆ์šฐ์Šค๋กœ ์žฅ์†Œ ์„ ํƒ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ง€์—ฐ=350 โ€” ํ›„์† ์š”์ฒญ ์‚ฌ์ด์— ์ตœ์†Œ 350ms๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์ˆ˜๋Ÿ‰=50 - ์ƒ˜ํ”Œ์„ ํฌํ•จํ•˜์—ฌ ์ตœ๋Œ€ 50 ๊ฐœ๋ณ„ ํ•ญ๋ชฉ/์ „์ฒด ์Šคํƒ; ์ด๋Š” ๋™์ผํ•œ ์Šคํƒ์˜ 50 ์žฅ์น˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • MassMove๋ฅผ ํ™œ์„ฑํ™”ํ•œ ํ›„ ์—ด๋ฆฐ ์ƒ์ž์—์„œ ์•„์ดํ…œ์„ ์ง‘์–ด ๋งˆ์šฐ์Šค๋กœ ๋ฐ”๋‹ฅ์— ๋†“์Šต๋‹ˆ๋‹ค. ๊ทธ ์œ ํ˜•๊ณผ ์›๋ž˜ ๊ฐ€์Šด์€ ํŒจํ„ด์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ์„ธ๊ณ„ X/Y/Z ๋ชฉ์ ์ง€๋Š” ์ด ์žฌ์„ค์ • ์œ„์น˜์— ๊ธฐ์–ต๋ฉ๋‹ˆ๋‹ค.
  • ์ด ์ƒ์ž์—์„œ ๋กœ๋“œ๋œ ๋™์ผํ•œ ์œ ํ˜•์˜ ๋‚˜๋จธ์ง€ ์•„์ดํ…œ์€ ์ง€์ƒ์˜ ๋™์ผํ•œ ์ง€์ ์œผ๋กœ ๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค. ์ค‘์ฒฉ๋œ ๊ฐ€๋ฐฉ ๋ฐ ๊ธฐํƒ€ ์œ ํ˜•์˜ ๋‚ด์šฉ๋ฌผ์€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์— ๋Œ€ํ•ด 50๋ฅผ 0๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • MassMove์—๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋œ ํ›„ ์ ˆ์ฐจ๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ๋Œ€๊ธฐ์—ด์€ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ข… ๋ฉ”์‹œ์ง€์—๋Š” ์„œ๋ฒ„ ํ™•์ธ์ด ์•„๋‹Œ ์ „์†ก๋œ ์š”์ฒญ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋‚จ์€ ๋Œ€๊ธฐ์—ด์„ ์ทจ์†Œํ•˜๋ ค๋ฉด UO.MassMove()๋ฅผ ํ˜ธ์ถœํ•˜์„ธ์š”.
UO.MassMove(350, 50);
UO.Print("Drag one item from the chest onto the ground");

๋ช…๋ น ๊ตฌํ˜„

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

UO.MassMove() โ€” UO.MassMove()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "massmove":

                    if (arguments.Length == 0) bridge.MassMove(-1, 0, 0, -1, -1, -1, 0);

                    else bridge.MassMove(NumberConversions.ToInt(arguments[0]),

                        arguments.Length > 1 ? NumberConversions.ToInt(arguments[1]) : 0,

                        arguments.Length > 2 ? ResolveType(arguments[2]) : 0,

                        arguments.Length > 3 ? ResolveTransferDestination(arguments[3], true) : -1,

                        arguments.Length > 4 ? NumberConversions.ToInt(arguments[4]) : -1,

                        arguments.Length > 5 ? NumberConversions.ToInt(arguments[5]) : -1,

                        arguments.Length > 6 ? NumberConversions.ToInt(arguments[6]) : 0);

                    break;

UO.MassMove(delay) โ€” UO.MassMove(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "massmove":

                    if (arguments.Length == 0) bridge.MassMove(-1, 0, 0, -1, -1, -1, 0);

                    else bridge.MassMove(NumberConversions.ToInt(arguments[0]),

                        arguments.Length > 1 ? NumberConversions.ToInt(arguments[1]) : 0,

                        arguments.Length > 2 ? ResolveType(arguments[2]) : 0,

                        arguments.Length > 3 ? ResolveTransferDestination(arguments[3], true) : -1,

                        arguments.Length > 4 ? NumberConversions.ToInt(arguments[4]) : -1,

                        arguments.Length > 5 ? NumberConversions.ToInt(arguments[5]) : -1,

                        arguments.Length > 6 ? NumberConversions.ToInt(arguments[6]) : 0);

                    break;

UO.MassMove(delay, quantity) โ€” UO.MassMove(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "massmove":

                    if (arguments.Length == 0) bridge.MassMove(-1, 0, 0, -1, -1, -1, 0);

                    else bridge.MassMove(NumberConversions.ToInt(arguments[0]),

                        arguments.Length > 1 ? NumberConversions.ToInt(arguments[1]) : 0,

                        arguments.Length > 2 ? ResolveType(arguments[2]) : 0,

                        arguments.Length > 3 ? ResolveTransferDestination(arguments[3], true) : -1,

                        arguments.Length > 4 ? NumberConversions.ToInt(arguments[4]) : -1,

                        arguments.Length > 5 ? NumberConversions.ToInt(arguments[5]) : -1,

                        arguments.Length > 6 ? NumberConversions.ToInt(arguments[6]) : 0);

                    break;

UO.MassMove(delay, quantity, type) โ€” UO.MassMove(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: delay (Any), quantity (Any), type (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "massmove":

                    if (arguments.Length == 0) bridge.MassMove(-1, 0, 0, -1, -1, -1, 0);

                    else bridge.MassMove(NumberConversions.ToInt(arguments[0]),

                        arguments.Length > 1 ? NumberConversions.ToInt(arguments[1]) : 0,

                        arguments.Length > 2 ? ResolveType(arguments[2]) : 0,

                        arguments.Length > 3 ? ResolveTransferDestination(arguments[3], true) : -1,

                        arguments.Length > 4 ? NumberConversions.ToInt(arguments[4]) : -1,

                        arguments.Length > 5 ? NumberConversions.ToInt(arguments[5]) : -1,

                        arguments.Length > 6 ? NumberConversions.ToInt(arguments[6]) : 0);

                    break;

UO.MassMove(delay, quantity, type, destination) โ€” UO.MassMove(Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: delay (Any), quantity (Any), type (Any), destination (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "massmove":

                    if (arguments.Length == 0) bridge.MassMove(-1, 0, 0, -1, -1, -1, 0);

                    else bridge.MassMove(NumberConversions.ToInt(arguments[0]),

                        arguments.Length > 1 ? NumberConversions.ToInt(arguments[1]) : 0,

                        arguments.Length > 2 ? ResolveType(arguments[2]) : 0,

                        arguments.Length > 3 ? ResolveTransferDestination(arguments[3], true) : -1,

                        arguments.Length > 4 ? NumberConversions.ToInt(arguments[4]) : -1,

                        arguments.Length > 5 ? NumberConversions.ToInt(arguments[5]) : -1,

                        arguments.Length > 6 ? NumberConversions.ToInt(arguments[6]) : 0);

                    break;

UO.MassMove(delay, quantity, type, destination, x, y, z) โ€” UO.MassMove(Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: delay (Any), quantity (Any), type (Any), destination (Any), x (Any), y (Any), z (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "massmove":

                    if (arguments.Length == 0) bridge.MassMove(-1, 0, 0, -1, -1, -1, 0);

                    else bridge.MassMove(NumberConversions.ToInt(arguments[0]),

                        arguments.Length > 1 ? NumberConversions.ToInt(arguments[1]) : 0,

                        arguments.Length > 2 ? ResolveType(arguments[2]) : 0,

                        arguments.Length > 3 ? ResolveTransferDestination(arguments[3], true) : -1,

                        arguments.Length > 4 ? NumberConversions.ToInt(arguments[4]) : -1,

                        arguments.Length > 5 ? NumberConversions.ToInt(arguments[5]) : -1,

                        arguments.Length > 6 ? NumberConversions.ToInt(arguments[6]) : 0);

                    break;
โš ๏ธ **GitHub.com Fallback** โš ๏ธ