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
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
UO.AddObject ยท UO.AddType ยท UO.EasyObject ยท UO.UserObject ยท UO.LastObject ยท UO.Forget
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
var ok = UO.MoveItem("loot");
UO.Print("Move request: " + Convert.ToString(ok));๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
UO.MassMove(350, 0);
UO.Print("Drag one sample item to the destination container");ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.AddObject(object? name);
void UO.AddObject(object? name, object? objectRawId);๋์ค์ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ช ๋ช ๋ serial ๊ฐ์ฒด๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ ๊ฐ์ ์ธ์ ํ์์ ๊ฐ์ฒด๋ฅผ ์ฆ์ ์ง์ ํฉ๋๋ค. ๋จ์ผ ์ธ์๋ ์ปค์๋ก ๊ฐ์ฒด๋ฅผ ์ ํํ๋๋ก ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
-
name๋ ๋ฐํ์์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋น์ด ์์ง ์์ ์ด๋ฆ์ ๋๋ค. -
objectRawId- serial ๋๋ ์ด๋ฏธ ์ ์ฅ๋ ๊ฐ์ฒด ์ด๋ฆ์ ๋๋ค. ๋จ์ผ ์ธ์ ์ค๋ฒ๋ก๋๋ ์ด ๋งค๊ฐ ๋ณ์๋ฅผ ํ์ฉํ์ง ์์ง๋ง ๋์ ๊ฐ์ฒด ์ ํ์ ์์ฒญํฉ๋๋ค.
void. ์ด๋ฆ๋ณ๋ก ๊ฐ์ฒด๋ฅผ ์ฝ์ด์ ์ ์ฅ๋ ๋ฐ์ธ๋ฉ์ ํ์ธํ์ธ์. ํธ์ถ์ด serial๋ก ๋ฐํ๋์ง ์์ต๋๋ค.
- ๋ ๊ฐ์ ์ธ์๊ฐ ์ฃผ์ด์ง๋ฉด ๋ฐํ์์
objectRawId๋ฅผ ํ์ธํ๊ณ serial๋ฅผname์๋์ ์ ์ฅํฉ๋๋ค. ํ๋์ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ๋ ๊ฐ์ฒด ์ ํ์ ์์ฒญํฉ๋๋ค. ์ฆ, ํญ๋ชฉ ๋๋ mobile์ด ์ ํ๋์ง๋ง ์นด๋ ์ ์ ์ ํ๋์ง ์์ต๋๋ค. ์ ํํ๊ธฐ ์ ์ ๋์ผํ ์ด๋ฆ์ ์ด์ ๋ฐ์ธ๋ฉ์ด ์ญ์ ๋ฉ๋๋ค. ์ปค์๋ฅผ ์ทจ์ํ๊ฑฐ๋ ์์ด๋ ์ปค์๊ฐ ๋ณต์๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.AddObject");
UO.AddObject("target");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๋ ค์ง ํญ๋ชฉ์ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: name (String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.AddObject. -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage($"What is {name}"). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.AddObject:bridge.AddObject(name).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void AddObject(string name)
{
SystemMessage($"What is {name}");
bridge.AddObject(name);
}๋งค๊ฐ๋ณ์: name (Any), objectRawId (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.AddObject. -
InjectionScript.Runtime.InjectionApiUO.ObjectChecked:ObjectChecked(objectRawId, id => AddObject((string)name, id)). -
InjectionScript.Runtime.InjectionApiUO.AddObject:AddObject((string)name, id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void AddObject(InjectionValue name, InjectionValue objectRawId)
=> ObjectChecked(objectRawId, id => AddObject((string)name, id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ํํฐ๋ ์ฌ์ ์๋์ง ์์ต๋๋ค.
- ๊ทธ๋ํฝ๋ง ์ ์ฅ๋๋ฉฐ ์์, ์๋, ์ปจํ ์ด๋, ํญ๋ชฉ ์ด๋ฆ, ๋ ์ด์ด ๋๋ ์์ฑ์ ์ ์ฅ๋์ง ์์ต๋๋ค. ์์์ด ๋ค๋ฅธ ๋์ผํ ์ ํ์ ๋ ํญ๋ชฉ์ ๊ฒ์ ์ ๋ณ๋์ ์์์ด ํ์ํฉ๋๋ค. ํญ๋ชฉ์ ํญ๋ชฉ์ด ํ์ฌ ์กด์ฌํ๋์ง, ์ฌ์ฉ ๊ฐ๋ฅํ์ง ๋๋ ์๋ฒ๊ฐ ํด๋น ์์ ์ ํ์ฉํ๋์ง ํ์ธํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.AddType");
UO.AddType("my_tool");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฌธ์์ด ๋ฒํธ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: name (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.AddType:AddType(arguments).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "addtype":
AddType(arguments);
break;๋งค๊ฐ๋ณ์: name (Any), type (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.AddType:AddType(arguments).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "addtype":
AddType(arguments);
break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ClickOnObject(object? objID);GameActions.SingleClick๋ฅผ ํตํด ๊ฐ์ฒด์ ๋ํ ๋จ์ผ ํด๋ฆญ์ ๋ณด๋ ๋๋ค.
-
objIDโ self/backpack/lasttarget/์ ์ฅ๋ ๊ฐ์ฒด์ ๊ฐ์ฒด ์ผ๋ จ๋ฒํธ ๋๋ ์ง์๋๋ ์ด๋ฆ์ ๋๋ค. ์ซ์ ๋ฌธ์์ด๊ณผ 0x ๋ฌธ์์ด์ ๋ฐํ์์ ์ํด ํด๊ฒฐ๋ฉ๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- Click๋ ObjectChecked๋ฅผ ํตํด ๋งํฌ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ClickOnObject๋ ๋จผ์ serial์ Arg๋ฅผ ์ฌ์ฉํ๊ณ Click(int)๋ฅผ ํธ์ถํฉ๋๋ค. ์ด๋ DoubleClick ๋๋ ์์ดํ ์ฌ์ฉ์ด ์๋ ์์ดํ ์ ์๋ช /์ ๋ณด์ ๋ํ ์์ฒญ์ ๋๋ค. ์๋ฒ ์๋ต์ ๋น๋๊ธฐ์ ์ผ๋ก ์ ๊ณต๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ClickOnObject");
UO.ClickOnObject("self");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ ๋ฒ์ ํด๋ฆญ์ self๋ก ์ ์ก๋ฉ๋๋ค.
UO.ClickOnObject("self");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์กํ๊ธฐ ์ ์ ๋์์ ๋ก์ปฌ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฐฐ๋ญ์ ํ ๋ฒ ํด๋ฆญํ๋ฉด ๋ ๋ฒ ํด๋ฆญํ๋ ๊ฒ์ฒ๋ผ ์ด๋ฆฌ์ง ์์ต๋๋ค.
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.Click:Click(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "clickonobject": Click(Arg(0)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.DeleteObject(object? name);๋ฐํ์ ํ ์ด๋ธ์์ ์ ์ฅ๋ ๊ฐ์ฒด ์ด๋ฆ์ ์ ๊ฑฐํฉ๋๋ค.
-
name- string ๊ฐ์ฒด ํ ์ด๋ธ์ ์ด๋ฆ์ ๋๋ค. ์ด ํญ๋ชฉ๋ง ์ญ์ ๋ฉ๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ์ด๋ฆ์ด ๋ฐ๊ฒฌ๋๋ฉด ํญ๋ชฉ์ ์ญ์ ํ๊ณ ํ์ธ ๋ฉ์์ง๋ฅผ ์ธ์ํฉ๋๋ค. ์ด๋ฆ์ด ์์ผ๋ฉด ์ฐพ์ ์ ์๋ค๋ ๋ฉ์์ง๋ฅผ ์ธ์ํฉ๋๋ค. ์๋ฒ ๊ฐ์ฒด์ ํด๋น ๋ด์ฉ์ ์ญ์ ๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.DeleteObject");
UO.DeleteObject("temporary");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํด๋น ์บ๋ฆญํฐ์ serial์์ ์์ ์ฐ๊ฒฐ๋ง ํด์ ๋ฉ๋๋ค.
UO.AddObject("temporary",UO.Self());
UO.DeleteObject("temporary");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด๋ฆ์ด ๋๋ฝ๋๋ฉด ์ง๋จ ๋ฉ์์ง๊ฐ ๋ํ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.DeleteObject("missing-example-name");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: name (String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.DeleteObject. -
InjectionScript.Runtime.State.RuntimeDictionary.TryGet:objects.TryGet(name, out int value). -
InjectionScript.Runtime.State.RuntimeDictionary.Remove:objects.Remove(name). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage($"Object {name} has been deleted").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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");
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ๋ง์ฐ์ค ์ด๋ฒคํธ(์ด๋, ๋๋ฅด๊ธฐ, ์ด๋, ๋๊ธฐ)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์๋ฒ ํ์ธ์ด ์์ผ๋ฉฐ ์ฐฝ์ ์ค์ ๋ด์ฉ/์ด์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
- ์ฌ์ฉ ์ค์ธ ์ปค์๋ ๋์์ผ๋ก์ ์ฑ๊ณต์ ์ธ ์ ์ก๊ณผ ๊ฐ์ง ์์ต๋๋ค. ์บก์ฒ์ ๋ฆด๋ฆฌ์ค๋ ๋ณ๋์ ์์ ์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Drag("lasttarget");
UO.Print("Drag: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ๋ฆฌํ - 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ๋์ ์ธ์ 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;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฐฝ ํฝ์ ์ ์์(100,120), ๋(260,180)์ ๋๋ค. serial, ๊ธ์ก ๋๋ ์๊ฐ ์ด๊ณผ๊ฐ ์์ต๋๋ค.
- ์ํ๋ ์์๊ฐ ์ด ์์น์ ์์ ๋๋ง ์ฌ์ฉํ์ญ์์ค. ๊ฐ์ฒด์ ๊ฒฝ์ฐ serial๋ก ์ฃผ์๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ๋ ์์ ์ ์ ๋๋ค.
UO.Drag(100, 120, 260, 180);C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: id (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Drag. -
InjectionScript.Runtime.InjectionApiUO.Drag:Drag(id, InjectionValue.Zero, InjectionValue.Zero).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Drag(InjectionValue id) => Drag(id, InjectionValue.Zero, InjectionValue.Zero);๋งค๊ฐ๋ณ์: id (Any), amount (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Drag. -
InjectionScript.Runtime.InjectionApiUO.Drag:Drag(id, amount, InjectionValue.Zero).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Drag(InjectionValue id, InjectionValue amount) => Drag(id, amount, InjectionValue.Zero);๋งค๊ฐ๋ณ์: id (Any), amount (Any), timeout (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Drag. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(amount). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.DragItem:bridge.DragItem(serial, requestedAmount). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Picking:bridge.Picking(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Wait:bridge.Wait(10). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage($"UO.Drag: item pickup was not observable within {timeoutMs} ms.").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;
}๋งค๊ฐ๋ณ์: fromX (Integer), fromY (Integer), toX (Integer), toY (Integer)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Drag. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Drag:bridge.Drag(fromX, fromY, toX, toY).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void Drag(int fromX, int fromY, int toX, int toY) => bridge.Drag(fromX, fromY, toX, toY);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค์ ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any), count (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.DragItem:bridge.DragItem(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "dragitem": return new InjectionValue(bridge.DragItem(Arg(0), Arg(1)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ๋ฐ ์๋ฒ ์ ๊ฒ ์ ํ์ด ์ ์ฉ๋ฉ๋๋ค. ํ์์๋ ๋ณ๋์ ๋ฐฐ์ก ํ์ธ์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Drop("lasttarget");
UO.Print("Drop: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- object=AddObject๋ฅผ ํตํ ์ ๋ฆฌํ, ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์=0.
- ๋ชฉ์ ์ง - ์บ๋ฆญํฐ๊ฐ ํ์ฌ ์ง์์ ์๋ ์ง์ ์ ๋๋ค.
var ok = UO.Drop("loot");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- count=5 ํ ์คํ์ ๋จ์; ๋ชฉ์ ์ง=backpack.
- ์ฌ๊ธฐ์ ์ธ ๋ฒ์งธ ์ธ์๋ X๊ฐ ์๋ ์ปจํ ์ด๋์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var ok = UO.Drop("loot", 5, "backpack");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: object (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.MoveItem:MoveItem(arguments[0], arguments.Length > 1 ? arguments[1] : InjectionValue.Zero, arguments.Length > 2 ? arguments[2] : new InjectionValue("ground")).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;๋งค๊ฐ๋ณ์: object (Any), count (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.MoveItem:MoveItem(arguments[0], arguments.Length > 1 ? arguments[1] : InjectionValue.Zero, arguments.Length > 2 ? arguments[2] : new InjectionValue("ground")).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;๋งค๊ฐ๋ณ์: object (Any), count (Any), destination (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.MoveItem:MoveItem(arguments[0], arguments.Length > 1 ? arguments[1] : InjectionValue.Zero, arguments.Length > 2 ? arguments[2] : new InjectionValue("ground")).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;๋งค๊ฐ๋ณ์: objID (Any), count (Any), x (Any), y (Any), z (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.MoveItemChecked:MoveItemChecked(Arg(0), Arg(1), 0, Arg(2), Arg(3), Arg(4)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "drop": return new InjectionValue(MoveItemChecked(Arg(0), Arg(1), 0, Arg(2), Arg(3), Arg(4)) ? 1 : 0);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.DropCheckCoord();
dynamic UO.DropCheckCoord(object? value);์์ดํ ์ ๋ ์ ๋จ์ด๋จ๋ฆด ๋ ์ขํ ๋ฒ์ ํ์ธ์ ์ฝ๊ฑฐ๋ ๋ณ๊ฒฝํฉ๋๋ค.
-
valueโ ์ ํ ๊ฐ: 0 ๋นํ์ฑํ, 0์ด ์๋ int ํ์ฑํ. ์ธ์๊ฐ ์์ผ๋ฉด ์ํ๋ ์ฝ๊ธฐ๋ง ๋ฉ๋๋ค.
int 0/1 โ ๊ฐ๋ฅํ ๋ นํ ํ ํ์ฌ ์ํ; ๋ ํ์ ๋ชจ๋ ์ซ์๋ฅผ ๋ฐํํฉ๋๋ค.
- MoveItemChecked ์ง๋ฉด์ ํ ๋น๋๊ณ ํ๋๊ทธ๊ฐ ์ผ์ง๋ฉด ์บ๋ฆญํฐ๋ก๋ถํฐ 2 ์ ๋ณด๋ค ํฐ ์ฒด๋น์ผํ X/Y ๊ฑฐ๋ฆฌ๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค. ํ์ธ์ ์ขํ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ์๋ฒ ์ ์ก ๊ถํ์ ํ์ธํ์ง ์์ต๋๋ค. ์ปจํ ์ด๋ ํ ๋น์ ์ด ํ๋๊ทธ๋ก ์ ํ๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.DropCheckCoord();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฝ๊ธฐ๋ ํ์ฌ ํ์คํ๋ ์ค์ ์ ๋ฐํํฉ๋๋ค.
var enabled = UO.DropCheckCoord();
UO.Print(Convert.ToString(enabled));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- MoveItemChecked๋ฅผ ํตํ ์ง์ ์ด๋์ ์ด์ ๋ ๊ฐ์ ์ฌ๊ฐํ์ผ๋ก ์ ํ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var enabled = UO.DropCheckCoord(1);
UO.Print(Convert.ToString(enabled));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๋ ๊ฐ์ ๋ช ์์ ์ผ๋ก ์ ์ฅ๋๊ณ ๋ณต์๋ฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var old = UO.DropCheckCoord();
var temporary = UO.DropCheckCoord(0);
var restored = UO.DropCheckCoord(old);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "dropcheckcoord":
if (arguments.Length > 0) state.DropCheckCoord = Arg(0) != 0 ? 1 : 0;
return new InjectionValue(state.DropCheckCoord);๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "dropcheckcoord":
if (arguments.Length > 0) state.DropCheckCoord = Arg(0) != 0 ? 1 : 0;
return new InjectionValue(state.DropCheckCoord);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.DropDelay();
dynamic UO.DropDelay(object? value);์์ดํ ์ ์ก์ ์ฌ์ฉ๋๋ GrabDelay ๋ฐํ์ ์ง์ฐ์ ์ฝ๊ฑฐ๋ ๋ณ๊ฒฝํฉ๋๋ค.
-
valueโ ๋ฐ๋ฆฌ์ด ๋จ์์ ์ ํ์ ์ง์ฐ; ํ๊ณ๋ฅผ 50..10000๋ก ์ ํํฉ๋๋ค.
์ธ์ int๊ฐ ์๊ณ ํ์ฌ GrabDelay๊ฐ ์์ต๋๋ค. ๋ ์์ ๋ชจ๋์ ๋ฉํ๋ฐ์ดํฐ์ object?๊ฐ ํฌํจ๋์ด ์์ง๋ง ํญ๋ชฉ ์์์ null๋ฅผ ๋ฐํํฉ๋๋ค.
- SetDropDelay ๋ฐ GetDropDelay๋ ์ํ๋ฅผ ์ฌ์ฉํฉ๋๋ค. GrabDelay. ์ด ์ค์ ์ ์๋ฒ์์ ์ ์ก ์๋ฃ๋ฅผ ํ์ธํ๋ ๋์ ํด๋ผ์ด์ธํธ ์ ์ก ์ง์ฐ์ ์ง์ ํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.DropDelay();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฝ๊ธฐ๋ ๋ฐ๋ฆฌ์ด๋ฅผ ๋ฐํํฉ๋๋ค.
var ms = UO.DropDelay();
UO.Print(Convert.ToString(ms));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํญ๋ชฉ์ 250 ms๋ฅผ ์ค์ ํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.DropDelay(250);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetDropDelay:bridge.SetDropDelay(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDropDelay:bridge.GetDropDelay().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "dropdelay":
if (arguments.Length > 0) { bridge.SetDropDelay(Arg(0)); return InjectionValue.Unit; }
return new InjectionValue(bridge.GetDropDelay());๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetDropDelay:bridge.SetDropDelay(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDropDelay:bridge.GetDropDelay().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "dropdelay":
if (arguments.Length > 0) { bridge.SetDropDelay(Arg(0)); return InjectionValue.Unit; }
return new InjectionValue(bridge.GetDropDelay());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๊ฐ ํ์ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.DropHere(UO.LastTarget());
UO.Print("DropHere: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- object - serial, ์ค์ ๋ก ๋์ฒดํฉ๋๋ค.
- ์ ์ฒด ์คํ์ด ์บ๋ฆญํฐ๋ก ์ ์ก๋ฉ๋๋ค.
var ok = UO.DropHere(0x40001234);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ๋ฆฌํ์ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: object (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.MoveItem:MoveItem(arguments[0], arguments.Length > 1 ? arguments[1] : InjectionValue.Zero, new InjectionValue("ground"), new InjectionValue(GetX()), new InjectionValue(GetY()), new InjectionValue(GetZ())). -
InjectionScript.Runtime.InjectionApiUO.GetX:GetX(). -
InjectionScript.Runtime.InjectionApiUO.GetY:GetY(). -
InjectionScript.Runtime.InjectionApiUO.GetZ:GetZ().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๋ฅผ ์ค์ ํ๋ฉด ์คํฌ๋ฆฝํธ ํ๋ฆ์ ์ผ์ ์ค์ง๊ฐ ์ถ๊ฐ๋ฉ๋๋ค. ๋ฐ๋ฉ ํ ์๋ฒ ์ฅ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ด์ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: moveIntoID (Any), x (Any), y (Any), z (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.DropDraggedItem:bridge.DropDraggedItem(Arg(0), Arg(1), Arg(2), Arg(3)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "dropitem": return new InjectionValue(bridge.DropDraggedItem(Arg(0), Arg(1), Arg(2), Arg(3)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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)๋ฅผ ํธ์ถํฉ๋๋ค. ๋จ์ผ ์ธ์ ํ์์ ์ฃผ์ด๋ง ์ฌ์ฉํฉ๋๋ค. ์ด๋ ์กฐ์น๋ฅผ ๋ณด๋ด๋ ๊ฒ์ ๋๋ค. ์์, ์์๊ถ, ํฉ๊ณ๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Dye");
UO.Dye(UO.LastObject());๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จ์ผ ์ธ์ ํธ์ถ์ ๋์์ ์ง์ ํ์ง ์์ต๋๋ค.
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ์์์๋ ์ด์ ์ ์ ์ฅ๋ ์ด๋ฆ์ธ ์ผ๋ฃ์ ์ฒ์ ์ฌ์ฉํฉ๋๋ค.
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: dyeObject (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WaitTargetObject:bridge.WaitTargetObject(Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseObject:bridge.UseObject(Arg(0, bridge.GetLastObject())). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLastObject:bridge.GetLastObject().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "dye":
if (arguments.Length > 1) bridge.WaitTargetObject(Arg(1));
bridge.UseObject(Arg(0, bridge.GetLastObject()));
break;๋งค๊ฐ๋ณ์: dyeObject (Any), target (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WaitTargetObject:bridge.WaitTargetObject(Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseObject:bridge.UseObject(Arg(0, bridge.GetLastObject())). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLastObject:bridge.GetLastObject().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "dye":
if (arguments.Length > 1) bridge.WaitTargetObject(Arg(1));
bridge.UseObject(Arg(0, bridge.GetLastObject()));
break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.EasyObject(object? name);
void UO.EasyObject(object? name, object? @object);๋ํํ ๋์ ์ฟผ๋ฆฌ ์์ด ๊ฐ์ฒด ์ด๋ฆ์ ์ ์ฅํฉ๋๋ค.
-
nameโ string๋ก ํ์ธ๋๋ ๋ฐํ์ ๊ฐ์ฒด ํญ๋ชฉ์ ์ด๋ฆ์ ๋๋ค. -
object- ์ ํ์ฌํญ serial/๋งํฌ. ๊ทธ๋ ์ง ์์ผ๋ฉด GetLastObject๊ฐ ๋ณด์กด๋ฉ๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- State.Objects.Set๋ ์ด๋ฆ ํญ๋ชฉ์ ๋์ฒดํฉ๋๋ค. ๋จ์ผ ์ธ์ ํ์์ LastTarget ๋์ ๋ง์ง๋ง์ผ๋ก ์ฌ์ฉ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ถ๊ธฐ์์๋ ์ธ๊ณ์ ๊ฐ์ฒด๊ฐ ์๋์ง ๋ณ๋๋ก ํ์ธํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.EasyObject");
UO.EasyObject("last-used");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด๋ฆ์ ํ์ฌ LastObject์ ๋ถ์ฌ๋ฉ๋๋ค.
UO.EasyObject("last-used");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ๊ฐ์ ์ธ์ ํ์์ ์ ๋ฌ๋ serial๋ฅผ ์ ์งํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.EasyObject("me", UO.Self());
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: name (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.State.RuntimeDictionary.Set:state.Objects.Set(Text(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Text:Text(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLastObject:bridge.GetLastObject().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;๋งค๊ฐ๋ณ์: name (Any), object (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.State.RuntimeDictionary.Set:state.Objects.Set(Text(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Text:Text(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLastObject:bridge.GetLastObject().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๋ฅผ ๋ฐํํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ง์ฐ=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;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;
}
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Delay=500 โ 0.5์ด ๊ฐ๊ฒฉ. source=lastcontainer - ์ด ํด๋ผ์ด์ธํธ์์ ์๋ฒ๊ฐ ์ฐ ๋ง์ง๋ง ์ปจํ ์ด๋์ ๋๋ค.
- ๋ชฉ์ ์ง - ๊ฐ์ด์ ๋ช ์์ ์ธ ID; ์๋ฅผ ๊ต์ฒดํ์ญ์์ค. lastcontainer ๋ฐ lastobject๋ ๋ง์ง๋ง์ผ๋ก ์ด๋ฆฐ ์ปจํ ์ด๋์ ๋ง์ง๋ง์ผ๋ก ์ฌ์ฉ๋ ๊ฐ์ฒด๋ผ๋ ์๋ฏธ๊ฐ ๋ค๋ฆ ๋๋ค.
- ์์ํ๊ธฐ ์ ์ ๋ง์ง๋ง์ผ๋ก ์ด์ด๋ณธ ์์ค๊ฐ ํ์ํ ์์ค์ธ์ง ํ์ธํ์ธ์. ์บ๋ฆฌ๋ ์ค์ฒฉ๋ ๋ฐฑ์ ์ฌ๊ท์ ์ผ๋ก ์ด์ง ์์ต๋๋ค.
var destination = "0x40005678";
UO.EmptyContainer(500, "lastcontainer", destination);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ง์ฐ=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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: delay (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteEmptyContainer:ExecuteEmptyContainer(arguments).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "emptycontainer": return ExecuteEmptyContainer(arguments);๋งค๊ฐ๋ณ์: delay (Any), source (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteEmptyContainer:ExecuteEmptyContainer(arguments).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "emptycontainer": return ExecuteEmptyContainer(arguments);๋งค๊ฐ๋ณ์: delay (Any), source (Any), destination (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteEmptyContainer:ExecuteEmptyContainer(arguments).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "emptycontainer": return ExecuteEmptyContainer(arguments);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ๋๋ ๋ค๋ฅธ ์์ ํ์ ๊ฐ์ฒด์ ํด๋น ํ๋๊ทธ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Exists("backpack");
UO.Print("Exists: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: id (Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Exists. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Exists:bridge.Exists(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Exists(int id) => bridge.Exists(id);๋งค๊ฐ๋ณ์: id (Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Exists. -
InjectionScript.Runtime.InjectionApiUO.Exists:Exists(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Exists(string id) => Exists(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Forget(object? name);๋ฉ์์ง ์์ด ๋ฐํ์ ๊ฐ์ฒด์์ ์ ์ฅ๋ ์ด๋ฆ์ ์ ๊ฑฐํฉ๋๋ค.
-
nameโ string๋ก ๋ณํ๋๋ ํญ๋ชฉ ์ด๋ฆ์ ๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- ๋ถ๊ธฐ๋ state.Objects.Remove๋ฅผ ํธ์ถํฉ๋๋ค. DeleteObject์ ๋ฌ๋ฆฌ ์ด ์์์ ํ์ธ์ ์ธ์ํ๊ฑฐ๋ ๋๋ฝ๋ ์ด๋ฆ์ ๋ณด๊ณ ํ์ง ์์ต๋๋ค. ๊ฒ์ ์๋ ๊ฐ์ฒด๋ ์ญ์ ๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Forget");
UO.Forget("temporary");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- serial์์ ์ด๋ฆ ์ฐ๊ฒฐ๋ง ์ ๊ฑฐ๋ฉ๋๋ค.
UO.EasyObject("temporary",UO.Self());
UO.Forget("temporary");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฉ์์ง ์์ด ๋๋ฝ๋ ์ด๋ฆ์ด ํ์ฉ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Forget("missing-example-name");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ญ์ ๋ ์ ํํ ์ด๋ฆ ๋ฌธ์์ด์ ์ฐธ์กฐํฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var name = "temporary";
UO.EasyObject(name, UO.Self());
UO.Forget(name);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: name (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.State.RuntimeDictionary.Remove:state.Objects.Remove(Text(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Text:Text(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "forget": if (arguments.Length > 0) state.Objects.Remove(Text(0)); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ๊ฒ์ฌ๋ ๊ฐ์ฒด๊ฐ ๋ก๋๋์๋์ง ์ฌ๋ถ๋ผ๋ ๋ ๋ค๋ฅธ ์ง๋ฌธ์ ๋ตํฉ๋๋ค.
- ์ด ๊ตฌํ์์๋ ๋์ฒด ์ด๋ฆ์ด ์บ๋ฆญํฐ์ ์ ๋ชฉ ํ๋์ ๋งคํ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetAltName("self");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ObjID=self โ ํ์ฌ ํด๋ผ์ด์ธํธ์ ๋ฌธ์์ ๋๋ค.
- ์ ๋ชฉ์๋ ์ ๋ชฉ๋ง ํฌํจ๋ฉ๋๋ค. ๋น ํ๋๋ ์คํฌ๋ฆฝํธ ์ค๋ฅ๋ฅผ โโ์๋ฏธํ์ง ์์ต๋๋ค.
var title = UO.GetAltName("self");
UO.Print(title);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetAltName:bridge.GetAltName(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getaltname": return new InjectionValue(bridge.GetAltName(Arg(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ํน์ ๋์์ ์กฐ๊ฑด์ ํ์ธํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetColor("lastobject");
UO.Print("GetColor: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- id=lastobject - ๋ง์ง๋ง์ผ๋ก ์ฌ์ฉ๋ ๊ฐ์ฒด์ ๋๋ค.
- ๊ฒฐ๊ณผ๋ ์ด๋ฏธ 16์ง์ ๋ฌธ์์ด์ด๋ฏ๋ก Int2Hex๊ฐ ํ์ํ์ง ์์ต๋๋ค.
var hue = UO.GetColor("lastobject");
UO.Print(hue);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetColor. -
InjectionScript.Runtime.InjectionApiUO.GetColor:GetColor(new InjectionValue(bridge.Self)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetColor() => GetColor(new InjectionValue(bridge.Self));๋งค๊ฐ๋ณ์: id (Any)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetColor. -
InjectionScript.Runtime.NumberConversions.ToHex:NumberConversions.ToHex((short)bridge.GetColor(GetObject(id))). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetColor:bridge.GetColor(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetColor(InjectionValue id) => NumberConversions.ToHex((short)bridge.GetColor(GetObject(id)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetFlags(object? id);์๋ ค์ง ๋ก์ปฌ ๊ฐ์ฒด์์ Entity.Flags ๋นํธ๋ง์คํฌ๋ฅผ ์ฝ์ต๋๋ค.
-
idโ self/backpack/lasttarget/์ ์ฅ๋ ๊ฐ์ฒด์ ๊ฐ์ฒด ์ผ๋ จ๋ฒํธ ๋๋ ์ง์๋๋ ์ด๋ฆ์ ๋๋ค. ์ซ์ ๋ฌธ์์ด๊ณผ 0x ๋ฌธ์์ด์ ๋ฐํ์์ ์ํด ํด๊ฒฐ๋ฉ๋๋ค.
int - ์๋ณธ Entity.Flags. ์ ์ ์๊ฑฐ๋ ๋๋ฝ๋ ์ํฐํฐ๊ฐ 0๋ฅผ ๋ฐํํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ ผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์๋๋ผ ๋ง์คํฌ์ ๋๋ค.
- GetObject๊ฐ ๋งํฌ๋ฅผ ํ์ธํ ๋ค์ bridge.World.Get์ด ๊ฒ์ ์คํธ๋ฆผ์์ Entity.Flags๋ฅผ ์ฝ์ต๋๋ค. null ๊ฐ์ ํ๋๊ทธ๋ ๋ชจ๋ธ์ด ์๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ ์ ์์ต๋๋ค. Exists๋ ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ด ๋ช ๋ น์ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetFlags("self");
UO.Print("GetFlags: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ์บ๋ฆญํฐ์ ๋ง์คํฌ๊ฐ ํ์๋ฉ๋๋ค.
var flags = UO.GetFlags("self");
UO.Print(Convert.ToString(flags));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: id (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetFlags. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetFlags:bridge.GetFlags(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetFlags(InjectionValue id) => bridge.GetFlags(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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)๋ฅผ ํตํด ๊ฐ์ฒด๊ฐ ์๋์ง ํ์ธํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetGraphic();
UO.Print("GetGraphic: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ ์๋ ํ์์์๋ self๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- body๋ serial์ด ์๋ ์บ๋ฆญํฐ์ ์ธ๋ชจ์ ๋ํ ์ฝ๋์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var body = UO.GetGraphic();
UO.Print("Body graphic: " + body);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetGraphics. -
InjectionScript.Runtime.InjectionApiUO.GetGraphics:GetGraphics(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetGraphics() => GetGraphics(bridge.Self);๋งค๊ฐ๋ณ์: id (Integer/String)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetGraphics. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetGraphics:bridge.GetGraphics(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetGraphics(int id) => $"0x{bridge.GetGraphics(id):X4}";๋งค๊ฐ๋ณ์: id (Integer/String)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetGraphics. -
InjectionScript.Runtime.InjectionApiUO.GetGraphics:GetGraphics(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetGraphics(string id) => GetGraphics(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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)๋ฅผ ํตํด ๊ฐ์ฒด๊ฐ ์๋์ง ํ์ธํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetLayer("backpack");
UO.Print("GetLayer: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetLayer. -
InjectionScript.Runtime.InjectionApiUO.GetLayer:GetLayer(new InjectionValue(bridge.Self)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetLayer() => GetLayer(new InjectionValue(bridge.Self));๋งค๊ฐ๋ณ์: id (Any)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetLayer. -
InjectionScript.Runtime.InjectionApiUO.ConvertLayer:ConvertLayer(bridge.GetLayer(GetObject(id))). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLayer:bridge.GetLayer(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetLayer(InjectionValue id) => ConvertLayer(bridge.GetLayer(GetObject(id)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ๋์ผํ ํ๋๊ทธ๋ฅผ ์ฝ์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetLocked("self");
UO.Print("GetLocked: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: id (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetLocked. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLocked:bridge.GetLocked(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetLocked(InjectionValue id) => bridge.GetLocked(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ํน์ ๋์์ ์กฐ๊ฑด์ ํ์ธํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetName();
UO.Print("GetName: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์์ผ๋ฉด self๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ ์ด๋ฆ ํ ์คํธ์ด๋ฉฐ ์ง์ ํ์๋ ์ ์์ต๋๋ค.
var name = UO.GetName();
UO.Print(name);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetName. -
InjectionScript.Runtime.InjectionApiUO.GetName:GetName("self").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetName() => GetName("self");๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: string / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getname":
case "charname": return new InjectionValue(bridge.GetName(Arg(0, bridge.Self)));๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetName(int id) => bridge.GetName(id);๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetName. -
InjectionScript.Runtime.InjectionApiUO.GetName:GetName(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetName(string id) => GetName(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ํน์ ๋์์ ์กฐ๊ฑด์ ํ์ธํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetQuantity("lastobject");
UO.Print("GetQuantity: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetQuantity:bridge.GetQuantity(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getquantity": return new InjectionValue(bridge.GetQuantity(Arg(0)));๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetQuantity. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetQuantity:bridge.GetQuantity(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetQuantity(int id) => bridge.GetQuantity(id);๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetQuantity. -
InjectionScript.Runtime.InjectionApiUO.GetQuantity:GetQuantity(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetQuantity(string id) => GetQuantity(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ์๋์ผ๋ก ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetSerial();
UO.Print("GetSerial: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋งค๊ฐ๋ณ์๊ฐ ์์ผ๋ฉฐ self๊ฐ ์ ํ๋์์ต๋๋ค.
- serial โ 16์ง์ ๋ฌธ์์ด. 0x00000000 ๊ฐ์ serial ๋ฌธ์๊ฐ ์์์ ์๋ฏธํฉ๋๋ค.
var serial = UO.GetSerial();
UO.Print(serial);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetSerial. -
InjectionScript.Runtime.NumberConversions.ToHex:NumberConversions.ToHex(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetSerial() => NumberConversions.ToHex(bridge.Self);๋งค๊ฐ๋ณ์: id (String)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetSerial. -
InjectionScript.Runtime.NumberConversions.ToHex:NumberConversions.ToHex(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetSerial(string id) => NumberConversions.ToHex(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๋ฅผ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetTooltip("backpack");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTooltip:bridge.GetTooltip(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getcliloc":
case "gettooltip":
return new InjectionValue(bridge.GetTooltip(Arg(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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, ๋งค๊ฐ๋ณ์).
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetTooltipRec("lasttarget");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ํจ - 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: dynamic / Array.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTooltipRecords:bridge.GetTooltipRecords(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetType(object? objID);ํญ๋ชฉ์ ์ซ์ graphic ๋๋ ๋ฌธ์์ body๋ฅผ ์ฝ์ต๋๋ค.
int - ์์ดํ ์ graphic/type ๋๋ ์บ๋ฆญํฐ์ body(์: ๊ณจ๋์ ๊ฒฝ์ฐ 0x0EED (3821)). ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ ์์ผ๋ฉด 0 ๊ฐ์ด ๋ฐํ๋ฉ๋๋ค. GetType๋ serial ๋๋ "0x..." ํ ์คํธ๋ฅผ ๋ฐํํ์ง ์์ต๋๋ค. ๋ฌธ์์ด ํ์์ GetGraphic๋ก ์ ๊ณต๋ฉ๋๋ค.
- ์ด ๋ช ๋ น์ ํด๋ผ์ด์ธํธ์ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ๋์์ ๋ณด๋ด์ง ์์ผ๋ฉฐ ์๋ฒ์ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
- ์ซ์ 0๋ ์ ํจํ ๋ฐ์ดํฐ ๊ฐ์ผ ์ ์์ต๋๋ค. ํด๋น ์์ฑ ๊ฐ๋ฟ๋ง ์๋๋ผ Exists(serial)๋ฅผ ํตํด ๊ฐ์ฒด๊ฐ ์๋์ง ํ์ธํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetType("lastobject");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ObjID="backpack" - ํ์ฌ ๋ฐฐ๋ญ.
- Convert.ToString๋ ์ถ๋ ฅ์ ์ํด ๋ฐํ๋ ์ซ์์ ํ์์ ์ง์ ํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var graphic = UO.GetType("backpack");
UO.Print("Backpack type: " + Convert.ToString(graphic));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๋ฌธ์์ด 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetGraphics:bridge.GetGraphics(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "gettype": return new InjectionValue(bridge.GetGraphics(Arg(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๊ฐ ๋ฐ์ํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Grab();
UO.Print("Grab: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ง์ ๋/์์ ์ปจํ ์ด๋๋ก ํญ๋ชฉ์ ์ ์กํ๊ฑฐ๋ ํญ๋ชฉ ์ ํ์ ์ฝ๋๋ค.
var accepted = UO.Grab();
UO.Print(accepted);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ง๋ ฌ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Grab. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.RequestInteractiveGrabTarget:bridge.RequestInteractiveGrabTarget().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Grab() => bridge.RequestInteractiveGrabTarget();๋งค๊ฐ๋ณ์: id (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Grab. -
InjectionScript.Runtime.InjectionApiUO.CompactGrab:CompactGrab(new[] { id }).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Grab(InjectionValue id) => CompactGrab(new[] { id });๋งค๊ฐ๋ณ์: amount (Any/Integer/String), id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.CompactGrab:CompactGrab(arguments).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "grab": return new InjectionValue(CompactGrab(arguments));๋งค๊ฐ๋ณ์: amount (Any/Integer/String), id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Grab. -
InjectionScript.Runtime.InjectionApiUO.CompactGrab:CompactGrab(new[] { new InjectionValue(amount), new InjectionValue(id) }).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Grab(int amount, int id) => CompactGrab(new[] { new InjectionValue(amount), new InjectionValue(id) });๋งค๊ฐ๋ณ์: amount (Any/Integer/String), id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Grab. -
InjectionScript.Runtime.InjectionApiUO.CompactGrab:CompactGrab(new[] { new InjectionValue(amount), new InjectionValue(id) }).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Grab(int amount, string id) => CompactGrab(new[] { new InjectionValue(amount), new InjectionValue(id) });๋งค๊ฐ๋ณ์: amount (Any/Integer/String), id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Grab. -
InjectionScript.Runtime.InjectionApiUO.CompactGrab:CompactGrab(new[] { new InjectionValue(amount), new InjectionValue(id) }).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Grab(string amount, string id) => CompactGrab(new[] { new InjectionValue(amount), new InjectionValue(id) });๋งค๊ฐ๋ณ์: amount (Any), item (Any), container (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [Grab]. -
InjectionScript.Runtime.InjectionApiUO.CompactGrab:CompactGrab(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactGrab(values))๋งค๊ฐ๋ณ์: amount (Any), item (Any), container (Any), timeout (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [Grab]. -
InjectionScript.Runtime.InjectionApiUO.CompactGrab:CompactGrab(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactGrab(values))ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ์ค๋ช ํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsMovable(UO.GetSerial("lastobject"));
UO.Print("IsMovable: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- item โ ๋ง์ง๋ง์ผ๋ก ์ฌ์ฉํ ์์ดํ ์ serial. ์์ง์ผ ์ ์๋ ์๋ ๊ทธ ์๋์ด ์๋๋๋ค.
- ์ด ์์ ์์๋ ์๋ฌด๊ฒ๋ ์ ํํ์ง ์์ผ๋ฉฐ ์๋ฒ์ ์๋ฌด๊ฒ๋ ๋ณด๋ด์ง ์์ต๋๋ค.
var item = UO.GetSerial("lastobject");
var movable = UO.IsMovable(item);
UO.Print("Locally movable 1/0: " + Convert.ToString(movable));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ง์์ ์๋ ์์ดํ ์ ๊ฒฝ์ฐ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsMovable:bridge.IsMovable(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "ismovable": return new InjectionValue(bridge.IsMovable(Arg(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ๋๋ ๋ค๋ฅธ ์์ ํ์ ๊ฐ์ฒด์ ํด๋น ํ๋๊ทธ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsObjectExists("backpack");
UO.Print("IsObjectExists: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Exists:bridge.Exists(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "isobjectexists": return new InjectionValue(bridge.Exists(Arg(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.LastObject();๋ง์ง๋ง์ผ๋ก ์ฌ์ฉํ ๊ฐ์ฒด์ serial๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ์ ์ฅ๋จ serial; 0์ serial์ด ์ค์น๋์ง ์์์์ ์๋ฏธํฉ๋๋ค. bool๋ ์๋๊ณ graphic/type๋ ์๋๋๋ค. 0์ด ์๋ ID๋ ์ธ์์ ๋ ์ด์ ์กด์ฌํ์ง ์์ ์ ์์ต๋๋ค.
- ํ๋ ์์ค: _world.LastObject. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ์ ํํ๊ฑฐ๋ ์ฌ์ฉํ๊ฑฐ๋ ๊ณต๊ฒฉํ์ง ์์ต๋๋ค.
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.LastObject();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ง์ง๋ง์ผ๋ก ์ฌ์ฉํ ๊ฐ์ฒด์ serial๋ฅผ ์ฝ์ต๋๋ค.
var id = UO.LastObject();
UO.Print(Hex(id));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ๋ ์์ค: _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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLastObject:bridge.GetLastObject().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "lastobject": return new InjectionValue(bridge.GetLastObject());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๋ฅผ ๊ทธ๋๋ก ๋ก๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.MakeFakeItem");
UO.MakeFakeItem(0x0E21);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ก์ปฌ ํด๋ผ์ด์ธํธ ํญ๋ชฉ๋ง ์์ฑํ๊ฑฐ๋ ์์ ํฉ๋๋ค.
UO.MakeFakeItem(0x0E21);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: type (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CreateFakeItem:bridge.CreateFakeItem(graphic, serial, amount, hue, x, y). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("MakeFakeItem: invalid graphic/serial or no active player."). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;
}๋งค๊ฐ๋ณ์: type (Any), serial (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CreateFakeItem:bridge.CreateFakeItem(graphic, serial, amount, hue, x, y). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("MakeFakeItem: invalid graphic/serial or no active player."). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;
}๋งค๊ฐ๋ณ์: type (Any), serial (Any), count (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CreateFakeItem:bridge.CreateFakeItem(graphic, serial, amount, hue, x, y). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("MakeFakeItem: invalid graphic/serial or no active player."). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;
}๋งค๊ฐ๋ณ์: type (Any), serial (Any), count (Any), color (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CreateFakeItem:bridge.CreateFakeItem(graphic, serial, amount, hue, x, y). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("MakeFakeItem: invalid graphic/serial or no active player."). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;
}๋งค๊ฐ๋ณ์: type (Any), serial (Any), count (Any), color (Any), x (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CreateFakeItem:bridge.CreateFakeItem(graphic, serial, amount, hue, x, y). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("MakeFakeItem: invalid graphic/serial or no active player."). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;
}๋งค๊ฐ๋ณ์: type (Any), serial (Any), count (Any), color (Any), x (Any), y (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CreateFakeItem:bridge.CreateFakeItem(graphic, serial, amount, hue, x, y). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("MakeFakeItem: invalid graphic/serial or no active player."). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๊ฐ ๊ฒ์ ์ฐฝ์ ์ง์ ๋ํ๋ฉ๋๋ค. ๋ค์ ํธ์ถ์ ๋ชจ๋๋ฅผ ๋ค์ ์ผญ๋๋ค. ์ฒซ ๋ฒ์งธ ์ ์ก ํ ์ธ์ ์๋ ํ์์ ์ฌ์ฉํ์ฌ ๋๋จธ์ง ๋๊ธฐ์ด์ ์ค์งํฉ๋๋ค. ์ด๋ฏธ ์ ์ก๋ ์์ฒญ์ ๋กค๋ฐฑ๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.MassMove");
UO.MassMove(350, 0);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ง์ฐ=350: ๋ค์ ์์ฒญ์ ์ต์ 350 ms๋งํผ ๋ถ๋ฆฌ๋ฉ๋๋ค. ์๋=0: ์ํ ์ฌ์ฉ์ ์ ํ์ด ์์ต๋๋ค.
- type, ๋ชฉ์ ์ง ๋ฐ X/Y/Z๋ ์ ์ก๋์ง ์์ต๋๋ค. MassMove๋ฅผ ํ์ฑํํ ํ ์ํ์ ๊ฐ๋ฐฉ์์ ์์๋ก ๋๋๊ทธํ์ธ์. ์ ํ๊ณผ ์์ค๋ ์ํ์์ ๊ฐ์ ธ์ค๊ณ ๋์์ ๋๋กญ ์์น์์ ๊ฐ์ ธ์ต๋๋ค.
- ์ํ์ด ๊ธ์ธ ๊ฒฝ์ฐ ๋์ผํ ์๋ ์ฉ๊ธฐ์ ๋ก๋๋ ๊ธ ๋๋ฏธ๊ฐ ์ด๋๋ฉ๋๋ค. ๋ค๋ฅธ ์ ํ์ ํญ๋ชฉ์ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค. Print๋ ํ์ ์ง์ ์กฐ์น๋ง ์ค๋ช ํฉ๋๋ค.
UO.MassMove(350, 0);
UO.Print("Drag one sample item to the destination container");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ง์ฐ์ 350 ms๋ก ์ค์ ๋ฉ๋๋ค. ์ด๊ณ๋ ๋ ๋ฒ์งธ ์๋ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋๊ณ ์ ์ฒด ์ฐ์ฐ 50์ ๊ฐ๋ณ ํญ๋ชฉ์ผ๋ก ์ ํํฉ๋๋ค.
- ์์ค์ ๋์ผํ ์ ํ์ 100 ์คํ์ด ํฌํจ๋ ๊ฒฝ์ฐ 50 ์ ์ฒด ์คํ์ด ์ ์ก๋ฉ๋๋ค(์ฒซ ๋ฒ์งธ ์๋ ์คํ๊ณผ ๋ค๋ฅธ ์คํ 49). ๊ฐ ์คํ์๋ ์๋ก ๋ค๋ฅธ ์์ด ํฌํจ๋ ์ ์์ต๋๋ค. ์นด์ดํฐ์๋ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. ๋จํ์ธ ๊ฒฝ์ฐ 50 ๋จํ์ผ๋ก ์ด์ ๋ฉ๋๋ค.
- ๋ค๋ฅธ ์ต์ ์ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์บก์ฒ ๋ฐ ํ ๋น์ ํธ์ถ ํ ๋ง์ฐ์ค๋ก ์ ํ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var delay = 350;
var total = 50;
UO.MassMove(delay, total);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;
}
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ง์ฐ=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);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;
}
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ง์ฐ=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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MassMove:bridge.MassMove(-1, 0, 0, -1, -1, -1, 0). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(arguments[2]). -
InjectionScript.Runtime.InjectionApiUO.ResolveTransferDestination:ResolveTransferDestination(arguments[3], true).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;๋งค๊ฐ๋ณ์: delay (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MassMove:bridge.MassMove(-1, 0, 0, -1, -1, -1, 0). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(arguments[2]). -
InjectionScript.Runtime.InjectionApiUO.ResolveTransferDestination:ResolveTransferDestination(arguments[3], true).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;๋งค๊ฐ๋ณ์: delay (Any), quantity (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MassMove:bridge.MassMove(-1, 0, 0, -1, -1, -1, 0). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(arguments[2]). -
InjectionScript.Runtime.InjectionApiUO.ResolveTransferDestination:ResolveTransferDestination(arguments[3], true).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;๋งค๊ฐ๋ณ์: delay (Any), quantity (Any), type (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MassMove:bridge.MassMove(-1, 0, 0, -1, -1, -1, 0). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(arguments[2]). -
InjectionScript.Runtime.InjectionApiUO.ResolveTransferDestination:ResolveTransferDestination(arguments[3], true).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;๋งค๊ฐ๋ณ์: delay (Any), quantity (Any), type (Any), destination (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MassMove:bridge.MassMove(-1, 0, 0, -1, -1, -1, 0). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(arguments[2]). -
InjectionScript.Runtime.InjectionApiUO.ResolveTransferDestination:ResolveTransferDestination(arguments[3], true).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MassMove:bridge.MassMove(-1, 0, 0, -1, -1, -1, 0). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(arguments[2]). -
InjectionScript.Runtime.InjectionApiUO.ResolveTransferDestination:ResolveTransferDestination(arguments[3], true).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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;