KO UO Topic items Part 2 - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.MoveItem(object? id);
int UO.MoveItem(object? id, object? amount);
int UO.MoveItem(object? id, object? amount, object? targetContainer);
int UO.MoveItem(object? item, object? amount, object? container, object? x);
int UO.MoveItem(object? item, object? amount, object? container, object? x, object? y);
int UO.MoveItem(object? id, object? amount, object? targetContainer, object? x, object? y, object? z);
int UO.MoveItem(object? item, object? amount, object? container, object? x, object? y, object? z, object? timeout);
int UO.MoveItem(object? item, object? amount, object? container, object? x, object? y, object? z, object? timeout, object? waitConfirmation);serial๋ก ํ๋์ ํน์ ์์ดํ /์คํ์ ์ด๋ฐํฉ๋๋ค. ํฌํํ์ฌ ์ปจํ ์ด๋๋ ๋ ์ ๋จ์ด๋จ๋ฆฝ๋๋ค.
-
idโ ํน์ ํญ๋ชฉ/๋ฌธ์์ ์ผ๋ จ๋ฒํธ: ์ซ์, 16์ง์/10์ง์ ๋ฌธ์์ด, self/backpack/lasttarget/lastobject/lastcontainer/lastcorpse/finditem/laststatus ๋๋ ์ ์ฅ๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type์ด ์๋๋๋ค. ๊ฐ์ฒด๋ฅผ ๋ก๋ํด์ผ ํฉ๋๋ค. ์์ ์ ์ Exists๋ฅผ ํ์ธํ์ธ์. -
itemโ ํน์ ํญ๋ชฉ/๋ฌธ์์ ์ผ๋ จ๋ฒํธ: ์ซ์, 16์ง์/10์ง์ ๋ฌธ์์ด, self/backpack/lasttarget/lastobject/lastcontainer/lastcorpse/finditem/laststatus ๋๋ ์ ์ฅ๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type์ด ์๋๋๋ค. ๊ฐ์ฒด๋ฅผ ๋ก๋ํด์ผ ํฉ๋๋ค. ์์ ์ ์ Exists๋ฅผ ํ์ธํ์ธ์. -
amountโ ํ ์คํ ์์ ์๋ ๋จ์ ์์ ๋๋ค. 0 ๋๋ ์์ ๊ฐ์ ์ ์ฒด ์คํ์ ์๋ฏธํฉ๋๋ค. ๊ธ์ ์ ์ธ ๊ฒ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์๋์ ์ํด ์ ํ๋ฉ๋๋ค. MassMove๋ฅผ ์ ํํ๋ ๊ฒ์ ์คํ ์๊ฐ ์๋๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 0์ ๋๋ค. -
targetContainerโ ์ปจํ ์ด๋์ ์ผ๋ จ๋ฒํธ ๋๋ ์ธํธ ์ด๋ฆ AddObject; backpack/self/my ๋ฐฐ๋ญ์ ์ ํํ๊ณ , receiving/catchbag - SetCatchBag๋ฅผ ์ ํํ๊ณ , ๋ฐฐ๋ญ์ด ์์ผ๋ฉด ๋ฐฐ๋ญ์ ์ ํํฉ๋๋ค. lastcontainer/lastobject/lasttarget/lastcorpse/finditem/laststatus๋ ์ฌ๋ฐ๋ฅธ ์ปจํ ์ด๋๋ก ํ์ธ๋๋ฉด ์ ํจํฉ๋๋ค. ground ๋๋ 0๋ ํ ์ง๋ฅผ ๋ช ์์ ์ผ๋ก ์ ํํฉ๋๋ค. -1โ๋์ผํ ๋ฐฐ๋ญ ์ ํ๊ธฐ. ์ ์ ์๊ฑฐ๋ ์ง์ ๋์ง ์์ ์ด๋ฆ์ผ๋ก ์ธํด ํญ๋ชฉ์ด ์บก์ฒ๋๊ธฐ ์ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ชฉ์ ์ง ์ธ์๊ฐ ์์ผ๋ฉด ๋ฐฐ๋ญ์ด ์ฌ์ฉ๋ฉ๋๋ค. -
containerโ ์ปจํ ์ด๋์ ์ผ๋ จ๋ฒํธ ๋๋ ์ธํธ ์ด๋ฆ AddObject; backpack/self/my ๋ฐฐ๋ญ์ ์ ํํ๊ณ , receiving/catchbag - SetCatchBag๋ฅผ ์ ํํ๊ณ , ๋ฐฐ๋ญ์ด ์์ผ๋ฉด ๋ฐฐ๋ญ์ ์ ํํฉ๋๋ค. lastcontainer/lastobject/lasttarget/lastcorpse/finditem/laststatus๋ ์ฌ๋ฐ๋ฅธ ์ปจํ ์ด๋๋ก ํ์ธ๋๋ฉด ์ ํจํฉ๋๋ค. ground ๋๋ 0๋ ํ ์ง๋ฅผ ๋ช ์์ ์ผ๋ก ์ ํํฉ๋๋ค. -1โ๋์ผํ ๋ฐฐ๋ญ ์ ํ๊ธฐ. ์ ์ ์๊ฑฐ๋ ์ง์ ๋์ง ์์ ์ด๋ฆ์ผ๋ก ์ธํด ํญ๋ชฉ์ด ์บก์ฒ๋๊ธฐ ์ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ชฉ์ ์ง ์ธ์๊ฐ ์์ผ๋ฉด ๋ฐฐ๋ญ์ด ์ฌ์ฉ๋ฉ๋๋ค. -
xโ ์ปจํ ์ด๋ ํฌํจ โ ๊ฒํ์ X, ๊ธฐ๋ณธ๊ฐ 65535(์๋). ์ง์์ ์์ ๋ - ์๋ X, ๊ธฐ๋ณธ ์บ๋ฆญํฐ X. -
y- Y ๊ฒํ ๋๋ ์ธ๊ณ Y; ๊ธฐ๋ณธ๊ฐ์ ์ปจํ ์ด๋์ ๊ฒฝ์ฐ 65535, ๋๋์ ๊ฒฝ์ฐ Y ๋ฌธ์์ ๋๋ค. -
zโ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปจํ ์ด๋์ ๋์ด๋ 0 ๋๋ ์ง๋ฉด์ ์๋ ์บ๋ฆญํฐ์ Z์ ๋๋ค. -
timeoutโ ์ผ๊ณฑ ๋ฒ์งธ ์ธ์: ์ต๋ ๋๊ธฐ ์๊ฐ(ms), ๊ธฐ๋ณธ๊ฐ 1000; ์์ ๊ฐ์ 0์ ๊ฐ์ต๋๋ค. ์ฌ๋ ๋ฒ์งธ waitConfirmation=true์๋ง ์ฌ์ฉ๋ฉ๋๋ค. -
waitConfirmationโ ์ฌ๋ ๋ฒ์งธ ์ธ์: true/1์๋ ๊ด์ฐฐ๋ ์ธ๊ณ ๋ณํ์ ๋ํ ๊ธฐ๋๊ฐ ํฌํจ๋ฉ๋๋ค. false/0(๊ธฐ๋ณธ๊ฐ)์ ์์ฒญ ์ ์ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
int 1 โ ํด๋ผ์ด์ธํธ๊ฐ ์บก์ฒ ๋ฐ ์ฌ์ค์ ์์ฒญ์ ์๋ฝํ์ต๋๋ค. 0โ์์ฒญ์ ์๋ฃํ ์ ์์ต๋๋ค. waitConfirmation=true ๊ฒฝ์ฐ ์ปจํ ์ด๋/์ขํ์ ๊ด์ฐฐ ๊ฐ๋ฅํ ๋ณ๊ฒฝ ๋๋ ์๋ ์คํ์ ๊ฐ์๊ฐ ์ถ๊ฐ๋ก ํ์ํฉ๋๋ค. ์ด๋ ์๋ก์ด ์คํ์ serial๋ ์๋๊ณ ์ ์ก๋ ์์ดํ ์ ๊ฐ์๋ ์๋๋๋ค. ์๋ฒ ์ด์์ ๊ฑฐ๋ถํ ์ ์์ต๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- 1๋ถํฐ 8๊น์ง์ ๋ชจ๋ ์ธ์ ๊ธธ์ด๊ฐ ์ง์๋ฉ๋๋ค. x๊ฐ ์ฃผ์ด์ง๋ฉด y/z๋ฅผ ์๋ตํ ์ ์์ต๋๋ค. ์ค๋ช ๋ ๊ธฐ๋ณธ๊ฐ์ด ์ฌ์ฉ๋ฉ๋๋ค.
- ์๋ ค์ง ๋์ ์ด๋ฆ์ ์บก์ฒ ์ ์ ํ์ธ๋ฉ๋๋ค. ์ ์ง์ ๊ฒฝ์ฐ ๋ช ์์ ์ผ๋ก ground/0๋ฅผ ์ฌ์ฉํ์ธ์. ์ด๋ฆ์ ์คํ๊ฐ ์์ด๋ ํด๋น ํญ๋ชฉ์ ๋ฐ๋ฅ์ ๋์ ธ์๋ ์ ๋ฉ๋๋ค.
- ์์ดํ ์ ์์, ๊ฐ๋ฐฉ ๋๋ ๋ฐฐ๋ญ์ ์์ ์ ์์ต๋๋ค. ground๋ ์๋ ์ปจํ ์ด๋์ ๊ด๊ณ์์ด ์ง์์ ๋ชฉ์ ์ง๋ฅผ ์ค์ ํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ธ์๋ ๊ฐ์ด์ด๋ type๊ฐ ์๋ ํญ๋ชฉ ์์ฒด์ serial์ ์ง์ ํฉ๋๋ค. ํ์ ํํด ์์ฒด๋ฅผ ์ํํฉ๋๋ค. ๋จผ์ ๋ง์ฐ์ค๋ก ํญ๋ชฉ์ ์ก์ ํ์๊ฐ ์์ต๋๋ค.
- DropCheckCoord๊ฐ ์ผ์ง๋ฉด 2์ ์ ๋์ด ๋ ์ ํฌ๊ธฐ๊ฐ ๊ฑฐ๋ถ๋ฉ๋๋ค. ์๋ฒ๋ ์ถ๊ฐ๋ก ๊ณต๊ฐ ๊ฐ์ฉ์ฑ์ ํ์ธํฉ๋๋ค. X/Y - ๊ฒํ ํฝ์ ์ด ์๋ ์ ์ ๋งคํํฉ๋๋ค. Zโ๋ค๊ฑฐํฐ๋ธ๋ฅผ ํฌํจํ ์ ํํ ํ๋ฉด์ ๋์ด. ์ปจํ ์ด๋์ ๊ฒฝ์ฐ X/Y๋ ์ฌ์ ํ ์ฉ๊ธฐ ๋ด๋ถ์ ์ฅ์๋ฅผ ์๋ฏธํฉ๋๋ค.
- ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ํด๋ผ์ด์ธํธ ์ธ๊ณ์ ์ํ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ถ๋ถ ์คํ์ ๊ฒฝ์ฐ ์๋ ๊ฐ์, ์ ์ฒด์ ๊ฒฝ์ฐ ์ปจํ ์ด๋, ์ง์์ ๊ฒฝ์ฐ ๋ ๋ค๋ฅธ X/Y/Z. ์ปจํ ์ด๋ ๋ด๋ถ์์ ๊ฒํ์ ์ ํํ ์์น๋ ์ด๋ฌํ ์์์ผ๋ก ํ์ธ๋์ง ์์ต๋๋ค. ์คํ์ด ์ฌ๋ผ์ง๊ฑฐ๋ ๋ณํฉ๋๋ฉด ํ์ธ์ด ๋ณต์กํด์ง ์ ์์ต๋๋ค.
- ์ด๋ ๋ณ๋์ ๊ฑฐ๋ ID ํ์ธ์ด ์๋๋๋ค. ํญ๋ชฉ์ด ์ด๋ฏธ ๋์ผํ ์ปจํ ์ด๋์ ์๋ ๊ฒฝ์ฐ ์ปจํ ์ด๋๋ฅผ ์ผ์นํ๋ค๊ณ ํด์ Gump ๋ด์์ ์๋ก์ด ์ด๋์ด ์ฆ๋ช ๋์ง๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.MoveItem("lasttarget");
UO.Print("MoveItem: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ๋ฆฌํ - ์ด๋ฆ AddObject; ๊ธ์ก์ด ๋๋ฝ๋์์ผ๋ฉฐ 0๊ณผ ๊ฐ์ต๋๋ค. ๋ชฉ์ ์ง๋ ๋ฐฐ๋ญ์ ๋๋ค.
- ํน์ ์ ํ์ ๋ชจ๋ ํญ๋ชฉ์ด ์๋ ํ๋์ ํญ๋ชฉ/์คํ์ด ์ ์ก๋ฉ๋๋ค.
var ok = UO.MoveItem("loot");
UO.Print("Move request: " + Convert.ToString(ok));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- amount=10 ํ ์คํ์ ๋จ์, chest๋ ์ปจํ ์ด๋์ ์ด๋ฆ, x/y=60/70, ๊ฒํ ๋ด๋ถ, z=0.
- ์๋์ MassMove์์ ์ฑํํ "10์คํ" ๊ฐ์ด ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var ok = UO.MoveItem("loot", 10, "chest", 60, 70, 0);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ground๋ ํ ์ง๋ฅผ ๋ช ์์ ์ผ๋ก ์ ํํฉ๋๋ค. ๋๋ฝ๋ X/Y/Z๋ ์บ๋ฆญํฐ์์ ๊ฐ์ ธ์ต๋๋ค.
- ๋ค๋ฅธ ์ง์ ์ ๊ฒฝ์ฐ ๋ฒ์์ DropCheckCoord๋ฅผ ๊ณ ๋ คํ์ฌ ์ธ๊ณ ์ขํ๋ฅผ ์ ๋ฌํฉ๋๋ค.
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.MoveItem("loot", 0, "ground");
return null;
}
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ground_item - ์ ํํ ์์ดํ ์ ์ด๋ฆฐ ์์์ serial ์ ์ฅํฉ๋๋ค. ์๋ ์์๋ ๋ณ๋์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋์ง ์์ต๋๋ค. amount=0๋ ์ ์ฒด ์คํ์ ๊ฐ์ ธ์ต๋๋ค. ์๋ฅผ ๋ค์ด, 10๋ ์ด ์คํ์ ์ต๋ 10๊ฐ ๋จ์๋ฅผ ์ฐจ์งํฉ๋๋ค.
- ground๋ ํ ์ง๋ฅผ ๋ช ํํ๊ฒ ์ ํํฉ๋๋ค. x/y โ ๋ฌธ์๋ก๋ถํฐ X๋ฅผ ๋ฐ๋ผ ํ ์ ์ ์๋ ์ ์ ์ ๋ ์ขํ์ ๋๋ค. z๋ ๋ฌธ์์์ ๋ฐ์จ ๊ฒ์ด๋ฉฐ ์ธ์ ํ ํ๋ฉด์ ๋์ด๊ฐ ๊ฐ์ ๊ฒฝ์ฐ์ ์ ํฉํฉ๋๋ค. ๊ณ๋จ, ํ ์ด๋ธ, ๊ธฐํ ๋ฐ๋ฅ์ ์ํ๋ ํ๋ฉด์ ์ค์ Z๋ฅผ ์ค์ ํ์ธ์.
- sent=1๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ฌ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๊ฐ ์์ผ๋ฉด ์๋ฒ ํ์ธ์ด ์์๋์ง ์์ต๋๋ค. 0 ๊ฐ์ ์์ฒญ์ด ์คํจํ์์ ์๋ฏธํฉ๋๋ค. ์ด๊ฒ์ ์ซ์ ํ๋๊ทธ์ ๋๋ค int 1/0: check sent != 0 ๋๋ sent == 0; bool์์ ๋น๊ต๋ ์ ํจํ์ง ์์ต๋๋ค.
- ๋ฐ์์ ์ง์ ์ฌ์ค์ ํ๋ ค๋ฉด UO.MoveItem('ground_item', 0, 'ground')์ด๋ฉด ์ถฉ๋ถํฉ๋๋ค. ์ธ ์ขํ๋ ๋ชจ๋ ์บ๋ฆญํฐ์์ ๊ฐ์ ธ์ต๋๋ค. ์์ ์์ ๋ฐฐ์นํ๋ ค๋ฉด ground ๋์ serial/์์ ์ด๋ฆ๊ณผ ๊ฒํ ์ขํ๋ฅผ ์ง์ ํ์ธ์.
UO.AddObject("ground_item");
var x = UO.GetX() + 1;
var y = UO.GetY();
var z = UO.GetZ();
var sent = UO.MoveItem("ground_item", 0, "ground", x, y, z);
if (Truth(sent == 1))
{
UO.Print("Ground move request sent");
}
else
{
UO.Print("Ground move request was not sent");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- waitConfirmation=true์ด๋ฏ๋ก timeout=1500ms๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. x/y=-1 โ ์๋ ๋ฐฐ์น.
- 0๋ ์ด๋ฏธ ์ ์ก๋ ์์ฒญ์ ๋ํ ์๊ฐ ์ด๊ณผ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค. ๋งน๋ชฉ์ ์ผ๋ก ์ ์ก์ ๋ฐ๋ณตํ์ง ๋ง์ญ์์ค. ๋จผ์ ์ํ์ ํ์ฌ ์ํ๋ฅผ ํ์ธํด์ฃผ์ธ์.
return RunScenario();
object? RunScenario()
{
var ok = UO.MoveItem("loot", 0, "backpack", -1, -1, 0, 1500, true);
if (Truth(ok == 0))
{
UO.Print("Move was rejected or not confirmed");
}
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)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.MoveItem. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveItem:CompactMoveItem(new[] { id }).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int MoveItem(InjectionValue id)
=> CompactMoveItem(new[] { id });๋งค๊ฐ๋ณ์: id (Any), amount (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.MoveItem. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveItem:CompactMoveItem(new[] { id, amount }).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int MoveItem(InjectionValue id, InjectionValue amount)
=> CompactMoveItem(new[] { id, amount });๋งค๊ฐ๋ณ์: id (Any), amount (Any), targetContainer (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.MoveItem. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveItem:CompactMoveItem(new[] { id, amount, targetContainer }).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int MoveItem(InjectionValue id, InjectionValue amount, InjectionValue targetContainer)
=> CompactMoveItem(new[] { id, amount, targetContainer });๋งค๊ฐ๋ณ์: item (Any), amount (Any), container (Any), x (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [MoveItem]. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveItem:CompactMoveItem(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactMoveItem(values))๋งค๊ฐ๋ณ์: item (Any), amount (Any), container (Any), x (Any), y (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [MoveItem]. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveItem:CompactMoveItem(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactMoveItem(values))๋งค๊ฐ๋ณ์: id (Any), amount (Any), targetContainer (Any), x (Any), y (Any), z (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.MoveItem. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveItem:CompactMoveItem(new[] { id, amount, targetContainer, x, y, z }).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int MoveItem(InjectionValue id, InjectionValue amount, InjectionValue targetContainer, InjectionValue x, InjectionValue y, InjectionValue z)
=> CompactMoveItem(new[] { id, amount, targetContainer, x, y, z });๋งค๊ฐ๋ณ์: item (Any), amount (Any), container (Any), x (Any), y (Any), z (Any), timeout (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [MoveItem]. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveItem:CompactMoveItem(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactMoveItem(values))
UO.MoveItem(item, amount, container, x, y, z, timeout, waitConfirmation) โ UO.MoveItem(Any,Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: item (Any), amount (Any), container (Any), x (Any), y (Any), z (Any), timeout (Any), waitConfirmation (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [MoveItem]. -
InjectionScript.Runtime.InjectionApiUO.CompactMoveItem:CompactMoveItem(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactMoveItem(values))ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.MoveItems(object? container, object? itemsType, object? itemsColor, object? moveIntoID, object? x, object? y, object? z, object? delayMS);๋ชจ๋ ์ ํฉํ ํ๋ชฉ์ ํ ์ปจํ ์ด๋์์ ๋ค๋ฅธ ์ปจํ ์ด๋๋ก ๋๋ ์ง์์ผ๋ก ์ง์ ์ฎ๊น๋๋ค. ํญ๋ชฉ์ graphic ๋ฐ hue์ ์ํด ์ ํ๋ฉ๋๋ค. ๊ฐ ์คํ์ ์์ ํ ์ ์ก๋ฉ๋๋ค. ์ด๊ฒ์ ๋ฌผ๊ฑด์ ์ฎ๊ธฐ๋ ๊ฒ์ด์ง ์บ๋ฆญํฐ ๊ฑท๊ธฐ๋ MassMove์ ๋ํํ ํ์ฑํ๊ฐ ์๋๋๋ค.
-
containerโ backpack, "backpack", ์ด๋ฆ AddObject ๋๋ hex-ID์ ๊ฐ์ ์์ค ์ปจํ ์ด๋์ ์ผ๋ จ ๋ฒํธ์ ๋๋ค. ์ฝํ ์ธ ๊ฐ ์ด๋ฏธ ๋ค์ด๋ก๋๋์ด ์์ด์ผ ํฉ๋๋ค. 0์ ์ ํจํ ์ถ์ฒ๊ฐ ์๋๋๋ค. ground๋ ์บ๋ฆญํฐ ์ฃผ๋ณ์ ์ฌ๋ฌผ์ ์ ํํ์ง ์์ต๋๋ค. ๋ฐฐ๋ญ์ ๊ฒฝ์ฐ self ๋์ backpack๋ฅผ ์ฌ์ฉํ์ธ์. -
itemsType- ๊ทธ๋ํฝ ํญ๋ชฉ(์: 0x0EED) - ๊ธ. ID ์ฌ๋ฌผ๋ ์๋๊ณ mobile ๋ชธ๋ ์๋๋๋ค. ์์ ๋๋ 0xFFFF - ๋ชจ๋ ์ ํ. ๋ฐฐ์ด/์ ํ ๋ง์คํฌ๋ ํ์ฉ๋์ง ์์ต๋๋ค. -
itemsColorโ Hue ๊ฒ๋ค. -1(๋๋ ๊ธฐํ ์์) ๋ฐ 0xFFFF - ๋ชจ๋; 0 - hue 0์๋ง ํด๋น๋ฉ๋๋ค. serial๋ ์๋๊ณ ์ ๋ช ๋ ์๋๋๋ค. -
moveIntoIDโ ๋์ ์ปจํ ์ด๋ ๋๋ ๊ฐ์ฒด ๋ณ์นญ์ ์ผ๋ จ ๋ฒํธ์ ๋๋ค. ๋ฐฐ๋ญ์ฉ - backpack. ํ ์ง์ ๊ฒฝ์ฐ - ์ซ์ 0 (๋ํ ground/"ground"/UO.Ground()). ์์ค์ ๋์์ด ๋ฌ๋ผ์ผ ํฉ๋๋ค. - ์ด ๋ช ๋ น์์ 1๋ backpack์ ์ฝ์๊ฐ ์๋๋๋ค. Self - serial mobile ๋ฐฐ๋ญ์ ์๋์ผ๋ก ๊ต์ฒดํ๋ ๋์ . -
xโ 0์ด ์๋ ์ปจํ ์ด๋์ ๊ฒฝ์ฐ ๊ฒํ ๋ด๋ถ์ ์์น์ ๋๋ค. -1,-1 ๋ฐฐ์น๋ ์๋ฒ์ ๋งก๊ธฐ์ธ์. ์ง์ - ์ธ๊ณ ์ขํ 0..65535, ๋ ๋ค ํ์์ด๋ฉฐ ์์๊ฐ ์๋๋๋ค. ๊ฒ์ ์ธ๊ณ์ ํ๋ฉด ํฝ์ ๋ ์๋๊ณ ๊ฒฝ๋ก์ ๋์ ๋ ์๋๋๋ค. -
yโ 0์ด ์๋ ์ปจํ ์ด๋์ ๊ฒฝ์ฐ ๊ฒํ ๋ด๋ถ์ ์์น์ ๋๋ค. -1,-1 ๋ฐฐ์น๋ ์๋ฒ์ ๋งก๊ธฐ์ธ์. ์ง์ - ์ธ๊ณ ์ขํ 0..65535, ๋ ๋ค ํ์์ด๋ฉฐ ์์๊ฐ ์๋๋๋ค. ๊ฒ์ ์ธ๊ณ์ ํ๋ฉด ํฝ์ ๋ ์๋๊ณ ๊ฒฝ๋ก์ ๋์ ๋ ์๋๋๋ค. -
zโ ์ง์์ ๋ฐฐ์นํ์ ๋ ์ธ๊ณ์ ๋์ด. ์ฌ์ดํธ์ ์ค์ ๊ณ ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค(ํ๋กํ ์ฝ ๋ฒ์ -128..127). ์ปจํ ์ด๋ ์์์์๋ 0๋ฅผ ํ์ํ์ธ์. ์ด๊ฒ์ ์ฅ๋น ๋ ์ด์ด ์ธ๋ฑ์ค๊ฐ ์๋๋๋ค. -
delayMSโ ์น์ธ๋ ์์ฒญ ๊ฐ์ ์ง์ฐ ์๊ฐ(๋ฐ๋ฆฌ์ด)์ ๋๋ค. ์ค์ ๋ก๋ max(GrabDelay, max(0, DelayMS)); ๋ง์ง๋ง ์ ์ก์ด ์ ์ก๋ ํ์๋ ๋๊ธฐ ์๊ฐ์ด ์์ต๋๋ค. 350๋ 350 ํญ๋ชฉ์ ์๋ฏธํ์ง ์์ผ๋ฉฐ 350ms ์์ ํ์ธ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
๋ฑ๋ก object? ํ๋ ์ด์์ ์ ์ก ์์ฒญ์ด ์น์ธ๋๋ฉด ์ค์ ๋ก๋ int 1/true๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 0/false๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ ํญ๋ชฉ ์๋ ๋ชจ๋ ๊ฒฝ๊ธฐ๊ฐ ์ด์๋๋ค๋ ๋ณด์ฅ์ด ์๋๋๋ค. ์๋ฒ๊ฐ ์๋ตํ ํ ๋ด์ฉ์ ํ์ธํ์ธ์. ๊ธด๊ธ ์ทจ์๋ ์ ์ฐจ๋ฅผ ์ค๋จํ๋ฉฐ false๋ฅผ ๋ฐํํ ํ์๊ฐ ์์ต๋๋ค.
- 8๊ฐ์ ์ธ์๊ฐ ๋ชจ๋ ํ์ํฉ๋๋ค. ์๋ ์ปจํ ์ด๋์ ์ง๊ณ ํ์ ๋ชฉ๋ก์ ํ ๋ฒ ์์ฑ๋ฉ๋๋ค. ์ฌ๊ท ์ํ๊ฐ ์์ต๋๋ค. ๊ฐ๋ฐฉ์ด ๋ชฉ๋ก์ ํฌํจ๋๋ฉด ํฌ์ฅ์ ํ์ง ์๊ณ ๋ด์ฉ๋ฌผ๊ณผ ํจ๊ป ํ๋์ ํญ๋ชฉ์ผ๋ก ์ด๋๋ฉ๋๋ค.
- ๊ฐ ๊ฒฝ๊ธฐ์ ํ์ฌ ์คํ ์ ์ฒด๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ํญ๋ชฉ ๋๋ ๋จ์ ์์ ๋ํ ์ ํ์ ์ด ๋ช ๋ น์ผ๋ก ์ค์ ๋์ง ์์ต๋๋ค. ์ด๋ฌํ ์๋๋ฆฌ์ค๋ UO.MassMove๋ฅผ ์ฐธ์กฐํ์ธ์. Ignore๋ ์ด ์ํ์ ์ถ๊ฐ ํํฐ๋ก ์ฌ์ฉ๋์ง ์์ต๋๋ค.
- ๊ฐ ์์ ์ ์ ํญ๋ชฉ์ด ์ฌ์ ํ ์๋ ์ปจํ ์ด๋์ ์๋์ง ๋ค์ ํ์ธํฉ๋๋ค. ์ปจํ ์ด๋ ์์ฒด/ํ์ ํญ๋ชฉ์ ์ค์ฒฉํ๋ ๊ฒ์ ๊ธ์งํ๊ณ ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์์ผ๋ฉด ๊ฑด๋๋ฐ๊ฒ ๋ ์ ์์ต๋๋ค. ๋๊ธฐ์ด์ ํธ๋์ญ์ ์ด ์๋๋๋ค. ์ด๋ฏธ ์ ์ถ๋ ์์ ์ ๋กค๋ฐฑ๋์ง ์์ต๋๋ค.
- ์์ค=0์ธ ๊ฒฝ์ฐ ๋์ผํ ์์ค/๋์ ๋๋ ์์ X/Y ์ ์ง๋ 0๋ฅผ ๋ฐํํ๊ณ ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํฉ๋๋ค. ์๋ฒ๋ ํด์๋, ๋ฒ์, ์ฉ๋ ๋ฐ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ๋ค์ด ์ฌ๋ ค์ง ๋ฌผ๊ฑด๊ณผ ๋์์ ๋ค๋ฅธ ์์ ์ ์ํํ์ง ๋ง์ญ์์ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.MoveItems("lasttarget", 0x0EED, -1, "backpack", -1, -1, 0, 350);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0x0EED - type ๊ณจ๋; -1 ~ ItemsColor - ๋ชจ๋ hue. -1,-1 ์ดํ backpack๋ ์ง๋ฉด์ด ์๋ ๊ฒํ์์์ ์๋ ์์น์ ๋๋ค. 350 ms - GrabDelay์ ๊ณ ๋ คํ ์ต์ ์ํ๋ ์ง์ฐ์ ๋๋ค. ๋ชจ๋ ์ง์ ๋๋ฏธ์ ๊ธ์ ์ ์ฒด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
var source = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(source == 0) || Truth(source == UO.Backpack()) || !(Truth(UO.Exists(source))))
{
return null;
}
var sent = UO.MoveItems(source, 0x0EED, -1, "backpack", -1, -1, 0, 350);
if (Truth(Truth(sent) == false))
{
UO.Print("No gold transfer request was accepted");
}
int Asc(object? value, int fallback = 0) { string text = Convert.ToString(value) ?? ""; if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback; return int.TryParse(text, out int number) ? number : fallback; }
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0x0E21 - ์ธ์ฒด๊ฐ ์๋ ๋ถ๋. backpack๋ ์์ค์ด๊ณ , ๋์์ ๊ฐ์ด์ serial์ ๋๋ค. ๋ชจ๋ ๊ฒฝ๊ธฐ๋ ํ ์ ์ผ๋ก ์งํ๋ฉ๋๋ค 30,40; ์๋ฒ๋ ์คํ์ ๋ณํฉํ๊ฑฐ๋ ์์น๋ฅผ ์กฐ์ ํ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var destination = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(destination == 0) || Truth(destination == UO.Backpack()) || !(Truth(UO.Exists(destination))))
{
return null;
}
var sent = UO.MoveItems("backpack", 0x0E21, -1, destination, 30, 40, 0, 350);
if (Truth(sent != 0))
{
UO.Print("Transfer requested; verify the destination contents");
}
return null;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;3. ์ ํํ type์ ๋ชจ๋ ์ง์ ์คํ์ ๋ฐ๋ฅ์ ๋๋ํ ๋์ต๋๋ค. - ์๋๋ฆฌ์ค ํด๋์ค
๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- itemType๋ ์๋์ด ์๋ ์ ํ์ ์ง์ ํฉ๋๋ค. ๋ชจ๋ ์ง์ ์คํ์ ๋ฐฐ๋ญ์ ๋ค์ด ์์ต๋๋ค. X+1/Y/Z๋ ๋์ผํ ๋์ด์ ์๋ ์ธ์ ์ง์ ์ ์์ ๋๋ค. ๊ฒฝ์ฌ๋ฉด/๋ฒฝ์ ๊ฒฝ์ฐ ์ฌ๋ฐ๋ฅธ ์ขํ๋ฅผ ์ ํํ์ธ์. 0 ์๋ ๋ชจ๋์๋ ํ ๋น์ด ํ์ํฉ๋๋ค. true๋ ์๋ฝ๋ ์์ฒญ์ ๋ํด์๋ง ๋งํ๊ณ , ์ถ์๋ ๋ฐฐ๋ญ์ ๋ํด์๋ ๋งํ์ง ์์ต๋๋ค.
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(DropTypeBesideMe(0x0EED))))
{
UO.Print("No ground drop request was accepted");
}
return null;
}
dynamic DropTypeBesideMe(dynamic itemType)
{
if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
{
return false;
}
var x = UO.GetX() + 1;
var y = UO.GetY();
var z = UO.GetZ();
return UO.MoveItems("backpack", itemType, -1, 0, x, y, z, 350);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
UO.MoveItems(container, itemsType, itemsColor, moveIntoID, x, y, z, delayMS) โ UO.MoveItems(Any,Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: container (Any), itemsType (Any), itemsColor (Any), moveIntoID (Any), x (Any), y (Any), z (Any), delayMS (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.MoveItems:bridge.MoveItems(Arg(0), ResolveType(arguments[1]), Arg(2), Arg(3), Arg(4), Arg(5), Arg(6), Arg(7)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(arguments[1]).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "moveitems": return new InjectionValue(bridge.MoveItems(Arg(0), ResolveType(arguments[1]), Arg(2), Arg(3), Arg(4), Arg(5), Arg(6), Arg(7)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.Name();์บ๋ฆญํฐ์ ์ด๋ฆ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
string์ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ ค์ง ์ด๋ฆ์ ๋๋ค. ๋น ๋ฌธ์์ด์ ๋น์ด ์๊ฑฐ๋ ์ ์ ์๋ ๊ฐ ๋๋ ๊ฐ์ฒด๊ฐ ์์์ ์๋ฏธํฉ๋๋ค. serial ๋๋ ํ๋กํ ๊ฒฝ๋ก๊ฐ ์๋๋๋ค. ๊ฒ์ ์ด๋ฆ/์ ๋ชฉ์ ์ธ์ด IDE๋ก ๋ฒ์ญ๋์ง ์์ต๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Name();
UO.Print("Name: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋งค๊ฐ๋ณ์ ์์: self๋ฅผ ์ฝ์ต๋๋ค.
- ๋น ๋ฌธ์์ด์ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ด๊ฒ์ "0" ํ ์คํธ๊ฐ ์๋๋๋ค.
var text = UO.Name();
if (Truth(text != ""))
{
UO.Print(text);
}
else
{
UO.Print("Text is unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น์ ์ ์บ๋ฆญํฐ๊ฐ ์ฝํ์ง๊ณ , ๊ทธ ๊ฐ์ ๋ผ์ธ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
-
- ์ฐ์ฐ์๋ ๋ฌธ์์ด์ ๊ฒฐํฉํฉ๋๋ค. ์ด ๊ฒฐ๊ณผ์๋ Convert.ToString๊ฐ ํ์ํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var text = UO.Name();
UO.Print("Player ะธะผั: " + text);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ํธ์ถ ๋ชจ๋ self๋ฅผ ์ฐธ์กฐํฉ๋๋ค. UO.Wait๋ ์ผ์ ์ ์ง 1000ms๋ฅผ ์ค์ ํฉ๋๋ค.
- ๊ทธ ์ฐจ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ์ธ์์ ๋ ๋๋ ๊ฒ์ ์๋ฏธํ ์ ์์ต๋๋ค. ์ด ์์์๋ ์ด๋ฆ์ด๋ ์ ๋ชฉ์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
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 previous = UO.Name();
await Delay(1000);
var current = UO.Name();
if (Truth(previous != current))
{
UO.Print("Updated text: " + current);
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Name]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.GetName(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Picking();ํด๋ผ์ด์ธํธ์ ์ปค์๊ฐ ์ฃผ์ด ์์ดํ ์ ์ํด ์ ์ ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int 1 - ItemHold.ํ์ฑํ๋ ์ธํธ; 0 - ์ค์น๋์ง ์์์ต๋๋ค. ์ด๋ ID์ด๋ ์๋ฒ ์ ๋ฌ ํ์ธ์ด ์๋ ํด๋ผ์ด์ธํธ ์ํ์ ๋๋ค. ๋ง์ฐ์ค๋ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๋ก ์ ํํ ๊ฐ์ฒด๊ฐ ๊ณ ๋ ค๋ฉ๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ ์๋ ๋ฌผ๊ฑด์ ์ง๊ฑฐ๋ ๋จ์ด๋จ๋ฆฌ๋ ๊ฒ์ด ์๋๋๋ค.
- ์ง์ ์ ์กํ๋ ค๋ฉด Drag/DragItem ๊ฒฐ๊ณผ๋ ํ์ธํ์ธ์. ๋ค๋ฅธ ์ฌ๋์ ๋ฐ์ ์ปค์๊ฐ ์ํ๋ ํญ๋ชฉ์ ์ฑ๊ณต์ ์ผ๋ก ๊ฐ์ ธ์๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Picking();
UO.Print("Picking: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค.
- 1 ๋๋ 0์ด ํ์๋ฉ๋๋ค.
UO.Print(Convert.ToString(UO.Picking()));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ๋์ ์ธ์ Drag๋ ์ ์ฒด ์คํ์ ์๋ฏธํ๋ฉฐ ์๊ฐ ์ด๊ณผ=0์ ๋๋ค.
- Picking ํด๋ผ์ด์ธํธ์ ๊ณต์ ์ปค์๋ฅผ ํ์ธํฉ๋๋ค. ๋์์ ๋ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ๋ง์ด๊ทธ๋ ์ด์ ์ ์คํํ์ง ๋ง์ญ์์ค.
return RunScenario();
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ธ์ 50 ms์ ์ผ์ ์ค์ง๋ฅผ ํตํด ์ต๋ 20ํ ๋ฐ๋ณต๋ฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์ปค์๋ฅผ ํด์ ํ๊ฑฐ๋ ๋ค๋ฅธ ์ฌ๋์ ์ด๋์ ์ทจ์ํ์ง ์์ต๋๋ค.
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 tries = 0;
while (Truth(UO.Picking()) && Truth(tries < 20))
{
await Delay(50);
tries = tries + 1;
}
if (Truth(UO.Picking()))
{
UO.Print("Cursor is still occupied");
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Picking. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Picking:bridge.Picking().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Picking() => bridge.Picking();ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ReceiveObjectName(object? id);
void UO.ReceiveObjectName(object? id, object? timeout);์ํด๋ฆญ ์์ฒญ์ผ๋ก ๊ฐ์ฒด์ ์ด๋ฆ์ ์์ฒญํฉ๋๋ค.
-
idโ ์ง๋ ฌ/ID ๊ฐ์ฒด: int, ์ซ์/16์ง์ ๋ฌธ์์ด ๋๋ ์ค์ ๋ ๋ณ์นญ(์: "lasttarget"). ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ ๋ก๋๋ ๊ฐ์ฒด๋ฅผ ํ์ธํ์ญ์์ค. -
timeoutโ ์ ํ ์ฌํญ int, ๋ฐ๋ฆฌ์ด; ๊ธฐ๋ณธ๊ฐ์ 0์ ๋๋ค. ์์ ๊ฐ์ ๊ธฐ๋๊ฐ์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- Bridge.ReceiveObjectName๋ Click(id)๋ฅผ ํธ์ถํ ๋ค์ GetName(id)๊ฐ ๋น์ด ์์ ๋๊น์ง max(0,timeout)๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค. 25ms ์ด์ ์ผ์ ์ค์งํ์ง ๋ง์ธ์. ์ด๋ฏธ ์ ์๋ ค์ง ์ด๋ฆ์ด ์์ผ๋ฉด ๋๊ธฐ๊ฐ ์ฆ์ ์ข ๋ฃ๋ฉ๋๋ค.
- ํ์์์์ด ์์ผ๋ฉด Click๋ง ์คํ๋ฉ๋๋ค. ๋ฐํ ์ด๋ฆ์ด ์์ต๋๋ค. GetName๋ฅผ ๋ณ๋๋ก ์ฝ์ผ์ธ์. ๋๊ธฐ๊ฐ ๋๋๋ฉด ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ReceiveObjectName");
UO.ReceiveObjectName("lasttarget");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ํด๋ฆญ ์์ฒญ์ผ๋ก ๊ฐ์ฒด์ ์ด๋ฆ์ ์์ฒญํฉ๋๋ค.
UO.ReceiveObjectName("lasttarget");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Bridge.ReceiveObjectName๋ Click(id)๋ฅผ ํธ์ถํ ๋ค์ GetName(id)๊ฐ ๋น์ด ์์ ๋๊น์ง max(0,timeout)๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค. 25ms ์ด์ ์ผ์ ์ค์งํ์ง ๋ง์ธ์. ์ด๋ฏธ ์ ์๋ ค์ง ์ด๋ฆ์ด ์์ผ๋ฉด ๋๊ธฐ๊ฐ ์ฆ์ ์ข ๋ฃ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
UO.ReceiveObjectName("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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์์์์ด ์์ผ๋ฉด Click๋ง ์คํ๋ฉ๋๋ค. ๋ฐํ ์ด๋ฆ์ด ์์ต๋๋ค. GetName๋ฅผ ๋ณ๋๋ก ์ฝ์ผ์ธ์. ๋๊ธฐ๊ฐ ๋๋๋ฉด ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
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.ReceiveObjectName(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.ReceiveObjectName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ReceiveObjectName:bridge.ReceiveObjectName(GetObject(id), 0). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void ReceiveObjectName(InjectionValue id) => bridge.ReceiveObjectName(GetObject(id), 0);๋งค๊ฐ๋ณ์: id (Any), timeout (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ReceiveObjectName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ReceiveObjectName:bridge.ReceiveObjectName(GetObject(id), NumberConversions.ToInt(timeout)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(timeout).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void ReceiveObjectName(InjectionValue id, InjectionValue timeout) => bridge.ReceiveObjectName(GetObject(id), NumberConversions.ToInt(timeout));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.TicksUse();์ ์ฅ๋ ๋งํฌ TicksUse๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ๋ฐํ์ ์์๋ถํฐ 10๋ถ์ 1์ด ์์ UO.Timer๋ฅผ ํ์ํฉ๋๋ค. 0 - ๋งํฌ๊ฐ ์์ง ์ค์ ๋์ง ์์๊ฑฐ๋ ์ฒ์ 10๋ถ์ 1์ด์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ฐ๋ฆฌ์ด๋ ๋ฌ๋ ฅ ์๊ฐ์ด ์๋๋๋ค.
- ticksUse ํ๋๋ฅผ ๋ฐํํฉ๋๋ค. UseObject์ ์ํด ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ๋ชจ๋ ์๋/์๋ฒ ํ๋์ ์๋์ผ๋ก ๊ด์ฐฐํ๋ ๊ฒ์ ์๋๋๋ค. ๋ช ๋ น ์์ฒด๋ ํ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
- UO.Timer() - ์ด ํ์๋ 10๋ถ์ 1์ด ๋จ์๋ก ๋์ด๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๋งํฌ๋ ์๋ก ๋ค๋ฅธ ๋ฐํ์ ๊ฐ์ ๋น๊ต๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.TicksUse();
UO.Print("TicksUse: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ฅ๋ ๋งํฌ TicksUse๋ฅผ ์ฝ์ต๋๋ค.
var stamp = UO.TicksUse();
UO.Print(stamp);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ticksUse ํ๋๋ฅผ ๋ฐํํฉ๋๋ค. UseObject์ ์ํด ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ๋ชจ๋ ์๋/์๋ฒ ํ๋์ ์๋์ผ๋ก ๊ด์ฐฐํ๋ ๊ฒ์ ์๋๋๋ค. ๋ช ๋ น ์์ฒด๋ ํ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var stamp = UO.TicksUse();
var ageTenths = UO.Timer() - stamp;
UO.Print(ageTenths);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.Timer() - ์ด ํ์๋ 10๋ถ์ 1์ด ๋จ์๋ก ๋์ด๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๋งํฌ๋ ์๋ก ๋ค๋ฅธ ๋ฐํ์ ๊ฐ์ ๋น๊ต๋์ง ์์ต๋๋ค.
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.TicksUse();
UO.Wait(250);
var after = UO.TicksUse();
UO.Print(before = after);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int TicksUse() => ticksUse;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.UpdateObject(object? id);์ด๋ฏธ ๋ก๋๋ ๊ฐ์ฒด์ ๋ํ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํฉ๋๋ค.
-
idโ ์ง๋ ฌ/ID ๊ฐ์ฒด: int, ์ซ์/16์ง์ ๋ฌธ์์ด ๋๋ ์ค์ ๋ ๋ณ์นญ(์: "lasttarget"). ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ ๋ก๋๋ ๊ฐ์ฒด๋ฅผ ํ์ธํ์ญ์์ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ๋ชจ๋ฐ์ผ์ ๊ฒฝ์ฐ ํญ๋ชฉ - SingleClick์ ๋ํด RequestMobileStatus(..., true)๊ฐ ํธ์ถ๋ฉ๋๋ค. serial๊ฐ ๋ ๋ก์ปฌ ํ ์ด๋ธ ๋ชจ๋์ ์์ผ๋ฉด ์๋ฌด ์์ ๋ ์ํ๋์ง ์์ต๋๋ค. ์ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ค์ด๋ก๋ํ๊ฑฐ๋ ์ ๋ฐ์ดํธ๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์๋๋๋ค.
- Bridge๋ ๊ฒ์ ์คํธ๋ฆผ์ ๋ํ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์๋ฒ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ด์ฅ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.UpdateObject");
UO.UpdateObject(UO.GetSerial("lasttarget"));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด๋ฏธ ๋ก๋๋ ๊ฐ์ฒด์ ๋ํ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํฉ๋๋ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.UpdateObject(id);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ชจ๋ฐ์ผ์ ๊ฒฝ์ฐ ํญ๋ชฉ - SingleClick์ ๋ํด RequestMobileStatus(..., true)๊ฐ ํธ์ถ๋ฉ๋๋ค. serial๊ฐ ๋ ๋ก์ปฌ ํ ์ด๋ธ ๋ชจ๋์ ์์ผ๋ฉด ์๋ฌด ์์ ๋ ์ํ๋์ง ์์ต๋๋ค. ์ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ค์ด๋ก๋ํ๊ฑฐ๋ ์ ๋ฐ์ดํธ๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์๋๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("self");
if (Truth(UO.Exists(id)))
{
UO.UpdateObject(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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Bridge๋ ๊ฒ์ ์คํธ๋ฆผ์ ๋ํ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์๋ฒ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ด์ฅ์ ์์ต๋๋ค.
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()
{
ApplyToLoaded(UO.GetSerial("lasttarget"));
return null;
}
void ApplyToLoaded(dynamic id)
{
if (Truth(UO.Exists(id)))
{
UO.UpdateObject(id);
}
}
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.UpdateObject. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UpdateObject:bridge.UpdateObject(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void UpdateObject(InjectionValue id) => bridge.UpdateObject(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.UseFromGround(object? @type);
int UO.UseFromGround(object? @type, object? color);์ง์/์ธ๊ณ์์ ์ฃผ์ด์ง graphic์ ๊ฐ์ฒด๋ฅผ ๊ฒ์ํ๊ณ ์ฆ์ ํด๋น ์ ํ๋ฆฌ์ผ์ด์ ์ ํธ์ถํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฐฐ๋ญ์ ์ฌ๋ ๋ฑ ๊ฐ๊น์ด ๋ฌผ์ฒด์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๋ฐํ์์ ์ค์ํ ๊ธฐ๋ฅ: ๊ฒ์์ FindType๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ ๋์ผํ body๋ก mobile๋ ์ฐพ์ ์ ์์ต๋๋ค. ์ด๋ ์๋ฐํ ๋งํ๋ฉด ํญ๋ชฉ๋ง ์ ํํ๋ ๊ฒ์ด ์๋๋๋ค. ๋ช ์์ ์ธ ๋ฐ๊ฒฝ๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ํ ํญ๋ชฉ์ด ์๋ ํญ๋ชฉ์ ๊ฒฝ์ฐ UseType(..., ground, ...)๋ฅผ ์ฌ์ฉํ์ธ์.
-
type- ํ์ graphic. ์๋ฅผ ๋ค์ด 0x0E75๋ ๋ฐฐ๋ญ์ ๋๋ค. ์ซ์ ๋๋ ์ซ์ 16์ง์ ๋ฌธ์์ด. ์์/0xFFFF โ ๋ชจ๋ graphic. 0x0190(๋จ์ฑ) ๋ฐ 0x0191(์ฌ์ฑ)๊ณผ ๊ฐ์ ์ ์ฒด ๊ฐ์ mobile๋ฅผ ์ ํํ ์ ์์ต๋๋ค. type ํญ๋ชฉ์ ๋์ฒดํ์ง ๋ง์ธ์. ์ด ์์์์๋ ๋ ๊ฐ์ง ์ ํ์ด ๋์์ ์ ์ก๋์ง ์์ต๋๋ค. -
color- ์ ํ ์ฌํญ hue, ๊ธฐ๋ณธ๊ฐ - 1(๋ชจ๋ ๊ฒ). ์์/0xFFFF - ๋ชจ๋, 0 - hue 0๋ง. ๋ค๋ฅธ ๋งค๊ฐ๋ณ์๋ ์์ต๋๋ค. ์ปจํ ์ด๋, ๊ฑฐ๋ฆฌ, ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฐ maxZ๋ ์ด ๋ช ๋ น์ ์ถ๊ฐ๋์ง ์์ต๋๋ค.
int - ๋ฐ๊ฒฌ๋ ์ฒซ ๋ฒ์งธ ๊ฐ์ฒด์ serial๋ UseObject ๋๋ 0์ ์ ๋ฌ๋ฉ๋๋ค. ์ด๊ฒ์ graphic๋ ์๋๊ณ true/false๋ ์๋ ๊ฐ์ฒด์ ๊ฐ์๊ฐ ์๋๋๋ค. ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ ์์ง๋ง ์๋ฒ์์ ํด๋น ๊ฐ์ฒด์ ์ฌ์ฉ์ ํ์ฉํ์ง ์์ ์ ์์ต๋๋ค. id != 0 ์ ์์๋๋ ๊ฒ์ ํจ๊ณผ๋ฅผ ๋ณ๋๋ก ํ์ธํ์ธ์.
- ํ์ฌ FindDistance ๋ฐ FindVertical๋ฅผ ์ฌ์ฉํ๊ณ Ignore๋ฅผ ๊ณ ๋ คํฉ๋๋ค. ๊ฒ์ ์ปจํ ์ด๋๋ ground๋ก ๊ณ ์ ๋๊ณ ์ค์ฒฉ๋ ์ฝํ ์ธ ๋ ํ์๋์ง ์์ต๋๋ค. ๋ชจ๋ฐ์ผ์ self๋ฅผ ์ ์ธํฉ๋๋ค. ์๋ช /๊ฐ์์ฑ/์ ๋ช ์ ๋ํ ๋ณ๋์ ์ ํ์ ์์ต๋๋ค.
- FindItem/FindCount/GetFoundItems๋ฅผ ๋ชจ๋ ๊ฒ์ ์ผ์น ํญ๋ชฉ์ผ๋ก ์ ๋ฐ์ดํธํ์ง๋ง ์ฒซ ๋ฒ์งธ ๊ฒฐ๊ณผ๋ง ์ ์ฉํฉ๋๋ค. ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒ์ด ๋ณด์ฅ๋์ง๋ ์์ต๋๋ค. ์๋ ๊ฐ์ฒด๋ ๋ชจ๋ฐ์ผ๋ณด๋ค ๋จผ์ ํ์ธ๋ฉ๋๋ค.
- ๋ฐฐ๋ญ์ ์๋ ์์ดํ ์ ์ง๊ฑฐ๋, ์บ๋ฆญํฐ๋ฅผ ์์ง์ด์ง ์์ผ๋ฉฐ, ์๋ฒ ์๋ต์ด๋ ๋์์ ์ข ๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ์ผ์นํ๋ ํญ๋ชฉ์ด ์์ผ๋ฉด ๋ฉ์์ง๋ฅผ ์ธ์ํฉ๋๋ค. ์๋ฌด๋ฐ ์กฐ์น ์์ด ๊ฒ์ํ๋ ค๋ฉด UO.FindType๋ฅผ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.UseFromGround(0x0E75);
UO.Print("UseFromGround: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- type๋ง ํด๋น; ๋ชจ๋ hue. ํ์ฌ FindDistance/FindVertical๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. bag - ์ฒซ ๋ฒ์งธ ๊ฒฐ๊ณผ์ ID, ๋ฐ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒฐ๊ณผ์ผ ํ์๋ ์์ต๋๋ค. ์ฝํ ์ธ ๋ ์๋ฒ์์ ํ์ฉํ๋ ๊ฒฝ์ฐ์๋ง ์ด๋ฆฝ๋๋ค.
var bag = UO.UseFromGround(0x0E75);
if (Truth(bag != 0))
{
UO.AddObject("ground_bag", bag);
}
else
{
UO.Print("No loaded ground backpack matches the search settings");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฒ์์ ๋ ๊ฐ์ ์ ๋ก ์ ํ๋๋ฉฐ ๋์ผํ Z์ ๋๋ค. ์์ 0x0044๋ ์์๋ก ์ ๊ณต๋ฉ๋๋ค. ํด๋น ์์์ ์์ดํ ์ hue๋ก ๋ฐ๊พธ์ธ์. ์ค๋ฅ๊ฐ ์์ด๋ ์ค์ ์ด ๋ณต์๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var oldDistance = UO.FindDistance();
var oldZ = UO.FindVertical();
try
{
UO.FindDistance(2);
UO.FindVertical(0);
var bag = UO.UseFromGround(0x0E75, 0x0044);
if (Truth(bag != 0))
{
UO.AddObject("colored_ground_bag", bag);
}
}
finally
{
UO.FindDistance(oldDistance);
UO.FindVertical(oldZ);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฐ๊ฒฝ์ ์ธ ๋ฒ์งธ ์ธ์ UseFromGround ๋์ FindDistance๋ฅผ ์ง์ ํฉ๋๋ค. 3000 ms โ ์ด๊ธฐ ํ์ธ์ด ์๋ ์์ ๋ฅผ ๋ณด๋ ์๊ฐ์ ๋๋ค. ์ฐฝ ์ ํ 3 - ์ปจํ ์ด๋. ์ด ๊ฒ์ ๊ฒฐ๊ณผ๋ ์ฐพ๊ธฐ*์ ๋จ์ ์์ต๋๋ค.
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 selected = OpenGroundBagWithin(2);
if (Truth(selected != 0))
{
await Delay(3000);
UO.CloseClientUIWindow(3, selected);
}
return null;
}
dynamic OpenGroundBagWithin(dynamic radius)
{
var previous = UO.FindDistance();
try
{
UO.FindDistance(radius);
return UO.UseFromGround(0x0E75, -1);
}
finally
{
UO.FindDistance(previous);
}
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: type (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UseFromGround. -
InjectionScript.Runtime.InjectionApiUO.UseFromGround:UseFromGround(type, new InjectionValue(-1)).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int UseFromGround(InjectionValue type) => UseFromGround(type, new InjectionValue(-1));๋งค๊ฐ๋ณ์: type (Any), color (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UseFromGround. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.FindType:bridge.FindType(ResolveType(type), NumberConversions.ToInt(color), 1, -1, false). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(type). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(color). -
InjectionScript.Runtime.InjectionApiUO.UseObject:UseObject(id). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("No matching item found on ground.").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int UseFromGround(InjectionValue type, InjectionValue color)
{
int id = bridge.FindType(ResolveType(type), NumberConversions.ToInt(color), 1, -1, false);
if (id != 0)
UseObject(id);
else
SystemMessage("No matching item found on ground.");
return id;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.UseItemOnMobile(object? itemSerial, object? targetSerial);์บ๋ฆญํฐ์ ํ๊ฒ์ ์ค๋นํ๊ณ ์์ดํ ์ ์ฌ์ฉํฉ๋๋ค.
-
itemSerialโ ์ง๋ ฌ/ID ๊ฐ์ฒด: int, ์ซ์/16์ง์ ๋ฌธ์์ด ๋๋ ์ค์ ๋ ๋ณ์นญ(์: "lasttarget"). ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ ๋ก๋๋ ๊ฐ์ฒด๋ฅผ ํ์ธํ์ญ์์ค. -
targetSerialโ ์ง๋ ฌ/ID ๊ฐ์ฒด: int, ์ซ์/16์ง์ ๋ฌธ์์ด ๋๋ ์ค์ ๋ ๋ณ์นญ(์: "lasttarget"). ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ ๋ก๋๋ ๊ฐ์ฒด๋ฅผ ํ์ธํ์ญ์์ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ExecuteClientApiCompatibility ๋จผ์ ๋ธ๋ฆฌ์งWaitTargetObject(TargetSerial)๋ฅผ ํธ์ถํ ๋ค์ ๋ธ๋ฆฌ์งUseObject(ItemSerial)๋ฅผ ํธ์ถํฉ๋๋ค. ์ธ์๋ ๊ตํ๋์ง ์์ต๋๋ค. ์ด๋ฌํ ์ง์ ๋ธ๋ฆฌ์ง ํธ์ถ์ TicksTarget/TicksUse ๋ฐํ์์ ์ ๋ฐ์ดํธํ์ง ์์ต๋๋ค.
- ๋์/ํญ๋ชฉ ์ ํ์ ํ์ธํ์ง ์์ผ๋ฉฐ ์ปค์๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ์ฌ์ฉํ๊ธฐ ์ ์ ๋์์ ์ค๋นํ๋ฉด ๋น ๋ฅด๊ฒ ๋์ฐฉํ๋ ๋์์ด ๋๋ฝ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ง๋ง ์๋ฒ๋ ์ฌ์ ํ ํด๋น ์์ ์ด ์ ํจํ์ง ์ฌ๋ถ๋ฅผ ํ๋จํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.UseItemOnMobile");
UO.UseItemOnMobile("0x40001234", "self");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์บ๋ฆญํฐ์ ํ๊ฒ์ ์ค๋นํ๊ณ ์์ดํ ์ ์ฌ์ฉํฉ๋๋ค.
UO.UseItemOnMobile("0x40001234", "self");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ExecuteClientApiCompatibility ๋จผ์ ๋ธ๋ฆฌ์งWaitTargetObject(TargetSerial)๋ฅผ ํธ์ถํ ๋ค์ ๋ธ๋ฆฌ์งUseObject(ItemSerial)๋ฅผ ํธ์ถํฉ๋๋ค. ์ธ์๋ ๊ตํ๋์ง ์์ต๋๋ค. ์ด๋ฌํ ์ง์ ๋ธ๋ฆฌ์ง ํธ์ถ์ TicksTarget/TicksUse ๋ฐํ์์ ์ ๋ฐ์ดํธํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var item = UO.GetSerial("lastobject");
var mobile = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(item)) && Truth(UO.Exists(mobile)))
{
UO.UseItemOnMobile(item, mobile);
}
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 item = UO.GetSerial("lastobject");
if (Truth(UO.Exists(item)))
{
UO.UseItemOnMobile(item, "self");
UO.Print(UO.Waiting());
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: itemSerial (Any), targetSerial (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WaitTargetObject:bridge.WaitTargetObject(Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseObject:bridge.UseObject(Arg(0)).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "useitemonmobile": bridge.WaitTargetObject(Arg(1)); bridge.UseObject(Arg(0)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.UseObject(object? objID);serial๋ก ๊ฐ์ฒด์ ์ฌ์ฉ์ ์์ฒญํฉ๋๋ค. ๋ธ๋ฆฌ์ง ํตํ GameActions.DoubleClick; type ํญ๋ชฉ์ด ๊ฒ์๋์ง ์์ต๋๋ค.
-
objIDโ ์ง๋ ฌ/ID ๊ฐ์ฒด: int, ์ซ์/16์ง์ ๋ฌธ์์ด ๋๋ ์ค์ ๋ ๋ณ์นญ(์: "lasttarget"). ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ ๋ก๋๋ ๊ฐ์ฒด๋ฅผ ํ์ธํ์ญ์์ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- GetObject๋ ๋ณ์นญ์ ํ์ฉํฉ๋๋ค. ์ ์ ์๋ ์ด๋ฆ์ -1๋ฅผ ์ ๊ณตํฉ๋๋ค. ํธ์ถ ํ ๋ฐํ์์ TicksUse๋ฅผ UO.Timer ๊ฐ์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค. ์๋ฒ์ ํ์ธ์ด ์๋ ์์ฒญ์ ์๊ฐ์ ๋๋ค.
- Bridge๋ ๊ฒ์ ์คํธ๋ฆผ์ ๋ํ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์๋ฒ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ด์ฅ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.UseObject");
UO.UseObject(UO.GetSerial("lasttarget"));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- serial๋ก ๊ฐ์ฒด์ ์ฌ์ฉ์ ์์ฒญํฉ๋๋ค. ๋ธ๋ฆฌ์ง ํตํ GameActions.DoubleClick; type ํญ๋ชฉ์ด ๊ฒ์๋์ง ์์ต๋๋ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.UseObject(id);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- GetObject๋ ๋ณ์นญ์ ํ์ฉํฉ๋๋ค. ์ ์ ์๋ ์ด๋ฆ์ -1๋ฅผ ์ ๊ณตํฉ๋๋ค. ํธ์ถ ํ ๋ฐํ์์ TicksUse๋ฅผ UO.Timer ๊ฐ์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค. ์๋ฒ์ ํ์ธ์ด ์๋ ์์ฒญ์ ์๊ฐ์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("self");
if (Truth(UO.Exists(id)))
{
UO.UseObject(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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Bridge๋ ๊ฒ์ ์คํธ๋ฆผ์ ๋ํ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์๋ฒ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ด์ฅ์ ์์ต๋๋ค.
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()
{
ApplyToLoaded(UO.GetSerial("lasttarget"));
return null;
}
void ApplyToLoaded(dynamic id)
{
if (Truth(UO.Exists(id)))
{
UO.UseObject(id);
}
}
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/Integer/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseObject:bridge.UseObject(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "useobject": bridge.UseObject(Arg(0)); return InjectionValue.Unit;๋งค๊ฐ๋ณ์: objID (Any/Integer/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UseObject. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseObject:bridge.UseObject(id). -
InjectionScript.Runtime.InjectionApiUO.Timer:Timer().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void UseObject(int id)
{
bridge.UseObject(id);
ticksUse = Timer();
}๋งค๊ฐ๋ณ์: objID (Any/Integer/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UseObject. -
InjectionScript.Runtime.InjectionApiUO.UseObject:UseObject(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void UseObject(string id) => UseObject(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.UseType(object? @type);
int UO.UseType(object? @type, object? color);
int UO.UseType(object? @type, object? color, object? container);
int UO.UseType(object? @type, object? color, object? container, object? distance);
int UO.UseType(object? @type, object? color, object? container, object? distance, object? nearest);
int UO.UseType(object? @type, object? color, object? container, object? distance, object? nearest, object? maxZ);์ํ๋ graphic/type ์ค ํ๋์ ํญ๋ชฉ์ ์ฐพ์ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐฐ๋ญ์์ ๋ฌผ์ฝ์ ๋ง์๊ฑฐ๋, ๊ทผ์ฒ์ ์๋ ๋ฐฐ๋ญ์ ์ด๊ฑฐ๋, ์ ํํ ์์์ ์์ดํ ์ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ช ๋ น์ ์บ๋ฆญํฐ๋ฅผ ๊ฒ์ํ๊ฑฐ๋ ์ด๋ํ์ง ์์ต๋๋ค. ํญ๋ชฉ์ ๋ฒ์๊ฐ ํ์ํ ๊ฒฝ์ฐ ๋์์ ๋ณ๋๋ก ์ค๋นํด์ผ ํฉ๋๋ค.
-
typeโ ํญ๋ชฉ์ ๊ทธ๋ํฝ: ์ซ์ ๋๋ 16์ง์ ๋ฌธ์์ด; ์๋ฅผ ๋ค์ด, 0x0F0C๋ ์น์ ๋ฌผ์ฝ์ ์ผ์ข ์ด๊ณ , 0x0E75๋ ๋ฐฐ๋ญ์ ๋๋ค. serial ๋๋ body ๋ฌธ์๊ฐ ์๋๋๋ค. ์์ ๋๋ 0xFFFF๋ ๋ชจ๋ type์ ํ์ฉํฉ๋๋ค. ์๋ฏธ ์๋ ํ๋์ ์ํด์๋ ์ ํํ graphic๊ฐ ๋ ์ข์ต๋๋ค. -
colorโ ํญ๋ชฉ์ ์์, ๊ธฐ๋ณธ๊ฐ - 1 (๋ชจ๋ ๊ฒ). ์์ ๋๋ 0xFFFF๋ ํํฐ๋ฅผ ์ ๊ฑฐํฉ๋๋ค. 0๋ ๋์๋์ง ์์ ํญ๋ชฉ์ ์ ํํฉ๋๋ค. ์ ๋ช ๋ ์๋๊ณ ํ ์คํธ์ ์์๋ ์๋๋๋ค. -
containerโ ๊ธฐ๋ณธ๊ฐ -1: ๋ฐฐ๋ญ๊ณผ ์ ์ฌ๋ ํ์ ์ปจํ ์ด๋. "my"๋ ๊ฐ์ ์๋ฏธ์ ๋๋ค. "backpack" ๋๋ ์ปจํ ์ด๋์ ๋ช ์์ ์ธ serial๋ ์ฌ๊ท ์ํ ๋ฃจํธ๋ฅผ ์ง์ ํฉ๋๋ค. ground/"ground"/UO.Ground(), ์ซ์ 0/1๋ ์ธ๊ณ์ ๊ฐ์ฒด๋ง์ ๋ํ๋ ๋๋ค. Self์ backpack์ ๋์์ด๊ฐ ์๋๋๋ค. ๋ช ์์ ์ธ ๋ฐฐ๋ญ์ ์ฌ์ฉํ์ญ์์ค. ์ ์ ์๊ฑฐ๋ null ๊ฐ์ฒด ๋ณ์นญ์ ๋ฐฐ๋ญ์ผ๋ก ํด๊ฒฐ๋ ์ ์์ต๋๋ค. ๋จผ์ Exists๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ก๋ ์ปจํ ์ด๋๋ฅผ ํ์ธํ์ธ์. -
distanceโ ๊ฒฝ๋ก ๊ธธ์ด๊ฐ ์๋ ์ต๋ ๊ธฐํํ์ X/Y ๋ฒ์์ ๋๋ค. ๊ธฐ๋ณธ ๋๋ ์์ ์ธ์๋ FindDistance์ ๋๋ค. 0๋ ๋์ผํ ์ ์ ์๋ฏธํฉ๋๋ค. ์ปจํ ์ด๋์ ๋ด๊ธด ํ๋ชฉ์ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๋ ์์ ์์์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ ๋ คํฉ๋๋ค. -
nearestโ ๊ธฐ๋ณธ๊ฐ true: ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒ์ ์ ํํ๊ณ ๋์ผํ ๊ฒฝ์ฐ ๋ ์์ ๊ฒ serial๋ฅผ ์ ํํฉ๋๋ค. false: ์ ๋ ฌ ์์ด ์ํ์์ ์ฒ์ ๋ฐ๊ฒฌ๋์์ต๋๋ค. ํญ๋ชฉ ์๋ ์คํ ๋ชจ๋๊ฐ ์๋๋๋ค. -
maxZโ ์บ๋ฆญํฐ์์ ์ธ๊ณ ๋์ด Z์ ์ต๋ ์ ๋ ์ฐจ์ด์ ๋๋ค. ๊ธฐ๋ณธ ๋๋ ์์ ์ธ์๋ FindVertical์ ๋๋ค. 0์๋ ๋์ผํ Z์ด ํ์ํฉ๋๋ค. ๊ฐ๋ฐฉ์ ๋ค์ด ์๋ ์์ดํ ์ ๊ฒฝ์ฐ, ๋ฐ๋ฅ์ ์๋ ์ธ๋ถ ์ฉ๊ธฐ์ ๋์ด ๋๋ ์์ ์ ์บ๋ฆญํฐ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ด๋ถ ๊ฒํ ์ขํ๋ ์๋ ์ขํ๋ก ๊ฐ์ฃผ๋์ง ์์ต๋๋ค. ์ด๋ ๋ณดํ ๊ฐ๋ฅ์ฑ์ด๋ ์์ ํ์ธ์ด ์๋ ๋์ด ํํฐ์ ๋๋ค.
int - UseObject๊ฐ ํธ์ถ๋๋ ํญ๋ชฉ์ serial 0 ์ผ์นํ๋ ํญ๋ชฉ์ด ์๋ ๊ฒฝ์ฐ. ReturnKind object์ ๋ฑ๋กํด๋ ๋๋์? ์ค์ ๋ก ์ซ์๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ true/false ๋๋ ์๋ฒ์ ์ฌ์ฉ ํ์ธ์ด ์๋๋๋ค. Used == true ๋์ ์ฌ์ฉ๋จ != 0๋ฅผ ํ์ธํ์ธ์. ํจ๊ณผ๊ฐ ์ฑ๊ณตํ๋ ค๋ฉด ์ํ, ๋ด์ฉ, ๋ก๊ทธ์ ๋ํ ๋ณ๋์ ํ์ธ์ด ํ์ํฉ๋๋ค.
- 1์์ 6 ์ธ์. ๋ฒ์๋ฅผ ์ค์ ํ๋ ค๋ฉด ์์๊ณผ ์ปจํ ์ด๋๋ ์ง์ ํ์ธ์. maxZ๋ฅผ ์ง์ ํ๋ ค๋ฉด 6๊ฐ ์์น๋ฅผ ๋ชจ๋ ์๋ฃํ์ธ์. ๋ฐฐ์ด type, ๋ง์คํฌ | ์ด ๋ช ๋ น์์๋ ์ถ๊ฐ ๋ชฉํ๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค.
- int/string๋ฅผ ์ฌ์ฉํ๋ ์ผ๋ฐ ์์๊ณผ ํ์ฅ ์์์ CompactUseType๋ฅผ ์ฌ์ฉํฉ๋๋ค: ํญ๋ชฉ๋ง, Ignore, ๊ฑฐ๋ฆฌ ๋ฐ ๋์ด; ์ปจํ ์ด๋๋ ์ด๋ฏธ ๋ก๋๋ ์ฝํ ์ธ ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ์ํฉ๋๋ค. ๋ก๋ฉ ์ปจํ ์ด๋๋ ์๋์ผ๋ก ์ด๋ฆฌ์ง ์์ต๋๋ค. FindItem/FindCount/GetFoundItems๋ ์ด ๋ถ๊ธฐ์์ ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค.
- ๊ณต์ ์์ ์ ๋ฐ ์ปจํ ์ด๋์ ๋์ด๋ ๊ฐ ์คํ์ ๋ํ ์ํ ๋ฐ๋ณต์ ํผํ๊ธฐ ์ํด ํธ์ถ๋น ํ ๋ฒ ๊ณ์ฐ๋ฉ๋๋ค. ์ํ ๋๋ ์ง๋์น๊ฒ ๊น์ ์ปจํ ์ด๋ ์ฒด์ธ(๋ฃจํธ๊ฐ ์๋ 128 ๋งํฌ)์ ๋์ด ์ผ์น๋ก ์ฌ์ฉ๋์ง ์์ต๋๋ค.
- 2๊ฐ์ object?์ ๊ณตํต ํธํ ๋ฑ๋ก์ ์ ์งํ์ต๋๋ค. ํตํ๋ฅผ ๋ธ๋ฆฌ์ง๋ก ๋ผ์ฐํ ํฉ๋๋ค.UseType ๋ฐฐ๋ญ ์์์ FindType๋ฅผ ์ฌ์ฉํ์ฌ ์ฐพ๊ธฐ*๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์ฒซ ๋ฒ์งธ ๊ฒฐ๊ณผ๋ฅผ ์ ํํฉ๋๋ค. ์์ธก ๊ฐ๋ฅํ ์์ถ ํ์์ ์ํด์๋ ๋ถ์ ์ ํ ๊ฐ ์ ํ์ ์์์ ๋ณํ๋ณด๋ค๋ int/string๋ฅผ ์ฌ์ฉํ์ธ์.
- UseObject๋ ์์ ๋์์ ๋ณด๋ด์ง๋ง ๋ช ๋ น์ ๋์, ์น์ , ์์ฃผ, ์ฐฝ ์ด๊ธฐ, ์๋ฒ ์ฅ์ ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ๊ฒ์ ๋ฒ์๋ ์๋ฒ์์ ํ์ฉํ๋ ์ฌ์ฉ ๋ฒ์๋ฅผ ํ์ฅํ์ง ์์ต๋๋ค.
- ์ผ์นํ๋ ํญ๋ชฉ์ด ์์ผ๋ฉด ์์ถ ํ์์ ๋ฉ์์ง๋ฅผ ์ธ์ํ๊ณ 0๋ฅผ ๋ฐํํฉ๋๋ค. ๋ฌธ์/์ฐ๊ฒฐ์ด ์๋ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๋ ํ์ ๊ถํ์ผ๋ก ๊ฐ์ฃผ๋์ด์๋ ์ ๋ฉ๋๋ค. ์ ํํ ID์ ์ํด์๋ UO.UseObject๋ฅผ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.UseType(0x0F0C);
UO.Print("UseType: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0x0F0C๋ ํ์ค ์ ํ์ ์น์ ๋ฌผ์ฝ์ ์์ ๋๋ค. ์๋ฒ๋ ์บ๋ฆญํฐ ์ํ, ์ง์ฐ ์๊ฐ ๋๋ ์์ฒด ๊ท์น์ผ๋ก ์ธํด ํด๋น ์์ ์ ๊ฑฐ๋ถํ ์ ์์ต๋๋ค. ์์๊ณผ ๋ฒ์๋ ๋ณ๋๋ก ์ง์ ํ์ง ์์ผ๋ฉฐ ๊ธฐ๋ณธ๊ฐ์ด ์ ์ฉ๋ฉ๋๋ค.
if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
{
return null;
}
var used = UO.UseType(0x0F0C);
if (Truth(used == 0))
{
UO.Print("No matching healing potion in the loaded backpack");
}
else
{
UO.Print("Potion use requested; check health and the game message");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0x0E75 โ ๋ฐฐ๋ญ์ type, -1 โ ๋ชจ๋ hue, ground โ ์ธ๊ณ์ ๋ฌผ์ฒด. 2 - ์ X/Y, true - ๊ฐ์ฅ ๊ฐ๊น์ด, 4 - ์ฐจ์ด Z. ๋ฐํ ๊ฐ๋ฐฉ โ ID. ์ฝํ ์ธ ์ ๋ํ ์ก์ธ์ค๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. ํ์ ๋ฐฐ๋ญ์ ์ค์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var bag = UO.UseType(0x0E75, -1, "ground", 2, true, 4);
if (Truth(bag != 0))
{
UO.AddObject("nearby_bag", bag);
}
else
{
UO.Print("No suitable ground backpack within the selected bounds");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- itemType โ graphic ์ฌ๋ฌผ, ์์ค โ ๋ณ๋์ serial ์ปจํ ์ด๋. ๋์ฐ๋ฏธ๋ UseType์ ๋์ผํ๊ฒ 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 source = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(source == 0) || !(Truth(UO.Exists(source))))
{
return null;
}
UO.AddObject("supply", source);
var used = UseFromNamedSupply(0x0F0C);
if (Truth(used == 0))
{
UO.Print("Supply item was not found with these filters");
}
return null;
}
dynamic UseFromNamedSupply(dynamic itemType)
{
var source = Asc(UO.GetSerial("supply"), 0);
if (Truth(source == 0) || !(Truth(UO.Exists(source))))
{
return 0;
}
return UO.UseType(itemType, 0, source, 2, false, 16);
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: type (Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UseType. -
InjectionScript.Runtime.InjectionApiUO.UseType:UseType(type, -1).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int UseType(int type) => UseType(type, -1);๋งค๊ฐ๋ณ์: type (Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UseType. -
InjectionScript.Runtime.InjectionApiUO.UseType:UseType(ResolveType(type)). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(type).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int UseType(string type) => UseType(ResolveType(type));๋งค๊ฐ๋ณ์: type (Any/Integer/String), color (Any/Integer/String)
๊ฒฐ๊ณผ: int / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseType:bridge.UseType(ResolveType(arguments[0]), arguments.Length > 1 ? Arg(1) : -1). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "usetype": return new InjectionValue(bridge.UseType(ResolveType(arguments[0]), arguments.Length > 1 ? Arg(1) : -1));๋งค๊ฐ๋ณ์: type (Any/Integer/String), color (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UseType. -
InjectionScript.Runtime.InjectionApiUO.CompactUseType:CompactUseType(new[] { new InjectionValue(type), new InjectionValue(color) }).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int UseType(int type, int color) => CompactUseType(new[]
{
new InjectionValue(type),
new InjectionValue(color)
});๋งค๊ฐ๋ณ์: type (Any/Integer/String), color (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UseType. -
InjectionScript.Runtime.InjectionApiUO.UseType:UseType(type, NumberConversions.ToInt(color)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(color).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int UseType(int type, string color) => UseType(type, NumberConversions.ToInt(color));๋งค๊ฐ๋ณ์: type (Any/Integer/String), color (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UseType. -
InjectionScript.Runtime.InjectionApiUO.UseType:UseType(ResolveType(type), color). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(type).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int UseType(string type, int color) => UseType(ResolveType(type), color);๋งค๊ฐ๋ณ์: type (Any/Integer/String), color (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UseType. -
InjectionScript.Runtime.InjectionApiUO.UseType:UseType(ResolveType(type), NumberConversions.ToInt(color)). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(type). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(color).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int UseType(string type, string color) => UseType(ResolveType(type), NumberConversions.ToInt(color));๋งค๊ฐ๋ณ์: type (Any), color (Any), container (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [UseType]. -
InjectionScript.Runtime.InjectionApiUO.CompactUseType:CompactUseType(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactUseType(values))๋งค๊ฐ๋ณ์: type (Any), color (Any), container (Any), distance (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [UseType]. -
InjectionScript.Runtime.InjectionApiUO.CompactUseType:CompactUseType(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactUseType(values))๋งค๊ฐ๋ณ์: type (Any), color (Any), container (Any), distance (Any), nearest (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [UseType]. -
InjectionScript.Runtime.InjectionApiUO.CompactUseType:CompactUseType(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactUseType(values))๋งค๊ฐ๋ณ์: type (Any), color (Any), container (Any), distance (Any), nearest (Any), maxZ (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [UseType]. -
InjectionScript.Runtime.InjectionApiUO.CompactUseType:CompactUseType(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactUseType(values))ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.UseWorldObject(object? serialOrName);serialOrName๋ถํฐ GetObject๊น์ง ํ์ฑํํ๊ณ UseObject๋ฅผ ํธ์ถํฉ๋๋ค. ๋ฌธ์์ด ์ด๋ฆ์ ์ด๋ฆ graphic/type์ด ์๋ ๊ฐ์ฒด ๋ณ์นญ์ ๋๋ค.
-
serialOrNameโ ์ง๋ ฌ/ID ๊ฐ์ฒด: int, ์ซ์/16์ง์ ๋ฌธ์์ด ๋๋ ์ค์ ๋ ๋ณ์นญ(์: "lasttarget"). ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ ๋ก๋๋ ๊ฐ์ฒด๋ฅผ ํ์ธํ์ญ์์ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- UserObject์ ์ง์ ๋ฉํ๋ฐ์ดํฐ์ ๋ฑ๋ก๋์์ต๋๋ค. ์ด๋ ์๋ฒ ์ ์ฒด ๊ฒ์์ด ์๋ serial์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ์ ๋๋ค.
- Bridge๋ ๊ฒ์ ์คํธ๋ฆผ์ ๋ํ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์๋ฒ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ด์ฅ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.UseWorldObject");
UO.UseWorldObject(UO.GetSerial("lasttarget"));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- serialOrName๋ถํฐ GetObject๊น์ง ํ์ฑํํ๊ณ UseObject๋ฅผ ํธ์ถํฉ๋๋ค. ๋ฌธ์์ด ์ด๋ฆ์ ์ด๋ฆ graphic/type์ด ์๋ ๊ฐ์ฒด ๋ณ์นญ์ ๋๋ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.UseWorldObject(id);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UserObject์ ์ง์ ๋ฉํ๋ฐ์ดํฐ์ ๋ฑ๋ก๋์์ต๋๋ค. ์ด๋ ์๋ฒ ์ ์ฒด ๊ฒ์์ด ์๋ serial์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("self");
if (Truth(UO.Exists(id)))
{
UO.UseWorldObject(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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Bridge๋ ๊ฒ์ ์คํธ๋ฆผ์ ๋ํ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์๋ฒ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ด์ฅ์ ์์ต๋๋ค.
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()
{
ApplyToLoaded(UO.GetSerial("lasttarget"));
return null;
}
void ApplyToLoaded(dynamic id)
{
if (Truth(UO.Exists(id)))
{
UO.UseWorldObject(id);
}
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: serialOrName (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UserObject. -
InjectionScript.Runtime.InjectionApiUO.UseObject:UseObject(GetObject(serialOrName)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(serialOrName).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void UserObject(InjectionValue serialOrName)
=> UseObject(GetObject(serialOrName));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.UserObject(object? serialOrName);serialOrName๋ถํฐ GetObject๊น์ง ํ์ฑํํ๊ณ UseObject๋ฅผ ํธ์ถํฉ๋๋ค. ๋ฌธ์์ด ์ด๋ฆ์ ์ด๋ฆ graphic/type์ด ์๋ ๊ฐ์ฒด ๋ณ์นญ์ ๋๋ค.
-
serialOrNameโ ์ง๋ ฌ/ID ๊ฐ์ฒด: int, ์ซ์/16์ง์ ๋ฌธ์์ด ๋๋ ์ค์ ๋ ๋ณ์นญ(์: "lasttarget"). ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ ๋ก๋๋ ๊ฐ์ฒด๋ฅผ ํ์ธํ์ญ์์ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- UO.UseWorldObject์ ์ฌ์ฉ ๊ฒฝ๋ก๊ฐ ๋์ผํฉ๋๋ค. ์ด ๋ช ๋ น์ ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฑฐ๋ AddObject ์ด๋ฆ์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
- Bridge๋ ๊ฒ์ ์คํธ๋ฆผ์ ๋ํ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์๋ฒ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ด์ฅ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.UserObject");
UO.UserObject(UO.GetSerial("lasttarget"));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- serialOrName๋ถํฐ GetObject๊น์ง ํ์ฑํํ๊ณ UseObject๋ฅผ ํธ์ถํฉ๋๋ค. ๋ฌธ์์ด ์ด๋ฆ์ ์ด๋ฆ graphic/type์ด ์๋ ๊ฐ์ฒด ๋ณ์นญ์ ๋๋ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
UO.UserObject(id);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.UseWorldObject์ ์ฌ์ฉ ๊ฒฝ๋ก๊ฐ ๋์ผํฉ๋๋ค. ์ด ๋ช ๋ น์ ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฑฐ๋ AddObject ์ด๋ฆ์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("self");
if (Truth(UO.Exists(id)))
{
UO.UserObject(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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Bridge๋ ๊ฒ์ ์คํธ๋ฆผ์ ๋ํ ์์ฒญ์ ๋ณด๋ ๋๋ค. ์๋ฒ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค. ํ์ธ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ด์ฅ์ ์์ต๋๋ค.
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()
{
ApplyToLoaded(UO.GetSerial("lasttarget"));
return null;
}
void ApplyToLoaded(dynamic id)
{
if (Truth(UO.Exists(id)))
{
UO.UserObject(id);
}
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: serialOrName (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.UserObject. -
InjectionScript.Runtime.InjectionApiUO.UseObject:UseObject(GetObject(serialOrName)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(serialOrName).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void UserObject(InjectionValue serialOrName)
=> UseObject(GetObject(serialOrName));