KO UO Topic multis houses - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
์ธ๊ณ์ ๋ณตํฉ ๊ฐ์ฒด: ์ง๊ณผ ๊ธฐํ ์ฌ๋ฌ ๊ฐ์ง, ์ง๋์์์ ํด๋น ๋ถ๋ถ ๋ฐ ์์น.
| ์ฃผ์ | ๋ช ๋ น ๋ฐ ์ค๋ช |
|---|---|
| GetMultis | UO.GetMultis |
| Multi Parts | UO.GetMultiAllParts |
| Parts at Position | UO.GetMultiPartsAtPosition |
| IsHouse | UO.IsHouse |
UO.GetMultis ยท UO.GetMultiAllParts ยท UO.GetMultiPartsAtPosition ยท UO.IsHouse
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
var items = UO.GetMultis();
UO.Print(Convert.ToString(ArrayLength(items)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
var houses = UO.GetMultis();
if (Truth(ArrayLength(houses) == 0))
{
return null;
}
var parts = UO.GetMultiAllParts(houses[0]);
UO.Print(Convert.ToString(ArrayLength(parts)));
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;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetMultiAllParts(object? multiID);ํ ์ง์ ๊ตฌ์ฑ ์์์ ๋ํ ๊ธฐ๋ก์ ์ฝ์ต๋๋ค.
-
multiIDโ ํน์ ๊ฐ์ฒด์ ์ผ๋ จ๋ฒํธ/ID: int, 10์ง์/16์ง์ ๋ฌธ์์ด ๋๋ ๋ณ์นญ ์ค์ self, backpack, lasttarget, lastobject ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. HouseManager์๋ ์ง์ ID๊ฐ ๋ก๋๋์ด ์์ด์ผ ํฉ๋๋ค.
๋ฐฐ์ด<๋ฐฐ์ด>. ๊ฐ ์ค์๋ 9 ํ๋๊ฐ ํฌํจ๋ฉ๋๋ค: [0] graphic/type ๊ตฌ์ฑ์์, [1] hue, [2] world X, [3] world Y, [4] ์ธ๊ณ Z, [5] multiOffsetX - ๋ค์ค์ ์คํ์ X, [6] multiOffsetY - ์คํ์ Y, [7] multiOffsetZ - ์คํ์ Z, [8] multiSerial - serial ์ง์์. ๊ตฌ์ฑ์์ ์์ - ๋น ๋ฐฐ์ด. ๊ทธ๋ํฝ์ด ID๊ฐ ์๋๋๋ค. ๊ฐ๋ณ ์ ์ ๊ตฌ์ฑ ์์์๋ ์ฌ๊ธฐ์ ์์ฒด serial์ด ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฏธ ๋ค์ด๋ก๋ํ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์ด ๋ช ๋ น์ ์ ์ฒด ์๋ฒ์์ ์ปจํ ์ด๋๋ฅผ ์ด๊ฑฐ๋ ํญ๋ชฉ์ ์ด๋ํ๊ฑฐ๋ ๊ฐ์ฒด๋ฅผ ๋ค์ด๋ก๋ํ์ง ์์ต๋๋ค.
- ๋ฐฐ์ด - 0๋ถํฐ ์์ํ๋ ์ธ๋ฑ์ค๊ฐ ์๋ ๋ฐฐ์ด์ ๋๋ค. var์ ์ ์ฅํ๊ณ , ArrayLength๋ฅผ ํ์ธํ ํ ์ ์ํ์ธ์. ์ค๋ ์ท์ ์ฐ์ ํ ์์๊ฐ ์ธ๊ณ์์ ์ฌ๋ผ์ง ์ ์์ต๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ Exists(serial)๋ฅผ ํ์ธํ์ธ์.
- ์๋ ค์ง ์ญ์ ๋์ง ์์ ๊ตฌ์ฑ ์์ HouseManager๊ฐ ๋ฐํ๋ฉ๋๋ค. ๋ณ๋์ ์ ์ ์ง๋์ ํ ์ง๋ ์ด ๋ชฉ๋ก์ ํฌํจ๋์ง ์์ต๋๋ค. ํ์ ์ค๋ ์ท์ ๋๋ค. ๊ณ ์ ์์ ๋๋ Z ์ ๋ ฌ์ ์ฝ์๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
var multis = (object?[])UO.GetMultis();
if (multis.Length > 0) {
var parts = (object?[])UO.GetMultiAllParts(multis[0]);
UO.Print("Parts: " + parts.Length);
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ , ๋ก๋๋ ์ฃผํ์ ์ ํํฉ๋๋ค.
- ๊ธธ์ด๋ ๋์ด๋ ์ฃผํ ์๊ฐ ์๋ ๊ตฌ์ฑ์์์ ์์ ๋๋ค.
var houses = UO.GetMultis();
if (Truth(ArrayLength(houses) == 0))
{
return null;
}
var parts = UO.GetMultiAllParts(houses[0]);
UO.Print(Convert.ToString(ArrayLength(parts)));
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- parts[0]๋ ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์ค์ ๋๋ค. ๊ทธ๋ ์ [0] - type, [2]/[3]/[4] - ์ธ๊ณ X/Y/Z.
- ๋์ ์ธ๋ฑ์ค [5]/[6]/[7]์๋ ์๋ ์คํ์ ์ด ํฌํจ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var houses = UO.GetMultis();
if (Truth(ArrayLength(houses) == 0))
{
return null;
}
var parts = UO.GetMultiAllParts(houses[0]);
if (Truth(ArrayLength(parts) > 0))
{
var part = parts[0];
UO.Print("Type: 0x" + Hex(part[0]));
UO.Print(Convert.ToString(part[2]) + "," + Convert.ToString(part[3]) + "," + Convert.ToString(part[4]));
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- [8]๋ ์ง์์ serial์ด๊ณ , [7]๋ Z ๊ตฌ์ฑ์์์ ์คํ์ ์ ๋๋ค.
- ์ง์์ serial๊ฐ ์์๋๋ ๋ช ๋ น์ ๋ถ๋ถ[0]์ ์ ๋ฌํ์ง ๋ง์ธ์. ์ด๋ ๋ณ๋์ ๊ตฌ์ฑ์์์ 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 houses = UO.GetMultis();
if (Truth(ArrayLength(houses) == 0))
{
return null;
}
var parts = UO.GetMultiAllParts(houses[0]);
var i = 0;
while (Truth(i < ArrayLength(parts)))
{
var part = parts[i];
UO.Print("Multi: 0x" + Hex(part[8]) + ", offset Z: " + Convert.ToString(part[7]));
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;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: multiID (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetMultiAllParts:bridge.GetMultiAllParts(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getmultiallparts":
return new InjectionValue((bridge.GetMultiAllParts(Arg(0)) ?? Array.Empty<int[]>())
.Select(part => new InjectionValue((part ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray())).ToArray());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetMultiPartsAtPosition(object? x, object? y);์ง์ ๋ ์๋ ์ ์ ์๋ ์ฃผํ์ ๊ตฌ์ฑ ์์๋ฅผ ์ฝ์ต๋๋ค.
-
xโ ์ง ๋ด๋ถ ์คํ์ ์ด ์๋ ํ์ฌ ์ง๋ ์ ์ ์ธ๊ณ X ์ขํ์ ๋๋ค. -
yโ ์ ์ ์ธ๊ณ ์ขํ Y. ๋ชจ๋ Z ๋์ด์์ ์ด ์ ์ ๋ก๋๋ ๋ชจ๋ ์ฃผํ์ ๊ตฌ์ฑ ์์๊ฐ ๋ฐํ๋ฉ๋๋ค.
๋ฐฐ์ด<๋ฐฐ์ด>. ๊ฐ ์ค์๋ 9 ํ๋๊ฐ ํฌํจ๋ฉ๋๋ค: [0] graphic/type ๊ตฌ์ฑ์์, [1] hue, [2] world X, [3] world Y, [4] ์ธ๊ณ Z, [5] multiOffsetX - ๋ค์ค์ ์คํ์ X, [6] multiOffsetY - ์คํ์ Y, [7] multiOffsetZ - ์คํ์ Z, [8] multiSerial - serial ์ง์์. ๊ตฌ์ฑ์์ ์์ - ๋น ๋ฐฐ์ด. ๊ทธ๋ํฝ์ด ID๊ฐ ์๋๋๋ค. ๊ฐ๋ณ ์ ์ ๊ตฌ์ฑ ์์์๋ ์ฌ๊ธฐ์ ์์ฒด serial์ด ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฏธ ๋ค์ด๋ก๋ํ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์ด ๋ช ๋ น์ ์ ์ฒด ์๋ฒ์์ ์ปจํ ์ด๋๋ฅผ ์ด๊ฑฐ๋ ํญ๋ชฉ์ ์ด๋ํ๊ฑฐ๋ ๊ฐ์ฒด๋ฅผ ๋ค์ด๋ก๋ํ์ง ์์ต๋๋ค.
- ๋ฐฐ์ด - 0๋ถํฐ ์์ํ๋ ์ธ๋ฑ์ค๊ฐ ์๋ ๋ฐฐ์ด์ ๋๋ค. var์ ์ ์ฅํ๊ณ , ArrayLength๋ฅผ ํ์ธํ ํ ์ ์ํ์ธ์. ์ค๋ ์ท์ ์ฐ์ ํ ์์๊ฐ ์ธ๊ณ์์ ์ฌ๋ผ์ง ์ ์์ต๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ Exists(serial)๋ฅผ ํ์ธํ์ธ์.
- ์๋ ค์ง ์ญ์ ๋์ง ์์ ๊ตฌ์ฑ ์์ HouseManager๊ฐ ๋ฐํ๋ฉ๋๋ค. ๋ณ๋์ ์ ์ ์ง๋์ ํ ์ง๋ ์ด ๋ชฉ๋ก์ ํฌํจ๋์ง ์์ต๋๋ค. ํ์ ์ค๋ ์ท์ ๋๋ค. ๊ณ ์ ์์ ๋๋ Z ์ ๋ ฌ์ ์ฝ์๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetMultiPartsAtPosition(UO.GetX(), UO.GetY());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- X/Y - ์บ๋ฆญํฐ์ ํ์ฌ ์์น.
- ๊ธธ์ด๋ ๋์ด๋ ์ฃผํ ์๊ฐ ์๋ ๊ตฌ์ฑ์์์ ์์ ๋๋ค.
var parts = UO.GetMultiPartsAtPosition(UO.GetX(), UO.GetY());
UO.Print(Convert.ToString(ArrayLength(parts)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- parts[0]๋ ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์ค์ ๋๋ค. ๊ทธ๋ ์ [0] - type, [2]/[3]/[4] - ์ธ๊ณ X/Y/Z.
- ๋์ ์ธ๋ฑ์ค [5]/[6]/[7]์๋ ์๋ ์คํ์ ์ด ํฌํจ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var parts = UO.GetMultiPartsAtPosition(UO.GetX(), UO.GetY());
if (Truth(ArrayLength(parts) > 0))
{
var part = parts[0];
UO.Print("Type: 0x" + Hex(part[0]));
UO.Print(Convert.ToString(part[2]) + "," + Convert.ToString(part[3]) + "," + Convert.ToString(part[4]));
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- [8]๋ ์ง์์ serial์ด๊ณ , [7]๋ Z ๊ตฌ์ฑ์์์ ์คํ์ ์ ๋๋ค.
- ์ง์์ serial๊ฐ ์์๋๋ ๋ช ๋ น์ ๋ถ๋ถ[0]์ ์ ๋ฌํ์ง ๋ง์ธ์. ์ด๋ ๋ณ๋์ ๊ตฌ์ฑ์์์ 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 parts = UO.GetMultiPartsAtPosition(UO.GetX(), UO.GetY());
var i = 0;
while (Truth(i < ArrayLength(parts)))
{
var part = parts[i];
UO.Print("Multi: 0x" + Hex(part[8]) + ", offset Z: " + Convert.ToString(part[7]));
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;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: x (Any), y (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetMultiPartsAtPosition:bridge.GetMultiPartsAtPosition(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getmultipartsatposition":
return new InjectionValue((bridge.GetMultiPartsAtPosition(Arg(0), Arg(1)) ?? Array.Empty<int[]>())
.Select(part => new InjectionValue((part ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray())).ToArray());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetMultis();ํด๋ผ์ด์ธํธ๊ฐ ํ/๋ฉํฐ๋ก ์ธ์ํ ๋ก๋๋ ๊ฐ์ฒด ๋ชฉ๋ก์ ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๋ฐฐ์ด์ IsHouse๊ฐ 1๋ฅผ ๋ฐํํ๋ ์๋ ์์ดํ ์ serial์ ๋๋ค. ๊ทธ๋ฌํ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด ๋น ๋ฐฐ์ด์ ๋๋ค. ์ด๊ฒ์ ID ์ฃผํ์ด๋ฉฐ ๊ทธ๋ํฝ ๊ตฌ์ฑ ์์ ๋ชฉ๋ก๋ ์๋๊ณ ์ขํ ๋ชฉ๋ก๋ ์๋๋ฉฐ ์๋ฒ์ ๋ชจ๋ ์ฃผํ ๋ชฉ๋ก๋ ์๋๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฏธ ๋ค์ด๋ก๋ํ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์ด ๋ช ๋ น์ ์ ์ฒด ์๋ฒ์์ ์ปจํ ์ด๋๋ฅผ ์ด๊ฑฐ๋ ํญ๋ชฉ์ ์ด๋ํ๊ฑฐ๋ ๊ฐ์ฒด๋ฅผ ๋ค์ด๋ก๋ํ์ง ์์ต๋๋ค.
- ๋ฐฐ์ด - 0๋ถํฐ ์์ํ๋ ์ธ๋ฑ์ค๊ฐ ์๋ ๋ฐฐ์ด์ ๋๋ค. var์ ์ ์ฅํ๊ณ , ArrayLength๋ฅผ ํ์ธํ ํ ์ ์ํ์ธ์. ์ค๋ ์ท์ ์ฐ์ ํ ์์๊ฐ ์ธ๊ณ์์ ์ฌ๋ผ์ง ์ ์์ต๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ Exists(serial)๋ฅผ ํ์ธํ์ธ์.
- ๋ก๋๋ ์๋ ์์ดํ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ํ ์ง์ ๊ตฌ์ฑ ์์์๋ GetMultiAllParts(serial)๋ฅผ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetMultis();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. ๋ก๋๋ ํ์ฐ์ค/๋ฉํฐ ์์ดํ ์ด ์ ํ๋ฉ๋๋ค.
- ๊ธธ์ด - ๋ ์ฝ๋ ์/ID. ์ด๊ฒ์ ์คํ์ ์์ด ์๋๋๋ค. ๋น ๋ชฉ๋ก์ 0์ ์ ๊ณตํฉ๋๋ค.
var items = UO.GetMultis();
UO.Print(Convert.ToString(ArrayLength(items)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. ๋ก๋๋ ํ์ฐ์ค/๋ฉํฐ ์์ดํ ์ด ์ ํ๋ฉ๋๋ค.
- items[i] โ ์ซ์ serial. 16์ง์๋ ์ถ๋ ฅ์๋ง ์ฌ์ฉ๋ฉ๋๋ค. ๋ฃจํ๋ ๋ง์ง๋ง ์ธ๋ฑ์ค์ ์ก์ธ์คํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var items = UO.GetMultis();
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. ๋ก๋๋ ํ์ฐ์ค/๋ฉํฐ ์์ดํ ์ด ์ ํ๋ฉ๋๋ค.
- ๋ ๊ฐ์ง ๋ค๋ฅธ ์ฌํญ, ์ฆ ์ค๋ ์ท์ ๊ธฐ๋ก๊ณผ ํ์ฌ ๊ฐ์ฒด์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. ๋ช ์์ ์ธ ์ ๋ ฌ์ด ์๋ ์์๋ ์น๋ฐํจ์ ์๋ฏธํ์ง ์์ต๋๋ค.
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.GetMultis();
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;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetWorldItems:bridge.GetWorldItems(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsHouse:bridge.IsHouse(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getmultis":
return new InjectionValue(bridge.GetWorldItems().Where(id => bridge.IsHouse(id) != 0).Select(id => new InjectionValue(id)).ToArray());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsHouse(object? objID);๋ก๋๋ ๊ฐ์ฒด(์ง, ๋ฐฐ ๋๋ ๊ธฐํ ๋ค์ค ํ์ผ ๊ตฌ์กฐ)์ ๋ํ ๋ค์ค ํ๋๊ทธ๋ฅผ ํ์ธํฉ๋๋ค.
-
objIDโ ํน์ ๊ฐ์ฒด์ ํ์ serial/ID: int, 16์ง์ ๋ฌธ์์ด ๋๋ ๋ณ์นญ self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. ์ง์ ๋์ง ์์ ์ด๋ฆ์ 0๋ก ํด์๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ ๋์์ ์ด์ง ์์ต๋๋ค.
int 1 - IsMulti ์์ฑ์ ๊ฐ์ง ์์ดํ . int 0 - ์ผ๋ฐ ๊ฐ์ฒด, mobile, ์ ์ ์๊ฑฐ๋ ์๊ฒฉ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ฆ์ ๊ฒฐ๊ณผ๋ฅผ ์ฃผํ์ผ๋ก ์ ํํ์ง ์์ต๋๋ค. ๋ฐฐ๋ 1๋ ์ ๊ณตํ ์ ์์ต๋๋ค. ํ์ ์ง์ฃผ์ธ, ์ง์ญ ๋๋ ์ง์ญ์ ๋ฐํํ์ง ์์ต๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ์๋ฒ์ ๋ํ ์์ฒญ๋ ์๊ณ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ด๋ํ ํ์๋ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ์ฝ๋ ์๊ฐ์ ๊ฐ๋ฆฌํจ๋ค. UO.Wait ๋๋ ๋ค๋ฅธ ์์ ํ์ ๊ฐ์ฒด์ ํด๋น ํ๋๊ทธ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsHouse(UO.GetSerial("lasttarget"));
UO.Print("IsHouse: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ๊ฒ์ ๊ฐ๋ณ ๋ฒฝ์ graphic์ด ์๋ ๋ค์ค ๊ฐ์ฒด์ serial๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค.
- 1๋ ํด๋์ค ๋ฉํฐ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด๋ ํด๋น ๊ตฌ์กฐ๋ฌผ์ด ์ฃผ๊ฑฐ์ฉ ๊ฑด๋ฌผ์ด๋ผ๋ ์ฆ๊ฑฐ๊ฐ ์๋๋๋ค.
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsHouse(target)))
{
UO.Print("Loaded multi structure");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ ๋ค์ mobile๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
- Exists๊ฐ ์๋ 0์ ์ผ๋ฐ ๊ฐ์ฒด๊ฐ ์๋๋ผ ๊ฐ์ฒด๊ฐ ์์์ ์๋ฏธํ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(target)))
{
if (Truth(UO.IsNPC(target) == 0))
{
if (Truth(UO.IsHouse(target)))
{
UO.Print("Multi");
}
else
{
UO.Print("Ordinary 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- self๋ mobile์ด๋ฏ๋ก ์ง ์์์๋ ์ฒซ ๋ฒ์งธ ๊ฒฐ๊ณผ๋ 0์ ๋๋ค.
- ๊ตฌ๋ฌธ์ ํ ์คํธํ๋ ค๋ฉด ์์ฒด 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 selfIsMulti = UO.IsHouse("self");
var selectedIsMulti = UO.IsHouse("lasttarget");
UO.Print("Self: " + Convert.ToString(selfIsMulti));
UO.Print("Selected object: " + Convert.ToString(selectedIsMulti));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsHouse:bridge.IsHouse(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "ishouse": return new InjectionValue(bridge.IsHouse(Arg(0)));