KO UO Topic containers - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
๋ด์ฉ์ ์ฝ๊ณ ๋์ ์ปจํ ์ด๋๋ฅผ ์ด๊ณ ์ ํํฉ๋๋ค. ๋ซํ ์๊ฑฐ๋ ์์ง ๋ก๋๋์ง ์์ ์ปจํ ์ด๋๋ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ฒด ํญ๋ชฉ ๋ชฉ๋ก์ ์ ๊ณตํ์ง ์์ต๋๋ค.
| ์ฃผ์ | ๋ช ๋ น ๋ฐ ์ค๋ช |
|---|---|
| Backpack | UO.Backpack |
| Bank | UO.ObjAtLayerEx ยท UO.OpenContainer |
| OpenContainer | UO.OpenContainer |
| LastContainer | UO.LastContainer |
| ContainerOf | UO.ContainerOf ยท UO.GetParent |
| IsContainer | UO.IsContainer |
| ์ค์ฒฉ๋ ์ปจํ ์ด๋ | UO.GetContent ยท UO.FindTypeEx ยท UO.FindTypesArrayEx |
| Receiving Container | UO.SetReceivingContainer ยท UO.UnsetReceivingContainer |
| Catch Bag | UO.SetCatchBag ยท UO.UnsetCatchBag |
| Container Transfers | UO.MoveItem ยท UO.MoveItems ยท UO.MassMove ยท UO.EmptyContainer |
UO.ContainerOf ยท UO.GetParent ยท UO.ContainerOff
UO.SetReceivingContainer ยท UO.UnsetReceivingContainer
UO.SetCatchBag ยท UO.UnsetCatchBag
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
UO.OpenContainer("lasttarget");๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
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;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Backpack();ํ์ฌ ์บ๋ฆญํฐ๊ฐ ์ฅ์ฐฉํ ๋ฐฐ๋ญ์ ID๋ฅผ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int - serial/ID, graphic/type, ๋ ์ด์ด, ํญ๋ชฉ ์ ๋๋ bool๊ฐ ์๋. 0โํ์ฌ ๊ฐ์ฒด๊ฐ ์์ต๋๋ค. ๋ชจ๋ 32 ๋นํธ serial๊ฐ ์ ์ฅ๋ฉ๋๋ค. != 0๋ฅผ ํ์ธํ์ธ์. == true ๋๋ > 0๊ฐ ์๋๋๋ค. ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ ์์ฒด์ ์ผ๋ก ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค. ํ์ฌ ํ๋ ์ด์ด์ Backpack ๋ ์ด์ด์์ ์ญ์ ๋์ง ์์ ํญ๋ชฉ์ ๊ฒ์ํฉ๋๋ค. ํ๋ ์ด์ด ์์/ํ๊ดด๋จ, ๋ฐฐ๋ญ์ด๋ ๊ฐ๋ฐฉ ์ ๊ฑฐ ์์ - 0. ๋ด์ฉ์ด ์๋ ์ปจํ ์ด๋๋ฅผ ๋ฐํํฉ๋๋ค. ์ ๊ฐ๋ฐฉ์ ๋ง๋ค์ง ์์ต๋๋ค.
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. ๊ฒ์ ์คํธ๋ฆผ์์ Invoke๋ฅผ ํตํด ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์คํฌ๋ฆฝํธ๋ฅผ ์ทจ์ํ๋ฉด ํด๋น ์ค๋ ๋์ ๋ํ ๋๊ธฐ๊ฐ ์ค๋จ๋ฉ๋๋ค. ํจํค์ง๋ฅผ ๋ณด๋ด์ง ์๊ณ , ์ปจํ ์ด๋/๋์์ ์ด์ง ์์ผ๋ฉฐ, ์์ดํ ์ ์ ์กํ์ง ์์ต๋๋ค.
- ๊ดํธ ์์ด ๋ด์ฅ๋ self/backpack๋ ์คํฌ๋ฆฝํธ ๋ณ์๋ก ์ฌ์ ์๋์ง ์๋ ํ ๋ค์ ์ฝํ์ง๋๋ค. ๋ฌธ์์ด ์ด๋ฆ์ ์์ ๋ช ๋ น์ ์ํด ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ด๋ฐ ๋์์์ "self"๋ ๋ฐฐ๋ญ์ ์๋ฏธํ๊ณ , UO.Self()๋ ์บ๋ฆญํฐ์ serial๋ฅผ ๋ฐํํฉ๋๋ค. ID ์ปจํ ์ด๋์ ๊ฒฝ์ฐ UO.Backpack()๋ฅผ ๋ช ์์ ์ผ๋ก ์ฌ์ฉํ์ธ์.
- World.Clear๋ ํ๋ ์ด์ด๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ํ์ ํ๋ ๊ฒฐ๊ณผ๋ 0์ ๋๋ค. ์ธ๊ณ์ ์ ์ฅํ๊ฑฐ๋ ์ฅ์ฐฉํ ๊ฐ๋ฐฉ์ ๋ฐ๊พธ๋ฉด ID๊ฐ ๋ฐ๋ ์ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ์์์ ์ด์ง ์์ต๋๋ค. 0์ด ์๋ ID๋ ์ฐ๊ฒฐ, ์๋ฒ ํ์ธ ๋๋ ์ฝํ ์ธ ๋ก๋ฉ์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Backpack();
UO.Print("Backpack: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- id๋ ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ก๊ทธ์ฉ HEX ํ์ serial. ์ด ์์์๋ ์๋ฌด ๊ฒ๋ ์ ํํ๊ฑฐ๋ ์ฌ์ฉํ์ง ์์ต๋๋ค.
var id = UO.Backpack();
UO.Print("ID: " + Hex(id));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ /์ดํ๋ 250 ms ๊ฐ๊ฒฉ์ผ๋ก ์ฝํ์ง๋๋ค. UO.Wait๋ ์์์ฉ์ผ๋ก๋ง ์ถ๊ฐ๋์์ต๋๋ค. ํ๋ฑ์ ๋์ผํ ์ต์ข ID์ ์๋ฏธํฉ๋๋ค. ์ค๊ฐ ๋ณ๊ฒฝ์ฌํญ์ด ๋๋ฝ๋ ์ ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Backpack();
await Delay(250);
var after = UO.Backpack();
if (Truth(before != after))
{
UO.Print("ID changed: " + Hex(after));
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ๋ณด์ - ์ ์ฅ๋จ ID LastTarget. IsOwnSerial(ํ๋ณด์)๋ ํ๋์ serial๋ฅผ ์ทจํ๊ณ bool๋ฅผ ๋ฐํํฉ๋๋ค. ํ์ฌ 0์ด ์๋ ์์ฒด ID์ ๋ํด true, ๊ทธ๋ ์ง ์์ผ๋ฉด false์ ๋๋ค. ํจ์ ์ ์๊ฐ ์ ์ฒด์ ์ผ๋ก ์ ๊ณต๋ฉ๋๋ค. ๋ชฉํ๋ ๋ณํ์ง ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var candidate = UO.LastTarget();
if (Truth(Truth(IsOwnSerial(candidate)) == true))
{
UO.Print("Own object selected");
}
else
{
UO.Print("Different object or no own object");
}
return null;
}
dynamic IsOwnSerial(dynamic candidate)
{
var current = UO.Backpack();
return Truth(current != 0) && Truth(current == candidate);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Backpack:bridge.Backpack.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "backpack": return new InjectionValue(bridge.Backpack);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.ContainerOf(object? name);ํญ๋ชฉ์ ์ง๊ณ ์์ ํญ๋ชฉ์ ์ฝ์ต๋๋ค.
-
nameโ ํน์ ๊ฐ์ฒด์ ์ผ๋ จ๋ฒํธ/ID: int, 10์ง์/16์ง์ ๋ฌธ์์ด ๋๋ ๋ณ์นญ ์ค์ self, backpack, lasttarget, lastobject ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค.
"0x40001234" ํ์์ string - ์ปจํ ์ด๋/์บ๋ฆญํฐ ์์ ์์ serial. ์ง์์ ์๋ ์์ดํ ์ ๊ฒฝ์ฐ "0x00000000" ๋๋ "0xFFFFFFFF"์ ๋๋ค. ์ ์ ์๋ ์ด๋ฆ/๊ฐ์ฒด ๋๋ ๋ชจ๋ฐ์ผ์ ๊ฒฝ์ฐ - "0x00000000". ์ปจํ ์ด๋์ graphic๋ ์๋๊ณ , ์์ดํ ์์ฒด์ ID๋ ์๋๊ณ , ์ค์ฒฉ๋ ๊ฐ๋ฐฉ์ ๋ฃจํธ ์์ ์๋ ์๋๋๋ค.
- ์ฌ๊ท ์ํ ๋ฐ ์๋ฒ ํธ์ถ ์์ด ๋ก์ปฌ ํญ๋ชฉ์ ์ปจํ ์ด๋ ํ๋๋ฅผ ์ฝ์ต๋๋ค. null ๊ฒฐ๊ณผ๋ฅผ ํด์ํ๊ธฐ ์ ์ Exists๋ฅผ ํ์ธํ์ธ์. Ground๋ ๋ ๊ฐ์ง ์ ํจํ ํํ์ ์ฌ์ฉํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.ContainerOf("backpack");
UO.Print("ContainerOf: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํญ๋ชฉ์ ๋ฐ๊ฒฌ๋ ์คํ์ serial์ ๋๋ค. type=0x0EED๋ FindType๋ก๋ง ์ ์ก๋ฉ๋๋ค.
- parent๋ ๋ฐฐ๋ญ์ ํฌํจํ๋ ์บ๋ฆญํฐ๊ฐ ์๋๋ผ ์ค์ ๋ฐฐ๋ญ์ ๋ํ๋ ๋๋ค.
var item = UO.FindType(0x0EED, -1, "backpack");
if (Truth(item != ""))
{
var parent = UO.ContainerOf(item);
UO.Print(Convert.ToString(parent));
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ ๋ฐฐ๋ญ ์์ฒด์ ๋๋ค.
- ์ฅ์ฐฉ๋ ๋ฐฐ๋ญ์ ๋ถ๋ชจ๋ ์บ๋ฆญํฐ์ serial๊ฐ ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var bag = UO.GetSerial("backpack");
if (Truth(UO.Exists(bag)))
{
UO.Print(Convert.ToString(UO.ContainerOf(bag)));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- GetContent("ground")๋ ID ์ปจํ ์ด๋ ๋ฐ์ ์์ดํ ์ ์ ๊ณตํฉ๋๋ค.
- ํ ์ง์ ๋ํ ๋ ํํ ๋ชจ๋ ์ ํจํฉ๋๋ค. Exists๊ฐ ์๋ ํ๋์ null ๋ถ๋ชจ๋ง์ผ๋ก๋ ๊ฐ์ฒด์ ์์น๋ฅผ โโ์ถ๋ก ํ๊ธฐ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var items = UO.GetContent("ground");
if (Truth(ArrayLength(items) > 0))
{
var item = items[0];
if (Truth(UO.Exists(item)))
{
UO.Print(Convert.ToString(UO.ContainerOf(item)));
}
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: name (Any)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ContainerOf. -
InjectionScript.Runtime.InjectionApiUO.TryGetObject:TryGetObject(name, out int id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ContainerOf:bridge.ContainerOf(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string ContainerOf(InjectionValue name)
{
if (TryGetObject(name, out int id))
{
var containerId = bridge.ContainerOf(id);
if (containerId < 0)
return "0xFFFFFFFF";
return $"0x{containerId:X8}";
}
return "0x00000000";
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ContainerOff();์ง์ ๋ ์์ ๋ฐํ์ ์ปจํ ์ด๋๋ฅผ ์ฌ์ค์ ํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- UnsetReceivingContainer๋ฅผ ํธ์ถํ๊ณ State.ReceivingContainer=0๋ฅผ ์๋๋ค. ๋ช ์์ ์ธ ํ ๋น์ด ์๋ ๋ค์ Grab ์์ ์์๋ ๋ฐฐ๋ญ์ด ์๋ ๊ฒฝ์ฐ ๋ฐฐ๋ญ์ ์ฌ์ฉํฉ๋๋ค. ํญ๋ชฉ์ด ์ด๋ํ์ง ์์ผ๋ฉฐ ์ปจํ ์ด๋ ์ฐฝ์ด ๋ซํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ContainerOff");
UO.ContainerOff();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ํ ReceivingContainer๋ 0๊ฐ ๋ฉ๋๋ค.
UO.ContainerOff();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ ๋น์ด ์ง์์ก์ต๋๋ค. ํด๋น ์์ ์ ์ฝํ ์ธ ๋ฅผ ์ด๋ํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.SetReceivingContainer("backpack");
UO.ContainerOff();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- null ์ํ์์๋ ๋ฐ๋ณต์ ์ธ ์ฌ์ค์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.ContainerOff();
UO.ContainerOff();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UnsetReceivingContainer. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UnsetReceivingContainer:bridge.UnsetReceivingContainer().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void UnsetReceivingContainer() => bridge.UnsetReceivingContainer();ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetContent(object? id);์ปจํ ์ด๋๋ ์ง์์ ์ ์ฌ๋ ๋ฌผํ์ ๋ด์ฉ๋ฌผ์ ์ง์ ์ฝ์ด๋ ๋๋ค.
-
idโ ํน์ ๊ฐ์ฒด์ ์ผ๋ จ๋ฒํธ/ID: int, 10์ง์/16์ง์ ๋ฌธ์์ด ๋๋ ๋ณ์นญ ์ค์ self, backpack, lasttarget, lastobject ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. my/backpack ๋ผ์ธ์ ๋ฐฐ๋ญ์ ์ ํํฉ๋๋ค. ๋ช ์์ ์ผ๋ก 0, "0" ๋๋ "ground"๋ก๋ง ๋์ง๋ฅผ ์ ํํฉ๋๋ค. ์ ์ ์๋ ๋ณ์นญ, ๋๋ฝ๋ ๋ฐฐ๋ญ, ์์ ID ๋๋ ๋ถ์ ์ ํ ๊ฐ ์ ํ์ผ๋ก ์ธํด ๋น ๋ฐฐ์ด์ด ์์ฑ๋ฉ๋๋ค.
๊ฐ ์ง๊ณ ํ์ ํญ๋ชฉ์ ๋ฐฐ์ด - serial. ground/0์ ๊ฒฝ์ฐ - ์ปจํ ์ด๋ ์ธ๋ถ ํ๋ชฉ; ์ผ๋ฐ ์ ์ง ํ์ 0 ๋ฐ 0xFFFFFFFF๊ฐ ๋ชจ๋ ๊ณ ๋ ค๋ฉ๋๋ค. ํญ๋ชฉ์ด ์์ผ๋ฉด ๋น ๋ฐฐ์ด์ด ๋ฐํ๋ฉ๋๋ค. ๋ชฉ๋ก์๋ type๊ฐ ์๋ ID๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ ๋ ์ด์ด๋ ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฏธ ๋ค์ด๋ก๋ํ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์ด ๋ช ๋ น์ ์ ์ฒด ์๋ฒ์์ ์ปจํ ์ด๋๋ฅผ ์ด๊ฑฐ๋ ํญ๋ชฉ์ ์ด๋ํ๊ฑฐ๋ ๊ฐ์ฒด๋ฅผ ๋ค์ด๋ก๋ํ์ง ์์ต๋๋ค.
- ๋ฐฐ์ด - 0๋ถํฐ ์์ํ๋ ์ธ๋ฑ์ค๊ฐ ์๋ ๋ฐฐ์ด์ ๋๋ค. var์ ์ ์ฅํ๊ณ , ArrayLength๋ฅผ ํ์ธํ ํ ์ ์ํ์ธ์. ์ค๋ ์ท์ ์ฐ์ ํ ์์๊ฐ ์ธ๊ณ์์ ์ฌ๋ผ์ง ์ ์์ต๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ Exists(serial)๋ฅผ ํ์ธํ์ธ์.
- ์ค์ฒฉ๋ ๋ฐฑ์ ์ฌ๊ท ์ํ, ๊ฑฐ๋ฆฌ ์ ๋ ฌ, Ignore ๋๋ FindDistance/FindVertical ํํฐ๊ฐ ์์ต๋๋ค. ์ผ๋ฐ FindType ์ค๋ ์ท์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- ์ด์ง ์์ ์์๋ ๋น์ด ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ต๋๋ค. ์์ ๋ ๋ฐ์ดํฐ๊ฐ ์๋ค๊ณ ํด์ ์๋ฒ๊ฐ ๋น์ด ์๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. ๋จผ์ ์ด๋ฆฐ ์ฉ๊ธฐ๋ฅผ ์ฌ์ฉํ๊ณ ๋ด์ฉ๋ฌผ์ด ๋์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetContent("backpack");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ID="backpack" - ํ์ฌ ์บ๋ฆญํฐ์ ๋ฐฐ๋ญ, ์ง์ ์ค์ฒฉ๋ ํญ๋ชฉ๋ง ํด๋น๋ฉ๋๋ค.
- ๊ธธ์ด - ๋ ์ฝ๋ ์/ID. ์ด๊ฒ์ ์คํ์ ์์ด ์๋๋๋ค. ๋น ๋ชฉ๋ก์ 0์ ์ ๊ณตํฉ๋๋ค.
var items = UO.GetContent("backpack");
UO.Print(Convert.ToString(ArrayLength(items)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ID="backpack" - ํ์ฌ ์บ๋ฆญํฐ์ ๋ฐฐ๋ญ, ์ง์ ์ค์ฒฉ๋ ํญ๋ชฉ๋ง ํด๋น๋ฉ๋๋ค.
- items[i] โ ์ซ์ serial. 16์ง์๋ ์ถ๋ ฅ์๋ง ์ฌ์ฉ๋ฉ๋๋ค. ๋ฃจํ๋ ๋ง์ง๋ง ์ธ๋ฑ์ค์ ์ก์ธ์คํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var items = UO.GetContent("backpack");
var i = 0;
while (Truth(i < ArrayLength(items)))
{
UO.Print("0x" + Hex(items[i]));
i = i + 1;
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ID="backpack" - ํ์ฌ ์บ๋ฆญํฐ์ ๋ฐฐ๋ญ, ์ง์ ์ค์ฒฉ๋ ํญ๋ชฉ๋ง ํด๋น๋ฉ๋๋ค.
- ๋ ๊ฐ์ง ๋ค๋ฅธ ์ฌํญ, ์ฆ ์ค๋ ์ท์ ๊ธฐ๋ก๊ณผ ํ์ฌ ๊ฐ์ฒด์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. ๋ช ์์ ์ธ ์ ๋ ฌ์ด ์๋ ์์๋ ์น๋ฐํจ์ ์๋ฏธํ์ง ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var items = UO.GetContent("backpack");
if (Truth(ArrayLength(items) > 0))
{
var first = items[0];
if (Truth(UO.Exists(first)))
{
UO.Print(UO.GetName(first));
}
}
else
{
UO.Print("Empty list");
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ID="ground"๋ ๋ช ์์ ์ผ๋ก ์ง๋ฉด์ ์ ํํฉ๋๋ค. NPC/players๋ ์ด ๋ชฉ๋ก์ ํฌํจ๋์ง ์์ต๋๋ค.
- ์ฌ๊ธฐ์ ๊ฒ์ ๋ฐ๊ฒฝ์ FindDistance๋ก ์ ํ๋์ง ์์ต๋๋ค. ํํฐ type ๋ฐ ๊ฑฐ๋ฆฌ์ ๊ฒฝ์ฐ GetWorldItems(type,color,distance)๊ฐ ์์ต๋๋ค.
var groundItems = UO.GetContent("ground");
UO.Print(Convert.ToString(ArrayLength(groundItems)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: id (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
InjectionScript.Runtime.NumberConversions.TryStr2Int:NumberConversions.TryStr2Int(text, out int literal). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(text). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetEquipment:bridge.GetEquipment(container). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetContent:bridge.GetContent(container). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Backpack:bridge.Backpack.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getcontent":
case "getequipment":
{
InjectionValue selection = arguments[0];
bool ground = false, explicitZero;
int container;
if (selection.Kind == InjectionValueKind.String)
{
string text = Text(0).Trim();
ground = text.Equals("ground", StringComparison.OrdinalIgnoreCase);
explicitZero = NumberConversions.TryStr2Int(text, out int literal) && literal == 0;
container = ground ? 0 : text.Equals("my", StringComparison.OrdinalIgnoreCase)
? bridge.Backpack : GetObject(text);
}
else
{
if (selection.Kind != InjectionValueKind.Integer && selection.Kind != InjectionValueKind.Decimal)
return new InjectionValue(Array.Empty<InjectionValue>());
container = Arg(0);
explicitZero = selection.Kind == InjectionValueKind.Integer ? selection.Integer == 0 : selection.Decimal == 0d;
}
// Only an explicit ground/zero selector may query world items.
if (container < 0 || container == 0 && !ground && !explicitZero)
return new InjectionValue(Array.Empty<InjectionValue>());
bool equipment = name.Equals("GetEquipment", StringComparison.OrdinalIgnoreCase);
int[] items = equipment
? container == 0 ? Array.Empty<int>() : bridge.GetEquipment(container)
: bridge.GetContent(container);
return new InjectionValue(items.Select(serial => new InjectionValue(serial)).ToArray());
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetParent(object? objID);ํญ๋ชฉ์ ์ง๊ณ ์์ ํญ๋ชฉ์ ์ฝ์ต๋๋ค.
-
objIDโ ํน์ ๊ฐ์ฒด์ ์ผ๋ จ๋ฒํธ/ID: int, 10์ง์/16์ง์ ๋ฌธ์์ด ๋๋ ๋ณ์นญ ์ค์ self, backpack, lasttarget, lastobject ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค.
int - serial ์ปจํ ์ด๋/์บ๋ฆญํฐ ์์ ์. ์ง์์ ์๋ ์์ดํ ์ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ์ ์ ๋ ฅ์ ๋ฐ๋ผ 0 ๋๋ -1(๋นํธ 0xFFFFFFFF)์ ๋๋ค. ์ ์ ์๋ ๋ฌผ์ฒด ๋๋ ๋ชจ๋ฐ์ผ์ ๊ฒฝ์ฐ - 0. ์ปจํ ์ด๋์ graphic๋ ์๋๊ณ , ์์ดํ ์์ฒด์ ID๋ ์๋๊ณ , ์ค์ฒฉ๋ ๊ฐ๋ฐฉ์ ๋ฃจํธ ์์ ์๋ ์๋๋๋ค.
- ์ฌ๊ท ์ํ ๋ฐ ์๋ฒ ํธ์ถ ์์ด ๋ก์ปฌ ํญ๋ชฉ์ ์ปจํ ์ด๋ ํ๋๋ฅผ ์ฝ์ต๋๋ค. null ๊ฒฐ๊ณผ๋ฅผ ํด์ํ๊ธฐ ์ ์ Exists๋ฅผ ํ์ธํ์ธ์. Ground๋ ๋ ๊ฐ์ง ์ ํจํ ํํ์ ์ฌ์ฉํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetParent("backpack");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํญ๋ชฉ์ ๋ฐ๊ฒฌ๋ ์คํ์ serial์ ๋๋ค. type=0x0EED๋ FindType๋ก๋ง ์ ์ก๋ฉ๋๋ค.
- parent๋ ๋ฐฐ๋ญ์ ํฌํจํ๋ ์บ๋ฆญํฐ๊ฐ ์๋๋ผ ์ค์ ๋ฐฐ๋ญ์ ๋ํ๋ ๋๋ค.
var item = UO.FindType(0x0EED, -1, "backpack");
if (Truth(item != ""))
{
var parent = UO.GetParent(item);
UO.Print(Convert.ToString(parent));
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ ๋ฐฐ๋ญ ์์ฒด์ ๋๋ค.
- ์ฅ์ฐฉ๋ ๋ฐฐ๋ญ์ ๋ถ๋ชจ๋ ์บ๋ฆญํฐ์ serial๊ฐ ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var bag = UO.GetSerial("backpack");
if (Truth(UO.Exists(bag)))
{
UO.Print(Convert.ToString(UO.GetParent(bag)));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- GetContent("ground")๋ ID ์ปจํ ์ด๋ ๋ฐ์ ์์ดํ ์ ์ ๊ณตํฉ๋๋ค.
- ํ ์ง์ ๋ํ ๋ ํํ ๋ชจ๋ ์ ํจํฉ๋๋ค. Exists๊ฐ ์๋ ํ๋์ null ๋ถ๋ชจ๋ง์ผ๋ก๋ ๊ฐ์ฒด์ ์์น๋ฅผ โโ์ถ๋ก ํ๊ธฐ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var items = UO.GetContent("ground");
if (Truth(ArrayLength(items) > 0))
{
var item = items[0];
if (Truth(UO.Exists(item)))
{
UO.Print(Convert.ToString(UO.GetParent(item)));
}
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ContainerOf:bridge.ContainerOf(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getparent": return new InjectionValue(bridge.ContainerOf(Arg(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Ground();๊ฒ์ ์ปจํ ์ด๋ ๋งค๊ฐ๋ณ์ ๋๋ ์ ์ก ๋์์ ๋ํ ํน์ ํ ์ง ์ง์ ์๋ฅผ ๋ฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int, ํญ์ 0. ์ด 0์ false, ๊ฒ์ ์ค๋ฅ, ID ํญ๋ชฉ, graphic, ์ง๋ ๋ฒํธ ๋๋ ์ขํ๊ฐ ์๋ ์ ํจํ ์ง์ ์ง์ ์์ ๋๋ค. Ground()๋ฅผ ์ฑ๊ณต์ ํ์๋ก ํ์ธํ์ง ๋ง์ธ์. ์ด ๊ฐ์ ์ ๋ฌํ ๊ฒ์ ๋๋ ์ ์ก ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์.
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. Ground() ํธ์ถ ์์ฒด๋ ์๋ฌด๊ฒ๋ ๊ฒ์ํ์ง ์๊ณ , ์๋ฌด๊ฒ๋ ์ด๋ํ์ง ์์ผ๋ฉฐ, ๋์์ ์ด์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ, ์ด์ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ๊ฒ์์ ๋ค์ด๊ฐ๊ธฐ ์ ์๋ 0๋ ๋ฐํํฉ๋๋ค.
- FindType, FindList, Count, FindTypeEx, FindTypesArrayEx, CountEx ๋๋ MoveItem ๋ช ๋ น์ ์ปจํ ์ด๋/๋์ ์์น๋ก ๋ณด๋ ๋๋ค. ๊ฒ์์์๋ ๋ก๋๋ ์๋ ๊ฐ์ฒด๋ฅผ ๋ณผ ์ ์์ง๋ง ๋ฉ๋ฆฌ ์๋ ์ ์ ๋ก๋ํ์ง ์์ต๋๋ค. ์ง์์ผ๋ก ์ ์กํ๋ ๊ฒฝ์ฐ X/Y/Z - ์ปจํ ์ด๋ ์ฐฝ ํฝ์ ์ด ์๋ ์ธ๊ณ ์ขํ์ ๋๋ค.
- FindType(type, color)๋ ์ฌ์ ํ ์ธ๋ฒคํ ๋ฆฌ์ ํ์๋ฉ๋๋ค. ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ color์ ๋๋ค. ํ ์ง์ ๊ฒฝ์ฐ FindType(type, color, UO.Ground())๋ผ๊ณ ์ ์ต๋๋ค. ๊ธฐ์กด ์ปดํฉํธ FindType/MoveItem์์ ์ซ์ -1๋ ์ฌ๊ณ ๋ฅผ ๋ํ๋ ๋๋ค. ํธํ๋๋ FindTypeEx/FindTypesArrayEx/CountEx - 1๋ ์ ์ง๋ก ํ์ฉ๋ฉ๋๋ค. UO.Ground() ๋๋ ๋ช ์์ ์ธ ์ด๋ฆ ground์ ์ฌ์ฉํ๊ณ , ํ์ธํ์ง ์๊ณ ๋ค๋ฅธ ๋ช ๋ น ๊ฐ์ ์ซ์ ์ง์ ์ ์ ์กํ์ง ๋ง์ญ์์ค.
- ์์ ๋ช ๋ น๊ณผ ์์ ๊ฐ์ ํ๊ธฐ๋ฒ ์ฐจ์ด๋ ์ด ํด๋ผ์ด์ธํธ๋ฅผ ์ค๋ช ํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Ground();
UO.Print("Ground: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ชฉ์ ์ง๋ int 0๋ฅผ ์์ ํ๊ณ , Print๋ ์ด ์ซ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ํธ์ถ ์์ฒด๋ ์๋ฌด๊ฒ๋ ๋ฒ๋ฆฌ์ง ์์ต๋๋ค.
var destination = UO.Ground();
UO.Print(Convert.ToString(destination));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0x0EED - ๊ณจ๋ ๊ทธ๋ํฝ; ๋ ๋ฒ์งธ -1๋ hue๋ฅผ ์๋ฏธํฉ๋๋ค. Ground()๋ ์ ์ธ๊ณ์์ ๊ฒ์์ ์ค์ ํ๊ณ , false๋ ์ปจํ ์ด๋ ์ฌ๊ท๋ฅผ ๋นํ์ฑํํฉ๋๋ค. FindTypeEx๋ ๊ฒฐ๊ณผ๊ฐ ์์ผ๋ฉด serial ๋๋ 0 ์ค ํ๋๋ฅผ ๋ฐํํฉ๋๋ค. != 0๋ serial๋ฅผ ํ์ธํฉ๋๋ค. ํ์ฌ FindDistance/FindVertical ๋ฐ ๋ชฉ๋ก Ignore์ด ์ฌ์ฉ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.FindTypeEx(0x0EED, -1, UO.Ground(), false);
if (Truth(id != 0))
{
UO.Print(Hex(id));
}
else
{
UO.Print("0");
}
return null;
}
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- FindGroundTypes(firstType, secondType, ๋ฐ๊ฒฝ, ๋์ด)๋ ๋ฐ๊ฒฝ=5 ๋ฐ ๋์ด=10๋ก ๊ธ 0x0EED ๋ฐ ํ์ง์ฃผ 0x0F7A๋ฅผ ๊ฒ์ํฉ๋๋ค. ๋ณ์ ์ ํ[1]์ ์ ์ธํ๋ฉด ๋ ๊ฐ์ ์ ์ด ์์ฑ๋ฉ๋๋ค. ์์[0] ๋ฐ ์ปจํ ์ด๋[0] - ๊ฐ๊ฐ ํ๋์ฉ. ์ ์ฒด ์คํ์ ํ๋์ ๊ฒฐ๊ณผ๋ก ๊ณ์ฐ๋ฉ๋๋ค. ์ ํ/์์์ ๋์ฒด ๊ฐ๋ฅํ๋ฉฐ ๊ต์ฐจํ๋ ์ปจํ ์ด๋๋ ์ค๋ณต๋์ง ์์ต๋๋ค ID. ์ด ํจ์๋ ์ ์ฅ๋ ๋ฐฐ์ด serial๋ฅผ ๋ฐํํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ๋ ํ๊ณ๋ฅผ ๋ชจ๋ ๋ณต์ํฉ๋๋ค. ID๋ง๋ค ๋ฉ์ธ ์ถ๋ ฅ์ด ๋์ต๋๋ค. ๊ธฐ๋ฅ ์ฝ๋๊ฐ ์ ์ฒด์ ์ผ๋ก ์ ๊ณต๋ฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var ids = FindGroundTypes(0x0EED, 0x0F7A, 5, 10);
foreach (var id in ids)
{
UO.Print(Hex(id));
}
return null;
}
dynamic FindGroundTypes(dynamic firstType, dynamic secondType, dynamic radius, dynamic height)
{
var oldDistance = UO.FindDistance();
var oldVertical = UO.FindVertical();
dynamic[] types = new dynamic[checked((int)(1) + 1)];
types[0] = firstType;
types[1] = secondType;
dynamic[] colors = new dynamic[checked((int)(0) + 1)];
colors[0] = -1;
dynamic[] containers = new dynamic[checked((int)(0) + 1)];
containers[0] = UO.Ground();
try
{
UO.FindDistance(radius);
UO.FindVertical(height);
UO.FindTypesArrayEx(types, colors, containers, false);
return UO.GetFoundItems();
}
finally
{
UO.FindDistance(oldDistance);
UO.FindVertical(oldVertical);
}
}
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0x40001001๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅํ ํญ๋ชฉ์ serial๋ก ๋ฐ๊พธ์ธ์. IsObjectExists ๋จผ์ ๋ก๋๋ ๊ฐ์ฒด๋ฅผ ํ์ธํฉ๋๋ค. MoveItem(์์ดํ , ๊ธ์ก, ๋ชฉ์ ์ง, X, Y, Z): ๊ธ์ก=0 - ์ ์ฒด ์คํ, Ground() - ํ ์ง, GetX/GetY/GetZ - ์บ๋ฆญํฐ์ ์๋ ์ . ๊ฒฐ๊ณผ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ ์ก ์์ฒญ์ ์๋ฝํ ๊ฒฝ์ฐ 1์ด๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ 0์ ๋๋ค. ์ด๋ Ground()์ด ์๋ MoveItem์ ๊ฒฐ๊ณผ์ด๋ฉฐ, ์๋ฒ์ ์ ์ก ํ์ธ์ด ์๋๋๋ค.
var item = 0x40001001;
if (Truth(UO.IsObjectExists(item)))
{
var result = UO.MoveItem(item, 0, UO.Ground(), UO.GetX("self"), UO.GetY("self"), UO.GetZ("self"));
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "ground": return new InjectionValue(0);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsContainer(object? objID);๋ก๋๋ ํญ๋ชฉ์ ๊ทธ๋ํฝ ์ ํ ํ์ผ๋ฐ์ดํฐ์์ ์ปจํ ์ด๋ ํ๋๊ทธ๋ฅผ ํ์ธํฉ๋๋ค.
-
objIDโ ํน์ ๊ฐ์ฒด์ ํ์ serial/ID: int, 16์ง์ ๋ฌธ์์ด ๋๋ ๋ณ์นญ self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. ์ง์ ๋์ง ์์ ์ด๋ฆ์ 0๋ก ํด์๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ ๋์์ ์ด์ง ์์ต๋๋ค.
int 1 - ์๋ ค์ง ํญ๋ชฉ์ graphic ๋ฐ์ดํฐ์ ์ปจํ ์ด๋ ์์ฑ์ด ์์ต๋๋ค. int 0 - ํด๋น ๊ธฐํธ๊ฐ ์์ผ๋ฉฐ ๊ฐ์ฒด๋ mobile์ด๋ฉฐ ์ ์ ์๊ฑฐ๋ ์ญ์ ๋์์ต๋๋ค. ์ด๋ ์ฉ๊ธฐ์ ๋ด๊ธด ๋ฌผ๊ฑด์ ๊ฐ์๋ ์๋๊ณ , ์ด๋ฆฐ ๊ฒํ์ ํ์๋ ์๋๋ฉฐ, ๋ด์ฉ๋ฌผ์ ๋ํ ์ ๊ทผ ํ์ธ๋ ์๋๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ์๋ฒ์ ๋ํ ์์ฒญ๋ ์๊ณ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ด๋ํ ํ์๋ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ์ฝ๋ ์๊ฐ์ ๊ฐ๋ฆฌํจ๋ค. UO.Wait ๋๋ ๋ค๋ฅธ ์์ ํ์ ๊ฐ์ฒด์ ํด๋น ํ๋๊ทธ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsContainer(UO.GetSerial("lastobject"));
UO.Print("IsContainer: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํญ๋ชฉ์ ๊ฐ์ฒด type๊ฐ ์๋๋ผ ๊ฐ์ฒด lastobject์ serial์ ๋๋ค.
- ์ด ๋ช ๋ น์ ์ปจํ ์ด๋ ์์ฑ๋ง ์ฝ๊ณ ์ด์ง๋ ์์ต๋๋ค.
var item = UO.GetSerial("lastobject");
if (Truth(UO.IsContainer(item)))
{
UO.Print("Known container: " + item);
}
else
{
UO.Print("Not a known container");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ๋ฐฉ์ ์ฌ์ ์ ์ ํํด์ผ ํ๋ฉฐ, ๋ด์ฉ๋ฌผ์ ๊ณ ๊ฐ์๊ฒ ์๋ ค์ผ ํฉ๋๋ค.
- FindType๋ type ๊ณจ๋, hue ๋ฐ serial ์ปจํ ์ด๋๋ฅผ ๋ฐ์ต๋๋ค. ๋น ๊ฒฐ๊ณผ๋ ์๋ฒ ์ปจํ ์ด๋๊ฐ ๋น์ด ์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var bag = UO.GetSerial("lasttarget");
if (Truth(UO.IsContainer(bag)))
{
var found = UO.FindType(0x0EED, -1, bag);
UO.Print("Known gold item: " + found);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Exists๊ณผ IsContainer๋ ๋์ผํ serial์ ๋ํ ๋ค๋ฅธ ์ง๋ฌธ์ ๋ตํฉ๋๋ค.
- ํ์ผ โโ๋ฐ์ดํฐ๊ฐ ์ ํฉํ์ง ์๊ฑฐ๋ ์์ง ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ๋ถ๋ฅ๊ฐ ์์๊ณผ ๋ค๋ฅผ ์ ์์ต๋๋ค. ๊ฐ์ด ๊ถ๋ฆฌ๋ฅผ ํ์ธํ๋ ๋ฐ ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var bag = UO.GetSerial("backpack");
var exists = UO.Exists(bag);
var container = UO.IsContainer(bag);
UO.Print("Loaded: " + Convert.ToString(exists));
UO.Print("Container flag: " + Convert.ToString(container));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsContainer:bridge.IsContainer(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "iscontainer": return new InjectionValue(bridge.IsContainer(Arg(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.LastContainer();๋ง์ง๋ง ์ปจํ ์ด๋์ serial๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ์ ์ฅ๋จ serial; 0์ serial์ด ์ค์น๋์ง ์์์์ ์๋ฏธํฉ๋๋ค. bool๋ ์๋๊ณ graphic/type๋ ์๋๋๋ค. 0์ด ์๋ ID๋ ์ธ์์ ๋ ์ด์ ์กด์ฌํ์ง ์์ ์ ์์ต๋๋ค.
- ํ๋ ์์ค: _world.LastContainer. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ์ ํํ๊ฑฐ๋ ์ฌ์ฉํ๊ฑฐ๋ ๊ณต๊ฒฉํ์ง ์์ต๋๋ค.
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.LastContainer();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ง์ง๋ง ์ปจํ ์ด๋์ serial๋ฅผ ์ฝ์ต๋๋ค.
var id = UO.LastContainer();
UO.Print(Hex(id));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ๋ ์์ค: _world.LastContainer. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ์ ํํ๊ฑฐ๋ ์ฌ์ฉํ๊ฑฐ๋ ๊ณต๊ฒฉํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.LastContainer();
if (Truth(id != 0) && Truth(UO.Exists(id)))
{
UO.Print(UO.GetName(id));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.LastContainer();
UO.Wait(500);
var after = UO.LastContainer();
UO.Print(before = after);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLastContainer:bridge.GetLastContainer().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "lastcontainer": return new InjectionValue(bridge.GetLastContainer());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.OpenContainer(object? id);
void UO.OpenContainer(object? id, object? timeout);์ปจํ ์ด๋ ์ด๊ธฐ๋ฅผ ์์ฒญํฉ๋๋ค.
-
idโ ์ง๋ ฌ/ID ๊ฐ์ฒด: int, ์ซ์/16์ง์ ๋ฌธ์์ด ๋๋ ์ค์ ๋ ๋ณ์นญ(์: "lasttarget"). ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ ๋ก๋๋ ๊ฐ์ฒด๋ฅผ ํ์ธํ์ญ์์ค. -
timeoutโ ์ ํ ์ฌํญ int, ๋ฐ๋ฆฌ์ด; ๊ธฐ๋ณธ๊ฐ์ 0์ ๋๋ค. ์์ ๊ฐ์ ๊ธฐ๋๊ฐ์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- Bridge.OpenContainer๋ UseObject(id)๋ฅผ ํธ์ถํ ๋ค์ ์๊ฐ ์ด๊ณผ>0์ธ ๊ฒฝ์ฐ์๋ง UO.Wait(timeout)๋ฅผ ํธ์ถํฉ๋๋ค. ์ผ์ ์ค์ง๋ ๊ณ ์ ๋์ด ์์ต๋๋ค. ์ปจํ ์ด๋์ ์ ๋ฌด/๋ด์ฉ๋ฌผ์ ํ์ธ๋์ง ์์ต๋๋ค.
- ์๊ฐ ์ด๊ณผ๊ฐ ์์ผ๋ฉด ์ผ์ ์ค์ง๊ฐ ์์ต๋๋ค. ์ผ์ ์ค์ง๊ฐ ๋๋ฌ๋ค๊ณ ํด์ ์ฝํ ์ธ ๊ฐ ์ด๋ ธ๊ฑฐ๋ ์์ ํ ๋ก๋๋์๋ค๋ ์ฆ๊ฑฐ๋ก ๊ฐ์ฃผ๋์ด์๋ ์ ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.OpenContainer");
UO.OpenContainer("lasttarget");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ปจํ ์ด๋ ์ด๊ธฐ๋ฅผ ์์ฒญํฉ๋๋ค.
UO.OpenContainer("lasttarget");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Bridge.OpenContainer๋ UseObject(id)๋ฅผ ํธ์ถํ ๋ค์ ์๊ฐ ์ด๊ณผ>0์ธ ๊ฒฝ์ฐ์๋ง UO.Wait(timeout)๋ฅผ ํธ์ถํฉ๋๋ค. ์ผ์ ์ค์ง๋ ๊ณ ์ ๋์ด ์์ต๋๋ค. ์ปจํ ์ด๋์ ์ ๋ฌด/๋ด์ฉ๋ฌผ์ ํ์ธ๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
UO.OpenContainer("lasttarget", 1000);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๊ฐ ์ด๊ณผ๊ฐ ์์ผ๋ฉด ์ผ์ ์ค์ง๊ฐ ์์ต๋๋ค. ์ผ์ ์ค์ง๊ฐ ๋๋ฌ๋ค๊ณ ํด์ ์ฝํ ์ธ ๊ฐ ์ด๋ ธ๊ฑฐ๋ ์์ ํ ๋ก๋๋์๋ค๋ ์ฆ๊ฑฐ๋ก ๊ฐ์ฃผ๋์ด์๋ ์ ๋ฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.OpenContainer(id, 1000);
UO.Print(UO.GetName(id));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: id (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.OpenContainer. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.OpenContainer:bridge.OpenContainer(GetObject(id), 0). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void OpenContainer(InjectionValue id) => bridge.OpenContainer(GetObject(id), 0);๋งค๊ฐ๋ณ์: id (Any), timeout (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.OpenContainer. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.OpenContainer:bridge.OpenContainer(GetObject(id), NumberConversions.ToInt(timeout)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(timeout).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void OpenContainer(InjectionValue id, InjectionValue timeout) => bridge.OpenContainer(GetObject(id), NumberConversions.ToInt(timeout));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetCatchBag();
void UO.SetCatchBag(object? container);-
containerโ ์ปจํ ์ด๋์ ์ผ๋ จ๋ฒํธ, ์ ์ฅ๋ ์ด๋ฆ("backpack" ๋๋ "my")์ ๋๋ค. 0 ํ ๋น์ด ์ทจ์๋ฉ๋๋ค. ์ธ์๊ฐ ์์ผ๋ฉด lastobject๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฌ์ค์ ๋์ง ์๊ณ ๋ง์ง๋ง์ผ๋ก ์ ์ฉ๋ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ฆ์ด ๊ธ์ ์ ์ธ serial๋ก ํ์ธ๋์ง ์์ผ๋ฉด ํ ๋น์ด ์ ๊ฑฐ๋ฉ๋๋ค. ์ค์น ์์ฒด์์๋ ๋ง์ด๊ทธ๋ ์ด์ ํ ๊ฐ์ฒด์ ์๋ฒ ๊ฐ์ฉ์ฑ๊ณผ ์ ํฉ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค.
void: ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. UO.SetCatchBag(...)์ธ ๊ฒฝ์ฐ var ๊ฒฐ๊ณผ = UO.SetCatchBag(...)๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ซ์ 1๋ฅผ ํ์ธ์ผ๋ก ๊ธฐ๋ํ ์ ์์ต๋๋ค. ์ค์ ์ด๋์ ๋ณ๋์ ๋ช ๋ น(์: Grab)์ ์ํด ์ํ๋ฉ๋๋ค.
- UO.SetCatchBag() ๋ฐ UO.SetReceivingContainer()๋ ์ธ์ ์์ด ์๋ก ๋ค๋ฅธ ํ์ ๊ฐ์ ๊ฐ์ต๋๋ค. ์ฒซ ๋ฒ์งธ๋ lastobject๋ฅผ ์ทจํ๊ณ ๋ ๋ฒ์งธ๋ ์ปจํ ์ด๋๋ฅผ ์ฌ์ค์ ํฉ๋๋ค.
- ๋ช ์์ ์ฌ์ค์ : UO.UnsetCatchBag(), UO.UnsetReceivingContainer() ๋๋ UO.SetCatchBag(0). ์ด๊ธฐํ ํ Grab๋ ๋ณ๋์ ๋ชฉ์ ์์ด ๋ฐฐ๋ญ์ ์ฌ์ฉํฉ๋๋ค.
- serial๋ฅผ ์ค์ ํ๋ค๊ณ ํด์ ์๋ฒ๊ฐ ํด๋น ํญ๋ชฉ์ ํด๋น ์์น์ ๋ฐฐ์นํ๋ ๊ฒ์ ํ์ฉํ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. ์ค์ ์ ์ก ์ค์ ๊ฑฐ๋ฆฌ, ์ ๋ฌด ๋ฐ ๊ฐ์ฉ์ฑ์ด ํ์ธ๋ฉ๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetCatchBag");
UO.SetCatchBag();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จ์ผ ์ปจํ ์ด๋ ๋งค๊ฐ๋ณ์๋ "backpack" ๋ฌธ์์ด์ ์์ ํฉ๋๋ค. ๋ฐํ์์์๋ ๋ฐฐ๋ญ์ serial์์ ์ด๋ฅผ ํ์ฉํฉ๋๋ค.
- ํธ์ถ์ Unit์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ var ๊ฒฐ๊ณผ ์์ด ๋ณ๋์ ์ค์ ์์ฑ๋ฉ๋๋ค. Print ๋ฉ์์ง๋ ์ค์ ์ ์ค๋ช ํ๋ฉฐ ํญ๋ชฉ ์ ์ก์ ํ์ธํ์ง ์์ต๋๋ค.
var destination = "backpack";
UO.SetCatchBag(destination);
UO.Print("Receiving container: own backpack");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ์ค๋ฒ๋ก๋์๋ ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. ๋ด๋ถ์ ์ผ๋ก ์ด๋ฆ์ lastobject์ ๋๋ค.
- ๋น ๊ดํธ๋ ์ฌ์ค์ ์ ์๋ฏธํ์ง ์์ต๋๋ค. ๊ฐ๋จํ ๋ ๋ฒ ํด๋ฆญํ์ฌ ์ ์ ํ ์ปจํ ์ด๋๋ฅผ ๋ฏธ๋ฆฌ ์ ํํ์ธ์. ์ค์ ํด๋์ฉ ๊ฐ๋ฐฉ์ ์ฌ์ฉ ๊ฐ๋ฅ ์ฌ๋ถ๋ ํ์ฌ ๊ฒ์ ์ํ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.SetCatchBag();
UO.Print("Destination taken from lastobject");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ํธ์ถ์์ ์ปจํ ์ด๋=bag์๋ 16์ง์ ๋ฌธ์์ด serial์ด ํฌํจ๋์ด ์์ต๋๋ค. 0x40001234์ ์์์ด๋ฏ๋ก ์ํ๋ ๊ฐ์ผ๋ก ๋ฐ๊ฟ์ผ ํฉ๋๋ค.
- ๋ ๋ฒ์งธ ํธ์ถ์์๋ ์ปจํ ์ด๋=0๊ฐ ํ ๋น์ ์ทจ์ํฉ๋๋ค. ๋ช ์์ ์ธ ์ปจํ ์ด๋๊ฐ ์๋ ๋ค์ Grab์ ๋ฐฐ๋ญ์ ์ฌ์ฉํฉ๋๋ค.
- ์ฌ์ค์ ์ ์๋ํ ์บ๋ฆฌ ๋ธ๋ก ๋ค์ ์์นํฉ๋๋ค. ์ค์ ๋ฐ ์ฌ์ค์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์์ผ๋ฉฐ ํญ๋ชฉ์ ์์ฒด์ ์ผ๋ก ์ด๋ํ์ง ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var bag = "0x40001234";
UO.SetCatchBag(bag);
UO.Print("Configured destination: " + bag);
UO.SetCatchBag(0);
UO.Print("Destination reset to the normal backpack fallback");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.SetReceivingContainer:SetReceivingContainer(arguments.Length > 0 ? arguments[0].ToString() : "lastobject"). -
InjectionScript.Runtime.InjectionValue.ToString:arguments[0].ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setcatchbag":
SetReceivingContainer(arguments.Length > 0 ? arguments[0].ToString() : "lastobject");
break;๋งค๊ฐ๋ณ์: container (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.SetReceivingContainer:SetReceivingContainer(arguments.Length > 0 ? arguments[0].ToString() : "lastobject"). -
InjectionScript.Runtime.InjectionValue.ToString:arguments[0].ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setcatchbag":
SetReceivingContainer(arguments.Length > 0 ? arguments[0].ToString() : "lastobject");
break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetReceivingContainer();
void UO.SetReceivingContainer(object? id);ํฅํ Grab์ ๋ํ ์์ ์ปจํ ์ด๋๋ฅผ ์ง์ ํฉ๋๋ค.
-
id- ์ ํ์ฌํญ serial/๋ณ์นญ. "my"/"backpack" - ํ์ฌ ๋ฐฐ๋ญ. ๊ธ์ ID์ ์กด์ฌ ํ์ธ ์์ด ์ ์ง๋ฉ๋๋ค. 0/negative/no ์ธ์๋ ์ค์ ์ ์ง์๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ํน์ํ my/backpack๋ฅผ ์ ์ธํ๊ณ ๋ฌธ์์ด์ GetObject๋ก ํ์ธ๋ฉ๋๋ค. Bridge.SetReceivingContainer๋ State.ReceivingContainer๋ฅผ ํ ๋นํฉ๋๋ค. ์ด ํธ์ถ๋ก๋ ํญ๋ชฉ์ด ์ ์ก๋์ง ์์ต๋๋ค.
- ํด๋ฆฌ์ด ํ Grab๋ ๋ช ์์ ์ธ ๋ชฉ์ ์์ด ๋ฐฐ๋ญ์ ์ฌ์ฉํฉ๋๋ค. ๊ธ์ ์ ์ธ ID ์์ฒด๋ง์ผ๋ก๋ ์ปจํ ์ด๋๊ฐ ๋ก๋๋์๊ฑฐ๋ ์๋ฒ์ ์ก์ธ์คํ ์ ์์์ ํ์ธํ์ง ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetReceivingContainer");
UO.SetReceivingContainer();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํฅํ Grab์ ๋ํ ์์ ์ปจํ ์ด๋๋ฅผ ์ง์ ํฉ๋๋ค.
UO.SetReceivingContainer("backpack");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํน์ํ my/backpack๋ฅผ ์ ์ธํ๊ณ ๋ฌธ์์ด์ GetObject๋ก ํ์ธ๋ฉ๋๋ค. Bridge.SetReceivingContainer๋ State.ReceivingContainer๋ฅผ ํ ๋นํฉ๋๋ค. ์ด ํธ์ถ๋ก๋ ํญ๋ชฉ์ด ์ ์ก๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.SetReceivingContainer();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํด๋ฆฌ์ด ํ Grab๋ ๋ช ์์ ์ธ ๋ชฉ์ ์์ด ๋ฐฐ๋ญ์ ์ฌ์ฉํฉ๋๋ค. ๊ธ์ ์ ์ธ ID ์์ฒด๋ง์ผ๋ก๋ ์ปจํ ์ด๋๊ฐ ๋ก๋๋์๊ฑฐ๋ ์๋ฒ์ ์ก์ธ์คํ ์ ์์์ ํ์ธํ์ง ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var bag = UO.GetSerial("lastcontainer");
if (Truth(UO.IsContainer(bag)))
{
UO.SetReceivingContainer(bag);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.SetReceivingContainer. -
InjectionScript.Runtime.InjectionApiUO.UnsetReceivingContainer:UnsetReceivingContainer().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void SetReceivingContainer() => UnsetReceivingContainer();๋งค๊ฐ๋ณ์: id (Integer/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.SetReceivingContainer. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UnsetReceivingContainer:bridge.UnsetReceivingContainer(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetReceivingContainer:bridge.SetReceivingContainer(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void SetReceivingContainer(int id)
{
if (id <= 0)
bridge.UnsetReceivingContainer();
else
bridge.SetReceivingContainer(id);
}๋งค๊ฐ๋ณ์: id (Integer/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.SetReceivingContainer. -
InjectionScript.Runtime.InjectionApiUO.SetReceivingContainer:SetReceivingContainer(bridge.Backpack). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Backpack:bridge.Backpack.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void SetReceivingContainer(string id)
{
string name = (id ?? string.Empty).Trim();
if (name.Equals("my", StringComparison.OrdinalIgnoreCase)
|| name.Equals("backpack", StringComparison.OrdinalIgnoreCase))
{
SetReceivingContainer(bridge.Backpack);
return;
}
SetReceivingContainer(GetObject(id));
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.UnsetCatchBag();Grab์ ๋ํ ์์ ์ปจํ ์ด๋๋ฅผ ์ง์๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ExecuteLegacyManualAlias๊ฐ UnsetReceivingContainer์ ํธ์ถํฉ๋๋ค. ๋ธ๋ฆฌ์ง๋ ReceivingContainer=0๋ฅผ ํ ๋นํฉ๋๋ค. ํ์ Grab๋ ๋ฐฐ๋ญ์ ์ฌ์ฉํฉ๋๋ค. ์ด๊ฒ์ ๊ฐ๋ฐฉ ์ ๊ฑฐ๊ฐ ์๋๋๋ค.
- ์ง์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ง ์์ ํ๊ฑฐ๋ ํ์ํฉ๋๋ค. ์ด ๋ช ๋ น์๋ ์๋ฒ ํ์ธ์ด ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.UnsetCatchBag");
UO.UnsetCatchBag();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Grab์ ๋ํ ์์ ์ปจํ ์ด๋๋ฅผ ์ง์๋๋ค.
UO.UnsetCatchBag();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteLegacyManualAlias๊ฐ UnsetReceivingContainer์ ํธ์ถํฉ๋๋ค. ๋ธ๋ฆฌ์ง๋ ReceivingContainer=0๋ฅผ ํ ๋นํฉ๋๋ค. ํ์ Grab๋ ๋ฐฐ๋ญ์ ์ฌ์ฉํฉ๋๋ค. ์ด๊ฒ์ ๊ฐ๋ฐฉ ์ ๊ฑฐ๊ฐ ์๋๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.SetCatchBag("backpack");
UO.UnsetCatchBag();
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()
{
UO.UnsetCatchBag();
UO.Print(UO.Backpack());
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.UnsetReceivingContainer:UnsetReceivingContainer().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "unsetcatchbag": UnsetReceivingContainer(); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.UnsetReceivingContainer();์ ์ฅ๋ ์์ ์ปจํ ์ด๋๋ฅผ ์ง์๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- UnsetReceivingContainer๋ ReceivingContainer=0์ ํ ๋นํฉ๋๋ค. ์ด์ด์ง๋ Grab์์๋ ๋ช ์์ ์ธ ๋ชฉ์ ์์ด ๋ฐฐ๋ญ์ ์ฌ์ฉํฉ๋๋ค. ํญ๋ชฉ์ด ์ ์ก๋์ง ์์ต๋๋ค.
- ์ง์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ง ์์ ํ๊ฑฐ๋ ํ์ํฉ๋๋ค. ์ด ๋ช ๋ น์๋ ์๋ฒ ํ์ธ์ด ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.UnsetReceivingContainer");
UO.UnsetReceivingContainer();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ฅ๋ ์์ ์ปจํ ์ด๋๋ฅผ ์ง์๋๋ค.
UO.UnsetReceivingContainer();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UnsetReceivingContainer๋ ReceivingContainer=0์ ํ ๋นํฉ๋๋ค. ์ด์ด์ง๋ Grab์์๋ ๋ช ์์ ์ธ ๋ชฉ์ ์์ด ๋ฐฐ๋ญ์ ์ฌ์ฉํฉ๋๋ค. ํญ๋ชฉ์ด ์ ์ก๋์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.SetReceivingContainer("backpack");
UO.UnsetReceivingContainer();
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()
{
UO.UnsetReceivingContainer();
UO.Print(UO.Backpack());
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UnsetReceivingContainer. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UnsetReceivingContainer:bridge.UnsetReceivingContainer().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void UnsetReceivingContainer() => bridge.UnsetReceivingContainer();