KO UO Topic targeting - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
๋์ ์ปค์ ๋ฐ ์ฌ์ ์ค์ ๋ ์๋ต์ ์ฌ์ฉํ ์๋ ์๋ต WaitTarget. ์์ ๋ชฉํ๋ฅผ ์ค์ ํ๋ ๊ฒ๊ณผ ์์ ์ ์ํํ๋ ๊ฒ์ ๋ณ๊ฐ์ ์์ ์ ๋๋ค.
| ์ฃผ์ | ๋ช ๋ น ๋ฐ ์ค๋ช |
|---|---|
| Target | UO.Target |
| TargetID | UO.TargetID |
| TargetToObject | UO.TargetToObject |
| TargetToTile | UO.TargetToTile |
| TargetToXYZ | UO.TargetToXYZ |
| TargetByResource | UO.TargetByResource |
| WaitTarget | UO.WaitTarget |
| WaitTargetObject | UO.WaitTargetObject |
| WaitTargetType | UO.WaitTargetType |
| WaitTargetTile | UO.WaitTargetTile |
| WaitTargetXYZ | UO.WaitTargetXYZ |
| WaitTargetSelf | UO.WaitTargetSelf |
| LastTarget | UO.LastTarget |
| CancelTarget | UO.CancelTarget |
| Client Target Response | UO.ClientRequestObjectTarget ยท UO.ClientRequestTileTarget ยท UO.WaitForClientTargetResponse ยท UO.ClientTargetResponse |
UO.Target ยท UO.TargetID ยท UO.Targeting ยท UO.TargetPresent ยท UO.TargetToObject ยท UO.TargetToTile ยท UO.TargetToXYZ ยท UO.TargetByResource ยท UO.LastTarget ยท UO.LastTargetX ยท UO.LastTargetY ยท UO.LastTile ยท UO.TicksTarget
UO.WaitTarget ยท UO.WaitTargetObject ยท UO.WaitTargetType ยท UO.WaitTargetObjectType ยท UO.WaitTargetTile ยท UO.WaitTargetXYZ ยท UO.WaitTargetSelf ยท UO.WaitTargetGround ยท UO.WaitTargetLast ยท UO.WaitForTarget ยท UO.IsWaitTargetActive ยท UO.CancelTarget ยท UO.CancelWaitTarget
UO.ClientRequestObjectTarget ยท UO.ClientRequestTileTarget ยท UO.ClientTargetResponse ยท UO.ClientTargetResponsePresent ยท UO.WaitForClientTargetResponse
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
UO.CancelWaitTarget();
UO.WaitTargetObject("self");
UO.UseSkill("Anatomy");๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
if (Truth(UO.TargetPresent()))
{
UO.TargetToXYZ(1445, 1690, 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 ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.CancelTarget();ํ์ฑ ์ปค์๋ฅผ ์ทจ์ํ๊ณ ์ค๋น๋ ์ญ์์ ๋ฐ์์ ์ง์๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. true/false, serial ๋๋ type๋ก ์ฌ์ฉํ์ง ๋ง์ธ์. ๋ฉํ๋ฐ์ดํฐ object? ํธํ๋๋ ์์์ ๊ฒฝ์ฐ ์ค์ ๊ฒฐ๊ณผ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค void.
- ์ด๋ฏธ ์๋ฒ์ ์ ์ก๋ ์๋ต์ ํ์๋์ง ์์ต๋๋ค.
- ๋ก์ปฌ ์ฝ๋ฐฑ ๋์์ด ์ทจ์๋์์ต๋๋ค. ํ์ฑ ์๋ฒ ๋์์ ๊ฒฝ์ฐ ๋์ ์ทจ์๊ฐ ์ ์ก๋ฉ๋๋ค.
- ๋๊ธฐ์ด์ ํด๋ผ์ด์ธํธ์ ๊ณตํต์ ์ ๋๋ค. ๋๊ธฐ์ด ์ญ์ ๋ ๋ชจ๋ ์ ์ฐจ์ ์ค๋น๋ ์๋ต์ ์ ์ฉ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.CancelTarget");
UO.CancelTarget();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค.
- self์ ๋ํ ๋๊ธฐ ์ค์ธ ์๋ต์ด ์ญ์ ๋ฉ๋๋ค.
UO.WaitTargetSelf();
UO.CancelTarget();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 1445/1690/0๋ ์ธ๊ณ์ ์๋ก์ด ์ง์ ์ ์์ ๋๋ค.
- ์๋ก์ด ๋ชฉํ๋ฅผ ์ค์ ํ๊ธฐ ์ ์ ์ด์ ๋ต๋ณ์ด ์ ๊ฑฐ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.CancelTarget();
UO.WaitTargetXYZ(1445, 1690, 0);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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()
{
UO.WaitTargetSelf();
UO.UseSkill("Anatomy");
await Delay(1000);
if (Truth(UO.IsWaitTargetActive()))
{
UO.CancelTarget();
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.CancelTarget. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetWaitTargetQueue:bridge.GetWaitTargetQueue(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsTargeting:bridge.IsTargeting(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CancelTarget:bridge.CancelTarget(). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("Targeting cancelled").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void CancelTarget()
{
var waitTargetQueue = bridge.GetWaitTargetQueue();
if (waitTargetQueue.Length > 0 || bridge.IsTargeting() != 0)
{
bridge.CancelTarget();
SystemMessage("Targeting cancelled");
}
else
SystemMessage("Error: no target to cancel");
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.CancelWaitTarget();์ค๋น๋ ์ญ์์ ๋ฐ์์ ์ง์๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. true/false, serial ๋๋ type๋ก ์ฌ์ฉํ์ง ๋ง์ธ์. ๋ฉํ๋ฐ์ดํฐ object? ํธํ๋๋ ์์์ ๊ฒฝ์ฐ ์ค์ ๊ฒฐ๊ณผ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค void.
- ์ด๋ฏธ ์๋ฒ์ ์ ์ก๋ ์๋ต์ ํ์๋์ง ์์ต๋๋ค.
- ์ด๋ฆฐ ์ปค์๋ ํ์ฑ ์ํ๋ก ์ ์ง๋ฉ๋๋ค. ๋์ค์ ์๋์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ๋๊ธฐ์ด์ ํด๋ผ์ด์ธํธ์ ๊ณตํต์ ์ ๋๋ค. ๋๊ธฐ์ด ์ญ์ ๋ ๋ชจ๋ ์ ์ฐจ์ ์ค๋น๋ ์๋ต์ ์ ์ฉ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.CancelWaitTarget");
UO.CancelWaitTarget();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค.
- self์ ๋ํ ๋๊ธฐ ์ค์ธ ์๋ต์ด ์ญ์ ๋ฉ๋๋ค.
UO.WaitTargetSelf();
UO.CancelWaitTarget();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 1445/1690/0๋ ์ธ๊ณ์ ์๋ก์ด ์ง์ ์ ์์ ๋๋ค.
- ์๋ก์ด ๋ชฉํ๋ฅผ ์ค์ ํ๊ธฐ ์ ์ ์ด์ ๋ต๋ณ์ด ์ ๊ฑฐ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.CancelWaitTarget();
UO.WaitTargetXYZ(1445, 1690, 0);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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()
{
UO.WaitTargetSelf();
UO.UseSkill("Anatomy");
await Delay(1000);
if (Truth(UO.IsWaitTargetActive()))
{
UO.CancelWaitTarget();
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CancelWaitTarget:bridge.CancelWaitTarget().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "cancelwaittarget": bridge.CancelWaitTarget(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ClientRequestObjectTarget();ํญ๋ชฉ์ด๋ ๋ฌธ์๋ฅผ ์๋์ผ๋ก ์ ํํ๊ธฐ ์ํ ๋ก์ปฌ ์ญ์์ ์ ์ฝ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. true/false, serial ๋๋ type๋ก ์ฌ์ฉํ์ง ๋ง์ธ์. ๋ฉํ๋ฐ์ดํฐ object? ํธํ๋๋ ์์์ ๊ฒฝ์ฐ ์ค์ ๊ฒฐ๊ณผ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค void.
- ์ด ๋ฐํ์์ ์ด์ ๊ฒฐ๊ณผ๊ฐ ์ฌ์ค์ ๋ฉ๋๋ค. ํด๋ฆญ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ช ๋ น์ด ์ฆ์ ๋ฐํ๋ฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ WaitForClientTargetResponse ๋๋ ClientTargetResponsePresent ๋ค์์ ClientTargetResponse๋ก ์ฝํ์ง๋๋ค.
- ์คํ ์ค์ธ ํ๋ก์์ ๋ฅผ ์ค์งํ๋ฉด ๊ฐ์ฅ ๊ฐ๊น์ด ํ๋ ์์์ ํด๋น ํ๋ก์์ ์ ์ํ ๋ฒ์๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค. ๋ค๋ฅธ ์์ฒญ์ด ์ด๋ฏธ ์ปค์๋ฅผ ๋์ฒดํ ๊ฒฝ์ฐ ์ด๋ฅผ ์ทจ์ํด๋ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
- ๋ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ์๋ ์ ํ์ ๋ํด ํ๋์ ํด๋ผ์ด์ธํธ ์ธํฐํ์ด์ค ์ญ์์ ์ ๋์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด์ ์์ฒญ์ด ์ฒ๋ฆฌ๋ ๋๊น์ง ์ ์์ฒญ์ ์์ํ์ง ๋ง์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ClientRequestObjectTarget");
UO.ClientRequestObjectTarget();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 5000 โ ํด๋ฆญ ๋๊ธฐ ์๊ฐ ์ด๊ณผ(๋ฐ๋ฆฌ์ด). ์ ์ฟผ๋ฆฌ๋ ์ด์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ค์ ํฉ๋๋ค.
- 5๊ฐ ํ๋์ ๋ฐฐ์ด์ ์ ํํ ๊ฐ์ฒด๋ฅผ ๋ํ๋ ๋๋ค. ๊ฒฐ๊ณผ[0]๋ type๊ฐ ์๋๋ผ serial์ ๋๋ค.
UO.ClientRequestObjectTarget();
if (Truth(UO.WaitForClientTargetResponse(5000)))
{
var result = UO.ClientTargetResponse();
if (Truth(ArrayLength(result) == 5))
{
UO.Print("Serial: " + UO.Int2Hex(result[0]));
}
else
{
UO.Print("Selection cancelled");
}
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CancelTarget๋ ๋ก์ปฌ ์ ํ์ ์ทจ์ํฉ๋๋ค. ์ฝ๋ฐฑ์ ๋น ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
- ClientTargetResponsePresent๋ 1์ ์ ๊ณตํ์ง๋ง ๋ฐฐ์ด์ ๊ธธ์ด๋ 0์ ๋๋ค. ๊ธธ์ด๋ฅผ ํ์ธํ์ง ์๊ณ ๊ฒฐ๊ณผ[0]์ ์ก์ธ์คํ์ง ๋ง์ธ์.
return RunScenario();
object? RunScenario()
{
UO.ClientRequestObjectTarget();
UO.CancelTarget();
if (Truth(UO.ClientTargetResponsePresent()))
{
var result = UO.ClientTargetResponse();
UO.Print("Fields: " + Convert.ToString(ArrayLength(result)));
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๋ต์๋ 5๊ฐ์ ํ๋๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. serial๊ฐ ๊ฒฐ๊ณผ[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()
{
UO.ClientRequestObjectTarget();
if (UO.WaitForClientTargetResponse(5000) == 0)
return false;
var result = UO.ClientTargetResponse();
if (((object? [])result).Length != 5 || Convert.ToInt32(result[0]) == 0)
return false;
UO.AddObject("selected_object", result[0]);
UO.Print($"Saved object: {UO.GetName(result[0])}");
return true;
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.RequestClientTarget:bridge.RequestClientTarget(false).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "clientrequestobjecttarget": bridge.RequestClientTarget(false); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ClientRequestTileTarget();์ /ํ์ผ ๋๋ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ ํํ๊ธฐ ์ํ ๋ก์ปฌ ์ญ์์ ์ ์ฝ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. true/false, serial ๋๋ type๋ก ์ฌ์ฉํ์ง ๋ง์ธ์. ๋ฉํ๋ฐ์ดํฐ object? ํธํ๋๋ ์์์ ๊ฒฝ์ฐ ์ค์ ๊ฒฐ๊ณผ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค void.
- ์ด ๋ฐํ์์ ์ด์ ๊ฒฐ๊ณผ๊ฐ ์ฌ์ค์ ๋ฉ๋๋ค. ํด๋ฆญ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ช ๋ น์ด ์ฆ์ ๋ฐํ๋ฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ WaitForClientTargetResponse ๋๋ ClientTargetResponsePresent ๋ค์์ ClientTargetResponse๋ก ์ฝํ์ง๋๋ค.
- ์คํ ์ค์ธ ํ๋ก์์ ๋ฅผ ์ค์งํ๋ฉด ๊ฐ์ฅ ๊ฐ๊น์ด ํ๋ ์์์ ํด๋น ํ๋ก์์ ์ ์ํ ๋ฒ์๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค. ๋ค๋ฅธ ์์ฒญ์ด ์ด๋ฏธ ์ปค์๋ฅผ ๋์ฒดํ ๊ฒฝ์ฐ ์ด๋ฅผ ์ทจ์ํด๋ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
- ๋ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ์๋ ์ ํ์ ๋ํด ํ๋์ ํด๋ผ์ด์ธํธ ์ธํฐํ์ด์ค ์ญ์์ ์ ๋์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด์ ์์ฒญ์ด ์ฒ๋ฆฌ๋ ๋๊น์ง ์ ์์ฒญ์ ์์ํ์ง ๋ง์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ClientRequestTileTarget");
UO.ClientRequestTileTarget();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฒฐ๊ณผ[1] - graphic, ๊ฒฐ๊ณผ[2]/[3]/[4] - X/Y/Z. ์ธ๊ณ ํ์ผ serial์ ๊ฒฐ๊ณผ[0]๋ 0์ ๊ฐ์ต๋๋ค.
- ์ ํ, ์ขํ ๋ฐ serial๋ ๋ณ๋์ ํ๋์ ๋๋ค. ์ด ๋ฐฐ์ด์๋ ์ ์ ๋ ์ด์ด ์ธ๋ฑ์ค๊ฐ ์์ต๋๋ค.
UO.ClientRequestTileTarget();
if (Truth(UO.WaitForClientTargetResponse(5000)))
{
var result = UO.ClientTargetResponse();
if (Truth(ArrayLength(result) == 5))
{
UO.Print("Type: " + UO.Int2Hex(result[1]));
UO.Print(Convert.ToString(result[2]) + "," + Convert.ToString(result[3]) + "," + Convert.ToString(result[4]));
}
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ ๊ฒฝ์ฐ X/Y/Z๋ 2/3/4 ํ๋์ ์์ต๋๋ค. ์ ์ญ ์ ์ฅ์ ๋ฌธ์์ด; graphic ๋ฐ serial๋ ์ฌ๊ธฐ์ ์ขํ๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.ClientRequestTileTarget();
if (UO.WaitForClientTargetResponse(5000) == 0)
return false;
var selection = (object? [])UO.ClientTargetResponse();
if (selection.Length != 5)
return false;
UO.SetGlobal("route.x", Convert.ToString(selection[2]));
UO.SetGlobal("route.y", Convert.ToString(selection[3]));
UO.SetGlobal("route.z", Convert.ToString(selection[4]));
return true;
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CancelTarget๋ ๋ก์ปฌ ์ปค์๋ฅผ ์ฌ์ ์ํฉ๋๋ค. ์ทจ์ ํ ์ฝ๋ฐฑ์ด ์๋ค๊ณ ํด์ ์ ํ์ด ์ฑ๊ณตํ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
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()
{
UO.ClientRequestTileTarget();
await WaitAsync(1000);
UO.CancelTarget();
if (UO.ClientTargetResponsePresent() != 0)
{
var result = (object? [])UO.ClientTargetResponse();
UO.Print($"Response after cancel: {result.Length} fields");
}
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.RequestClientTarget:bridge.RequestClientTarget(true).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "clientrequesttiletarget": bridge.RequestClientTarget(true); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.ClientTargetResponse();๋ง์ง๋ง ๋ก์ปฌ ClientRequest*์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด์ ๋ณต์ฌํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
5๊ฐ์ int ๋ฐฐ์ด: [0]=serial ๋ฌผ์ฒด(0 ์ง์ ๊ทผ์ฒ/๊ณ ์ ), [1]=graphic/type, [2]=X, [3]=Y, [4]=Z. ์ ํ ์ , ์ ์์ฒญ์ผ๋ก ์ฌ์ค์ ๋ ํ, ์ทจ์ ๋๋ ๋ถ์ ์ ํ ์ ํ ์ ๋น ๋ฐฐ์ด์ด ๋ฐํ๋ฉ๋๋ค. hue, ์ง๋, ์ ์ ๋ ์ด์ด ์ธ๋ฑ์ค ๋ฐ ํ ์ง/์ ์ ์์ฑ์ด ๋๋ฝ๋์์ต๋๋ค. ์ด๊ฒ์ ๋ช ๋ช ๋ ํ๋๊ฐ ์๋ ๊ฐ์ฒด๊ฐ ์๋๋๋ค.
- ์ฝ๊ธฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์๋นํ์ง ์์ผ๋ฉฐ ๋ค์ ์ฝ์ ์ ์์ต๋๋ค. ์๋ก์ด ClientRequest*๊ฐ ์ด๋ฅผ ๋์ฒดํฉ๋๋ค.
- ์ธ๋ฑ์ค์ ์ก์ธ์คํ๊ธฐ ์ ์ ํญ์ ArrayLength(result)=5์ ํ์ธํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.ClientTargetResponse();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 5000 โ ํด๋ฆญ ๋๊ธฐ ์๊ฐ ์ด๊ณผ(๋ฐ๋ฆฌ์ด). ์ ์ฟผ๋ฆฌ๋ ์ด์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ค์ ํฉ๋๋ค.
- 5๊ฐ ํ๋์ ๋ฐฐ์ด์ ์ ํํ ๊ฐ์ฒด๋ฅผ ๋ํ๋ ๋๋ค. ๊ฒฐ๊ณผ[0]๋ type๊ฐ ์๋๋ผ serial์ ๋๋ค.
UO.ClientRequestObjectTarget();
if (Truth(UO.WaitForClientTargetResponse(5000)))
{
var result = UO.ClientTargetResponse();
if (Truth(ArrayLength(result) == 5))
{
UO.Print("Serial: " + UO.Int2Hex(result[0]));
}
else
{
UO.Print("Selection cancelled");
}
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฒฐ๊ณผ[1] - graphic, ๊ฒฐ๊ณผ[2]/[3]/[4] - X/Y/Z. ์ธ๊ณ ํ์ผ serial์ ๊ฒฐ๊ณผ[0]๋ 0์ ๊ฐ์ต๋๋ค.
- ์ ํ, ์ขํ ๋ฐ serial๋ ๋ณ๋์ ํ๋์ ๋๋ค. ์ด ๋ฐฐ์ด์๋ ์ ์ ๋ ์ด์ด ์ธ๋ฑ์ค๊ฐ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.ClientRequestTileTarget();
if (Truth(UO.WaitForClientTargetResponse(5000)))
{
var result = UO.ClientTargetResponse();
if (Truth(ArrayLength(result) == 5))
{
UO.Print("Type: " + UO.Int2Hex(result[1]));
UO.Print(Convert.ToString(result[2]) + "," + Convert.ToString(result[3]) + "," + Convert.ToString(result[4]));
}
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CancelTarget๋ ๋ก์ปฌ ์ ํ์ ์ทจ์ํฉ๋๋ค. ์ฝ๋ฐฑ์ ๋น ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
- ClientTargetResponsePresent๋ 1์ ์ ๊ณตํ์ง๋ง ๋ฐฐ์ด์ ๊ธธ์ด๋ 0์ ๋๋ค. ๊ธธ์ด๋ฅผ ํ์ธํ์ง ์๊ณ ๊ฒฐ๊ณผ[0]์ ์ก์ธ์คํ์ง ๋ง์ธ์.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.ClientRequestObjectTarget();
UO.CancelTarget();
if (Truth(UO.ClientTargetResponsePresent()))
{
var result = UO.ClientTargetResponse();
UO.Print("Fields: " + Convert.ToString(ArrayLength(result)));
}
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.ClientTargetResponse:bridge.ClientTargetResponse().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "clienttargetresponse":
return new InjectionValue(bridge.ClientTargetResponse().Select(value => new InjectionValue(value)).ToArray());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.ClientTargetResponsePresent();๋ง์ง๋ง ๋ก์ปฌ ์ ํ ์์ฒญ์ ๋ํ ์๋ต์ด ์์ ๋์๋์ง ํ์ธํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int 1 โ ์ทจ์๋ฅผ ํฌํจํ์ฌ ์ฝ๋ฐฑ์ด ์ด๋ฏธ ์๋ตํ์ต๋๋ค. 0 - ์๋ก์ด ์ ํ์ด ์์ง ์๋ฃ๋์ง ์์์ต๋๋ค. 1 ๊ฐ์ ๊ฐ์ฒด์ ์กด์ฌ๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ทจ์ํ๋ฉด ClientTargetResponse๊ฐ ๋น ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ์๋ฒ ์์ผ์ ์กด์ฌ๋ฅผ ๋ํ๋ด์ง ์์ผ๋ฉฐ WaitTarget ๋๊ธฐ์ด์ ์ค๋ช ํ์ง ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ฅผ ์ฝ์ด๋ ์ด ํ๋๊ทธ๋ ์ฌ์ค์ ๋์ง ์์ต๋๋ค. ๋ค์ ClientRequest*์ ์ํด ์ฌ์ค์ ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.ClientTargetResponsePresent();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CancelTarget๋ ๋ก์ปฌ ์ ํ์ ์ทจ์ํฉ๋๋ค. ์ฝ๋ฐฑ์ ๋น ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
- ClientTargetResponsePresent๋ 1์ ์ ๊ณตํ์ง๋ง ๋ฐฐ์ด์ ๊ธธ์ด๋ 0์ ๋๋ค. ๊ธธ์ด๋ฅผ ํ์ธํ์ง ์๊ณ ๊ฒฐ๊ณผ[0]์ ์ก์ธ์คํ์ง ๋ง์ธ์.
UO.ClientRequestObjectTarget();
UO.CancelTarget();
if (Truth(UO.ClientTargetResponsePresent()))
{
var result = UO.ClientTargetResponse();
UO.Print("Fields: " + Convert.ToString(ArrayLength(result)));
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๋ต ์ค๋น ์ํ์ ๋ด์ฉ์ด ๋ชจ๋ ํ์ธ๋ฉ๋๋ค. 1 ์์ฑ์ serial ๊ฐ์ฒด๊ฐ ์๋๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.ClientRequestObjectTarget();
if (UO.WaitForClientTargetResponse(5000) == 0)
return false;
if (UO.ClientTargetResponsePresent() == 0)
return false;
var response = (object? [])UO.ClientTargetResponse();
return response.Length == 5 && Convert.ToInt32(response[0]) != 0;
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํด๋ง์ 5์ด๋ก ์ ํ๋ฉ๋๋ค. ์๋ต์ด ์์ผ๋ฉด ์ปค์๊ฐ ์ทจ์๋ฉ๋๋ค. X/Y/Z ํ๋๋ ์ ์ฒด ์๋ต์์๋ง ์ฝํ์ง๋๋ค.
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()
{
UO.ClientRequestTileTarget();
for (int attempt = 0; attempt < 50; attempt++)
{
if (UO.ClientTargetResponsePresent() != 0)
{
var response = (object? [])UO.ClientTargetResponse();
if (response.Length == 5)
UO.Print($"Selected tile: {response[2]},{response[3]},{response[4]}");
return null;
}
await WaitAsync(100);
}
UO.CancelTarget();
UO.Print("Selection timed out");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClientTargetResponsePresent:bridge.ClientTargetResponsePresent().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "clienttargetresponsepresent": return new InjectionValue(bridge.ClientTargetResponsePresent());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.IsWaitTargetActive();์ค๋น๋ ์๋ต์ด ๋์ ๋๊ธฐ์ด์ ๋จ์ ์๋์ง ํ์ธํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int 1 - ์ทจ์๋์ง ์์ ์ง์ฐ๋ ๋ฌผ์ฒด, ํ์ผ ๋๋ ๋ค์ ๊ด๊ฒฝ์ โโ์ทจ์๊ฐ ์์ต๋๋ค. 0 - ๋๊ธฐ์ด์ด ๋น์ด ์์ต๋๋ค. ์ด๋ฆฐ ์ปค์๊ฐ ์์ต๋๋ค. ์ปค์ ์ฌ์ฉ์ ๊ฒฝ์ฐ TargetPresent/Targeting.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ์ ์ฒด ํด๋ผ์ด์ธํธ์ ๋๊ธฐ์ด์ ์ฝ์ต๋๋ค. ์ฌ๋ฌ ํ๋ก์์ ๊ฐ ๋์์ ์คํ๋๋ ๊ฒฝ์ฐ ๊ฐ ํ๋ก์์ ์ ์๋ต์ด ๊ณ ๋ ค๋ฉ๋๋ค.
- 0์ ๋ณด๋ฅ ์ค์ธ ์๋ต์ด ์์์ ์๋ฏธํฉ๋๋ค. ์๋ฒ์์ ์คํฌ์ด๋ ์ฃผ๋ฌธ์ ์ฑ๊ณต์ ์ธ ์ฌ์ฉ์ ํ์ธํ์ง๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.IsWaitTargetActive();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- WaitTargetSelf ์ดํ ๋ฐ ์๋ฒ ๋์ 1 ์ด์ ์ด ์์๋ฉ๋๋ค.
- CancelWaitTarget ๋๊ธฐ์ด์ ์ง์๋๋ค. ๋ค์ ํ ์คํธ๋ 0์ ์ ๊ณตํฉ๋๋ค.
UO.WaitTargetSelf();
UO.Print(Convert.ToString(UO.IsWaitTargetActive()));
UO.CancelWaitTarget();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ํ์๋ ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. UO.Wait=50ms, ์ต๋ 20 ๊ธฐ๋์น.
- ๋ต๋ณ์ด ๋จ์ ์์ผ๋ฉด ์ทจ์๋ฉ๋๋ค. ์๋ฒ ์ก์ ๊ฒฐ๊ณผ์ ๋ํ ํ์ธ์ ๋ณ๋๋ก ์ถ๊ฐํฉ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var attempts = 0;
while (Truth(UO.IsWaitTargetActive()) && Truth(attempts < 20))
{
await Delay(50);
attempts = attempts + 1;
}
if (Truth(UO.IsWaitTargetActive()))
{
UO.CancelWaitTarget();
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒซ ๋ฒ์งธ ์ค์๋ ์ง์ฐ๋ ์๋ต์ด ํ์๋๊ณ ๋ ๋ฒ์งธ ์ค์๋ ์๋ ฅ ์ํ๊ฐ ํ์๋ฉ๋๋ค.
- ์ปค์๊ฐ ์๋ ํ์ ํ๊ฐ ์๋ ์ปค์๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ์ด ๊ฐ์ ์๋ก ๋ฐ๊ฟ ์ฌ์ฉํ ์ ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.Print("Queued: " + Convert.ToString(UO.IsWaitTargetActive()));
UO.Print("Cursor: " + Convert.ToString(UO.TargetPresent()));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.Waiting:Waiting().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "iswaittargetactive": return new InjectionValue(Waiting());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.LastTarget();๋ง์ง๋ง์ผ๋ก ์ ์ฅ๋ ๋์ ๊ฐ์ฒด์ serial๋ฅผ ์ฝ์ด์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int - serial/ID, type๋ ์๋๊ณ bool๋ ์๋๋๋ค. 0์ ๋ชฉํ ๊ฐ์ฒด๊ฐ ์์์ ์๋ฏธํฉ๋๋ค. ์ง์ ๋ฐ ์ ์ ์๋ serial 0๊ฐ ์์ง๋ง ์ขํ๋ ์ ์ฅํ ์ ์์ต๋๋ค. ๋ชจ๋ 32 ๋นํธ๊ฐ ์ ์ง๋ฉ๋๋ค. 0์ด ์๋ ID๋ฅผ ํ์ธํ๋ ค๋ฉด > 0 ๋๋ == true๊ฐ ์๋ != 0์ ์ฌ์ฉํ์ธ์.
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. ์กฐ์ค๊ฒฝ์ ์ผ์ง ์์ผ๋ฉฐ, ์๋ก์ด ๋์์ ์ ํํ์ง ์์ผ๋ฉฐ, ๊ณต๊ฒฉํ๊ฑฐ๋ ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค. LastTarget๋ LastAttack ๋ฐ LastStatus์ ๋ค๋ฆ ๋๋ค. ์ผ๋ฐ์ ์ธ ์ ํ self๋ ๋ง์ง๋ง ๋์์ ๋์ฒดํ์ง ์์ต๋๋ค. ๋ช ์์ ์ธ ClientMarkChar๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- SetEntity์๋ ์๋ ค์ง ์ํฐํฐ๊ฐ ๋ณด์กด๋ฉ๋๋ค.X/Y; ์ปจํ ์ด๋์ ์๋ ํญ๋ชฉ์ ๊ฒฝ์ฐ ์ด๋ ๋ด์ฉ์ ์ขํ๊ฐ ๋ ์ ์์ต๋๋ค. SetLand/SetStatic ์ ํํ ์ง์ ์ X/Y ์ธ์์ ๊ตฌํ์ธ์. ์ดํ์ ๊ฐ์ฒด๋ฅผ ์ด๋/์ ๊ฑฐํด๋ ์ ์ฅ๋ ์ขํ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ํ์ฌ ์์น๋ GetX/GetY(serial)๋ฅผ ์ฌ์ฉํ์ธ์.
- Clear ๋ฐ World.Clear ํด๋ฆฌ์ด ๋ น์(์คํฌ๋ฆฝํธ๊ฐ ์ ์ฅ๋ ๋ ํฌํจ). ๋ช ์์ ์ค์ ์ ์ ์ ์๋ serial๋ ์ด์ X/Y๋ฅผ ์์ํ์ง ์์ผ๋ฉฐ 0๊ฐ ๋ฉ๋๋ค. ์ด๋ ๋์์ด ์๋ฒ์ ์กด์ฌํจ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
- ๋ณ๋์ ๋ช ๋ น์ผ๋ก serial ๋ฐ X/Y๋ฅผ ์ฝ๋ ๊ฒ์ ์์์ ์ด์ง ์์ต๋๋ค. ๋์ ๊ฐ์ฒด์ ๊ฒฝ์ฐ LastTile๋ ๋คํธ์ํฌ X/Y=65535๋ฅผ ์ ์ฅํฉ๋๋ค. ์ด๋ ์ ์ฅ๋ ๊ฐ์ฒด ์์น๊ฐ ์๋๋๋ค. ์ ์ง/์ ์ LastTile(1)/(2) ์ฝ๊ธฐ ์ ํ X/Y. ๊ดํธ๊ฐ ์๋ lasttarget๋ ๋ณ์๋ก ์ฌ์ ์๋์ง ์๋ ํ ๋ด์ฅ๋ ์ค์๊ฐ ๊ฐ์ ๋๋ค.
- World.Clear ํธ์ถ ClearWorldState: ํ์ฑ ์ฝ๋ฐฑ, ์ ์ฅ๋ ๋์ ๋ฐ ์ฌ์ ํจํท์ ์ฌ์ค์ ํฉ๋๋ค. ์ ์์ ์ธ ์ฌ์ค์ ์ ๊ธฐ๋ก์ ์ ์ฅํฉ๋๋ค. ๋ด๋ถ TargetLast๋ ์ ์ฅ๋ ํจํท์ ํ์ฑ ์๋ฒ ๋์์๋ง ๋ณด๋ ๋๋ค. ๊ธฐ๋ก์ด ์๊ฑฐ๋ ๋ก์ปฌ ์ฝ๋ฐฑ์ ๊ฒฝ์ฐ ์๋ฌด๊ฒ๋ ๋ณด๋ด์ง ์๊ณ ๋์์ ์ ์ฅํฉ๋๋ค. ํ์ฑ ํด๋ผ์ด์ธํธ ์ฝ๋ฐฑ์ ์ทจ์๋ก null๋ฅผ ํ ๋ฒ ์์ ํฉ๋๋ค. ์๋ต์ด ๋น์ด ์์ผ๋ฉด ClientTargetResponsePresent๋ 1๊ฐ ๋ฉ๋๋ค. ์๋ฃ๋ ์ ํ์ ๋ค์ ์๋ฆผ์ ๋ฐ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.LastTarget();
UO.Print("LastTarget: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- value๋ ๋ช ๋ น์ ์ ์ผํ ๊ฒฐ๊ณผ์ ๋๋ค. HEX๋ ID, Convert๋ฅผ ํ์ํฉ๋๋ค.ToString๋ ์ขํ์ ๋๋ค. ํธ์ถ์์๋ ์๋ฌด๊ฒ๋ ์ ํ๋์ง ์์ต๋๋ค.
var value = UO.LastTarget();
UO.Print("Saved value: " + Hex(value));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- id โ ์ ์ฅ๋จ serial. Exists๋ GetX/GetY ์ด์ ์ ๊ฐ์ฒด๊ฐ ์๋์ง ํ์ธํฉ๋๋ค. ์ ์ฅ๋ ์ขํ์ ํ์ฌ ์ขํ๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค. serial=0๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ์์๋ ์ ํํ ์ ์ ์ธ์ํ์ง๋ง 0 ์์ฒด์์๋ ํด๋น ์ ์ด ์ ํ๋์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.LastTarget();
var x = UO.LastTargetX();
var y = UO.LastTargetY();
UO.Print("Saved XY: " + Convert.ToString(x) + "," + Convert.ToString(y));
if (Truth(id != 0) && Truth(UO.Exists(id)))
{
UO.Print("Live XY: " + Convert.ToString(UO.GetX(id)) + "," + Convert.ToString(UO.GetY(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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์/์ต๋๋ API ๋งค๊ฐ๋ณ์๊ฐ ์๋ ์ด์์คํดํธ ๊ฒฐ๊ณผ์ ํ์ฉ ๊ฐ๋ฅํ ๋ฒ์๋ฅผ ์ง์ ํฉ๋๋ค. ์ด์์คํดํธ๋ ์์ ํ ์ ์๋์ด ์์ต๋๋ค. -1๋ ์์ฒด์ ์ผ๋ก ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ๋ค๋ ์ ํธ์ ๋๋ค. ID์ ๊ฒฝ์ฐ ๊ฒ์ฌ์์๋ ๋ฒ์ ๋์ ์ต์์ ๋นํธ๋ฅผ ํฌํจํ์ฌ 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 value = ReadTargetValue();
UO.Print("Checked value: " + Convert.ToString(value));
return null;
}
dynamic ReadTargetValue()
{
var value = UO.LastTarget();
if (Truth(value == 0))
{
return -1;
}
return value;
}
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.LastTarget:bridge.LastTarget.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "lasttarget": return new InjectionValue(bridge.LastTarget);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.LastTargetX();๋ง์ง๋ง ๋์์ ์ ํํ์ ๋ ์ ์ฅ๋ X ์ขํ๋ฅผ ์ฝ์ด์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int์ ํ๋ฉด ํฝ์ ์ด ์๋ X์ ์ ์ฅ๋ ์ขํ์ ๋๋ค. ์ง์ฐ๊ธฐ ์ /ํ ๋๋ ์ ์ ์๋ ๋ฌผ์ฒด์ ๋ํด - 0; ์ค์ ์ขํ 0๋ ํ์ฉ๋ฉ๋๋ค. bool๊ฐ ์๋๋๋ค. ์ง์/์ ์ ์ ๊ฒฝ์ฐ LastTarget()=0์์๋ ์๋ํฉ๋๋ค.
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. ์กฐ์ค๊ฒฝ์ ์ผ์ง ์์ผ๋ฉฐ, ์๋ก์ด ๋์์ ์ ํํ์ง ์์ผ๋ฉฐ, ๊ณต๊ฒฉํ๊ฑฐ๋ ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค. LastTarget๋ LastAttack ๋ฐ LastStatus์ ๋ค๋ฆ ๋๋ค. ์ผ๋ฐ์ ์ธ ์ ํ self๋ ๋ง์ง๋ง ๋์์ ๋์ฒดํ์ง ์์ต๋๋ค. ๋ช ์์ ์ธ ClientMarkChar๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- SetEntity์๋ ์๋ ค์ง ์ํฐํฐ๊ฐ ๋ณด์กด๋ฉ๋๋ค.X/Y; ์ปจํ ์ด๋์ ์๋ ํญ๋ชฉ์ ๊ฒฝ์ฐ ์ด๋ ๋ด์ฉ์ ์ขํ๊ฐ ๋ ์ ์์ต๋๋ค. SetLand/SetStatic ์ ํํ ์ง์ ์ X/Y ์ธ์์ ๊ตฌํ์ธ์. ์ดํ์ ๊ฐ์ฒด๋ฅผ ์ด๋/์ ๊ฑฐํด๋ ์ ์ฅ๋ ์ขํ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ํ์ฌ ์์น๋ GetX/GetY(serial)๋ฅผ ์ฌ์ฉํ์ธ์.
- Clear ๋ฐ World.Clear ํด๋ฆฌ์ด ๋ น์(์คํฌ๋ฆฝํธ๊ฐ ์ ์ฅ๋ ๋ ํฌํจ). ๋ช ์์ ์ค์ ์ ์ ์ ์๋ serial๋ ์ด์ X/Y๋ฅผ ์์ํ์ง ์์ผ๋ฉฐ 0๊ฐ ๋ฉ๋๋ค. ์ด๋ ๋์์ด ์๋ฒ์ ์กด์ฌํจ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
- ๋ณ๋์ ๋ช ๋ น์ผ๋ก serial ๋ฐ X/Y๋ฅผ ์ฝ๋ ๊ฒ์ ์์์ ์ด์ง ์์ต๋๋ค. ๋์ ๊ฐ์ฒด์ ๊ฒฝ์ฐ LastTile๋ ๋คํธ์ํฌ X/Y=65535๋ฅผ ์ ์ฅํฉ๋๋ค. ์ด๋ ์ ์ฅ๋ ๊ฐ์ฒด ์์น๊ฐ ์๋๋๋ค. ์ ์ง/์ ์ LastTile(1)/(2) ์ฝ๊ธฐ ์ ํ X/Y. ๊ดํธ๊ฐ ์๋ lasttarget๋ ๋ณ์๋ก ์ฌ์ ์๋์ง ์๋ ํ ๋ด์ฅ๋ ์ค์๊ฐ ๊ฐ์ ๋๋ค.
- World.Clear ํธ์ถ ClearWorldState: ํ์ฑ ์ฝ๋ฐฑ, ์ ์ฅ๋ ๋์ ๋ฐ ์ฌ์ ํจํท์ ์ฌ์ค์ ํฉ๋๋ค. ์ ์์ ์ธ ์ฌ์ค์ ์ ๊ธฐ๋ก์ ์ ์ฅํฉ๋๋ค. ๋ด๋ถ TargetLast๋ ์ ์ฅ๋ ํจํท์ ํ์ฑ ์๋ฒ ๋์์๋ง ๋ณด๋ ๋๋ค. ๊ธฐ๋ก์ด ์๊ฑฐ๋ ๋ก์ปฌ ์ฝ๋ฐฑ์ ๊ฒฝ์ฐ ์๋ฌด๊ฒ๋ ๋ณด๋ด์ง ์๊ณ ๋์์ ์ ์ฅํฉ๋๋ค. ํ์ฑ ํด๋ผ์ด์ธํธ ์ฝ๋ฐฑ์ ์ทจ์๋ก null๋ฅผ ํ ๋ฒ ์์ ํฉ๋๋ค. ์๋ต์ด ๋น์ด ์์ผ๋ฉด ClientTargetResponsePresent๋ 1๊ฐ ๋ฉ๋๋ค. ์๋ฃ๋ ์ ํ์ ๋ค์ ์๋ฆผ์ ๋ฐ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.LastTargetX();
UO.Print("LastTargetX: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- value๋ ๋ช ๋ น์ ์ ์ผํ ๊ฒฐ๊ณผ์ ๋๋ค. HEX๋ ID, Convert๋ฅผ ํ์ํฉ๋๋ค.ToString๋ ์ขํ์ ๋๋ค. ํธ์ถ์์๋ ์๋ฌด๊ฒ๋ ์ ํ๋์ง ์์ต๋๋ค.
var value = UO.LastTargetX();
UO.Print("Saved value: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- id โ ์ ์ฅ๋จ serial. Exists๋ GetX/GetY ์ด์ ์ ๊ฐ์ฒด๊ฐ ์๋์ง ํ์ธํฉ๋๋ค. ์ ์ฅ๋ ์ขํ์ ํ์ฌ ์ขํ๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค. serial=0๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ์์๋ ์ ํํ ์ ์ ์ธ์ํ์ง๋ง 0 ์์ฒด์์๋ ํด๋น ์ ์ด ์ ํ๋์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.LastTarget();
var x = UO.LastTargetX();
var y = UO.LastTargetY();
UO.Print("Saved XY: " + Convert.ToString(x) + "," + Convert.ToString(y));
if (Truth(id != 0) && Truth(UO.Exists(id)))
{
UO.Print("Live XY: " + Convert.ToString(UO.GetX(id)) + "," + Convert.ToString(UO.GetY(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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์/์ต๋๋ API ๋งค๊ฐ๋ณ์๊ฐ ์๋ ์ด์์คํดํธ ๊ฒฐ๊ณผ์ ํ์ฉ ๊ฐ๋ฅํ ๋ฒ์๋ฅผ ์ง์ ํฉ๋๋ค. ์ด์์คํดํธ๋ ์์ ํ ์ ์๋์ด ์์ต๋๋ค. -1๋ ์์ฒด์ ์ผ๋ก ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ๋ค๋ ์ ํธ์ ๋๋ค. ID์ ๊ฒฝ์ฐ ๊ฒ์ฌ์์๋ ๋ฒ์ ๋์ ์ต์์ ๋นํธ๋ฅผ ํฌํจํ์ฌ 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 value = ReadTargetValue(0, 65535);
UO.Print("Checked value: " + Convert.ToString(value));
return null;
}
dynamic ReadTargetValue(dynamic minimum, dynamic maximum)
{
var value = UO.LastTargetX();
if (Truth(value < minimum) || Truth(value > maximum))
{
return -1;
}
return value;
}
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.LastTargetX. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.LastTarget). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastTarget:bridge.LastTarget.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int LastTargetX() => bridge is ITargetSnapshotBridge snapshot ? snapshot.LastTargetX : bridge.GetX(bridge.LastTarget);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.LastTargetY();๋ง์ง๋ง ๋์์ ์ ํํ์ ๋ ์ ์ฅ๋ Y ์ขํ๋ฅผ ์ฝ์ด์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int์ ํ๋ฉด ํฝ์ ์ด ์๋ Y์ ์ ์ฅ๋ ์ขํ์ ๋๋ค. ์ง์ฐ๊ธฐ ์ /ํ ๋๋ ์ ์ ์๋ ๋ฌผ์ฒด์ ๋ํด - 0; ์ค์ ์ขํ 0๋ ํ์ฉ๋ฉ๋๋ค. bool๊ฐ ์๋๋๋ค. ์ง์/์ ์ ์ ๊ฒฝ์ฐ LastTarget()=0์์๋ ์๋ํฉ๋๋ค.
- ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. ์กฐ์ค๊ฒฝ์ ์ผ์ง ์์ผ๋ฉฐ, ์๋ก์ด ๋์์ ์ ํํ์ง ์์ผ๋ฉฐ, ๊ณต๊ฒฉํ๊ฑฐ๋ ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค. LastTarget๋ LastAttack ๋ฐ LastStatus์ ๋ค๋ฆ ๋๋ค. ์ผ๋ฐ์ ์ธ ์ ํ self๋ ๋ง์ง๋ง ๋์์ ๋์ฒดํ์ง ์์ต๋๋ค. ๋ช ์์ ์ธ ClientMarkChar๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- SetEntity์๋ ์๋ ค์ง ์ํฐํฐ๊ฐ ๋ณด์กด๋ฉ๋๋ค.X/Y; ์ปจํ ์ด๋์ ์๋ ํญ๋ชฉ์ ๊ฒฝ์ฐ ์ด๋ ๋ด์ฉ์ ์ขํ๊ฐ ๋ ์ ์์ต๋๋ค. SetLand/SetStatic ์ ํํ ์ง์ ์ X/Y ์ธ์์ ๊ตฌํ์ธ์. ์ดํ์ ๊ฐ์ฒด๋ฅผ ์ด๋/์ ๊ฑฐํด๋ ์ ์ฅ๋ ์ขํ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ํ์ฌ ์์น๋ GetX/GetY(serial)๋ฅผ ์ฌ์ฉํ์ธ์.
- Clear ๋ฐ World.Clear ํด๋ฆฌ์ด ๋ น์(์คํฌ๋ฆฝํธ๊ฐ ์ ์ฅ๋ ๋ ํฌํจ). ๋ช ์์ ์ค์ ์ ์ ์ ์๋ serial๋ ์ด์ X/Y๋ฅผ ์์ํ์ง ์์ผ๋ฉฐ 0๊ฐ ๋ฉ๋๋ค. ์ด๋ ๋์์ด ์๋ฒ์ ์กด์ฌํจ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
- ๋ณ๋์ ๋ช ๋ น์ผ๋ก serial ๋ฐ X/Y๋ฅผ ์ฝ๋ ๊ฒ์ ์์์ ์ด์ง ์์ต๋๋ค. ๋์ ๊ฐ์ฒด์ ๊ฒฝ์ฐ LastTile๋ ๋คํธ์ํฌ X/Y=65535๋ฅผ ์ ์ฅํฉ๋๋ค. ์ด๋ ์ ์ฅ๋ ๊ฐ์ฒด ์์น๊ฐ ์๋๋๋ค. ์ ์ง/์ ์ LastTile(1)/(2) ์ฝ๊ธฐ ์ ํ X/Y. ๊ดํธ๊ฐ ์๋ lasttarget๋ ๋ณ์๋ก ์ฌ์ ์๋์ง ์๋ ํ ๋ด์ฅ๋ ์ค์๊ฐ ๊ฐ์ ๋๋ค.
- World.Clear ํธ์ถ ClearWorldState: ํ์ฑ ์ฝ๋ฐฑ, ์ ์ฅ๋ ๋์ ๋ฐ ์ฌ์ ํจํท์ ์ฌ์ค์ ํฉ๋๋ค. ์ ์์ ์ธ ์ฌ์ค์ ์ ๊ธฐ๋ก์ ์ ์ฅํฉ๋๋ค. ๋ด๋ถ TargetLast๋ ์ ์ฅ๋ ํจํท์ ํ์ฑ ์๋ฒ ๋์์๋ง ๋ณด๋ ๋๋ค. ๊ธฐ๋ก์ด ์๊ฑฐ๋ ๋ก์ปฌ ์ฝ๋ฐฑ์ ๊ฒฝ์ฐ ์๋ฌด๊ฒ๋ ๋ณด๋ด์ง ์๊ณ ๋์์ ์ ์ฅํฉ๋๋ค. ํ์ฑ ํด๋ผ์ด์ธํธ ์ฝ๋ฐฑ์ ์ทจ์๋ก null๋ฅผ ํ ๋ฒ ์์ ํฉ๋๋ค. ์๋ต์ด ๋น์ด ์์ผ๋ฉด ClientTargetResponsePresent๋ 1๊ฐ ๋ฉ๋๋ค. ์๋ฃ๋ ์ ํ์ ๋ค์ ์๋ฆผ์ ๋ฐ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.LastTargetY();
UO.Print("LastTargetY: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- value๋ ๋ช ๋ น์ ์ ์ผํ ๊ฒฐ๊ณผ์ ๋๋ค. HEX๋ ID, Convert๋ฅผ ํ์ํฉ๋๋ค.ToString๋ ์ขํ์ ๋๋ค. ํธ์ถ์์๋ ์๋ฌด๊ฒ๋ ์ ํ๋์ง ์์ต๋๋ค.
var value = UO.LastTargetY();
UO.Print("Saved value: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- id โ ์ ์ฅ๋จ serial. Exists๋ GetX/GetY ์ด์ ์ ๊ฐ์ฒด๊ฐ ์๋์ง ํ์ธํฉ๋๋ค. ์ ์ฅ๋ ์ขํ์ ํ์ฌ ์ขํ๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค. serial=0๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ์์๋ ์ ํํ ์ ์ ์ธ์ํ์ง๋ง 0 ์์ฒด์์๋ ํด๋น ์ ์ด ์ ํ๋์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.LastTarget();
var x = UO.LastTargetX();
var y = UO.LastTargetY();
UO.Print("Saved XY: " + Convert.ToString(x) + "," + Convert.ToString(y));
if (Truth(id != 0) && Truth(UO.Exists(id)))
{
UO.Print("Live XY: " + Convert.ToString(UO.GetX(id)) + "," + Convert.ToString(UO.GetY(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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์/์ต๋๋ API ๋งค๊ฐ๋ณ์๊ฐ ์๋ ์ด์์คํดํธ ๊ฒฐ๊ณผ์ ํ์ฉ ๊ฐ๋ฅํ ๋ฒ์๋ฅผ ์ง์ ํฉ๋๋ค. ์ด์์คํดํธ๋ ์์ ํ ์ ์๋์ด ์์ต๋๋ค. -1๋ ์์ฒด์ ์ผ๋ก ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ๋ค๋ ์ ํธ์ ๋๋ค. ID์ ๊ฒฝ์ฐ ๊ฒ์ฌ์์๋ ๋ฒ์ ๋์ ์ต์์ ๋นํธ๋ฅผ ํฌํจํ์ฌ 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 value = ReadTargetValue(0, 65535);
UO.Print("Checked value: " + Convert.ToString(value));
return null;
}
dynamic ReadTargetValue(dynamic minimum, dynamic maximum)
{
var value = UO.LastTargetY();
if (Truth(value < minimum) || Truth(value > maximum))
{
return -1;
}
return value;
}
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.LastTargetY. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.LastTarget). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastTarget:bridge.LastTarget.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int LastTargetY() => bridge is ITargetSnapshotBridge snapshot ? snapshot.LastTargetY : bridge.GetY(bridge.LastTarget);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.LastTile();
int UO.LastTile(object? index);๋ง์ง๋ง์ผ๋ก ์ ์ฅ๋ ํ์ผ ๋์์ ์ฝ์ต๋๋ค.
-
index- ์ ํ์ฌํญ int 0..3: 0=graphic, 1=X, 2=Y, 3=Z. ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ์ต๋๋ค. - 0. ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด ์ ์ฒด ๋ ์ฝ๋์ ํ์ด ๋ฐํ๋ฉ๋๋ค.
์ธ์ ์์ string "graphic X Y Z" ์ญ์ง์ ํ๋ ํฌํจ; ์ธ๋ฑ์ค ํฌํจ - ํ ํ๋์ int. ๋๋ฝ/์งง์ ํญ๋ชฉ์ 0์ผ๋ก ์ฑ์์ง๋๋ค.
- NormalizeLastTile๋ ๋๋ฝ๋ ํ๋๋ฅผ 4๊ฐ๋ก ์์ฑํฉ๋๋ค. ์ด ์ค์๋ map/hue/serial๊ฐ ํฌํจ๋์ด ์์ง ์์ต๋๋ค. 0 ๊ฐ์ ์ค์ graphic/์ขํ ๋๋ ํ๋ ์์์ ์๋ฏธํ ์ ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ ์ฅ๋ ํ์ผ ๋์๋ง ์ฝ์ต๋๋ค. ๋์์ ์์ฑํ๊ฑฐ๋ ์ ์ ์ ์ ํํ์ง ์์ต๋๋ค. WaitTargetTile("lasttile")์ ๋ณ๋์ ๋ ์ฝ๋ ์กด์ฌ ํ์ธ์ ์ฌ์ฉํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.LastTile();
UO.Print("LastTile: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ง์ง๋ง์ผ๋ก ์ ์ฅ๋ ํ์ผ ๋์์ ์ฝ์ต๋๋ค.
UO.Print(UO.LastTile());๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- NormalizeLastTile๋ ๋๋ฝ๋ ํ๋๋ฅผ 4๊ฐ๋ก ์์ฑํฉ๋๋ค. ์ด ์ค์๋ map/hue/serial๊ฐ ํฌํจ๋์ด ์์ง ์์ต๋๋ค. 0 ๊ฐ์ ์ค์ graphic/์ขํ ๋๋ ํ๋ ์์์ ์๋ฏธํ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.LastTile(1));
UO.Print(UO.LastTile(2));
UO.Print(UO.LastTile(3));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ๋ช ๋ น์ ์ ์ฅ๋ ํ์ผ ๋์๋ง ์ฝ์ต๋๋ค. ๋์์ ์์ฑํ๊ฑฐ๋ ์ ์ ์ ์ ํํ์ง ์์ต๋๋ค. WaitTargetTile("lasttile")์ ๋ณ๋์ ๋ ์ฝ๋ ์กด์ฌ ํ์ธ์ ์ฌ์ฉํฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var graphic = UO.LastTile(0);
var x = UO.LastTile(1);
var y = UO.LastTile(2);
var z = UO.LastTile(3);
UO.Print(Convert.ToString(graphic) + " " + Convert.ToString(x) + " " + Convert.ToString(y) + " " + Convert.ToString(z));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.LastTile. -
InjectionScript.Runtime.InjectionApiUO.NormalizeLastTile:NormalizeLastTile(bridge.LastTile()). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastTile:bridge.LastTile().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string LastTile()
{
int[] tileInfo = NormalizeLastTile(bridge.LastTile());
return $"{tileInfo[0]} {tileInfo[1]} {tileInfo[2]} {tileInfo[3]}";
}๋งค๊ฐ๋ณ์: index (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.LastTile. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(index). -
InjectionScript.Runtime.InjectionApiUO.NormalizeLastTile:NormalizeLastTile(bridge?.LastTile()).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int LastTile(InjectionValue index)
{
var i = NumberConversions.ToInt(index);
if (i < 0 || i > 3)
return 0;
return NormalizeLastTile(bridge?.LastTile())[i];
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Target();
void UO.Target(object? @object);
void UO.Target(object? targetKey, object? target);
void UO.Target(object? targetKey, object? target, object? targetType, object? @type, object? x, object? y, object? z);์์ ๋์์ ์ทจ์/์ค์ ํ๊ฑฐ๋ ๋ช ์์ ์ธ ๋์ ํจํท์ ๋ณด๋ ๋๋ค.
-
objectโ ์ธ์ 1๊ฐ: serial/alias๋ WaitTargetObject์ ํตํด ๋ฐฐ์น๋ฉ๋๋ค. ์ธ์ ์์ - CancelTarget. -
targetKeyโ ID ๋์ ์ฟผ๋ฆฌ์ int ์ธ์์ 2/7 ํ์์์ ์ผ๋ฐ์ ์ผ๋ก UO.TargetID()์ ๋๋ค. ํจํค์ง์ ์ง์ ์ ๋ฌ๋๋ฉฐ ํค๋ฅผ ๋๋ฅด์ง ์์ต๋๋ค. -
targetโ ์์ 2: serial/๋ณ์นญ ๋๋ "lasttile". ๋ชจ์ 7: serial ๊ฐ์ฒด; "ground"์ serial=0์ ๋จ๊น๋๋ค. -
targetType- 7 ํ์๋ง ํด๋น: ํ๋กํ ์ฝ ์ ํ ๋์, ์ผ๋ฐ์ ์ผ๋ก 0 ๊ฐ์ฒด, 1 ํ์ผ. byte๋ก ์ถ์ ๊ฐ๋ฅ. -
type- 7 ๋ชจ์๋ง ํด๋น: graphic ๋ฐ ํ์ผ/์ ์ ์๋ ๊ฐ์ฒด์ ์ธ๊ณ ์ขํ; graphic/X/Y๋ ushort๋ก, Z๋ sbyte๋ก ์ถ์๋ฉ๋๋ค. ์๋ ค์ง ์ํฐํฐ ๋ธ๋ฆฌ์ง์ ๊ฒฝ์ฐ ์ด๋ฅผ ์ค์ ์ํฐํฐ ํ๋๋ก ๋ฐ๊ฟ๋๋ค. -
x- 7 ๋ชจ์๋ง ํด๋น: graphic ๋ฐ ํ์ผ/์ ์ ์๋ ๊ฐ์ฒด์ ์ธ๊ณ ์ขํ; graphic/X/Y๋ ushort๋ก, Z๋ sbyte๋ก ์ถ์๋ฉ๋๋ค. ์๋ ค์ง ์ํฐํฐ ๋ธ๋ฆฌ์ง์ ๊ฒฝ์ฐ ์ด๋ฅผ ์ค์ ์ํฐํฐ ํ๋๋ก ๋ฐ๊ฟ๋๋ค. -
y- 7 ๋ชจ์๋ง ํด๋น: graphic ๋ฐ ํ์ผ/์ ์ ์๋ ๊ฐ์ฒด์ ์ธ๊ณ ์ขํ; graphic/X/Y๋ ushort๋ก, Z๋ sbyte๋ก ์ถ์๋ฉ๋๋ค. ์๋ ค์ง ์ํฐํฐ ๋ธ๋ฆฌ์ง์ ๊ฒฝ์ฐ ์ด๋ฅผ ์ค์ ์ํฐํฐ ํ๋๋ก ๋ฐ๊ฟ๋๋ค. -
z- 7 ๋ชจ์๋ง ํด๋น: graphic ๋ฐ ํ์ผ/์ ์ ์๋ ๊ฐ์ฒด์ ์ธ๊ณ ์ขํ; graphic/X/Y๋ ushort๋ก, Z๋ sbyte๋ก ์ถ์๋ฉ๋๋ค. ์๋ ค์ง ์ํฐํฐ ๋ธ๋ฆฌ์ง์ ๊ฒฝ์ฐ ์ด๋ฅผ ์ค์ ์ํฐํฐ ํ๋๋ก ๋ฐ๊ฟ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ์ธ์๊ฐ ์๊ฑฐ๋ ํ๋์ธ ์์์ ExecuteLegacyManualAlias๋ฅผ ๋ฐ๋ผ ์งํ๋๊ณ ๋๊ธฐ์ด์ ์ ์ดํฉ๋๋ค. 2/7 ์์์ Target๋ฅผ ์ง์ ํธ์ถํ๊ณ ๋ค์ ๋์์ ๋๊ธฐ์ด์ด ์๋ Send_TargetObject๋ฅผ ๋ณด๋ ๋๋ค.
- 2 ํ์์์ "lasttile"์ ์ ์ฅ๋ ๋์ ํ์ผ์ graphic/X/Y/Z๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ถ์ฌํ๋ฉด ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. ์ ์ ์๋ ๊ฐ์ฒด ๋ณ์นญ๋ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค. targetType=0๊ฐ ์๋ 7 ํ์์ serial๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ์๋ํฉ๋๋ค. ๋ค๋ฅธ ์ ํ์ serial=0์ ๋ ๋์ธ์.
- Bridge.Target๋ ํ์ฑ ์ปค์/์ผ์น targetKey๋ฅผ ํ์ธํ์ง ์์ต๋๋ค. ํ์ฌ ID๋ฅผ ์ ๋ฌํฉ๋๋ค. ์ด์ ์์ฒญ์ ์ด์ ํค๋ฅผ ์ฌ์ฉํ์ง ๋ง์ธ์. ํธ์ถ์ ์๋ฒ์์ ์๋ฝ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
- 2/7 ์ธ์์ ๋ช ์์ ํ์์ ํจํท์ ์ง์ ๋ณด๋ ๋๋ค. ์์ serial๋ 0์ด ๋๊ณ , targetKey๋ uint๋ก ์ค์ด๋ญ๋๋ค. ์ด ๋ถ๊ธฐ๋ ๋ก์ปฌ ์ปค์/ํ๋ฅผ ์ง์ฐ๊ฑฐ๋ TicksTarget๋ฅผ ์ ๋ฐ์ดํธํ์ง ์์ต๋๋ค. TargetToObject/TargetToTile ํด๋ผ์ด์ธํธ์ ํ์ฑ ์กฐ์ค์ ๋ํด ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Target");
UO.Target();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ ๋์์ ์ทจ์/์ค์ ํ๊ฑฐ๋ ๋ช ์์ ์ธ ๋์ ํจํท์ ๋ณด๋ ๋๋ค.
UO.Target("self");
UO.Print(UO.Waiting());
UO.Target();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๊ฑฐ๋ ํ๋์ธ ์์์ ExecuteLegacyManualAlias๋ฅผ ๋ฐ๋ผ ์งํ๋๊ณ ๋๊ธฐ์ด์ ์ ์ดํฉ๋๋ค. 2/7 ์์์ Target๋ฅผ ์ง์ ํธ์ถํ๊ณ ๋ค์ ๋์์ ๋๊ธฐ์ด์ด ์๋ Send_TargetObject๋ฅผ ๋ณด๋ ๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.TargetPresent()))
{
UO.Target(UO.TargetID(), "self");
}
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.Target๋ ํ์ฑ ์ปค์/์ผ์น targetKey๋ฅผ ํ์ธํ์ง ์์ต๋๋ค. ํ์ฌ 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()
{
if (Truth(UO.TargetPresent()))
{
UO.Target(UO.TargetID(), "ground", 1, 0, UO.GetX(), UO.GetY(), UO.GetZ());
}
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.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.WaitTargetObject:WaitTargetObject(arguments[0].ToString()). -
InjectionScript.Runtime.InjectionValue.ToString:arguments[0].ToString(). -
InjectionScript.Runtime.InjectionApiUO.CancelTarget:CancelTarget().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "target":
if (arguments.Length > 0) WaitTargetObject(arguments[0].ToString());
else CancelTarget();
break;๋งค๊ฐ๋ณ์: object (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
InjectionScript.Runtime.InjectionApiUO.WaitTargetObject:WaitTargetObject(arguments[0].ToString()). -
InjectionScript.Runtime.InjectionValue.ToString:arguments[0].ToString(). -
InjectionScript.Runtime.InjectionApiUO.CancelTarget:CancelTarget().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "target":
if (arguments.Length > 0) WaitTargetObject(arguments[0].ToString());
else CancelTarget();
break;๋งค๊ฐ๋ณ์: targetKey (Any), target (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Target. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(targetKey). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastTile:bridge.LastTile(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Target:bridge.Target(key, 0, 1, tile[0], tile[1], tile[2], tile[3]). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("UO.Target: lasttile is unavailable"). -
InjectionScript.Runtime.InjectionApiUO.TryGetObject:TryGetObject(target, out int serial).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void Target(InjectionValue targetKey, InjectionValue target)
{
int key = NumberConversions.ToInt(targetKey);
string selector = target.Kind == InjectionValueKind.String ? target.String : string.Empty;
if (selector.Equals("lasttile", StringComparison.OrdinalIgnoreCase))
{
int[] tile = bridge.LastTile() ?? Array.Empty<int>();
if (tile.Length >= 4)
bridge.Target(key, 0, 1, tile[0], tile[1], tile[2], tile[3]);
else
SystemMessage("UO.Target: lasttile is unavailable");
return;
}
if (TryGetObject(target, out int serial))
bridge.Target(key, serial, 0, 0, 0, 0, 0);
else
SystemMessage($"UO.Target: invalid target '{selector}'");
}๋งค๊ฐ๋ณ์: targetKey (Any), target (Any), targetType (Any), type (Any), x (Any), y (Any), z (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Target. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(targetType). -
InjectionScript.Runtime.InjectionApiUO.TryGetObject:TryGetObject(target, out serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Target:bridge.Target ( NumberConversions.ToInt(targetKey), serial, targetTypeValue, ResolveType(type), NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(z) ). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(type).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void Target
(
InjectionValue targetKey,
InjectionValue target,
InjectionValue targetType,
InjectionValue type,
InjectionValue x,
InjectionValue y,
InjectionValue z
)
{
int targetTypeValue = NumberConversions.ToInt(targetType);
string selector = target.Kind == InjectionValueKind.String ? target.String : string.Empty;
int serial = 0;
if (targetTypeValue == 0 && !selector.Equals("ground", StringComparison.OrdinalIgnoreCase))
TryGetObject(target, out serial);
bridge.Target
(
NumberConversions.ToInt(targetKey),
serial,
targetTypeValue,
ResolveType(type),
NumberConversions.ToInt(x),
NumberConversions.ToInt(y),
NumberConversions.ToInt(z)
);
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.TargetByResource(object? objID, object? resource);graphic์์ ์์ดํ ์ ๊ฒ์ํ์ฌ, ์ฃผ์ด์ง ๋์์ ์ค๋นํ๊ณ , ์ฐพ์ ์์ดํ ์ ์ฌ์ฉํฉ๋๋ค.
-
objIDโ ์ง๋ ฌ/ID ๊ฐ์ฒด: int, ์ซ์/16์ง์ ๋ฌธ์์ด ๋๋ ์ค์ ๋ ๋ณ์นญ(์: "lasttarget"). ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ ๋ก๋๋ ๊ฐ์ฒด๋ฅผ ํ์ธํ์ญ์์ค. -
resourceโ ๊ฒ์ํ ๊ทธ๋ํฝ/type ํญ๋ชฉ, ResolveType ํ์ฉ; ์ด๋ Pascal API์ ๋ฆฌ์์ค ํ๋ ๋ฒํธ๊ฐ ์๋๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ์ด ๊ตฌํ์์๋ FindType(ResolveType(Resource), -1, 0, -1, true)๊ฐ ํญ๋ชฉ์ ๊ฒ์ํฉ๋๋ค. ๋ฐ๊ฒฌ๋ ๊ฒฝ์ฐ != 0, ์ฒซ ๋ฒ์งธ ๋ธ๋ฆฌ์ง.WaitTargetObject(ObjID), ๋ค์ ๋ธ๋ฆฌ์ง.UseObject(๋ฐ๊ฒฌ).
- ์๋ฌด๊ฒ๋ ๋ฐ๊ฒฌ๋์ง ์์์ต๋๋ค. ์๋ฌด๊ฒ๋ ์ค์น๋๊ฑฐ๋ ์ฌ์ฉ๋์ง ์์์ต๋๋ค. ์ด ๋ช ๋ น์ ๋ณ๋์ ๋ฆฌ์์ค ๋์ ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค. ๋ฒ์=0๋ ์ธ๋ฒคํ ๋ฆฌ ์ฝํ ์ธ /์ฅ๋น๋ฅผ ํฌํจํ์ฌ RootContainer=Player.Serial์ด ์๋ ํญ๋ชฉ์ ์ ํํฉ๋๋ค. recursive=true๋ ๋ธ๋ฆฌ์ง๋ก ์ ๋ฌ๋์ง๋ง ์ดscope0 ๋ถ๊ธฐ ์์ฒด๋ RootContainer์ ์ฌ์ฉํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.TargetByResource");
UO.TargetByResource("self", "0x0E21");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- graphic์์ ์์ดํ ์ ๊ฒ์ํ์ฌ, ์ฃผ์ด์ง ๋์์ ์ค๋นํ๊ณ , ์ฐพ์ ์์ดํ ์ ์ฌ์ฉํฉ๋๋ค.
UO.TargetByResource("self", "0x0E21");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ๊ตฌํ์์๋ FindType(ResolveType(Resource), -1, 0, -1, true)๊ฐ ํญ๋ชฉ์ ๊ฒ์ํฉ๋๋ค. ๋ฐ๊ฒฌ๋ ๊ฒฝ์ฐ != 0, ์ฒซ ๋ฒ์งธ ๋ธ๋ฆฌ์ง.WaitTargetObject(ObjID), ๋ค์ ๋ธ๋ฆฌ์ง.UseObject(๋ฐ๊ฒฌ).
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
UO.TargetByResource("lasttarget", "0x0E21");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๋ฌด๊ฒ๋ ๋ฐ๊ฒฌ๋์ง ์์์ต๋๋ค. ์๋ฌด๊ฒ๋ ์ค์น๋๊ฑฐ๋ ์ฌ์ฉ๋์ง ์์์ต๋๋ค. ์ด ๋ช ๋ น์ ๋ณ๋์ ๋ฆฌ์์ค ๋์ ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค. ๋ฒ์=0๋ ์ธ๋ฒคํ ๋ฆฌ ์ฝํ ์ธ /์ฅ๋น๋ฅผ ํฌํจํ์ฌ RootContainer=Player.Serial์ด ์๋ ํญ๋ชฉ์ ์ ํํฉ๋๋ค. recursive=true๋ ๋ธ๋ฆฌ์ง๋ก ์ ๋ฌ๋์ง๋ง ์ดscope0 ๋ถ๊ธฐ ์์ฒด๋ RootContainer์ ์ฌ์ฉํฉ๋๋ค.
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.TargetByResource("self", "0x0E21");
UO.Print(UO.Waiting());
UO.CancelWaitTarget();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any), resource (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.FindType:bridge.FindType(ResolveType(arguments[1]), -1, 0, -1, true). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(arguments[1]). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WaitTargetObject:bridge.WaitTargetObject(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseObject:bridge.UseObject(found).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "targetbyresource":
{
int found = bridge.FindType(ResolveType(arguments[1]), -1, 0, -1, true);
if (found != 0) { bridge.WaitTargetObject(Arg(0)); bridge.UseObject(found); }
return InjectionValue.Unit;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.TargetID();ํ์ฌ ๋์ ์ปค์์ ID๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int - ๋ง์ง๋ง ๊ฐ์ฒด์ serial๊ฐ ์๋ ์ปค์์ 32 ๋นํธ ID. ์ปค์๊ฐ ์์ผ๋ฉด 0๊ฐ ๋ฐํ๋ฉ๋๋ค. ์ต์์ ๋นํธ๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ int๋ ์์์ ๋๋ค. Int2Hex๋ ๋นํธ๋ฅผ ์ ์ฅํฉ๋๋ค. ์ค์ cursorID=0 ๋ฐ ๋ก์ปฌ ๋ฒ์์์๋ 0๋ ์ ๊ณตํ ์ ์์ต๋๋ค. TargetPresent์์ ํ๋์ ํ์ธํ์ธ์. ์ด ํด๋ผ์ด์ธํธ์์๋ null ID์ ๋ํ null์ด ์๋ ํน์ ๋์ฒด๊ฐ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
- LastTarget/GetSerial("lasttarget")๋ ์ ํํ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ , TargetID๋ ๋์ ์์ฒญ์ ์ฐธ์กฐํฉ๋๋ค. ์ด ๊ฐ์ ์๋ก ๋์ฒด๋ ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.TargetID();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค.
- Int2Hex์ ์ฌ์ฉํ๋ฉด ์ต์์ ๋นํธ๋ฅผ ํฌํจํ์ฌ ID์ ๋ชจ๋ ๋นํธ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
if (Truth(UO.TargetPresent()))
{
UO.Print(UO.Int2Hex(UO.TargetID()));
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ปค์ โ ์์ผ์ ID, ๋ฌผ์ฒด์ object โ serial.
- TargetToObject์์๋ ์ปค์๊ฐ ์๋ object๊ฐ ์ ๋ฌ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var cursor = UO.TargetID();
var targetSerial = UO.GetSerial("lasttarget");
UO.Print("Cursor: " + UO.Int2Hex(cursor));
UO.Print("Object: " + targetSerial);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 1000 โ ๋๊ธฐ ์๊ฐ ์ด๊ณผ(๋ฐ๋ฆฌ์ด).
- ๋ฐ์ ์งํ๋ ๊ฒฐ๊ณผ WaitForTarget์ ๋๋ค. ์ด๋ฅผ ์ํด ์ปค์ ๊ธฐํธ๊ฐ ํ์ธ๋์ง ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (Truth(UO.WaitForTarget(1000)))
{
var cursor = UO.TargetID();
UO.Print("Request: " + UO.Int2Hex(cursor));
}
else
{
UO.Print("No cursor arrived");
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTargetCursorId:bridge.GetTargetCursorId().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "targetid": return new InjectionValue(bridge.GetTargetCursorId());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.TargetPresent();ํด๋ผ์ด์ธํธ์์ ํ์ฑ ๋์ ์ ํ ์ปค์๋ฅผ ํ์ธํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int 1 - TargetManager.IsTargeting ์ค์น; 0 - ํ์ฑ ์ปค์๊ฐ ์์ต๋๋ค. ๋ก์ปฌ ์ฝ๋ฐฑ ๋์๋ ๊ณ ๋ ค๋ฉ๋๋ค. ์ด๋ serial ๋๋ ๋๊ธฐ์ด ์ํ WaitTarget๊ฐ ์๋๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ์ํ๋ฅผ ํ ๋ฒ ์ฝ์ต๋๋ค. ์ปค์๊ฐ ๋ํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
- ๊ฒ์ ์์ ํ ์๋ฒ ์ญ์์ ์ ๊ธฐ๋ค๋ฆฌ๋ ค๋ฉด WaitForTarget๋ฅผ ์ฌ์ฉํ์ธ์. ๋ก์ปฌ ClientRequest* - WaitForClientTargetResponse์ ๊ฒฐ๊ณผ์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.TargetPresent();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค.
- 1 ๋๋ 0์ด ํ์๋ฉ๋๋ค.
UO.Print(Convert.ToString(UO.TargetPresent()));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์กฐ๊ฑด์ ํ์ฑ ์ปค์๋ก ํ์ธ๋ฉ๋๋ค.
- CancelTarget ์ด ํด๋ผ์ด์ธํธ์์๋ ์ค๋น๋ ์๋ต๋ ์ญ์ ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.TargetPresent()))
{
UO.CancelTarget();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UseSkill๊ฐ ์คํฌ์ ์์ฒญํ๊ณ , WaitForTarget๊ฐ 3000ms๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
- TargetToObject๋ ํ์ฑ ์๋ฒ ๋์์๋ง ์๋ตํฉ๋๋ค. ์๊ฐ ์ด๊ณผ๊ฐ ์์ผ๋ฉด ๋ถ๊ธฐ๊ฐ ์คํ๋์ง ์์ต๋๋ค.
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.UseSkill("Anatomy");
if (Truth(UO.WaitForTarget(3000)))
{
if (Truth(UO.TargetPresent()))
{
UO.TargetToObject("self");
}
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.IsTargeting:IsTargeting().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "targetpresent": return new InjectionValue(IsTargeting());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.TargetToObject(object? objID);์ด๋ฏธ ํ์ฑํ๋ ์๋ฒ ๋์ serial ๊ฐ์ฒด์ ์ฆ์ ์๋ตํฉ๋๋ค.
-
objIDโ ํญ๋ชฉ ๋๋ ๋ฌธ์์ ์ผ๋ จ๋ฒํธ/ID, ์ซ์ ๋๋ 16์ง์/10์ง์ ๋ฌธ์์ด, self/backpack/lasttarget/lastobject ๋๋ ์ ์ฅ๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type์ด ์๋๋๋ค. ๋ช ๋ช ๋ ๊ฐ์ฒด์ ์์ ์ ์ํํ๊ธฐ ์ ์ Exists๋ฅผ ํ์ธํ์ธ์. ํด๊ฒฐ๋์ง ์์ ๋ณ์นญ์ serial 0์ ์ ๊ณตํฉ๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. true/false, serial ๋๋ type๋ก ์ฌ์ฉํ์ง ๋ง์ธ์. ๋ฉํ๋ฐ์ดํฐ object? ํธํ๋๋ ์์์ ๊ฒฝ์ฐ ์ค์ ๊ฒฐ๊ณผ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค void.
- ํ์ฑ ์๋ฒ ์ปค์๊ฐ ์์ผ๋ฉด ์๋ฌด ์์ ๋ ์ํํ์ง ์์ผ๋ฉฐ ์ง์ฐ๋ ์๋ต์ ์์ฑํ์ง ์์ต๋๋ค. ์ฌ์ ์ค๋น๋ WaitTargetObject/WaitTargetTile/WaitTargetXYZ๋ฅผ ์ฌ์ฉํ์ธ์.
- ๋ก์ปฌ ClientRequest* ๋ฐ ๊ธฐํ ์ฝ๋ฐฑ ์ฌ์ดํธ๋ ์ด ๋ช ๋ น์ผ๋ก ์ฒ๋ฆฌ๋์ง ์์ต๋๋ค.
- ์๋ฒ๋ ๋์์ด ์ ํจํ์ง ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ serial์ ๊ฒฝ์ฐ ID๋ ๊ทธ๋ํฝ/์ขํ ํ๋๊ฐ 0์ธ ์ํ๋ก ์ ์ก๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.TargetToObject");
UO.TargetToObject("self");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋งค๊ฐ๋ณ์๋ ๋ฌธ์ ์์ฒด๋ฅผ ์ ์ํฉ๋๋ค.
- ํฅํ ๋ฒ์ ๋๊ธฐ์ด์๋ ์๋ฌด๊ฒ๋ ์ถ๊ฐ๋์ง ์์ต๋๋ค.
if (Truth(UO.TargetPresent()))
{
UO.TargetToObject("self");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 3000 โ ์ต๋ ๋๊ธฐ ์๊ฐ(๋ฐ๋ฆฌ์ด); ์์ผ๋ฅผ ์์ฒญํ ์์ ์ ์ด์ ์ ์ํ๋์ด์ผ ํฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์์ผ๊ฐ ๋ํ๋ ํ์๋ง ํธ์ถ๋ฉ๋๋ค. ๊ฒ์ ์์ ์ ์๋ฒ ์ค๋ฅ๋ก ๋๋ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.WaitForTarget(3000)))
{
UO.TargetToObject("self");
}
else
{
UO.Print("Target timeout");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CancelTarget ๊ธฐ์กด ์ฌ์ดํธ๋ฅผ ๋ซ๊ณ ๋๊ธฐ์ด์ ์ง์๋๋ค.
- ์๋ก์ด ๋ฒ์๊ฐ ์์ผ๋ฉด ๋์ ์ ๊ธฐ๋๋ฅผ ๋ถ๋ฌ์ผ์ผํค์ง ์์ต๋๋ค. ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๊ฐ ๋ณ๊ฒฝํ์ง ์๋ ํ ๋๊ธฐ์ด ์ถ๋ ฅ์ 0๋ก ์ ์ง๋ฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.CancelTarget();
UO.TargetToObject("self");
UO.Print("Queued: " + Convert.ToString(UO.IsWaitTargetActive()));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TargetToObject:bridge.TargetToObject(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "targettoobject": bridge.TargetToObject(Arg(0)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.TargetToTile(object? tile, object? x, object? y, object? z);ํ์ผ โโ์ขํ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ ํ์ฑํ๋ ์๋ฒ ๋์์ ์ฆ์ ์๋ตํฉ๋๋ค.
-
tile- ๊ทธ๋ํฝ/type ํ์ผ, 0..65535, serial ์๋. 0์ ์ง์ ๋ ๊ทธ๋ํฝ์ด ์๋ ์ขํ ๋์์ ๋ํ๋ ๋๋ค. -
xโ ํ์ฌ ์ง๋์ ์ธ๊ณ X ์ขํ 0..65535. ์ด๋ ํ๋ฉด ํฝ์ ์ด๋ ๊ฒํ ์ขํ๊ฐ ์๋๋๋ค. -
yโ ํ์ฌ ์ง๋์ ์ธ๊ณ Y ์ขํ 0..65535. -
z- ๋คํธ์ํฌ ๋์ ์ฌ์ฉ์ ์ํ ๊ฒ์ ํฌ์ธํธ ๋์ด -128..127. ์ด๊ฒ์ ๋ฐ๋ฅ์ด๋ ์ฅ๋น์ ์ธต์ด ์๋๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. true/false, serial ๋๋ type๋ก ์ฌ์ฉํ์ง ๋ง์ธ์. ๋ฉํ๋ฐ์ดํฐ object? ํธํ๋๋ ์์์ ๊ฒฝ์ฐ ์ค์ ๊ฒฐ๊ณผ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค void.
- ํ์ฑ ์๋ฒ ์ปค์๊ฐ ์์ผ๋ฉด ์๋ฌด ์์ ๋ ์ํํ์ง ์์ผ๋ฉฐ ์ง์ฐ๋ ์๋ต์ ์์ฑํ์ง ์์ต๋๋ค. ์ฌ์ ์ค๋น๋ WaitTargetObject/WaitTargetTile/WaitTargetXYZ๋ฅผ ์ฌ์ฉํ์ธ์.
- ๋ก์ปฌ ClientRequest* ๋ฐ ๊ธฐํ ์ฝ๋ฐฑ ์ฌ์ดํธ๋ ์ด ๋ช ๋ น์ผ๋ก ์ฒ๋ฆฌ๋์ง ์์ต๋๋ค.
- graphic=0์ธ ๋์์๋ ์ญ์์ ์ด ํ์ํฉ๋๋ค. ๋ฌผ์ฒด ์๋ ฅ์์ง๋ฉด์ ๋ฐ์๋ค์ด์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.TargetToTile");
UO.TargetToTile(0x0CCA, 1445, 1690, 0);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋งค๊ฐ๋ณ์๋ ์ค์ ์ ์ ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ขํ์ graphic๋ฅผ ์ํ๋ ๊ฐ์ผ๋ก ๋ฐ๊ฟ๋๋ค.
- ํฅํ ๋ฒ์ ๋๊ธฐ์ด์๋ ์๋ฌด๊ฒ๋ ์ถ๊ฐ๋์ง ์์ต๋๋ค.
if (Truth(UO.TargetPresent()))
{
UO.TargetToTile(0x0CCA, 1445, 1690, 0);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 3000 โ ์ต๋ ๋๊ธฐ ์๊ฐ(๋ฐ๋ฆฌ์ด); ์์ผ๋ฅผ ์์ฒญํ ์์ ์ ์ด์ ์ ์ํ๋์ด์ผ ํฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์์ผ๊ฐ ๋ํ๋ ํ์๋ง ํธ์ถ๋ฉ๋๋ค. ๊ฒ์ ์์ ์ ์๋ฒ ์ค๋ฅ๋ก ๋๋ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.WaitForTarget(3000)))
{
UO.TargetToTile(0x0CCA, 1445, 1690, 0);
}
else
{
UO.Print("Target timeout");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CancelTarget ๊ธฐ์กด ์ฌ์ดํธ๋ฅผ ๋ซ๊ณ ๋๊ธฐ์ด์ ์ง์๋๋ค.
- ์๋ก์ด ๋ฒ์๊ฐ ์์ผ๋ฉด ๋์ ์ ๊ธฐ๋๋ฅผ ๋ถ๋ฌ์ผ์ผํค์ง ์์ต๋๋ค. ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๊ฐ ๋ณ๊ฒฝํ์ง ์๋ ํ ๋๊ธฐ์ด ์ถ๋ ฅ์ 0๋ก ์ ์ง๋ฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.CancelTarget();
UO.TargetToTile(0x0CCA, 1445, 1690, 0);
UO.Print("Queued: " + Convert.ToString(UO.IsWaitTargetActive()));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: tile (Any), x (Any), y (Any), z (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TargetToTile:bridge.TargetToTile(Arg(0), Arg(1), Arg(2), Arg(3)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "targettotile":
bridge.TargetToTile(Arg(0), Arg(1), Arg(2), Arg(3)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.TargetToXYZ(object? x, object? y, object? z);ํ์ผ โโ์ขํ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ ํ์ฑํ๋ ์๋ฒ ๋์์ ์ฆ์ ์๋ตํฉ๋๋ค.
-
xโ ํ์ฌ ์ง๋์ ์ธ๊ณ X ์ขํ 0..65535. ์ด๋ ํ๋ฉด ํฝ์ ์ด๋ ๊ฒํ ์ขํ๊ฐ ์๋๋๋ค. -
yโ ํ์ฌ ์ง๋์ ์ธ๊ณ Y ์ขํ 0..65535. -
z- ๋คํธ์ํฌ ๋์ ์ฌ์ฉ์ ์ํ ๊ฒ์ ํฌ์ธํธ ๋์ด -128..127. ์ด๊ฒ์ ๋ฐ๋ฅ์ด๋ ์ฅ๋น์ ์ธต์ด ์๋๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. true/false, serial ๋๋ type๋ก ์ฌ์ฉํ์ง ๋ง์ธ์. ๋ฉํ๋ฐ์ดํฐ object? ํธํ๋๋ ์์์ ๊ฒฝ์ฐ ์ค์ ๊ฒฐ๊ณผ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค void.
- ํ์ฑ ์๋ฒ ์ปค์๊ฐ ์์ผ๋ฉด ์๋ฌด ์์ ๋ ์ํํ์ง ์์ผ๋ฉฐ ์ง์ฐ๋ ์๋ต์ ์์ฑํ์ง ์์ต๋๋ค. ์ฌ์ ์ค๋น๋ WaitTargetObject/WaitTargetTile/WaitTargetXYZ๋ฅผ ์ฌ์ฉํ์ธ์.
- ๋ก์ปฌ ClientRequest* ๋ฐ ๊ธฐํ ์ฝ๋ฐฑ ์ฌ์ดํธ๋ ์ด ๋ช ๋ น์ผ๋ก ์ฒ๋ฆฌ๋์ง ์์ต๋๋ค.
- graphic=0์ธ ๋์์๋ ์ญ์์ ์ด ํ์ํฉ๋๋ค. ๋ฌผ์ฒด ์๋ ฅ์์ง๋ฉด์ ๋ฐ์๋ค์ด์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.TargetToXYZ");
UO.TargetToXYZ(1445, 1690, 0);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋งค๊ฐ๋ณ์๋ ์ค์ ์ ์ ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ขํ์ graphic๋ฅผ ์ํ๋ ๊ฐ์ผ๋ก ๋ฐ๊ฟ๋๋ค.
- ํฅํ ๋ฒ์ ๋๊ธฐ์ด์๋ ์๋ฌด๊ฒ๋ ์ถ๊ฐ๋์ง ์์ต๋๋ค.
if (Truth(UO.TargetPresent()))
{
UO.TargetToXYZ(1445, 1690, 0);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 3000 โ ์ต๋ ๋๊ธฐ ์๊ฐ(๋ฐ๋ฆฌ์ด); ์์ผ๋ฅผ ์์ฒญํ ์์ ์ ์ด์ ์ ์ํ๋์ด์ผ ํฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์์ผ๊ฐ ๋ํ๋ ํ์๋ง ํธ์ถ๋ฉ๋๋ค. ๊ฒ์ ์์ ์ ์๋ฒ ์ค๋ฅ๋ก ๋๋ ์ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.WaitForTarget(3000)))
{
UO.TargetToXYZ(1445, 1690, 0);
}
else
{
UO.Print("Target timeout");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CancelTarget ๊ธฐ์กด ์ฌ์ดํธ๋ฅผ ๋ซ๊ณ ๋๊ธฐ์ด์ ์ง์๋๋ค.
- ์๋ก์ด ๋ฒ์๊ฐ ์์ผ๋ฉด ๋์ ์ ๊ธฐ๋๋ฅผ ๋ถ๋ฌ์ผ์ผํค์ง ์์ต๋๋ค. ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๊ฐ ๋ณ๊ฒฝํ์ง ์๋ ํ ๋๊ธฐ์ด ์ถ๋ ฅ์ 0๋ก ์ ์ง๋ฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.CancelTarget();
UO.TargetToXYZ(1445, 1690, 0);
UO.Print("Queued: " + Convert.ToString(UO.IsWaitTargetActive()));
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: x (Any), y (Any), z (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.TargetToTile:bridge.TargetToTile(0, Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "targettoxyz":
bridge.TargetToTile(0, Arg(0), Arg(1), Arg(2)); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Targeting();ํด๋ผ์ด์ธํธ์์ ํ์ฑ ๋์ ์ ํ ์ปค์๋ฅผ ํ์ธํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int 1 - TargetManager.IsTargeting ์ค์น; 0 - ํ์ฑ ์ปค์๊ฐ ์์ต๋๋ค. ๋ก์ปฌ ์ฝ๋ฐฑ ๋์๋ ๊ณ ๋ ค๋ฉ๋๋ค. ์ด๋ serial ๋๋ ๋๊ธฐ์ด ์ํ WaitTarget๊ฐ ์๋๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ์ํ๋ฅผ ํ ๋ฒ ์ฝ์ต๋๋ค. ์ปค์๊ฐ ๋ํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
- ๊ฒ์ ์์ ํ ์๋ฒ ์ญ์์ ์ ๊ธฐ๋ค๋ฆฌ๋ ค๋ฉด WaitForTarget๋ฅผ ์ฌ์ฉํ์ธ์. ๋ก์ปฌ ClientRequest* - WaitForClientTargetResponse์ ๊ฒฐ๊ณผ์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Targeting();
UO.Print("Targeting: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค.
- 1 ๋๋ 0์ด ํ์๋ฉ๋๋ค.
UO.Print(Convert.ToString(UO.Targeting()));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์กฐ๊ฑด์ ํ์ฑ ์ปค์๋ก ํ์ธ๋ฉ๋๋ค.
- CancelTarget ์ด ํด๋ผ์ด์ธํธ์์๋ ์ค๋น๋ ์๋ต๋ ์ญ์ ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Targeting()))
{
UO.CancelTarget();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UseSkill๊ฐ ์คํฌ์ ์์ฒญํ๊ณ , WaitForTarget๊ฐ 3000ms๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
- TargetToObject๋ ํ์ฑ ์๋ฒ ๋์์๋ง ์๋ตํฉ๋๋ค. ์๊ฐ ์ด๊ณผ๊ฐ ์์ผ๋ฉด ๋ถ๊ธฐ๊ฐ ์คํ๋์ง ์์ต๋๋ค.
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.UseSkill("Anatomy");
if (Truth(UO.WaitForTarget(3000)))
{
if (Truth(UO.Targeting()))
{
UO.TargetToObject("self");
}
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.IsTargeting. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsTargeting:bridge.IsTargeting().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int IsTargeting() => bridge.IsTargeting();ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.TicksTarget();WaitTargetObject/WaitTargetTile ๋ฐ ํด๋น ํธ์ถ ์ ธ์ ํตํด ๋์์ ๋ง์ง๋ง ํ๋ก๋น์ ๋ ํ์์คํฌํ๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ์ค๋น ์์ ์ UO.Timer ๊ฐ(๋ฐํ์ ์์๋ถํฐ 10๋ถ์ 1์ด ๋จ์). ์ฒซ ๋ฒ์งธ ํ๋ จ ์ - 0. ์ด๋ ๋๊ธฐ ์๊ฐ๋ ์๋๊ณ ๋ฐ๋ฆฌ์ด๋ ์๋๊ณ ID ๋ชฉํ๋ ์๋ ํ์์ ๋๋ค.
- ์ฆ์ TargetToObject/TargetToTile/TargetToXYZ ๋๊ธฐ์ด์ ์ค๋นํ์ง ์๊ณ ์ด ํ์๋ฅผ ์ ๋ฐ์ดํธํ์ง ์์ต๋๋ค.
- ์ผ๋ถ ๊ฒ์ ๋ช ๋ น์ ๋ธ๋ฆฌ์ง๋ฅผ ํตํด ์ง์ ๋ต๋ณ์ ์ ๊ณตํฉ๋๋ค. TicksTarget๋ ๋ชฉํ ๋ณ๊ฒฝ์ ํ์ค์๊ฐ ์๋๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.TicksTarget();
UO.Print("TicksTarget: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค. WaitTargetSelf ๊ณ ๋๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ์คํฌํ๋ 10๋ถ์ 1์ด ๋จ์๋ก ์ธก์ ๋ฉ๋๋ค.
UO.WaitTargetSelf();
var stamp = UO.TicksTarget();
UO.Print(Convert.ToString(stamp));
UO.CancelWaitTarget();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.Wait=250 ๋ฐ๋ฆฌ์ด.
- ํ์์ ๋ถ์ฐ์์ฑ์ผ๋ก ์ธํด ๊ฒฝ๊ณผ ์๊ฐ์ ์ผ๋ฐ์ ์ผ๋ก 250๊ฐ ์๋ 2 ๋๋ 3์ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
UO.WaitTargetObject("self");
await Delay(250);
var elapsed = UO.Timer() - UO.TicksTarget();
UO.Print("Tenths: " + Convert.ToString(elapsed));
UO.CancelWaitTarget();
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์บ๋ฆญํฐ์ selfId - int serial.
- ์ซ์ ํ์์ ๋ฌธ์์ด ํ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํ์๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. TicksTarget์๋ ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
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 selfId = UO.Hex2Int(UO.GetSerial("self"));
UO.WaitTargetObject(selfId);
UO.Print(Convert.ToString(UO.TicksTarget()));
UO.CancelWaitTarget();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int TicksTarget() => ticksTarget;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.WaitForClientTargetResponse(object? maxWaitTimeMS);๋ก์ปฌ ์ ํ ClientRequestObjectTarget/ClientRequestTileTarget์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
-
maxWaitTimeMSโ ์ต๋ ์๊ฐ(๋ฐ๋ฆฌ์ด). 0 ๋ฐ ์์ ๊ฐ์ ๋ฌดํ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ํ ๋ฒ์ ํ์ธ์ ์ ๊ณตํฉ๋๋ค.
int 1 - ์ทจ์๋ฅผ ํฌํจํ์ฌ ์๋ต์ด ์ด๋ฏธ ์์ ๋์์ต๋๋ค. 0 - ์ ํ ์๊ฐ์ด ๋ง๋ฃ๋์์ต๋๋ค. 1์ ๊ฒฝ์ฐ์๋ ClientTargetResponse์ ๊ธธ์ด๋ฅผ ํ์ธํ์ธ์. 0๋ฅผ ์ฌ์ฉํ๋ฉด ์ปค์ ์์ฒด๊ฐ ์๋์ผ๋ก ๋ซํ์ง ์์ต๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋๊ธฐ๋ ์ต๋ 25 ms ๊ฐ๊ฒฉ์ผ๋ก ์คํฌ๋ฆฝํธ ์ค๋ ๋์์ ๋ฐ์ํ๋ฉฐ ์คํฌ๋ฆฝํธ๋ฅผ ์ค์งํ๋ฉด ์ค๋จ๋ฉ๋๋ค.
- ์ด์ ClientRequest*์ด ์์ผ๋ฉด ์ ์ ํ์ด ์์๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.WaitForClientTargetResponse(5000);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 5000 โ ํด๋ฆญ ๋๊ธฐ ์๊ฐ ์ด๊ณผ(๋ฐ๋ฆฌ์ด). ์ ์ฟผ๋ฆฌ๋ ์ด์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ค์ ํฉ๋๋ค.
- 5๊ฐ ํ๋์ ๋ฐฐ์ด์ ์ ํํ ๊ฐ์ฒด๋ฅผ ๋ํ๋ ๋๋ค. ๊ฒฐ๊ณผ[0]๋ type๊ฐ ์๋๋ผ serial์ ๋๋ค.
UO.ClientRequestObjectTarget();
if (Truth(UO.WaitForClientTargetResponse(5000)))
{
var result = UO.ClientTargetResponse();
if (Truth(ArrayLength(result) == 5))
{
UO.Print("Serial: " + UO.Int2Hex(result[0]));
}
else
{
UO.Print("Selection cancelled");
}
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฒฐ๊ณผ[1] - graphic, ๊ฒฐ๊ณผ[2]/[3]/[4] - X/Y/Z. ์ธ๊ณ ํ์ผ serial์ ๊ฒฐ๊ณผ[0]๋ 0์ ๊ฐ์ต๋๋ค.
- ์ ํ, ์ขํ ๋ฐ serial๋ ๋ณ๋์ ํ๋์ ๋๋ค. ์ด ๋ฐฐ์ด์๋ ์ ์ ๋ ์ด์ด ์ธ๋ฑ์ค๊ฐ ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.ClientRequestTileTarget();
if (Truth(UO.WaitForClientTargetResponse(5000)))
{
var result = UO.ClientTargetResponse();
if (Truth(ArrayLength(result) == 5))
{
UO.Print("Type: " + UO.Int2Hex(result[1]));
UO.Print(Convert.ToString(result[2]) + "," + Convert.ToString(result[3]) + "," + Convert.ToString(result[4]));
}
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๊ฐ ์ด๊ณผ๋ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ง์ ๋ฉ๋๋ค. ์ฑ๊ณต์ ์ธ ๋๊ธฐ๋ ์๋ต์ ์๋ฏธํ๋ฉฐ, ๊ทธ ๋ด์ฉ์ ๋ณ๋๋ก ํ์ธํด์ผ ํฉ๋๋ค.
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.ClientRequestTileTarget();
int ready = UO.WaitForClientTargetResponse(3000);
if (ready == 0)
{
UO.CancelTarget();
UO.Print("Selection timed out");
return false;
}
var response = (object? [])UO.ClientTargetResponse();
if (response.Length != 5)
return false;
UO.Print($"Tile coordinates: {response[2]}, {response[3]}, {response[4]}");
return true;
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: maxWaitTimeMS (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WaitForClientTargetResponse:bridge.WaitForClientTargetResponse(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "waitforclienttargetresponse": return new InjectionValue(bridge.WaitForClientTargetResponse(Arg(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.WaitForTarget(object? maxWaitTimeMS);์ ํ ์๊ฐ ๋ด์ ํ์ฑ ๋์ ์ปค์๊ฐ ๋ํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
-
maxWaitTimeMSโ ์ต๋ ๋๊ธฐ ์๊ฐ(๋ฐ๋ฆฌ์ด)์ ๋๋ค. 0๊ณผ ์์ ๊ฐ์ ์ฆ์ ํ์ธ์ ์ ๊ณตํฉ๋๋ค. ๋์๋ ๊ธฐ๋ค๋ฆผ์ด ์๋๋๋ค.
int 1 โ ํ์ธ ์ค์ ์ปค์๊ฐ ํ์ฑํ๋์์ต๋๋ค. 0 - ์ปค์ ์์ด ์๊ฐ ์ด๊ณผ๋์์ต๋๋ค. ๋ก์ปฌ ์ฝ๋ฐฑ ๋์๋ ์ด ํ ์คํธ๋ฅผ ๋ง์กฑํฉ๋๋ค. ์ด๋ ์ค๋น๋ WaitTarget ์ฌ์ฉ์ ํ์ธํ๋ ๊ฒ์ด ์๋๋๋ค. ํ์ธํ๊ธฐ ์ ์ ์๋ ์๋ต์ด ์ด๋ฏธ ์ปค์๋ฅผ ๋ชจ๋ ์ฌ์ฉํ์ ์ ์์ต๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๊ฒ์ฌ๋ ์คํฌ๋ฆฝํธ ์ค๋ ๋์์ ์ต๋ 25 ms ๋์ ์ผ์ ์ค์งํ์ฌ ์ํ๋๋ฉฐ ์ด๋ฅผ ์ค์งํ๋ฉด ์ค๋จ๋ ์ ์์ต๋๋ค.
- ๋ฉ์๋ ์์ฒด๋ ์ญ์์ ์ ์์ฑํ๊ฑฐ๋ ๋์์ ์ ํํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.WaitForTarget(3000);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- MaxWaitTimeMS=3000์ด๋ฉด self๊ฐ ์ ํ๋ฉ๋๋ค.
- WaitTargetSelf๋ ๋ฏธ๋ฆฌ ์ค์ ๋์ด ์์ง ์์ต๋๋ค. ์ด ์๋ ๋ช ์์ ์ผ๋ก ์๋ตํฉ๋๋ค.
UO.UseSkill("Anatomy");
if (Truth(UO.WaitForTarget(3000)))
{
UO.TargetToObject("self");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- MaxWaitTimeMS=0.
- ์ค๋น - 1 ๋๋ 0; ๊ธด ๋ฉ์ถค์ด ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var ready = UO.WaitForTarget(0);
UO.Print(Convert.ToString(ready));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 500 - 0.5์ด.
- ์๋ ฅ์ด ์๋ค๋ ๊ฒ์ ์์ ์ด ์คํจํ๊ฑฐ๋ ์๋์ผ๋ก ์ฒ๋ฆฌ๋๊ณ ์์์ ์๋ฏธํ ์ ์์ต๋๋ค. ๊ฒ์ ๋ก๊ทธ๋ฅผ ํ์ธํ์ธ์.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (Truth(UO.WaitForTarget(500) == 0))
{
UO.CancelWaitTarget();
UO.Print("Cursor did not arrive");
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: maxWaitTimeMS (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WaitUntilTargeting:bridge.WaitUntilTargeting(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "waitfortarget": return new InjectionValue(bridge.WaitUntilTargeting(Arg(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.WaitTarget(object? target);
void UO.WaitTarget(object? target, object? @type);
void UO.WaitTarget(object? target, object? @type, object? color);
void UO.WaitTarget(object? target, object? @type, object? color, object? distance);
void UO.WaitTarget(object? target, object? @type, object? color, object? distance, object? notoriety);
void UO.WaitTarget(object? target, object? @type, object? color, object? distance, object? notoriety, object? nearest);
void UO.WaitTarget(object? target, object? @type, object? color, object? distance, object? notoriety, object? nearest, object? maxZ);serial๋ฅผ ๋ค์ ๋์ ์์ฒญ ๋๊ธฐ์ด์ ๋ฃ๊ฑฐ๋ ํํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋์์ ์ ํํฉ๋๋ค.
-
targetโ ์์ ํ์ฉ serial/alias๊ฐ ์ง์ ์ค์ ๋๊ณ ๋ค๋ฅธ ๋งค๊ฐ๋ณ์๋ ๋ฌด์๋ฉ๋๋ค. 0 ๋๋ -1๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒ์์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ค๋ฅธ ์ซ์ ํ์๊พผ์ด ๋ค์ ๋ชฉํ๋ฅผ ์ทจ์ํฉ๋๋ค. -
type- ์ ํ ์ฌํญ graphic/type ๋๋ ์ ํ ๋ง์คํฌ; -1 ์ ํ ์์. ๋ช ๋ช ๋ ์ ํ์ ResolveType/ParseTypeMask๋ก ํด๊ฒฐ๋ฉ๋๋ค. -
color- ์ ํ ์ฌํญ hue: -1 ๋๋ 0xFFFF(์ ํ ์์). -
distanceโ ์ ํ์ ์ผ๋ก ์ ๋ด ์ต๋ ๊ฑฐ๋ฆฌ. ๊ธฐ๋ณธ๊ฐ์ GetFindDistance์ ๋๋ค. ResolveCompactDistance๋ฅผ ํ์ฑํ๋ฉด ๊ฒ์ ์ค์ ์ ๋ฐ๋ผ ํน๋ณํ ๊ฐ์ ํ์ฉํฉ๋๋ค. -
notoriety- ์ ํ์ ์ซ์/๋ง์คํฌ ์ ๋ช . ๋น์ด ์์ง ์์ ๋ง์คํฌ๋ ๋ชจ๋ฐ์ผ ํ๋ณด์๋ฅผ ์ ํํฉ๋๋ค. ๊ทธ๊ฒ์ด ์์ผ๋ฉด ํด๋ํฐ๊ณผ world ํญ๋ชฉ์ด ๊ณ ๋ ค๋ฉ๋๋ค. -
nearest- ์ ํ ์ฌํญ bool, ๊ธฐ๋ณธ๊ฐ true: ๊ฑฐ๋ฆฌ์์ผ๋ก ์ ๋ ฌํ ๋ค์ serial๋ก ์ ๋ ฌํฉ๋๋ค. -
maxZโ ์ต์ ์ต๋ ์ ๋๊ฐ(Z-selfZ), ๊ธฐ๋ณธ๊ฐ GetFindVertical.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ๊ฒ์ ์ self, serial=0, ์ผ๋ฐ ๋ฌด์ ๋ชฉ๋ก ๋ฐ ์ ํ๋ ๋ช ๋ช ๋ type ํํฐ๋ฅผ ์ ์ธํฉ๋๋ค. ์ค๋ณต์ด ์ ๊ฑฐ๋ฉ๋๋ค. ์ง์ ์์ฑ serial์ ์ด๋ฌํ ํํฐ๋ฅผ ํต๊ณผํ์ง ์์ต๋๋ค.
- ๊ฒ์์์๋ ๋ก๋๋ ๊ฐ์ฒด๋ง ์ฝ์ต๋๋ค. ์ผ์นํ์ง ์์/์๋ชป๋ ์ผํฐ๋ - ๋ฉ์์ง ๋ฐ CancelNextTarget. ์ฑ๊ณต์ ์ธ ์ ํ์ WaitTargetObject์ ํธ์ถํ๊ณ TicksTarget๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. WaitTarget ์์ฒด๋ ์์ดํ ์ ์ฌ์ฉํ์ง ์๊ณ , ๋์์ ์ด์ง ์์ผ๋ฉฐ, ์๋ฒ๊ฐ ์ฒ๋ฆฌํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.WaitTarget");
UO.WaitTarget("self");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- serial๋ฅผ ๋ค์ ๋์ ์์ฒญ ๋๊ธฐ์ด์ ๋ฃ๊ฑฐ๋ ํํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋์์ ์ ํํฉ๋๋ค.
UO.WaitTarget("self");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฒ์ ์ self, serial=0, ์ผ๋ฐ ๋ฌด์ ๋ชฉ๋ก ๋ฐ ์ ํ๋ ๋ช ๋ช ๋ type ํํฐ๋ฅผ ์ ์ธํฉ๋๋ค. ์ค๋ณต์ด ์ ๊ฑฐ๋ฉ๋๋ค. ์ง์ ์์ฑ serial์ ์ด๋ฌํ ํํฐ๋ฅผ ํต๊ณผํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.WaitTarget(0, -1, -1, 10, 3, true, 20);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฒ์์์๋ ๋ก๋๋ ๊ฐ์ฒด๋ง ์ฝ์ต๋๋ค. ์ผ์นํ์ง ์์/์๋ชป๋ ์ผํฐ๋ - ๋ฉ์์ง ๋ฐ CancelNextTarget. ์ฑ๊ณต์ ์ธ ์ ํ์ WaitTargetObject์ ํธ์ถํ๊ณ TicksTarget๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. WaitTarget ์์ฒด๋ ์์ดํ ์ ์ฌ์ฉํ์ง ์๊ณ , ๋์์ ์ด์ง ์์ผ๋ฉฐ, ์๋ฒ๊ฐ ์ฒ๋ฆฌํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
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.WaitTarget("lasttarget");
UO.Print(UO.Waiting());
UO.CancelWaitTarget();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: target (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [WaitTarget]. -
InjectionScript.Runtime.InjectionApiUO.CompactWaitTarget:CompactWaitTarget(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values =>
{
CompactWaitTarget(values);
return InjectionValue.Unit;
}๋งค๊ฐ๋ณ์: target (Any), type (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [WaitTarget]. -
InjectionScript.Runtime.InjectionApiUO.CompactWaitTarget:CompactWaitTarget(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values =>
{
CompactWaitTarget(values);
return InjectionValue.Unit;
}๋งค๊ฐ๋ณ์: target (Any), type (Any), color (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [WaitTarget]. -
InjectionScript.Runtime.InjectionApiUO.CompactWaitTarget:CompactWaitTarget(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values =>
{
CompactWaitTarget(values);
return InjectionValue.Unit;
}๋งค๊ฐ๋ณ์: target (Any), type (Any), color (Any), distance (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [WaitTarget]. -
InjectionScript.Runtime.InjectionApiUO.CompactWaitTarget:CompactWaitTarget(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values =>
{
CompactWaitTarget(values);
return InjectionValue.Unit;
}๋งค๊ฐ๋ณ์: target (Any), type (Any), color (Any), distance (Any), notoriety (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [WaitTarget]. -
InjectionScript.Runtime.InjectionApiUO.CompactWaitTarget:CompactWaitTarget(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values =>
{
CompactWaitTarget(values);
return InjectionValue.Unit;
}
UO.WaitTarget(target, type, color, distance, notoriety, nearest) โ UO.WaitTarget(Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: target (Any), type (Any), color (Any), distance (Any), notoriety (Any), nearest (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [WaitTarget]. -
InjectionScript.Runtime.InjectionApiUO.CompactWaitTarget:CompactWaitTarget(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values =>
{
CompactWaitTarget(values);
return InjectionValue.Unit;
}
UO.WaitTarget(target, type, color, distance, notoriety, nearest, maxZ) โ UO.WaitTarget(Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: target (Any), type (Any), color (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [WaitTarget]. -
InjectionScript.Runtime.InjectionApiUO.CompactWaitTarget:CompactWaitTarget(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values =>
{
CompactWaitTarget(values);
return InjectionValue.Unit;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.WaitTargetGround(object? @type);
void UO.WaitTargetGround(object? @type, object? color);graphic/hue์์ ํญ๋ชฉ์ ๊ฒ์ํ์ฌ ๋ค์ ๋์์ ๋๊ธฐ์ด์ ๋ฐฐ์นํฉ๋๋ค.
-
type- ๊ทธ๋ํฝ/type int, 16์ง์ ๋ฌธ์์ด ๋๋ ์ด๋ฆ์ด type์ธ ์ธํธ. serial ์์ดํ ์ด ์๋๋๋ค. -
color- ์ ํ์ฌํญ int hue; ๊ธฐ๋ณธ๊ฐ -1 - ๋ชจ๋ ์์.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ๋ฒ์: ์ฌ๊ท ๊ฒ์์ด ์๋ ground/์ปจํ ์ด๋ ์ ํ๊ธฐ 1. Bridge.FindType๋ ์ฐพ์ serial๋ฅผ ๋ฐํํฉ๋๋ค. serial>0 ๋ธ๋ฆฌ์ง.WaitTargetObject์ด ํธ์ถ๋ ๋. ์ด๋ฌํ ๋ฉ์๋๋ ๋ฐํ์ TicksTarget๋ฅผ ์ง์ ์ ๋ฐ์ดํธํ์ง ์์ต๋๋ค.
- ํญ๋ชฉ ์์ - ๋ฉ์์ง ๋ฐ CancelNextTarget. ๊ฒ์ ๊ฒฐ๊ณผ ์ผ๋ฐ FindItem/FoundItems๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์ด ๋ช ๋ น์ ๋ฐ๊ฒฌ๋ ํญ๋ชฉ์ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ ์ปค์๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.WaitTargetGround");
UO.WaitTargetGround("0x0E21");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- graphic/hue์์ ํญ๋ชฉ์ ๊ฒ์ํ์ฌ ๋ค์ ๋์์ ๋๊ธฐ์ด์ ๋ฐฐ์นํฉ๋๋ค.
UO.WaitTargetGround("0x0E21");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฒ์: ์ฌ๊ท ๊ฒ์์ด ์๋ ground/์ปจํ ์ด๋ ์ ํ๊ธฐ 1. Bridge.FindType๋ ์ฐพ์ serial๋ฅผ ๋ฐํํฉ๋๋ค. serial>0 ๋ธ๋ฆฌ์ง.WaitTargetObject์ด ํธ์ถ๋ ๋. ์ด๋ฌํ ๋ฉ์๋๋ ๋ฐํ์ TicksTarget๋ฅผ ์ง์ ์ ๋ฐ์ดํธํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.WaitTargetGround("0x0E21", -1);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํญ๋ชฉ ์์ - ๋ฉ์์ง ๋ฐ CancelNextTarget. ๊ฒ์ ๊ฒฐ๊ณผ ์ผ๋ฐ FindItem/FoundItems๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์ด ๋ช ๋ น์ ๋ฐ๊ฒฌ๋ ํญ๋ชฉ์ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ ์ปค์๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
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.WaitTargetGround("0x0E21", -1);
UO.Print(UO.Waiting());
UO.CancelWaitTarget();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: type (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WaitTargetGround. -
InjectionScript.Runtime.InjectionApiUO.WaitTargetGround:WaitTargetGround(type, new InjectionValue(-1)).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void WaitTargetGround(InjectionValue type) => WaitTargetGround(type, new InjectionValue(-1));๋งค๊ฐ๋ณ์: type (Any), color (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WaitTargetGround. -
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.SystemMessage:SystemMessage("No ground item found. Next target request will be canceled"). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CancelNextTarget:bridge.CancelNextTarget(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WaitTargetObject:bridge.WaitTargetObject(item).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void WaitTargetGround(InjectionValue type, InjectionValue color)
{
int item = bridge.FindType(ResolveType(type), NumberConversions.ToInt(color), 1, -1, false);
if (item <= 0)
{
SystemMessage("No ground item found. Next target request will be canceled");
bridge.CancelNextTarget();
}
else
bridge.WaitTargetObject(item);
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.WaitTargetLast();๋ณ์นญ lasttarget๋ฅผ ํตํด ๋ค์ ์๋ฒ ๋์์ ๋ํ ์๋ต์ ์ค๋นํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. true/false, serial ๋๋ type๋ก ์ฌ์ฉํ์ง ๋ง์ธ์. ๋ฉํ๋ฐ์ดํฐ object? ํธํ๋๋ ์์์ ๊ฒฝ์ฐ ์ค์ ๊ฒฐ๊ณผ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค void.
- ํ์ ๋์๋ง ์ค๋นํฉ๋๋ค. ์์ดํ , ์คํฌ, ์ฃผ๋ฌธ ์์ฒด๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋ค์ ์๋ฒ ๋์์ ํด๋ผ์ด์ธํธ ํ๋ ์์ ์ฒ๋ฆฌํ ๋ ์ค๋น๋ ๋์์ ๋ฐ์ต๋๋ค.
- ์ฐ์ ํธ์ถ์ ๊ณตํต ํด๋ผ์ด์ธํธ ๋๊ธฐ์ด์ ํ์ฑํฉ๋๋ค. ๊ฐ์ฒด์ ์ขํ ๋์์ ํ ๋ฒ์ ํ๋์ฉ ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ก์ปฌ ์ ํ ์ฐฝ ClientRequest*/Info/container๋ ์ด๋ฅผ ์๋นํ์ง ์์ต๋๋ค.
- CancelWaitTarget ๋๊ธฐ์ด์ ์ง์๋๋ค. TerminateAll ์ ์ฒด๋ฅผ ์ฒญ์ํฉ๋๋ค. ์์ง ์คํ ์ค์ธ ํ๋ก์์ ๋ฅผ ์ค์งํ๋ฉด ์์ฒด ๋ณด๋ฅ ์ค์ธ ์๋ต๋ ๋ฌดํจํ๋ฉ๋๋ค. ์งง์ ์ ์ฐจ๋ฅผ ์๋ฃํด๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋น๋ ๋์์ด ์ทจ์๋์ง ์์ต๋๋ค.
- ์๋ต์ ๋ณด๋ด๋ ์๋ฒ์์์ ์์ ์ด ๋ณด์ฅ๋์ง๋ ์์ต๋๋ค. ์๋ต์ ๋ฒ์, ๊ฐ์ฒด์ ์ ๊ทผ์ฑ, ๊ฐ์์ฑ ๋ฐ ์์ ๊ท์น์ ํ์ธํฉ๋๋ค. ์ ์ดํ๋ ค๋ฉด ๊ฒ์ ๊ฒฐ๊ณผ์ ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.WaitTargetLast");
UO.WaitTargetLast();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค. lasttarget๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์๋ ฅ์ ์ด์ง ์๊ณ ์์ ์์ฒด๋ฅผ ์ํํ์ง ์์ต๋๋ค.
UO.WaitTargetLast();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ์คํฌ์ ์ฌ์ฉํ๋ ค๋ฉด ๋ก๋๋ ์บ๋ฆญํฐ์์ lasttarget๊ฐ ํ์ฉ๋์ด์ผ ํฉ๋๋ค.
- Exists ๊ฒ์ฌ๋ ์ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ๊ฐ์ฒด ์ ํ ๋ฐ ๊ธฐ์ ์ ํจ์ฑ์ ์ ํ์ ์คํฌ๋ฆฝํธ ์กฐ๊ฑด์ผ๋ก ์ ์ง๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
UO.CancelWaitTarget();
UO.WaitTargetLast();
UO.UseSkill("Anatomy");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- IsWaitTargetActive๋ ์๋ต ํ๋ฅผ ํ์ธํฉ๋๋ค.
- CancelWaitTarget ์ด๋ฏธ ์ด๋ ค ์๋ ๋ง์ถค ์ญ์์ ์ ๋ซ์ง ์๊ณ ์ค๋น๋ฅผ ์ทจ์ํฉ๋๋ค.
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.WaitTargetLast();
if (Truth(UO.IsWaitTargetActive()))
{
UO.CancelWaitTarget();
}
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.WaitTargetLast. -
InjectionScript.Runtime.InjectionApiUO.WaitTargetObject:WaitTargetObject("lasttarget").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void WaitTargetLast() => WaitTargetObject("lasttarget");ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.WaitTargetObject(object? objID);
void UO.WaitTargetObject(object? id1, object? id2);์๋ฒ ์์ผ์ ๋ํด ํ๋ ๋๋ ๋ ๊ฐ์ ์ฐ์ serial ์๋ต์ ์ค๋นํฉ๋๋ค.
-
objID / id1 / id2โ ํญ๋ชฉ ๋๋ ๋ฌธ์์ ์ผ๋ จ๋ฒํธ/ID, ์ซ์ ๋๋ 16์ง์/10์ง์ ๋ฌธ์์ด, self/backpack/lasttarget/lastobject ๋๋ ์ ์ฅ๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type์ด ์๋๋๋ค. ๋ช ๋ช ๋ ๊ฐ์ฒด์ ์์ ์ ์ํํ๊ธฐ ์ ์ Exists๋ฅผ ํ์ธํ์ธ์. ํด๊ฒฐ๋์ง ์์ ๋ณ์นญ์ serial 0์ ์ ๊ณตํฉ๋๋ค. ๋จ์ผ ์ธ์๋ ํ๋์ ๋ชฉํ๋ฅผ ์ง์ ํฉ๋๋ค. ์ซ์ ๋ฐ ๋ฌธ์์ด ํ์์ ๋์ผํ ๋ฐฉ์์ผ๋ก TicksTarget๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. -
objIDโ ํญ๋ชฉ ๋๋ ๋ฌธ์์ ์ผ๋ จ๋ฒํธ/ID, ์ซ์ ๋๋ 16์ง์/10์ง์ ๋ฌธ์์ด, self/backpack/lasttarget/lastobject ๋๋ ์ ์ฅ๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type์ด ์๋๋๋ค. ๋ช ๋ช ๋ ๊ฐ์ฒด์ ์์ ์ ์ํํ๊ธฐ ์ ์ Exists๋ฅผ ํ์ธํ์ธ์. ํด๊ฒฐ๋์ง ์์ ๋ณ์นญ์ serial 0์ ์ ๊ณตํฉ๋๋ค. ๋จ์ผ ์ธ์๋ ํ๋์ ๋ชฉํ๋ฅผ ์ง์ ํฉ๋๋ค. ์ซ์ ๋ฐ ๋ฌธ์์ด ํ์์ ๋์ผํ ๋ฐฉ์์ผ๋ก TicksTarget๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. -
id1โ ํญ๋ชฉ ๋๋ ๋ฌธ์์ ์ผ๋ จ๋ฒํธ/ID, ์ซ์ ๋๋ 16์ง์/10์ง์ ๋ฌธ์์ด, self/backpack/lasttarget/lastobject ๋๋ ์ ์ฅ๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type์ด ์๋๋๋ค. ๋ช ๋ช ๋ ๊ฐ์ฒด์ ์์ ์ ์ํํ๊ธฐ ์ ์ Exists๋ฅผ ํ์ธํ์ธ์. ํด๊ฒฐ๋์ง ์์ ๋ณ์นญ์ serial 0์ ์ ๊ณตํฉ๋๋ค. ์์์ ์ฒซ ๋ฒ์งธ ๋ชฉํ๋ ๋ ์ค์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. -
id2โ ํญ๋ชฉ ๋๋ ๋ฌธ์์ ์ผ๋ จ๋ฒํธ/ID, ์ซ์ ๋๋ 16์ง์/10์ง์ ๋ฌธ์์ด, self/backpack/lasttarget/lastobject ๋๋ ์ ์ฅ๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type์ด ์๋๋๋ค. ๋ช ๋ช ๋ ๊ฐ์ฒด์ ์์ ์ ์ํํ๊ธฐ ์ ์ Exists๋ฅผ ํ์ธํ์ธ์. ํด๊ฒฐ๋์ง ์์ ๋ณ์นญ์ serial 0์ ์ ๊ณตํฉ๋๋ค. ์์์ ๋ ๋ฒ์งธ ๋ชฉ์ ์ ๋ ์ค์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ๋ค์ ๊ฐ๋ณ ๋ฒ์์ ์ ์ฉ๋ฉ๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. true/false, serial ๋๋ type๋ก ์ฌ์ฉํ์ง ๋ง์ธ์. ๋ฉํ๋ฐ์ดํฐ object? ํธํ๋๋ ์์์ ๊ฒฝ์ฐ ์ค์ ๊ฒฐ๊ณผ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค void.
- ํ์ ๋์๋ง ์ค๋นํฉ๋๋ค. ์์ดํ , ์คํฌ, ์ฃผ๋ฌธ ์์ฒด๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋ค์ ์๋ฒ ๋์์ ํด๋ผ์ด์ธํธ ํ๋ ์์ ์ฒ๋ฆฌํ ๋ ์ค๋น๋ ๋์์ ๋ฐ์ต๋๋ค.
- ์ฐ์ ํธ์ถ์ ๊ณตํต ํด๋ผ์ด์ธํธ ๋๊ธฐ์ด์ ํ์ฑํฉ๋๋ค. ๊ฐ์ฒด์ ์ขํ ๋์์ ํ ๋ฒ์ ํ๋์ฉ ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ก์ปฌ ์ ํ ์ฐฝ ClientRequest*/Info/container๋ ์ด๋ฅผ ์๋นํ์ง ์์ต๋๋ค.
- CancelWaitTarget ๋๊ธฐ์ด์ ์ง์๋๋ค. TerminateAll ์ ์ฒด๋ฅผ ์ฒญ์ํฉ๋๋ค. ์์ง ์คํ ์ค์ธ ํ๋ก์์ ๋ฅผ ์ค์งํ๋ฉด ์์ฒด ๋ณด๋ฅ ์ค์ธ ์๋ต๋ ๋ฌดํจํ๋ฉ๋๋ค. ์งง์ ์ ์ฐจ๋ฅผ ์๋ฃํด๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋น๋ ๋์์ด ์ทจ์๋์ง ์์ต๋๋ค.
- ์๋ต์ ๋ณด๋ด๋ ์๋ฒ์์์ ์์ ์ด ๋ณด์ฅ๋์ง๋ ์์ต๋๋ค. ์๋ต์ ๋ฒ์, ๊ฐ์ฒด์ ์ ๊ทผ์ฑ, ๊ฐ์์ฑ ๋ฐ ์์ ๊ท์น์ ํ์ธํฉ๋๋ค. ์ ์ดํ๋ ค๋ฉด ๊ฒ์ ๊ฒฐ๊ณผ์ ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.WaitTargetObject");
UO.WaitTargetObject("self");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- id="self" - ์บ๋ฆญํฐ์ serial. CancelWaitTarget๋ ์ด์ ์ ์ค๋น๋ ๋ต๋ณ์ ์ ๊ฑฐํฉ๋๋ค.
- UseSkill ์คํฌ์ ์์ฒญํฉ๋๋ค. ๊ทธ์ ์๋ฒ ์์ผ๋ ์ค๋น๋ ๋ชฉํ๋ฅผ ๋ฐ์ต๋๋ค.
UO.CancelWaitTarget();
UO.WaitTargetObject("self");
UO.UseSkill("Anatomy");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- objectId - ์ serial: ๊ทํ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์. ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค.
- ์ฌ๊ธฐ์ ๋ชฉํ๊ฐ ๋ฐฉ๊ธ ์ค๋น๋์์ต๋๋ค. ์คํฌ๋ฆฝํธ์ ๋ค์ ๋จ๊ณ์์๋ ์ค์ ๋ก ๋์์ ์์ํ๋ ์์ ์ ํธ์ถํด์ผ ํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var objectId = 0x40001234;
if (Truth(UO.Exists(objectId)))
{
UO.WaitTargetObject(objectId);
UO.Print("Object target prepared");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ค์ ๋์์ ๋ฏธ๋ฆฌ ์ ์๋ ์ด๋ฆ AddObject์ ๋๋ค. GetSerial๋ id1/id2 ํ์๊ณผ ์ผ์นํ๋ ํ์ ๋ฐํํฉ๋๋ค.
- ์ฒซ ๋ฒ์งธ ์๋ฒ ์๋ ฅ์ ์ฒซ ๋ฒ์งธ, ๋ ๋ฒ์งธ - ๋ ๋ฒ์งธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ ๊ฐ์ ์ฐ์ ์กฐ์ค๊ฒฝ์ ์ฌ์ฉํ๋ ์์ ์๋ง ์ ํฉํฉ๋๋ค. ๋ค๋ฅธ ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ ๋ถํ์ํ ๋ ๋ฒ์งธ ๋์์ ์ ๊ฑฐํ์ธ์.
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 first = UO.GetSerial("source");
var second = UO.GetSerial("destination");
if (Truth(UO.Exists(first)) && Truth(UO.Exists(second)))
{
UO.CancelWaitTarget();
UO.WaitTargetObject(first, second);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.WaitTargetObject:WaitTargetObject(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "waittargetobject": WaitTargetObject(Arg(0)); return InjectionValue.Unit;๋งค๊ฐ๋ณ์: objID (Any/String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WaitTargetObject. -
InjectionScript.Runtime.InjectionApiUO.WaitTargetObject:WaitTargetObject(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void WaitTargetObject(string id) => WaitTargetObject(GetObject(id));๋งค๊ฐ๋ณ์: id1 (String), id2 (String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WaitTargetObject. -
InjectionScript.Runtime.InjectionApiUO.WaitTargetObject:WaitTargetObject(GetObject(id1), GetObject(id2)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id1).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void WaitTargetObject(string id1, string id2) => WaitTargetObject(GetObject(id1), GetObject(id2));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.WaitTargetObjectType(object? id, object? @type);
void UO.WaitTargetObjectType(object? id, object? @type, object? color);์ฃผ์ด์ง ๋ฌผ์ฒด์ ๋ ์์ ๋ฐ๊ฒฌ๋ ๋ฌผ์ฒด๋ผ๋ ๋ ๊ฐ์ ์ฐ์๋ ํ์ ์ ์ค๋นํฉ๋๋ค.
-
idโ ์ง๋ ฌ/ID ๊ฐ์ฒด: int, ์ซ์/16์ง์ ๋ฌธ์์ด ๋๋ ์ค์ ๋ ๋ณ์นญ(์: "lasttarget"). ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ ๋ก๋๋ ๊ฐ์ฒด๋ฅผ ํ์ธํ์ญ์์ค. -
type- ๋ ๋ฒ์งธ ํญ๋ชฉ์ ๊ทธ๋ํฝ/type, int/hex/named type. -
color- ๋ ๋ฒ์งธ ์ฃผ์ ์ ์ ํ ์ฌํญ hue; -1 ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๊ฐ๋ฅํฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ๋จผ์ serial๋ถํฐ GetObject๊น์ง ํ์ฉํฉ๋๋ค. ๋ ๋ฒ์งธ๋ FindType(type,color,1,-1,false)๋ฅผ ์ฐพ์ต๋๋ค. ๋ ๋ค ๊ธ์ ์ ์ด๋ฉด ๋ธ๋ฆฌ์ง๋ฅผ ํธ์ถํฉ๋๋ค.WaitTargetObject(์ฒซ ๋ฒ์งธ, ๋ ๋ฒ์งธ). ๋์์ ์์๊ฐ ์ ์ง๋ฉ๋๋ค.
- ํ๋ ์ด์์ ๋ชฉํ๊ฐ ๋๋ฝ๋๊ฑฐ๋ ๊ธ์ ์ ์ด์ง ์์ ๊ฒฝ์ฐ(๋ฉ์์ง ๋ฐ CancelNextTarget) ๋ ๋ชฉํ๊ฐ ๋ชจ๋ ์ค์ ๋์ง ์์ต๋๋ค. ํด๋น ๋ธ๋์น๋ TicksTarget์ ์ ๋ฐ์ดํธํ์ง ์์ผ๋ฉฐ ์์ดํ ์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.WaitTargetObjectType");
UO.WaitTargetObjectType("self", "0x0E21");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฃผ์ด์ง ๋ฌผ์ฒด์ ๋ ์์ ๋ฐ๊ฒฌ๋ ๋ฌผ์ฒด๋ผ๋ ๋ ๊ฐ์ ์ฐ์๋ ํ์ ์ ์ค๋นํฉ๋๋ค.
UO.WaitTargetObjectType("self", "0x0E21");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ serial๋ถํฐ GetObject๊น์ง ํ์ฉํฉ๋๋ค. ๋ ๋ฒ์งธ๋ FindType(type,color,1,-1,false)๋ฅผ ์ฐพ์ต๋๋ค. ๋ ๋ค ๊ธ์ ์ ์ด๋ฉด ๋ธ๋ฆฌ์ง๋ฅผ ํธ์ถํฉ๋๋ค.WaitTargetObject(์ฒซ ๋ฒ์งธ, ๋ ๋ฒ์งธ). ๋์์ ์์๊ฐ ์ ์ง๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.WaitTargetObjectType("lasttarget", "0x0E21", -1);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ๋ ์ด์์ ๋ชฉํ๊ฐ ๋๋ฝ๋๊ฑฐ๋ ๊ธ์ ์ ์ด์ง ์์ ๊ฒฝ์ฐ(๋ฉ์์ง ๋ฐ CancelNextTarget) ๋ ๋ชฉํ๊ฐ ๋ชจ๋ ์ค์ ๋์ง ์์ต๋๋ค. ํด๋น ๋ธ๋์น๋ TicksTarget์ ์ ๋ฐ์ดํธํ์ง ์์ผ๋ฉฐ ์์ดํ ์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
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.WaitTargetObjectType("self", "0x0E21", -1);
UO.Print(UO.Waiting());
UO.CancelWaitTarget();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: id (Any), type (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WaitTargetObjectType. -
InjectionScript.Runtime.InjectionApiUO.WaitTargetObjectType:WaitTargetObjectType(id, type, new InjectionValue(-1)).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void WaitTargetObjectType(InjectionValue id, InjectionValue type)
=> WaitTargetObjectType(id, type, new InjectionValue(-1));๋งค๊ฐ๋ณ์: id (Any), type (Any), color (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WaitTargetObjectType. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id). -
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.SystemMessage:SystemMessage("UO.WaitTargetObjectType: object or ground item not found"). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CancelNextTarget:bridge.CancelNextTarget(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WaitTargetObject:bridge.WaitTargetObject(first, second).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void WaitTargetObjectType(InjectionValue id, InjectionValue type, InjectionValue color)
{
int first = GetObject(id);
int second = bridge.FindType(ResolveType(type), NumberConversions.ToInt(color), 1, -1, false);
if (first <= 0 || second <= 0)
{
SystemMessage("UO.WaitTargetObjectType: object or ground item not found");
bridge.CancelNextTarget();
return;
}
bridge.WaitTargetObject(first, second);
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.WaitTargetSelf();๋ณ์นญ self๋ฅผ ํตํด ๋ค์ ์๋ฒ ๋์์ ๋ํ ์๋ต์ ์ค๋นํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. true/false, serial ๋๋ type๋ก ์ฌ์ฉํ์ง ๋ง์ธ์. ๋ฉํ๋ฐ์ดํฐ object? ํธํ๋๋ ์์์ ๊ฒฝ์ฐ ์ค์ ๊ฒฐ๊ณผ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค void.
- ํ์ ๋์๋ง ์ค๋นํฉ๋๋ค. ์์ดํ , ์คํฌ, ์ฃผ๋ฌธ ์์ฒด๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋ค์ ์๋ฒ ๋์์ ํด๋ผ์ด์ธํธ ํ๋ ์์ ์ฒ๋ฆฌํ ๋ ์ค๋น๋ ๋์์ ๋ฐ์ต๋๋ค.
- ์ฐ์ ํธ์ถ์ ๊ณตํต ํด๋ผ์ด์ธํธ ๋๊ธฐ์ด์ ํ์ฑํฉ๋๋ค. ๊ฐ์ฒด์ ์ขํ ๋์์ ํ ๋ฒ์ ํ๋์ฉ ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ก์ปฌ ์ ํ ์ฐฝ ClientRequest*/Info/container๋ ์ด๋ฅผ ์๋นํ์ง ์์ต๋๋ค.
- CancelWaitTarget ๋๊ธฐ์ด์ ์ง์๋๋ค. TerminateAll ์ ์ฒด๋ฅผ ์ฒญ์ํฉ๋๋ค. ์์ง ์คํ ์ค์ธ ํ๋ก์์ ๋ฅผ ์ค์งํ๋ฉด ์์ฒด ๋ณด๋ฅ ์ค์ธ ์๋ต๋ ๋ฌดํจํ๋ฉ๋๋ค. ์งง์ ์ ์ฐจ๋ฅผ ์๋ฃํด๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋น๋ ๋์์ด ์ทจ์๋์ง ์์ต๋๋ค.
- ์๋ต์ ๋ณด๋ด๋ ์๋ฒ์์์ ์์ ์ด ๋ณด์ฅ๋์ง๋ ์์ต๋๋ค. ์๋ต์ ๋ฒ์, ๊ฐ์ฒด์ ์ ๊ทผ์ฑ, ๊ฐ์์ฑ ๋ฐ ์์ ๊ท์น์ ํ์ธํฉ๋๋ค. ์ ์ดํ๋ ค๋ฉด ๊ฒ์ ๊ฒฐ๊ณผ์ ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.WaitTargetSelf");
UO.WaitTargetSelf();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ผ์์ด ์์ต๋๋ค. self๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์๋ ฅ์ ์ด์ง ์๊ณ ์์ ์์ฒด๋ฅผ ์ํํ์ง ์์ต๋๋ค.
UO.WaitTargetSelf();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด ์คํฌ์ ์ฌ์ฉํ๋ ค๋ฉด ๋ก๋๋ ์บ๋ฆญํฐ์์ self๊ฐ ํ์ฉ๋์ด์ผ ํฉ๋๋ค.
- Exists ๊ฒ์ฌ๋ ์ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ๊ฐ์ฒด ์ ํ ๋ฐ ๊ธฐ์ ์ ํจ์ฑ์ ์ ํ์ ์คํฌ๋ฆฝํธ ์กฐ๊ฑด์ผ๋ก ์ ์ง๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("self")))
{
UO.CancelWaitTarget();
UO.WaitTargetSelf();
UO.UseSkill("Anatomy");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- IsWaitTargetActive๋ ์๋ต ํ๋ฅผ ํ์ธํฉ๋๋ค.
- CancelWaitTarget ์ด๋ฏธ ์ด๋ ค ์๋ ๋ง์ถค ์ญ์์ ์ ๋ซ์ง ์๊ณ ์ค๋น๋ฅผ ์ทจ์ํฉ๋๋ค.
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.WaitTargetSelf();
if (Truth(UO.IsWaitTargetActive()))
{
UO.CancelWaitTarget();
}
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.WaitTargetSelf. -
InjectionScript.Runtime.InjectionApiUO.WaitTargetObject:WaitTargetObject("self").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void WaitTargetSelf() => WaitTargetObject("self");ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.WaitTargetTile(object? selector);
void UO.WaitTargetTile(object? x, object? y, object? z);
void UO.WaitTargetTile(object? @type, object? x, object? y, object? z);์ ํ์ ํ์ผ ๊ทธ๋ํฝ์ ์ฌ์ฉํ์ฌ ์ขํ ๋์์ ์ค๋นํฉ๋๋ค.
-
selector- ๋จ์ผ ์ธ์ ํ์์์๋ง: ์ ์ฅ๋ ์ง์ ์ ๋ฐ๋ณตํ๋ "lasttile" ๋ฌธ์์ด์ ๋๋ค. -
type- ๊ทธ๋ํฝ/type ํ์ผ, 0..65535, serial ์๋. 0์ ์ง์ ๋ ๊ทธ๋ํฝ์ด ์๋ ์ขํ ๋์์ ๋ํ๋ ๋๋ค. 4๊ฐ์ ์ธ์ ํ์์ผ๋ก ์ ๊ณต๋ฉ๋๋ค. x/y/z ํ์์ 0์ ๊ฐ์ต๋๋ค. -
xโ ํ์ฌ ์ง๋์ ์ธ๊ณ X ์ขํ 0..65535. ์ด๋ ํ๋ฉด ํฝ์ ์ด๋ ๊ฒํ ์ขํ๊ฐ ์๋๋๋ค. -
yโ ํ์ฌ ์ง๋์ ์ธ๊ณ Y ์ขํ 0..65535. -
z- ๋คํธ์ํฌ ๋์ ์ฌ์ฉ์ ์ํ ๊ฒ์ ํฌ์ธํธ ๋์ด -128..127. ์ด๊ฒ์ ๋ฐ๋ฅ์ด๋ ์ฅ๋น์ ์ธต์ด ์๋๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. true/false, serial ๋๋ type๋ก ์ฌ์ฉํ์ง ๋ง์ธ์. ๋ฉํ๋ฐ์ดํฐ object? ํธํ๋๋ ์์์ ๊ฒฝ์ฐ ์ค์ ๊ฒฐ๊ณผ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค void.
- ํ์ ๋์๋ง ์ค๋นํฉ๋๋ค. ์์ดํ , ์คํฌ, ์ฃผ๋ฌธ ์์ฒด๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋ค์ ์๋ฒ ๋์์ ํด๋ผ์ด์ธํธ ํ๋ ์์ ์ฒ๋ฆฌํ ๋ ์ค๋น๋ ๋์์ ๋ฐ์ต๋๋ค.
- ์ฐ์ ํธ์ถ์ ๊ณตํต ํด๋ผ์ด์ธํธ ๋๊ธฐ์ด์ ํ์ฑํฉ๋๋ค. ๊ฐ์ฒด์ ์ขํ ๋์์ ํ ๋ฒ์ ํ๋์ฉ ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ก์ปฌ ์ ํ ์ฐฝ ClientRequest*/Info/container๋ ์ด๋ฅผ ์๋นํ์ง ์์ต๋๋ค.
- CancelWaitTarget ๋๊ธฐ์ด์ ์ง์๋๋ค. TerminateAll ์ ์ฒด๋ฅผ ์ฒญ์ํฉ๋๋ค. ์์ง ์คํ ์ค์ธ ํ๋ก์์ ๋ฅผ ์ค์งํ๋ฉด ์์ฒด ๋ณด๋ฅ ์ค์ธ ์๋ต๋ ๋ฌดํจํ๋ฉ๋๋ค. ์งง์ ์ ์ฐจ๋ฅผ ์๋ฃํด๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋น๋ ๋์์ด ์ทจ์๋์ง ์์ต๋๋ค.
- ์๋ต์ ๋ณด๋ด๋ ์๋ฒ์์์ ์์ ์ด ๋ณด์ฅ๋์ง๋ ์์ต๋๋ค. ์๋ต์ ๋ฒ์, ๊ฐ์ฒด์ ์ ๊ทผ์ฑ, ๊ฐ์์ฑ ๋ฐ ์์ ๊ท์น์ ํ์ธํฉ๋๋ค. ์ ์ดํ๋ ค๋ฉด ๊ฒ์ ๊ฒฐ๊ณผ์ ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.WaitTargetTile");
UO.WaitTargetTile("lasttile");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- x=1445, y=1690, z=0; ๋๋ฝ๋ type๋ 0์ ๊ฐ์ต๋๋ค.
- ์ด๊ฒ์ด ์ธ์์ ์์ ์ด๋ค. ์ด ๋ช ๋ น์ ์บ๋ฆญํฐ๋ฅผ ์ด๋ํ๊ฑฐ๋ ๊ฒํ์ ์์ดํ ์ ๋ฐฐ์นํ์ง ์์ต๋๋ค.
UO.CancelWaitTarget();
UO.WaitTargetTile(1445, 1690, 0);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- type=0x0CCA โ ๊ทธ๋ํฝ์ ์; ์ ํํ ํ์ผ์ ์ค์ type๋ฅผ ์ฌ์ฉํ์ธ์. x/y/z๋ ์๋ ์์น์ ๋๋ค.
- ๊ทธ๋ํฝ๊ณผ ์ขํ๋ ์ํ๋ ์ง๋ ๊ฐ์ฒด๋ฅผ ์ค๋ช ํด์ผ ํฉ๋๋ค. ์๋ฒ๋ ๋์์ ์ ํจ์ฑ์ ํ์ธํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.CancelWaitTarget();
UO.WaitTargetTile(0x0CCA, 1445, 1690, 0);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ํ๊ธฐ๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๊ณ ๋ง์ง๋ง ๋ฌธ์์ด๋ง ํ์ฉํฉ๋๋ค. ๋จ์ผ ์ธ์ ํ์์ ๋ค๋ฅธ ๋ฌธ์์ด์ด๋ ์ซ์๋ก ์ธํด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
- TargetManager ํ์ผ์ ๋ง์ง๋ง ํ๋๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ ํ ์ ์๋ 0์ด ๋ ์ ์์ต๋๋ค. ๋จผ์ ๊ฒ์์์ ์ํ๋ ์ง์ ์ ์ ํํฉ๋๋ค. 3๊ฐ ๋๋ 4๊ฐ์ ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ช ์์ ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.WaitTargetTile("lasttile");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: selector (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WaitTargetTile. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastTile:bridge.LastTile(). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("UO.WaitTargetTile: lasttile is unavailable; next target request canceled."). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CancelNextTarget:bridge.CancelNextTarget(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WaitTargetTile:bridge.WaitTargetTile(tile[0], tile[1], tile[2], tile[3]). -
InjectionScript.Runtime.InjectionApiUO.Timer:Timer().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void WaitTargetTile(InjectionValue selector)
{
string name = selector.Kind == InjectionValueKind.String
? (selector.String ?? string.Empty).Trim()
: string.Empty;
if (!name.Equals("lasttile", StringComparison.OrdinalIgnoreCase))
throw new NativeSubrutineException("UO.WaitTargetTile(one argument) accepts only 'lasttile'.");
int[] tile = bridge.LastTile() ?? Array.Empty<int>();
if (tile.Length < 4)
{
SystemMessage("UO.WaitTargetTile: lasttile is unavailable; next target request canceled.");
bridge.CancelNextTarget();
return;
}
bridge.WaitTargetTile(tile[0], tile[1], tile[2], tile[3]);
ticksTarget = Timer();
}๋งค๊ฐ๋ณ์: x (Any), y (Any), z (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WaitTargetTile. -
InjectionScript.Runtime.InjectionApiUO.WaitTargetTile:WaitTargetTile(new InjectionValue(0), x, y, z).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void WaitTargetTile(InjectionValue x, InjectionValue y, InjectionValue z)
=> WaitTargetTile(new InjectionValue(0), x, y, z);๋งค๊ฐ๋ณ์: type (Any), x (Any), y (Any), z (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WaitTargetTile. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WaitTargetTile:bridge.WaitTargetTile(ResolveType(type), NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(z)). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(type). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x). -
InjectionScript.Runtime.InjectionApiUO.Timer:Timer().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void WaitTargetTile(InjectionValue type, InjectionValue x, InjectionValue y, InjectionValue z)
{
bridge.WaitTargetTile(ResolveType(type), NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(z));
ticksTarget = Timer();
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.WaitTargetType(object? @type);
void UO.WaitTargetType(object? @type, object? color);graphic/hue์์ ํญ๋ชฉ์ ๊ฒ์ํ์ฌ ๋ค์ ๋์์ ๋๊ธฐ์ด์ ๋ฐฐ์นํฉ๋๋ค.
-
type- ๊ทธ๋ํฝ/type int, 16์ง์ ๋ฌธ์์ด ๋๋ ์ด๋ฆ์ด type์ธ ์ธํธ. serial ์์ดํ ์ด ์๋๋๋ค. -
color- ์ ํ์ฌํญ int hue; ๊ธฐ๋ณธ๊ฐ -1 - ๋ชจ๋ ์์.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ๋ฒ์: ์ฌ๊ท ๊ฒ์ ๊ธฐ๋ฅ์ด ์๋ ๋ฐฐ๋ญ. Bridge.FindType๋ ๋ฐ๊ฒฌ๋ serial๋ฅผ ๋ฐํํฉ๋๋ค. serial>0 ๋ธ๋ฆฌ์ง.WaitTargetObject๊ฐ ํธ์ถ๋ ๋. ์ด๋ฌํ ๋ฉ์๋๋ ๋ฐํ์ TicksTarget๋ฅผ ์ง์ ์ ๋ฐ์ดํธํ์ง ์์ต๋๋ค.
- ํญ๋ชฉ ์์ - ๋ฉ์์ง ๋ฐ CancelNextTarget. ๊ฒ์ ๊ฒฐ๊ณผ ์ผ๋ฐ FindItem/FoundItems๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์ด ๋ช ๋ น์ ๋ฐ๊ฒฌ๋ ํญ๋ชฉ์ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ ์ปค์๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.WaitTargetType");
UO.WaitTargetType("0x0E21");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- graphic/hue์์ ํญ๋ชฉ์ ๊ฒ์ํ์ฌ ๋ค์ ๋์์ ๋๊ธฐ์ด์ ๋ฐฐ์นํฉ๋๋ค.
UO.WaitTargetType("0x0E21");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฒ์: ์ฌ๊ท ๊ฒ์ ๊ธฐ๋ฅ์ด ์๋ ๋ฐฐ๋ญ. Bridge.FindType๋ ๋ฐ๊ฒฌ๋ serial๋ฅผ ๋ฐํํฉ๋๋ค. serial>0 ๋ธ๋ฆฌ์ง.WaitTargetObject๊ฐ ํธ์ถ๋ ๋. ์ด๋ฌํ ๋ฉ์๋๋ ๋ฐํ์ TicksTarget๋ฅผ ์ง์ ์ ๋ฐ์ดํธํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.WaitTargetType("0x0E21", -1);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํญ๋ชฉ ์์ - ๋ฉ์์ง ๋ฐ CancelNextTarget. ๊ฒ์ ๊ฒฐ๊ณผ ์ผ๋ฐ FindItem/FoundItems๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์ด ๋ช ๋ น์ ๋ฐ๊ฒฌ๋ ํญ๋ชฉ์ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ ์ปค์๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
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.WaitTargetType("0x0E21", -1);
UO.Print(UO.Waiting());
UO.CancelWaitTarget();
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: type (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WaitTargetType. -
InjectionScript.Runtime.InjectionApiUO.WaitTargetType:WaitTargetType(ResolveType(type), -1). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(type).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void WaitTargetType(InjectionValue type) => WaitTargetType(ResolveType(type), -1);๋งค๊ฐ๋ณ์: type (Any), color (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.WaitTargetType. -
InjectionScript.Runtime.InjectionApiUO.WaitTargetType:WaitTargetType(ResolveType(type), NumberConversions.ToInt(color)). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(type). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(color).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void WaitTargetType(InjectionValue type, InjectionValue color)
=> WaitTargetType(ResolveType(type), NumberConversions.ToInt(color));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.WaitTargetXYZ(object? x, object? y, object? z);๋ค์ ์๋ฒ ์๊ฐ์ ์ํด graphic=0๋ก ์ขํ ๋์์ ์ค๋นํฉ๋๋ค.
-
xโ ํ์ฌ ์ง๋์ ์ธ๊ณ X ์ขํ 0..65535. ์ด๋ ํ๋ฉด ํฝ์ ์ด๋ ๊ฒํ ์ขํ๊ฐ ์๋๋๋ค. -
yโ ํ์ฌ ์ง๋์ ์ธ๊ณ Y ์ขํ 0..65535. -
z- ๋คํธ์ํฌ ๋์ ์ฌ์ฉ์ ์ํ ๊ฒ์ ํฌ์ธํธ ๋์ด -128..127. ์ด๊ฒ์ ๋ฐ๋ฅ์ด๋ ์ฅ๋น์ ์ธต์ด ์๋๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. true/false, serial ๋๋ type๋ก ์ฌ์ฉํ์ง ๋ง์ธ์. ๋ฉํ๋ฐ์ดํฐ object? ํธํ๋๋ ์์์ ๊ฒฝ์ฐ ์ค์ ๊ฒฐ๊ณผ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค void.
- ํ์ ๋์๋ง ์ค๋นํฉ๋๋ค. ์์ดํ , ์คํฌ, ์ฃผ๋ฌธ ์์ฒด๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋ค์ ์๋ฒ ๋์์ ํด๋ผ์ด์ธํธ ํ๋ ์์ ์ฒ๋ฆฌํ ๋ ์ค๋น๋ ๋์์ ๋ฐ์ต๋๋ค.
- ์ฐ์ ํธ์ถ์ ๊ณตํต ํด๋ผ์ด์ธํธ ๋๊ธฐ์ด์ ํ์ฑํฉ๋๋ค. ๊ฐ์ฒด์ ์ขํ ๋์์ ํ ๋ฒ์ ํ๋์ฉ ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ก์ปฌ ์ ํ ์ฐฝ ClientRequest*/Info/container๋ ์ด๋ฅผ ์๋นํ์ง ์์ต๋๋ค.
- CancelWaitTarget ๋๊ธฐ์ด์ ์ง์๋๋ค. TerminateAll ์ ์ฒด๋ฅผ ์ฒญ์ํฉ๋๋ค. ์์ง ์คํ ์ค์ธ ํ๋ก์์ ๋ฅผ ์ค์งํ๋ฉด ์์ฒด ๋ณด๋ฅ ์ค์ธ ์๋ต๋ ๋ฌดํจํ๋ฉ๋๋ค. ์งง์ ์ ์ฐจ๋ฅผ ์๋ฃํด๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋น๋ ๋์์ด ์ทจ์๋์ง ์์ต๋๋ค.
- ์๋ต์ ๋ณด๋ด๋ ์๋ฒ์์์ ์์ ์ด ๋ณด์ฅ๋์ง๋ ์์ต๋๋ค. ์๋ต์ ๋ฒ์, ๊ฐ์ฒด์ ์ ๊ทผ์ฑ, ๊ฐ์์ฑ ๋ฐ ์์ ๊ท์น์ ํ์ธํฉ๋๋ค. ์ ์ดํ๋ ค๋ฉด ๊ฒ์ ๊ฒฐ๊ณผ์ ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.WaitTargetXYZ");
UO.WaitTargetXYZ(1445, 1690, 0);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- X=1445, Y=1690, Z=0. ๊ทธ๋ํฝ์ 0์ ๊ฐ์ต๋๋ค.
- ์๋ฒ ์ขํ๊ณ๊ฐ ๋ํ๋๋ฉด ์๋ต์ด ์ ์ก๋ฉ๋๋ค.
UO.WaitTargetXYZ(1445, 1690, 0);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- X/Y/Z๋ ์์ ์ ์บ๋ฆญํฐ์์ ์ฝ์ด์ต๋๋ค.
- ์ด๋ ์บ๋ฆญํฐ serial์ object ํ๊ฒ์ด ์๋ ์ขํ ํ๊ฒ์ ๋๋ค. ํ์์ ๊ฒฝ์ฐ WaitTargetSelf๊ฐ ํ์ํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
UO.WaitTargetXYZ(x, y, z);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ขํ๋ฅผ ์ถ์ถ ์ง์ ์ผ๋ก ๋ฐ๊ฟ๋๋ค. UseType๋ ๋ฐฐ๋ญ์์ ์ด๋ค ์๊น์ ์ฝ type=0x0F39์ ์ฐพ๊ณ ์์ต๋๋ค.
- ์ ์ ํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์์ ์ผ๋ก ์ด๋ํ๊ธฐ ์ ์ CancelWaitTarget๋ฅผ ํตํด ํ๋ ์ ์ ๊ฑฐํ์ญ์์ค.
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.CancelWaitTarget();
UO.WaitTargetXYZ(1445, 1690, 0);
UO.UseType(0x0F39, -1);
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: x (Any), y (Any), z (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.WaitTargetTile:WaitTargetTile(new InjectionValue(0), arguments[0], arguments[1], arguments[2]).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "waittargetxyz": WaitTargetTile(new InjectionValue(0), arguments[0], arguments[1], arguments[2]); return InjectionValue.Unit;