KO UO Topic mobiles - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฏธ ์๊ณ ์๋ ์บ๋ฆญํฐ, NPC, ๋ชฌ์คํฐ ๋ฐ ์ ์๋๋ฌผ์ ๋๋ค. Serial์ ํน์ ์๋ฌผ์ฒด, body/type ๊ทธ๋ํฝ์ ์ ์ํฉ๋๋ค. ์ด๊ฒ์ ๋ค๋ฅธ ์๋ฏธ์ ๋๋ค.
| ์ฃผ์ | ๋ช ๋ น ๋ฐ ์ค๋ช |
|---|---|
| Players | UO.GetMobiles ยท UO.FindMobile |
| NPC | UO.IsNpc ยท UO.FindMobile |
| Monsters | UO.FindType ยท UO.FindMobile |
| Pets | UO.GetPetsCurrent ยท UO.GetPetsMax |
| Followers | UO.GetFollowers ยท UO.GetFollowersMax |
| Name / Serial / Body | UO.GetName ยท UO.GetSerial ยท UO.GetType |
| ์ขํ | UO.GetX ยท UO.GetY ยท UO.GetZ |
| Distance | UO.GetDistance |
| Notoriety | UO.Notoriety |
| Status | UO.GetStatus ยท UO.Alive ยท UO.Dead ยท UO.Hidden ยท UO.Poisoned ยท UO.Paralyzed |
| Rename | UO.Rename |
UO.GetMobile ยท UO.GetMobiles ยท UO.IsNpc
UO.Followers ยท UO.GetFollowers ยท UO.FollowersMax ยท UO.GetFollowersMax ยท UO.PetsCurrent ยท UO.GetPetsCurrent ยท UO.PetsMax ยท UO.GetPetsMax
UO.Notoriety ยท UO.GetNotoriety
UO.CanChangeName ยท UO.MobileCanBeRenamed ยท UO.Rename ยท UO.RenameMobile
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
var radius = 12;
var allyStatus = 2;
var anyBody = -1;
var maxHeight = 8;
dynamic nearestFirst = true;
dynamic includeMe = false;
dynamic livingOnly = true;
dynamic visibleOnly = true;
var allies = UO.GetMobiles(radius, allyStatus, anyBody, maxHeight, nearestFirst, includeMe, livingOnly, visibleOnly);
if (Truth(ArrayLength(allies) == 0))
{
return null;
}
UO.AddObject("leader", allies[0]);
UO.Follow(allies[0], 2, false);
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;๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
var value = UO.GetNotoriety();
UO.Print("GetNotoriety: " + Convert.ToString(value));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.CanChangeName(object? id);mobile ์ด๋ฆ์ ๋ฐ๊ฟ ์ ์๋ ํด๋ผ์ด์ธํธ์ ์๋ ค์ง ํ์๋ฅผ ํ์ธํฉ๋๋ค.
-
idโ ํน์ ๊ฐ์ฒด์ ํ์ serial/ID: int, 16์ง์ ๋ฌธ์์ด ๋๋ ๋ณ์นญ self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. ์ง์ ๋์ง ์์ ์ด๋ฆ์ 0๋ก ํด์๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ ๋์์ ์ด์ง ์์ต๋๋ค. ์ธ์๋ ํ์์ ๋๋ค. ์ง์ self๋ฅผ ํต๊ณผํ์ธ์.
int 1 - ๋ก๋๋จ mobile์๋ IsRenamable ์์ฑ์ด ์์ต๋๋ค. int 0 - ์์ฑ์ด ๋๋ฝ๋์๊ฑฐ๋ ๊ฐ์ฒด๊ฐ mobile๊ฐ ์๋๊ฑฐ๋ ์ ์ ์๊ฑฐ๋ ์ญ์ ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ ์๋๋ฌผ์ ๋ํ ๋ง์ง๋ง ์๋ฒ ๊ถํ์ ๋๋ค. ์ด ๋ช ๋ น์ ๊ฐ์ฒด์ ์ด๋ฆ์ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ ํ์ ์์ฒญ์ด ์๋ฒ์์ ์๋ฝ๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ์๋ฒ์ ๋ํ ์์ฒญ๋ ์๊ณ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ด๋ํ ํ์๋ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ์ฝ๋ ์๊ฐ์ ๊ฐ๋ฆฌํจ๋ค. UO.Wait ๋๋ ๋ค๋ฅธ ์์ ํ์ ๊ฐ์ฒด์ ํด๋น ํ๋๊ทธ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด ์ ์๋๋ฌผ์ ๋ํ ๋ง์ง๋ง ์๋ฒ ๊ถํ์ ๋๋ค. ์ด ๋ช ๋ น์ ๊ฐ์ฒด์ ์ด๋ฆ์ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ ํ์ ์์ฒญ์ด ์๋ฒ์์ ์๋ฝ๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.CanChangeName("self");
UO.Print("CanChangeName: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- self ์ธ์๋ ํด๋น ๋ฌธ์๋ฅผ ๋ช ์์ ์ผ๋ก ์ ํํฉ๋๋ค. ์ํ - 1/0์๋ง ํด๋น๋ฉ๋๋ค.
- ์๋ฅผ ๋ค์ด ์ ์๋๋ฌผ์ ๋ํ ๋ง์ง๋ง ์๋ฒ ๊ถํ์ ๋๋ค. ์ด ๋ช ๋ น์ ๊ฐ์ฒด์ ์ด๋ฆ์ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ ํ์ ์์ฒญ์ด ์๋ฒ์์ ์๋ฝ๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
var state = UO.CanChangeName("self");
if (Truth(state))
{
UO.Print("Rename permission flag is present");
}
else
{
UO.Print("Rename permission flag is absent");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- IsNpc ์ ๋ชฉ ๋ฐ ์ ์ ์๋ ๊ฐ์ฒด๋ ์ ์ธ๋ฉ๋๋ค. target์ ๋ณ๊ฒฝ๋๋ lasttarget์ ๋ํ ์ค์๊ฐ ์ฐธ์กฐ๊ฐ ์๋ ๋จ์ผ serial์ ์ ์ฅํฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ IsRenamable ํ๋๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์ ์ ํ ์ํ๋ฅผ ์์ ํ ํ์๋ง ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var state = UO.CanChangeName(target);
UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
}
else
{
UO.Print("No loaded mobile selected");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.Wait(500) โ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ผ์ ์ค์ง๋ฉ๋๋ค. ์ดํ์๋ mobile์ด ์ฌ์ ํ ์กด์ฌํ๋์ง ๋ณ๋๋ก ํ์ธํฉ๋๋ค.
- ๋ ์ด๋ฏธ์ง๊ฐ ๋น๊ต๋ฉ๋๋ค. ์ค๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ด ๋๋ฝ๋ ์ ์์ผ๋ฉฐ ์ด๋ ์๋ฒ ์ด๋ฒคํธ์ ๋ํ ์ง์์ ์ธ ๊ตฌ๋ ์ด ์๋๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var before = UO.CanChangeName(target);
await Delay(500);
if (Truth(UO.IsNPC(target)))
{
var after = UO.CanChangeName(target);
if (Truth(before != after))
{
UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
}
}
else
{
UO.Print("Mobile left the local world");
}
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: id (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.CanChangeName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CanChangeName:bridge.CanChangeName(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int CanChangeName(InjectionValue id) => bridge.CanChangeName(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Followers();์บ๋ฆญํฐ์ ๋ค์ ๊ธธ๋ค์ฌ์ง๊ฑฐ๋ ์ํ๋๋ ์๋ฌผ์ ์ํ ์ถฉ๋ถํ ๊ณต๊ฐ์ด ์๋์ง ๋ฏธ๋ฆฌ ๊ฒฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Followers๋ ์ ์ ๋ ์ ์ด ์ฌ๋กฏ์ ํ์ํ๊ณ , FollowersMax๋ ์ด ํ๋๋ฅผ ๋ํ๋ ๋๋ค. ์ด๊ฒ์ ๊ทผ์ฒ์ ์๋ ๋๋ฌผ์ ์๋ ์ด๋ ๋ช ๋ น Follow๊ฐ ์๋๋๋ค. ์บ๋ฆญํฐ์ ์ํ ์นด์ดํฐ(์ ์ ๋ ์ ์๋๋ฌผ ์ ์ด ์ฌ๋กฏ)๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int - ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์๋ ์ ์๋๋ฌผ ์ ์ด ์ฌ๋กฏ, 0..255๋ฅผ ์ฐจ์งํฉ๋๋ค. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋, ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋, ๋๋ฝ/ํ๊ดด๋ ํ๋ ์ด์ด์ผ ์ ์์ต๋๋ค. ์ด๋ bool, ID ๋๋ type๊ฐ ์๋ ์๋์ ๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋๋ผ ํ๋์ ๋จ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํ์ง ์์ผ๋ฉฐ ๋ฐฐ์ด์ ๋ฐํํ์ง ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, 5์ 3์ด ์ฌ์ฉ ์ค์ด๊ณ 2 ์ฌ๋กฏ์ ๋น์ด ์์ต๋๋ค. 4 ๊ฐ์ ํ ์ฌ๋กฏ์ ์๋ฌผ 4๊ฐ, 4๊ฐ์ ์๋ฌผ 1๊ฐ ๋๋ ๊ธฐํ ์กฐํฉ์ ์๋ฏธํ ์ ์์ต๋๋ค. 2์ ์๋ ์๋ฌผ์ ๊ฒฝ์ฐ "busy < maximum" ์ฒดํฌ ์ฌ๋กฏ์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ต๋ - ํ์ฌ >= 2๊ฐ ํ์ํฉ๋๋ค. ํน์ ์๋ฌผ์ ๋น์ฉ๊ณผ ํ๋๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. FollowersMax๋ฅผ ์์ 5๋ก ๋์ฒดํ์ง ๋ง์ธ์.
- 0๋ ์ ์๋๋ฌผ์ด ๋ถ์ค, ์ฌ๋ง ๋๋ ์๋ฐฉ๋์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. ์ ์๋๋ฌผ์ด ๋น์ด ์๊ฑฐ๋ ์ํ๊ฐ ์์ง ์ ๋ฐ์ดํธ๋์ง ์์์ ์ ์์ต๋๋ค. ์นด์ดํฐ์ ์ฆ๊ฐ๋ ์ ์ด๊ถ ๋ณ๊ฒฝ์ ์ถ๊ฐ์ ์ธ ์ ํธ์ผ ๋ฟ์ ๋๋ค. ์ด๋ค ์๋ฌผ์ด ๊ธธ๋ค์ฌ์ก๋์ง ๊ฒฐ์ ํ์ง ์์ต๋๋ค. ์๋ฒ์ ํซ ์์ฒด์ ๋ฉ์์ง๋ ํ์ธํด๋ณด์ธ์. ์ด ์ฌ๋กฏ์ ๋ง๊ตฌ๊ฐ์ ์ฅ์์ ๋์ผํ์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.Followers ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- PetsCurrent/Followers๋ ์ํ type >= 3์์ ์ ์ ๋ ์ ์ด ์ฌ๋กฏ์ ๋ณด๊ณ ํฉ๋๋ค. ์ ์๋๋ฌผ ํ ๋ง๋ฆฌ๊ฐ ์ฌ๋ฌ ์ฌ๋กฏ์ ์ฐจ์งํ ์ ์์ต๋๋ค. ์ํ ๋ฐ ๊ธธ๋ค์ธ ์๋ฌผ์ ๋ํ ๊ท์น์ ์๋ฒ์์ ์ค์ ํฉ๋๋ค. ์ด๊ฒ์ ๋ณด์ด๋ mobile์ ์ซ์๋ ์๋๊ณ , ID ์ ์๋๋ฌผ์ ๋ชฉ๋ก๋ ์๋๊ณ , ๊ทผ์ฒ์ ์๋ ๋๋ฌผ์ ์ซ์๋ ์๋๋๋ค.
- CharacterStatus๋ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ํ์ํ ๋ณธ๋ฌธ์ ํ์ธํฉ๋๋ค. Weight๋ ์์ฒด ํ์ฅ ์ํ์ธ ์ฌ๋กฏ - type 3, Luck - type 4, ์๋ฒ WeightMax - type 5์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํ์ ์นด์ดํฐ๊ฐ ์๋ ์ปดํฉํธ/์ค๋๋ ํจํค์ง๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์๋ถํฐ ์์๋ฉ๋๋ค. ํตํ๋ ์๋ก์ด ์ํ๋ฅผ ๋ฐ์๋ค๋ ๊ฒ์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Followers();
UO.Print("Followers: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ - ์ฌ์ฉ ์ค, ์ต๋ - ์ ํ, freeSlots - ์ฐจ์ด. ์ ์ ์๋/0 ์ ํ ๋๋ ์ผ๊ด์ฑ ์๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ๊ณต๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๊ณ ์ฃผ์ฅํ์ง ์๊ณ ์์ ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ต์ ์ํ๋ง ์ฝ๊ณ ์ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํ์ง ์์ต๋๋ค.
var current = UO.Followers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
UO.Print("Follower status is unavailable or inconsistent");
return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ ID๊ฐ lasttarget์ ์๋๋ก ์ํ๋ ๋๋ฌผ์ ์ ํํ์ธ์. requiredSlots=2 - ์์ ์ค์ , ์๋ฒ์ ์๋ ์ด ์๋ฌผ์ ์ค์ ๋น์ฉ์ผ๋ก ๋์ฒดํ์ธ์. ๊ณต๊ฐ์ด ๋ถ์กฑํ ๊ฒฝ์ฐ ๋์์ด ์ค์ ๋์ง ์์ผ๋ฉฐ ์คํฌ์ด ํธ์ถ๋์ง ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋์์ ๋๊ธฐ์ด์ ๋จ์ผ ์ธ์ UseSkill("๋๋ฌผ ๊ธธ๋ค์ด๊ธฐ") ์ด์ ์ ์ค๋น๋ฉ๋๋ค. ์๋๋ฅผ ์์ํ๋ค๊ณ ํด์ ์ฑ๊ณต์ด ๋ณด์ฅ๋๋ ๊ฒ์ ์๋๋๋ค. ๊ธฐ์ , ๋ฒ์, ๊ธธ๋ค์ ๊ฐ๋ฅ์ฑ ๋ฐ ์๋ฒ ์๋ต์ด ์ค์ํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var requiredSlots = 2;
var current = UO.Followers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
{
UO.Print("Not enough known control slots");
return null;
}
var animal = UO.LastTarget();
if (Truth(animal == 0))
{
UO.Print("Select the animal first");
return null;
}
UO.WaitTargetObject(animal);
UO.UseSkill("Animal Taming");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CanAddFollower๋ ์๋ก์ด UO ๋ช ๋ น์ด ์๋๋ผ ์์ ํ ์ ์ธ๋ ์ฌ์ฉ์ ๋์ฐ๋ฏธ์ ๋๋ค. ์บ์ ์ ํ์ด ์ถฉ๋ถํ๋ฉด 1/true๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 0/false๋ฅผ ๋ฐํํฉ๋๋ค. extraSlots ๋งค๊ฐ๋ณ์๋ type/ID๊ฐ ์๋๋ผ ADDED๋๋ ์๋ฌผ์ ๋น์ฉ์ ๋๋ค. 2 - ์; ํด๋น ๊ธฐ๋ฅ์ ๊ธธ๋ค์ด๊ฑฐ๋ ์ํํ์ง ์์ต๋๋ค. ์ ๊ฒ์ ์กฐ์น ์ง์ ์ ๋ฐ๋ณต๋์ด์ผ ํฉ๋๋ค.
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(CanAddFollower(2)))
{
UO.Print("Capacity check passed; verify the creature cost before acting");
}
else
{
UO.Print("Insufficient capacity or unavailable status");
}
return null;
}
dynamic CanAddFollower(dynamic extraSlots)
{
if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.Followers();
var maximum = UO.PetsMax();
if (Truth(maximum <= 0))
{
return false;
}
return extraSlots <= maximum - current;
}
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.RegisterCharacterGetterAliases [Followers]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Followers:bridge.Followers.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.FollowersAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.FollowersMax();์บ๋ฆญํฐ์ ๋ค์ ๊ธธ๋ค์ฌ์ง๊ฑฐ๋ ์ํ๋๋ ์๋ฌผ์ ์ํ ์ถฉ๋ถํ ๊ณต๊ฐ์ด ์๋์ง ๋ฏธ๋ฆฌ ๊ฒฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Followers๋ ์ ์ ๋ ์ ์ด ์ฌ๋กฏ์ ํ์ํ๊ณ , FollowersMax๋ ์ด ํ๋๋ฅผ ๋ํ๋ ๋๋ค. ์ด๊ฒ์ ๊ทผ์ฒ์ ์๋ ๋๋ฌผ์ ์๋ ์ด๋ ๋ช ๋ น Follow๊ฐ ์๋๋๋ค. ์บ๋ฆญํฐ์ ์ํ ์นด์ดํฐ(์ต๋ ์ ์๋๋ฌผ ์ ์ด ์ฌ๋กฏ)๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int - ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์๋ ์ต๋ ์ ์๋๋ฌผ ์ ์ด ์ฌ๋กฏ, 0..255. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋, ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋, ๋๋ฝ/ํ๊ดด๋ ํ๋ ์ด์ด์ผ ์ ์์ต๋๋ค. ์ด๋ bool, ID ๋๋ type๊ฐ ์๋ ์๋์ ๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋๋ผ ํ๋์ ๋จ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํ์ง ์์ผ๋ฉฐ ๋ฐฐ์ด์ ๋ฐํํ์ง ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, 5์ 3์ด ์ฌ์ฉ ์ค์ด๊ณ 2 ์ฌ๋กฏ์ ๋น์ด ์์ต๋๋ค. 4 ๊ฐ์ ํ ์ฌ๋กฏ์ ์๋ฌผ 4๊ฐ, 4๊ฐ์ ์๋ฌผ 1๊ฐ ๋๋ ๊ธฐํ ์กฐํฉ์ ์๋ฏธํ ์ ์์ต๋๋ค. 2์ ์๋ ์๋ฌผ์ ๊ฒฝ์ฐ "busy < maximum" ์ฒดํฌ ์ฌ๋กฏ์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ต๋ - ํ์ฌ >= 2๊ฐ ํ์ํฉ๋๋ค. ํน์ ์๋ฌผ์ ๋น์ฉ๊ณผ ํ๋๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. FollowersMax๋ฅผ ์์ 5๋ก ๋์ฒดํ์ง ๋ง์ธ์.
- 0๋ ์ ์๋๋ฌผ์ด ๋ถ์ค, ์ฌ๋ง ๋๋ ์๋ฐฉ๋์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. ์ ์๋๋ฌผ์ด ๋น์ด ์๊ฑฐ๋ ์ํ๊ฐ ์์ง ์ ๋ฐ์ดํธ๋์ง ์์์ ์ ์์ต๋๋ค. ์นด์ดํฐ์ ์ฆ๊ฐ๋ ์ ์ด๊ถ ๋ณ๊ฒฝ์ ์ถ๊ฐ์ ์ธ ์ ํธ์ผ ๋ฟ์ ๋๋ค. ์ด๋ค ์๋ฌผ์ด ๊ธธ๋ค์ฌ์ก๋์ง ๊ฒฐ์ ํ์ง ์์ต๋๋ค. ์๋ฒ์ ํซ ์์ฒด์ ๋ฉ์์ง๋ ํ์ธํด๋ณด์ธ์. ์ด ์ฌ๋กฏ์ ๋ง๊ตฌ๊ฐ์ ์ฅ์์ ๋์ผํ์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.FollowersMax ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- PetsMax/FollowersMax๋ ์ฌ์ ์ฌ๋กฏ์ด ์๋ type >= 3 ์ํ์์ ์๋ฒ๊ฐ ํ์ฉํ๋ ์ด ์ฌ๋กฏ ์ ํ์ ๋ณด๊ณ ํฉ๋๋ค. ํ๋๋ณด๋ค ๋ ๋ง์ ์ฌ๋กฏ์ด ์ ์ ๋์ด ์์ ์ ์์ต๋๋ค. ์ฌ์ ์ฉ๋์ ์ต๋ ์ ๋ฅ๋ก ๊ฐ์ฃผํ๊ณ ์์ ๊ฒฐ๊ณผ๋ฅผ 0๋ก ๋ฐ๊ฟ๋๋ค. ํ์ ์๋ฌด๊ฒ๋ ๊ณต๊ฐํ์ง ์์ผ๋ฉฐ, ๊ธธ๋ค์ด๊ฑฐ๋ ์๊ตฌํ์ง๋ ์์ต๋๋ค.
- CharacterStatus๋ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ํ์ํ ๋ณธ๋ฌธ์ ํ์ธํฉ๋๋ค. Weight๋ ์์ฒด ํ์ฅ ์ํ์ธ ์ฌ๋กฏ - type 3, Luck - type 4, ์๋ฒ WeightMax - type 5์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํ์ ์นด์ดํฐ๊ฐ ์๋ ์ปดํฉํธ/์ค๋๋ ํจํค์ง๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์๋ถํฐ ์์๋ฉ๋๋ค. ํตํ๋ ์๋ก์ด ์ํ๋ฅผ ๋ฐ์๋ค๋ ๊ฒ์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.FollowersMax();
UO.Print("FollowersMax: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ - ์ฌ์ฉ ์ค, ์ต๋ - ์ ํ, freeSlots - ์ฐจ์ด. ์ ์ ์๋/0 ์ ํ ๋๋ ์ผ๊ด์ฑ ์๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ๊ณต๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๊ณ ์ฃผ์ฅํ์ง ์๊ณ ์์ ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ต์ ์ํ๋ง ์ฝ๊ณ ์ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํ์ง ์์ต๋๋ค.
var current = UO.Followers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
UO.Print("Follower status is unavailable or inconsistent");
return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ ID๊ฐ lasttarget์ ์๋๋ก ์ํ๋ ๋๋ฌผ์ ์ ํํ์ธ์. requiredSlots=2 - ์์ ์ค์ , ์๋ฒ์ ์๋ ์ด ์๋ฌผ์ ์ค์ ๋น์ฉ์ผ๋ก ๋์ฒดํ์ธ์. ๊ณต๊ฐ์ด ๋ถ์กฑํ ๊ฒฝ์ฐ ๋์์ด ์ค์ ๋์ง ์์ผ๋ฉฐ ์คํฌ์ด ํธ์ถ๋์ง ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋์์ ๋๊ธฐ์ด์ ๋จ์ผ ์ธ์ UseSkill("๋๋ฌผ ๊ธธ๋ค์ด๊ธฐ") ์ด์ ์ ์ค๋น๋ฉ๋๋ค. ์๋๋ฅผ ์์ํ๋ค๊ณ ํด์ ์ฑ๊ณต์ด ๋ณด์ฅ๋๋ ๊ฒ์ ์๋๋๋ค. ๊ธฐ์ , ๋ฒ์, ๊ธธ๋ค์ ๊ฐ๋ฅ์ฑ ๋ฐ ์๋ฒ ์๋ต์ด ์ค์ํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var requiredSlots = 2;
var current = UO.Followers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
{
UO.Print("Not enough known control slots");
return null;
}
var animal = UO.LastTarget();
if (Truth(animal == 0))
{
UO.Print("Select the animal first");
return null;
}
UO.WaitTargetObject(animal);
UO.UseSkill("Animal Taming");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CanAddFollower๋ ์๋ก์ด UO ๋ช ๋ น์ด ์๋๋ผ ์์ ํ ์ ์ธ๋ ์ฌ์ฉ์ ๋์ฐ๋ฏธ์ ๋๋ค. ์บ์ ์ ํ์ด ์ถฉ๋ถํ๋ฉด 1/true๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 0/false๋ฅผ ๋ฐํํฉ๋๋ค. extraSlots ๋งค๊ฐ๋ณ์๋ type/ID๊ฐ ์๋๋ผ ADDED๋๋ ์๋ฌผ์ ๋น์ฉ์ ๋๋ค. 2 - ์; ํด๋น ๊ธฐ๋ฅ์ ๊ธธ๋ค์ด๊ฑฐ๋ ์ํํ์ง ์์ต๋๋ค. ์ ๊ฒ์ ์กฐ์น ์ง์ ์ ๋ฐ๋ณต๋์ด์ผ ํฉ๋๋ค.
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(CanAddFollower(2)))
{
UO.Print("Capacity check passed; verify the creature cost before acting");
}
else
{
UO.Print("Insufficient capacity or unavailable status");
}
return null;
}
dynamic CanAddFollower(dynamic extraSlots)
{
if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.PetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(maximum <= 0))
{
return false;
}
return extraSlots <= maximum - current;
}
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.RegisterCharacterGetterAliases [FollowersMax]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.FollowersMax:bridge.FollowersMax.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.FollowersMaxAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetFollowers();์บ๋ฆญํฐ์ ๋ค์ ๊ธธ๋ค์ฌ์ง๊ฑฐ๋ ์ํ๋๋ ์๋ฌผ์ ์ํ ์ถฉ๋ถํ ๊ณต๊ฐ์ด ์๋์ง ๋ฏธ๋ฆฌ ๊ฒฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Followers๋ ์ ์ ๋ ์ ์ด ์ฌ๋กฏ์ ํ์ํ๊ณ , FollowersMax๋ ์ด ํ๋๋ฅผ ๋ํ๋ ๋๋ค. ์ด๊ฒ์ ๊ทผ์ฒ์ ์๋ ๋๋ฌผ์ ์๋ ์ด๋ ๋ช ๋ น Follow๊ฐ ์๋๋๋ค. ์บ๋ฆญํฐ์ ์ํ ์นด์ดํฐ(์ ์ ๋ ์ ์๋๋ฌผ ์ ์ด ์ฌ๋กฏ)๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int - ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์๋ ์ ์๋๋ฌผ ์ ์ด ์ฌ๋กฏ, 0..255๋ฅผ ์ฐจ์งํฉ๋๋ค. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋, ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋, ๋๋ฝ/ํ๊ดด๋ ํ๋ ์ด์ด์ผ ์ ์์ต๋๋ค. ์ด๋ bool, ID ๋๋ type๊ฐ ์๋ ์๋์ ๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋๋ผ ํ๋์ ๋จ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํ์ง ์์ผ๋ฉฐ ๋ฐฐ์ด์ ๋ฐํํ์ง ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, 5์ 3์ด ์ฌ์ฉ ์ค์ด๊ณ 2 ์ฌ๋กฏ์ ๋น์ด ์์ต๋๋ค. 4 ๊ฐ์ ํ ์ฌ๋กฏ์ ์๋ฌผ 4๊ฐ, 4๊ฐ์ ์๋ฌผ 1๊ฐ ๋๋ ๊ธฐํ ์กฐํฉ์ ์๋ฏธํ ์ ์์ต๋๋ค. 2์ ์๋ ์๋ฌผ์ ๊ฒฝ์ฐ "busy < maximum" ์ฒดํฌ ์ฌ๋กฏ์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ต๋ - ํ์ฌ >= 2๊ฐ ํ์ํฉ๋๋ค. ํน์ ์๋ฌผ์ ๋น์ฉ๊ณผ ํ๋๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. FollowersMax๋ฅผ ์์ 5๋ก ๋์ฒดํ์ง ๋ง์ธ์.
- 0๋ ์ ์๋๋ฌผ์ด ๋ถ์ค, ์ฌ๋ง ๋๋ ์๋ฐฉ๋์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. ์ ์๋๋ฌผ์ด ๋น์ด ์๊ฑฐ๋ ์ํ๊ฐ ์์ง ์ ๋ฐ์ดํธ๋์ง ์์์ ์ ์์ต๋๋ค. ์นด์ดํฐ์ ์ฆ๊ฐ๋ ์ ์ด๊ถ ๋ณ๊ฒฝ์ ์ถ๊ฐ์ ์ธ ์ ํธ์ผ ๋ฟ์ ๋๋ค. ์ด๋ค ์๋ฌผ์ด ๊ธธ๋ค์ฌ์ก๋์ง ๊ฒฐ์ ํ์ง ์์ต๋๋ค. ์๋ฒ์ ํซ ์์ฒด์ ๋ฉ์์ง๋ ํ์ธํด๋ณด์ธ์. ์ด ์ฌ๋กฏ์ ๋ง๊ตฌ๊ฐ์ ์ฅ์์ ๋์ผํ์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.Followers ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- PetsCurrent/Followers๋ ์ํ type >= 3์์ ์ ์ ๋ ์ ์ด ์ฌ๋กฏ์ ๋ณด๊ณ ํฉ๋๋ค. ์ ์๋๋ฌผ ํ ๋ง๋ฆฌ๊ฐ ์ฌ๋ฌ ์ฌ๋กฏ์ ์ฐจ์งํ ์ ์์ต๋๋ค. ์ํ ๋ฐ ๊ธธ๋ค์ธ ์๋ฌผ์ ๋ํ ๊ท์น์ ์๋ฒ์์ ์ค์ ํฉ๋๋ค. ์ด๊ฒ์ ๋ณด์ด๋ mobile์ ์ซ์๋ ์๋๊ณ , ID ์ ์๋๋ฌผ์ ๋ชฉ๋ก๋ ์๋๊ณ , ๊ทผ์ฒ์ ์๋ ๋๋ฌผ์ ์ซ์๋ ์๋๋๋ค.
- CharacterStatus๋ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ํ์ํ ๋ณธ๋ฌธ์ ํ์ธํฉ๋๋ค. Weight๋ ์์ฒด ํ์ฅ ์ํ์ธ ์ฌ๋กฏ - type 3, Luck - type 4, ์๋ฒ WeightMax - type 5์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํ์ ์นด์ดํฐ๊ฐ ์๋ ์ปดํฉํธ/์ค๋๋ ํจํค์ง๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์๋ถํฐ ์์๋ฉ๋๋ค. ํตํ๋ ์๋ก์ด ์ํ๋ฅผ ๋ฐ์๋ค๋ ๊ฒ์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetFollowers();
UO.Print("GetFollowers: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ - ์ฌ์ฉ ์ค, ์ต๋ - ์ ํ, freeSlots - ์ฐจ์ด. ์ ์ ์๋/0 ์ ํ ๋๋ ์ผ๊ด์ฑ ์๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ๊ณต๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๊ณ ์ฃผ์ฅํ์ง ์๊ณ ์์ ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ต์ ์ํ๋ง ์ฝ๊ณ ์ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํ์ง ์์ต๋๋ค.
var current = UO.GetFollowers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
UO.Print("Follower status is unavailable or inconsistent");
return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ ID๊ฐ lasttarget์ ์๋๋ก ์ํ๋ ๋๋ฌผ์ ์ ํํ์ธ์. requiredSlots=2 - ์์ ์ค์ , ์๋ฒ์ ์๋ ์ด ์๋ฌผ์ ์ค์ ๋น์ฉ์ผ๋ก ๋์ฒดํ์ธ์. ๊ณต๊ฐ์ด ๋ถ์กฑํ ๊ฒฝ์ฐ ๋์์ด ์ค์ ๋์ง ์์ผ๋ฉฐ ์คํฌ์ด ํธ์ถ๋์ง ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋์์ ๋๊ธฐ์ด์ ๋จ์ผ ์ธ์ UseSkill("๋๋ฌผ ๊ธธ๋ค์ด๊ธฐ") ์ด์ ์ ์ค๋น๋ฉ๋๋ค. ์๋๋ฅผ ์์ํ๋ค๊ณ ํด์ ์ฑ๊ณต์ด ๋ณด์ฅ๋๋ ๊ฒ์ ์๋๋๋ค. ๊ธฐ์ , ๋ฒ์, ๊ธธ๋ค์ ๊ฐ๋ฅ์ฑ ๋ฐ ์๋ฒ ์๋ต์ด ์ค์ํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var requiredSlots = 2;
var current = UO.GetFollowers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
{
UO.Print("Not enough known control slots");
return null;
}
var animal = UO.LastTarget();
if (Truth(animal == 0))
{
UO.Print("Select the animal first");
return null;
}
UO.WaitTargetObject(animal);
UO.UseSkill("Animal Taming");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CanAddFollower๋ ์๋ก์ด UO ๋ช ๋ น์ด ์๋๋ผ ์์ ํ ์ ์ธ๋ ์ฌ์ฉ์ ๋์ฐ๋ฏธ์ ๋๋ค. ์บ์ ์ ํ์ด ์ถฉ๋ถํ๋ฉด 1/true๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 0/false๋ฅผ ๋ฐํํฉ๋๋ค. extraSlots ๋งค๊ฐ๋ณ์๋ type/ID๊ฐ ์๋๋ผ ADDED๋๋ ์๋ฌผ์ ๋น์ฉ์ ๋๋ค. 2 - ์; ํด๋น ๊ธฐ๋ฅ์ ๊ธธ๋ค์ด๊ฑฐ๋ ์ํํ์ง ์์ต๋๋ค. ์ ๊ฒ์ ์กฐ์น ์ง์ ์ ๋ฐ๋ณต๋์ด์ผ ํฉ๋๋ค.
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(CanAddFollower(2)))
{
UO.Print("Capacity check passed; verify the creature cost before acting");
}
else
{
UO.Print("Insufficient capacity or unavailable status");
}
return null;
}
dynamic CanAddFollower(dynamic extraSlots)
{
if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.GetFollowers();
var maximum = UO.PetsMax();
if (Truth(maximum <= 0))
{
return false;
}
return extraSlots <= maximum - current;
}
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.RegisterCharacterGetterAliases [GetFollowers]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Followers:bridge.Followers.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.FollowersAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetFollowersMax();์บ๋ฆญํฐ์ ๋ค์ ๊ธธ๋ค์ฌ์ง๊ฑฐ๋ ์ํ๋๋ ์๋ฌผ์ ์ํ ์ถฉ๋ถํ ๊ณต๊ฐ์ด ์๋์ง ๋ฏธ๋ฆฌ ๊ฒฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Followers๋ ์ ์ ๋ ์ ์ด ์ฌ๋กฏ์ ํ์ํ๊ณ , FollowersMax๋ ์ด ํ๋๋ฅผ ๋ํ๋ ๋๋ค. ์ด๊ฒ์ ๊ทผ์ฒ์ ์๋ ๋๋ฌผ์ ์๋ ์ด๋ ๋ช ๋ น Follow๊ฐ ์๋๋๋ค. ์บ๋ฆญํฐ์ ์ํ ์นด์ดํฐ(์ต๋ ์ ์๋๋ฌผ ์ ์ด ์ฌ๋กฏ)๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int - ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์๋ ์ต๋ ์ ์๋๋ฌผ ์ ์ด ์ฌ๋กฏ, 0..255. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋, ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋, ๋๋ฝ/ํ๊ดด๋ ํ๋ ์ด์ด์ผ ์ ์์ต๋๋ค. ์ด๋ bool, ID ๋๋ type๊ฐ ์๋ ์๋์ ๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋๋ผ ํ๋์ ๋จ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํ์ง ์์ผ๋ฉฐ ๋ฐฐ์ด์ ๋ฐํํ์ง ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, 5์ 3์ด ์ฌ์ฉ ์ค์ด๊ณ 2 ์ฌ๋กฏ์ ๋น์ด ์์ต๋๋ค. 4 ๊ฐ์ ํ ์ฌ๋กฏ์ ์๋ฌผ 4๊ฐ, 4๊ฐ์ ์๋ฌผ 1๊ฐ ๋๋ ๊ธฐํ ์กฐํฉ์ ์๋ฏธํ ์ ์์ต๋๋ค. 2์ ์๋ ์๋ฌผ์ ๊ฒฝ์ฐ "busy < maximum" ์ฒดํฌ ์ฌ๋กฏ์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ต๋ - ํ์ฌ >= 2๊ฐ ํ์ํฉ๋๋ค. ํน์ ์๋ฌผ์ ๋น์ฉ๊ณผ ํ๋๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. FollowersMax๋ฅผ ์์ 5๋ก ๋์ฒดํ์ง ๋ง์ธ์.
- 0๋ ์ ์๋๋ฌผ์ด ๋ถ์ค, ์ฌ๋ง ๋๋ ์๋ฐฉ๋์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. ์ ์๋๋ฌผ์ด ๋น์ด ์๊ฑฐ๋ ์ํ๊ฐ ์์ง ์ ๋ฐ์ดํธ๋์ง ์์์ ์ ์์ต๋๋ค. ์นด์ดํฐ์ ์ฆ๊ฐ๋ ์ ์ด๊ถ ๋ณ๊ฒฝ์ ์ถ๊ฐ์ ์ธ ์ ํธ์ผ ๋ฟ์ ๋๋ค. ์ด๋ค ์๋ฌผ์ด ๊ธธ๋ค์ฌ์ก๋์ง ๊ฒฐ์ ํ์ง ์์ต๋๋ค. ์๋ฒ์ ํซ ์์ฒด์ ๋ฉ์์ง๋ ํ์ธํด๋ณด์ธ์. ์ด ์ฌ๋กฏ์ ๋ง๊ตฌ๊ฐ์ ์ฅ์์ ๋์ผํ์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.FollowersMax ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- PetsMax/FollowersMax๋ ์ฌ์ ์ฌ๋กฏ์ด ์๋ type >= 3 ์ํ์์ ์๋ฒ๊ฐ ํ์ฉํ๋ ์ด ์ฌ๋กฏ ์ ํ์ ๋ณด๊ณ ํฉ๋๋ค. ํ๋๋ณด๋ค ๋ ๋ง์ ์ฌ๋กฏ์ด ์ ์ ๋์ด ์์ ์ ์์ต๋๋ค. ์ฌ์ ์ฉ๋์ ์ต๋ ์ ๋ฅ๋ก ๊ฐ์ฃผํ๊ณ ์์ ๊ฒฐ๊ณผ๋ฅผ 0๋ก ๋ฐ๊ฟ๋๋ค. ํ์ ์๋ฌด๊ฒ๋ ๊ณต๊ฐํ์ง ์์ผ๋ฉฐ, ๊ธธ๋ค์ด๊ฑฐ๋ ์๊ตฌํ์ง๋ ์์ต๋๋ค.
- CharacterStatus๋ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ํ์ํ ๋ณธ๋ฌธ์ ํ์ธํฉ๋๋ค. Weight๋ ์์ฒด ํ์ฅ ์ํ์ธ ์ฌ๋กฏ - type 3, Luck - type 4, ์๋ฒ WeightMax - type 5์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํ์ ์นด์ดํฐ๊ฐ ์๋ ์ปดํฉํธ/์ค๋๋ ํจํค์ง๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์๋ถํฐ ์์๋ฉ๋๋ค. ํตํ๋ ์๋ก์ด ์ํ๋ฅผ ๋ฐ์๋ค๋ ๊ฒ์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetFollowersMax();
UO.Print("GetFollowersMax: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ - ์ฌ์ฉ ์ค, ์ต๋ - ์ ํ, freeSlots - ์ฐจ์ด. ์ ์ ์๋/0 ์ ํ ๋๋ ์ผ๊ด์ฑ ์๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ๊ณต๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๊ณ ์ฃผ์ฅํ์ง ์๊ณ ์์ ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ต์ ์ํ๋ง ์ฝ๊ณ ์ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํ์ง ์์ต๋๋ค.
var current = UO.Followers();
var maximum = UO.GetFollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
UO.Print("Follower status is unavailable or inconsistent");
return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ ID๊ฐ lasttarget์ ์๋๋ก ์ํ๋ ๋๋ฌผ์ ์ ํํ์ธ์. requiredSlots=2 - ์์ ์ค์ , ์๋ฒ์ ์๋ ์ด ์๋ฌผ์ ์ค์ ๋น์ฉ์ผ๋ก ๋์ฒดํ์ธ์. ๊ณต๊ฐ์ด ๋ถ์กฑํ ๊ฒฝ์ฐ ๋์์ด ์ค์ ๋์ง ์์ผ๋ฉฐ ์คํฌ์ด ํธ์ถ๋์ง ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋์์ ๋๊ธฐ์ด์ ๋จ์ผ ์ธ์ UseSkill("๋๋ฌผ ๊ธธ๋ค์ด๊ธฐ") ์ด์ ์ ์ค๋น๋ฉ๋๋ค. ์๋๋ฅผ ์์ํ๋ค๊ณ ํด์ ์ฑ๊ณต์ด ๋ณด์ฅ๋๋ ๊ฒ์ ์๋๋๋ค. ๊ธฐ์ , ๋ฒ์, ๊ธธ๋ค์ ๊ฐ๋ฅ์ฑ ๋ฐ ์๋ฒ ์๋ต์ด ์ค์ํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var requiredSlots = 2;
var current = UO.Followers();
var maximum = UO.GetFollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
{
UO.Print("Not enough known control slots");
return null;
}
var animal = UO.LastTarget();
if (Truth(animal == 0))
{
UO.Print("Select the animal first");
return null;
}
UO.WaitTargetObject(animal);
UO.UseSkill("Animal Taming");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CanAddFollower๋ ์๋ก์ด UO ๋ช ๋ น์ด ์๋๋ผ ์์ ํ ์ ์ธ๋ ์ฌ์ฉ์ ๋์ฐ๋ฏธ์ ๋๋ค. ์บ์ ์ ํ์ด ์ถฉ๋ถํ๋ฉด 1/true๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 0/false๋ฅผ ๋ฐํํฉ๋๋ค. extraSlots ๋งค๊ฐ๋ณ์๋ type/ID๊ฐ ์๋๋ผ ADDED๋๋ ์๋ฌผ์ ๋น์ฉ์ ๋๋ค. 2 - ์; ํด๋น ๊ธฐ๋ฅ์ ๊ธธ๋ค์ด๊ฑฐ๋ ์ํํ์ง ์์ต๋๋ค. ์ ๊ฒ์ ์กฐ์น ์ง์ ์ ๋ฐ๋ณต๋์ด์ผ ํฉ๋๋ค.
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(CanAddFollower(2)))
{
UO.Print("Capacity check passed; verify the creature cost before acting");
}
else
{
UO.Print("Insufficient capacity or unavailable status");
}
return null;
}
dynamic CanAddFollower(dynamic extraSlots)
{
if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.PetsCurrent();
var maximum = UO.GetFollowersMax();
if (Truth(maximum <= 0))
{
return false;
}
return extraSlots <= maximum - current;
}
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.RegisterCharacterGetterAliases [GetFollowersMax]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.FollowersMax:bridge.FollowersMax.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.FollowersMaxAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetMobile(object? id);๋ถ๋์ฐ์ ๋ํ ๊ฐ๋ตํ ๊ธฐ๋ก์ ํ๋์ฉ ์์งํฉ๋๋ค ID.
-
idโ ํน์ ๊ฐ์ฒด์ ์ผ๋ จ๋ฒํธ/ID: int, 10์ง์/16์ง์ ๋ฌธ์์ด ๋๋ ๋ณ์นญ ์ค์ self, backpack, lasttarget, lastobject ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค.
9 ํ๋ ๋ฐฐ์ด: [0] int serial, [1] string ์ด๋ฆ, [2] int X, [3] int Y, [4] int Z, [5] int HP, [6] int MaxHP, [7] int ์ ๋ช , [8] int ๋ฐฉํฅ 0..7. ์ ์ ์๋ ID์ ๊ฒฝ์ฐ ๋ฐฐ์ด์๋ 9 ํ๋๋ ์์ต๋๋ค. ์ ๋ฌ๋ ID๋ ์ ์ฅ๋๊ณ ์ด๋ฆ์ ๋น์ด ์์ผ๋ฉฐ ์ฌ์ฉํ ์ ์๋ ์ซ์ ์์ฑ์ 0์ ๋๋ค. ์ด๊ฒ์ ์์ ํ ํ์ค์นผ ๊ธฐ๋ก TMobile์ด ์๋๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฏธ ๋ค์ด๋ก๋ํ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์ด ๋ช ๋ น์ ์ ์ฒด ์๋ฒ์์ ์ปจํ ์ด๋๋ฅผ ์ด๊ฑฐ๋ ํญ๋ชฉ์ ์ด๋ํ๊ฑฐ๋ ๊ฐ์ฒด๋ฅผ ๋ค์ด๋ก๋ํ์ง ์์ต๋๋ค.
- ๋ฐฐ์ด - 0๋ถํฐ ์์ํ๋ ์ธ๋ฑ์ค๊ฐ ์๋ ๋ฐฐ์ด์ ๋๋ค. var์ ์ ์ฅํ๊ณ , ArrayLength๋ฅผ ํ์ธํ ํ ์ ์ํ์ธ์. ์ค๋ ์ท์ ์ฐ์ ํ ์์๊ฐ ์ธ๊ณ์์ ์ฌ๋ผ์ง ์ ์์ต๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ Exists(serial)๋ฅผ ํ์ธํ์ธ์.
- 9๊ฐ์ ํ๋๊ฐ ์๋ค๊ณ ํด์ ์บ๋ฆญํฐ์ ์กด์ฌ๊ฐ ํ์ธ๋๋ ๊ฒ์ ์๋๋๋ค. Exists๋ฅผ ์ฌ์ฉํ์ธ์. ๋ช ๋ น ์์ฒด๋ ID๊ฐ Mobile์ ์ํ๋์ง ํ์ธํ์ง ์์ต๋๋ค. ํญ๋ชฉ์ ์ด๋ฆ/์ขํ ๋ฐ 0๊ฐ์ ๋ฌธ์ ์์ฑ์ด ๋ฐํ๋ ์ ์์ต๋๋ค.
- ๋ค๋ฅธ ์บ๋ฆญํฐ์ HP/MaxHP๋ ์๋ฒ์์ ๋ณด๋ด๋ ์ค์ผ์ผ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. Z - ์ฅ๋น ๋ ์ด์ด๊ฐ ์๋ ๋์ด์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetMobile("self");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ID=self. [1]๋ ์ด๋ฆ์ด๊ณ , [5]/[6]๋ Mana๊ฐ ์๋ ํ์ฌ ๋ฐ ์ต๋ HP์ ๋๋ค.
- ๋ฐฐ์ด์๋ 9๊ฐ์ ํ๋๊ฐ ๊ณ ์ ๋์ด ์์ต๋๋ค. ์๋์ ์ง์ ํ๊ธฐ ์ ๋น ์ด๋ฆ๊ณผ 0/0 ๊ฐ๋ฅํฉ๋๋ค.
var mobile = UO.GetMobile("self");
UO.Print(mobile[1] + ": " + Convert.ToString(mobile[5]) + "/" + Convert.ToString(mobile[6]));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- lasttarget๋ ๋ฌธ์๋ฅผ ๋ํ๋ด์ผ ํฉ๋๋ค. [2]/[3]/[4] - X/Y/Z ์ธ๊ณ.
- ๋จผ์ , ๋ฌผ์ฒด์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. ๋์์ด ๊ฐ๋ฐฉ์ ์๋ ํญ๋ชฉ์ธ ๊ฒฝ์ฐ ์ขํ๋ ํด๋น ํญ๋ชฉ์ ๊ฒํ๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(target)))
{
var mobile = UO.GetMobile(target);
UO.Print(Convert.ToString(mobile[2]) + "," + Convert.ToString(mobile[3]) + "," + Convert.ToString(mobile[4]));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- [7] - ์ ๋ช ์ ์๋ฏธ, [8] - ๋ฐฉํฅ 0..7. type ํ๋๊ฐ ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์๋ ค์ง ๋ฐ์ดํฐ๋ฅผ ์ฝ์ง๋ง ์บ๋ฆญํฐ๋ฅผ ์ง์ํ๊ฑฐ๋ ์ ํฌ ๋ชจ๋๋ฅผ ์ ํํ์ง๋ ์์ต๋๋ค.
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 target = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(target)))
{
var mobile = UO.GetMobile(target);
UO.Print("Notoriety: " + Convert.ToString(mobile[7]));
UO.Print("Direction: " + Convert.ToString(mobile[8]));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: id (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetHP:bridge.GetHP(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetMaxHP:bridge.GetMaxHP(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetNotoriety:bridge.GetNotoriety(id). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDir:bridge.GetDir(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getmobile":
{
int id = Arg(0);
return new InjectionValue(new[]
{
new InjectionValue(id), new InjectionValue(bridge.GetName(id)), new InjectionValue(bridge.GetX(id)),
new InjectionValue(bridge.GetY(id)), new InjectionValue(bridge.GetZ(id)), new InjectionValue(bridge.GetHP(id)),
new InjectionValue(bridge.GetMaxHP(id)), new InjectionValue(bridge.GetNotoriety(id)), new InjectionValue(bridge.GetDir(id))
});
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetMobiles();
dynamic UO.GetMobiles(object? distance);
dynamic UO.GetMobiles(object? distance, object? notoriety);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf, object? aliveOnly);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf, object? aliveOnly, object? visibleOnly);์ผ์นํ๋ ๋ก๋๋ ๋ฌธ์/NPC์ ๋ฐฐ์ด ID์ ๊ฐ์ ธ์ต๋๋ค. ์คํฌ๋ฆฝํธ๊ฐ ์ฌ๋ฌ ๋์์ ํ์ธํ๊ฑฐ๋, ์์ฒด ๋์์ ์ ํํ๊ฑฐ๋, ํ๊ฒฝ์ ๊ณ์ฐํ๊ฑฐ๋, ์์ ์ ์ ์์ฒด ์กฐ๊ฑด์ ์ถ๊ฐํด์ผ ํ ๋ ํ์ํฉ๋๋ค.
-
distanceโ ์ ์ ํฌํจํ ์ํ ๋ฐ๊ฒฝ: 5๋ ๊ฑฐ๋ฆฌ 0..5๋ฅผ ํ์ฉํฉ๋๋ค. ๊ฑฐ๋ฆฌ๋ max(abs(dx),abs(dy))์ด๋ฏ๋ก ์ธ์ ํ ๋๊ฐ์ ๋ 1์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ซ์๊ฐ ์์์ธ ๊ฒฝ์ฐ์๋ ๋ฌด์ ํ ๊ฒ์์ด ์๋ UO.FindDistance()์ ์ ํํฉ๋๋ค. 0๋ ๋์ผํ X/Y ์ ์ ๋จ๊น๋๋ค. ๊ฒฝ๋ก์ ๊ธธ์ด๊ฐ ์๋๋๋ค. ์ฅ์ ๋ฌผ๊ณผ ๋ฐ๋ฅ์ ์ด ๋งค๊ฐ๋ณ์๋ก ํ์ธ๋์ง ์์ต๋๋ค. -
notorietyโ ์๋ฒ์์ ๋ฐ์ ์บ๋ฆญํฐ์์ ๊ด๊ณ ์ํ: 0 โ ์ ์ ์์, 1 โ ๋ฌด์ฃ, 2 โ ๋๋งน, 3 โ ํ์, 4 โ ๋ฒ์ฃ, 5 โ ์ , 6 โ ์ด์ธ์, 7 - ๋ฌด์ ์ ๋๋ค. ์ซ์๋ ํ๋์ ์ํ๋ฅผ ์๋ฏธํฉ๋๋ค. "5|6" ๋๋ ์ซ์ ๋ฐฐ์ด - ์ ํญ๋ชฉ ์ค ํ๋. ์ท์ ์๊น์ด๋ ์์ ์ ์๊น์ด ์๋๋๋ค. ์์(๋ณดํต -1), 0xFFFF, "any", ๋น ๋ฌธ์์ด ๋๋ ๋น ๋ฐฐ์ด์ ์ด ํํฐ๋ฅผ ๋ณ๋๋ก ๋นํ์ฑํํฉ๋๋ค. ์ ํจํ ์ซ์๊ฐ ์๋ ์๋ชป๋ ๋ฌธ์์ด์ ๋๊ตฌ๋ ์ฐพ์ ์ ์์ต๋๋ค. ์ํ ์์์ ๋ฐ๋ผ ์ฐ์ ์์๊ฐ ์ค์ ๋์ง ์์ต๋๋ค. 5 ํํฐ๋ NPC/๋ชฌ์คํฐ๋ฅผ ์๋์ผ๋ก ์ ํํ๋ ๋์ ์ ์ ์ ํํฉ๋๋ค. ์ค์ ๊ฐ์ ์๋ฒ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. -
body- ํน์ ์บ๋ฆญํฐ์ ID๋ ์ฐฉ์ฉํ ๊ฐ์ท์ type๊ฐ ์๋ ์บ๋ฆญํฐ์ ์ ์ฒด/NPC ๊ทธ๋ํฝ์ ๋๋ค. ์ซ์, 16์ง์ ๋ฌธ์์ด, ๋ฌธ์์ด "0x0190|0x0191" ๋๋ ์ซ์ ๋ฐฐ์ด. 0x0190 (400) - ์ธ๊ฐ ๋จ์ฑ; 0x0191 (401) - ์ฌ์ฑ ์ธ๊ฐ. ๋ง์คํฌ๋ ๋ ๋ชธ์ ํ๋๋ก ๋ฌถ์ต๋๋ค. ๋ชฉ๋ก์๋ ๋ค๋ฅธ ์ข ์กฑ, ์ ๋ น ๋๋ ๋ณ์ ์ด ์๋์ผ๋ก ํฌํจ๋์ง ์์ต๋๋ค. ํ์ค ๊ทธ๋ํฝ ์ ์ฒด ์ ํ ํ. ์์(๊ธฐ๋ณธ์ ์ผ๋ก -1), 0xFFFF, "any", ๋น ๋ฌธ์์ด ๋๋ ๋น ๋ฐฐ์ด๋ง - ๋ชจ๋ ๋ณธ๋ฌธ. ์ ํจํ ์ซ์๊ฐ ์๋ ์ ์ ์๋ ํ ์คํธ๋ ๋น ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค. -
maxZโ ์ต๋ ๋ณต๊ทผ(Z ๋์ - ์บ๋ฆญํฐ์ Z)์ ํฌํจํ๋ฉฐ, Z ์ธ๊ณ ๋จ์์ ๋๋ค. ์ด๊ฒ์ ์ธต์๋ ์ ์ X/Y๊ฐ ์๋๋๋ค. maxZ=4 Z ํ๋ ์ด์ด 10๋ Z ๋์ 6..14๋ฅผ ํ์ฉํฉ๋๋ค. 0์๋ ์ ํํ ๋์ผํ ๋์ด๊ฐ ํ์ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก/์์์ ๊ฒฝ์ฐ UO.FindVertical()๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ณ๋จ์์๋ Z๋ก ์ํ๋ ๋์์ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์์ ์ฐจ์ด Z๋ ๋ฐ๋ฅ์ ์ ๊ทผ์ฑ์ ์ ์ฆํ์ง ๋ชปํฉ๋๋ค. -
nearest- true/1 ๋ฐฐ์ด์ ๊ฐ๊น์ด ๊ฒ๋ถํฐ ๋จผ ๊ฒ ์์ผ๋ก ์ ๋ ฌํ ๋ค์, ๊ฐ์ผ๋ฉด serial๋ก ์ ๋ ฌํฉ๋๋ค. false/0๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋ผ์ด์ธํธ ์์๋ฅผ ์ ์งํฉ๋๋ค. ์ด๋ ์ถ๊ฐ ๋ฐ๊ฒฝ์ด๋ ํ๋์ ๊ฐ์ฒด ์ ํ์ด ์๋๋๋ค. -
includeSelf- true/1๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ๋ชจ๋ ํํฐ์ Ignore๊ฐ ํ์ฉํ๋ ๊ฒฝ์ฐ self๋ฅผ ํ์ฑํํ ์ ์์ต๋๋ค. false/0๋ ๊ธฐ๋ณธ์ ์ผ๋ก self๋ฅผ ์ ์ธํฉ๋๋ค. ํฌํจํ๋ค๊ณ ํด์ ๊ฒฐ๊ณผ์ self๊ฐ ์กด์ฌํ๋ค๊ณ ๋ณด์ฅ๋๋ ๊ฒ์ ์๋๋๋ค. -
aliveOnly- true/1๋ IsDead != 0์ธ ๋ชจ๋ฐ์ผ์ ์ ์ธํฉ๋๋ค. false/0๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ์กฐ๊ฑด์ ์ถ๊ฐํ์ง ์์ต๋๋ค. HP๋ฅผ 0๊ณผ ๋น๊ตํ์ง ์๊ณ , ์์ฒด ์์ดํ ์ ๊ฒ์ํ์ง ์์ผ๋ฉฐ, ๋์์ด ์ํ๋ ํ์๋ ์ด์๋จ์ ๊ฒ์ด๋ผ๊ณ ๋ณด์ฅํ์ง ์์ต๋๋ค. -
visibleOnly- true/1์๋ ํ์ฌ ์ํ ClassicUO์ ๋ฐ๋ผ IsVisible=1๊ฐ ํ์ํฉ๋๋ค. false/0๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์กฐ๊ฑด์ ์ถ๊ฐํ์ง ์์ต๋๋ค. ์ด๋ ๋ฒฝ/์์ ๊ฒ์ฌ๊ฐ ์๋ ํด๋ผ์ด์ธํธ์ ๋ํ ๋ก๋๋ ๊ฐ์ฒด์ ๊ฐ์์ฑ์ ๋๋ค. ๊ธฐํํ์ ๊ฒ์ฌ๋ฅผ ์ํด ์ขํ๊ฐ ํฌํจ๋ ๋ณ๋์ UO.CheckLOS๊ฐ ์์ต๋๋ค. ์๋ฒ๋ ์ฌ์ ํ ์์ ์ ๊ฑฐ๋ถํ ์ ์์ต๋๋ค.
๋ฐฐ์ด - serial ๋ชจ๋ฐ์ผ. ๋น ๋ฐฐ์ด์ ์ผ์นํ๋ ํญ๋ชฉ์ด ์์์ ์๋ฏธํฉ๋๋ค. ๋ชฉํ[0] ์ ์ ArrayLength๋ฅผ ํ์ธํ์ธ์. body/type๋ ์๋๊ณ , ์ ์ฒด HP๋ ์๋๊ณ , 1/0๋ ์๋๋๋ค. ์ธ์ ์๋ ํ์์ FindDistance/FindVertical/Ignore์ ๊ณ์ ์ ์ฉ๋๊ณ self๋ ์ ์ธ๋ฉ๋๋ค.
- ์ง์ญ ๊ฒ์: ์ด๋ฏธ ๋ค์ด๋ก๋ํ ๋ชจ๋ฐ์ผ์๋ง ํด๋น๋ฉ๋๋ค. Ignore์ด ๊ณ ๋ ค๋ฉ๋๋ค. self๋ ์ง์ํ๋ ๋ช ๋ น์์ ๋ช ์์ ์ผ๋ก includeSelf=true๋ฅผ ์ ์ธํ๊ณ ๋ ์ ์ธ๋ฉ๋๋ค. ์ปจํ ์ด๋์ ์์ดํ ์ ๋ชจ๋ฐ์ผ์ด ์๋๋๋ค.
- ์กฐ๊ฑด์ด ํจ๊ป ์ ์ฉ๋ฉ๋๋ค(AND). body/notoriety ๋ด์ ์ ํจํ ๋์์ OR๋ฅผ ํตํด ๊ฒฐํฉ๋ฉ๋๋ค. FindItem, FindCount ๋ฐ GetFoundItems์์๋ ๊ฒ์์ด ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- body/notoriety์์ ์ ํจํ ์ซ์๊ฐ ์๋ ๋ง์คํฌ๋ ๋ค์์ ์ฌ์ฉํฉ๋๋ค. "any|5"๋ ์ฌ์ ํ 5๋ก ์ ํ๋ฉ๋๋ค. ์ ํจํ ์ซ์ ์์ ์๋ ๊ณต๋ฐฑ/์๋ชป๋ ์์๋ ๋ฌด์๋ฉ๋๋ค. ์ ํ์ด ์์ผ๋ฉด -1๋ฅผ ๋ณ๋๋ก ์ ๋ฌํ์ธ์. ์ด ๊ท์น์ classMask์ ์ ์ฉํ์ง ๋ง์ธ์. ์ ์ ์๋ ํด๋์ค ์ด๋ฆ์ ์ ์ฒด ๋ชฉ๋ก์ ๊ฑฐ๋ถํฉ๋๋ค.
- ํ์ ์ธ๊ณ์ ์์ญ์ ์ด์ง ์์ผ๋ฉฐ ๋ชฉํ๋ฅผ ํฅํด ๋ฌ๋ฆฌ์ง ์์ผ๋ฉฐ ๊ฒฝ๋ก์ ํต๊ณผ ๊ฐ๋ฅ์ฑ์ ํ์ธํ์ง ์์ต๋๋ค. ์ ํ๊ณผ ์๋ฒ ์ฒ๋ฆฌ ์ฌ์ด์ ์ธ์์ ์ํ๊ฐ ๋ฐ๋ ์ ์์ต๋๋ค.
- true ๋ฐ 1์ ์ ์ก์ ํ๋๊ทธ false ๋ฐ 0์๋ ๋์ผํฉ๋๋ค. 0์ด ์๋ ๋ค๋ฅธ ์ซ์๋ true๋ก ๋ณํ๋์ง๋ง 8/9๋ ๋ณ๋์ ๋ชจ๋๊ฐ ์๋๋๋ค. ํด๋ฆฌ์ด true/false๋ฅผ ์ฌ์ฉํ์ธ์.
- 0..8 ์์น ์ธ์๊ฐ ์ง์๋ฉ๋๋ค. classMask ๋ฐ ์์์ ์ด ๋ช ๋ น์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ธ์ AttackNearest์ ์์๋ฅผ ์ด์ด๋ฐ์ง ๋ง์ธ์.
- ๋ฐฐ์ด - ์ค๋ ์ท ID. ๋์์ ๋์ค์ ์ฌ๋ผ์ง ์ ์์ต๋๋ค. ๊ฒ์๊ณผ ์์ ์ฌ์ด์ ๋๊ธฐ ์๊ฐ์ด ์์๋์ง Exists๋ฅผ ๋ค์ ํ์ธํ์ธ์. ๊ทธ ์์ฒด๋ก๋ ์๋ฌด๊ฒ๋ ๊ณต๊ฒฉํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetMobiles(5, 2, -1, 8, true, false, true, true);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- nearestFirst=true๋ ์๊ตฐ[0]์ ๊ฐ์ฅ ๊ฐ๊น์ด ์๊ตฐ์ผ๋ก ๋ง๋ญ๋๋ค. Follow์๋ ๋ฐฐ๊ฒฝ ๊ฑท๊ธฐ๊ฐ ํฌํจ๋ฉ๋๋ค. UO.Follow(0)์ ์ ์ฐจํฉ๋๋ค. ์๊ตฐ์ ์ด๋ฆ/ํด๋์ค๋ ์ด ๋ช ๋ น์ผ๋ก ๊ฒฐ์ ๋์ง ์์ต๋๋ค.
var radius = 12;
var allyStatus = 2;
var anyBody = -1;
var maxHeight = 8;
dynamic nearestFirst = true;
dynamic includeMe = false;
dynamic livingOnly = true;
dynamic visibleOnly = true;
var allies = UO.GetMobiles(radius, allyStatus, anyBody, maxHeight, nearestFirst, includeMe, livingOnly, visibleOnly);
if (Truth(ArrayLength(allies) == 0))
{
return null;
}
UO.AddObject("leader", allies[0]);
UO.Follow(allies[0], 2, false);
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;2. ์ํํ ๋์์ ์๋ฅผ ์ธ๊ณ ๊ทธ ์์ ๋ฐ๋ผ ์กฐ์น๋ฅผ ์ ํํ์ญ์์ค - ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ
๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฌ๊ธฐ์๋ Nearest=false๊ฐ ์ ์ ํฉ๋๋ค. ์นด์ดํฐ๊ฐ ์ค์ํฉ๋๋ค. ArrayLength๋ ์คํ์ ์๋ ํญ๋ชฉ ์๊ฐ ์๋๋ผ ๋ชจ๋ฐ์ผ ์์ ๋๋ค. Alarm๋ ๋ก๊ทธ์ ์๋ฆผ์ ์ธ์ํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var enemies = UO.GetMobiles(5, "5|6", -1, 4, false, false, true, true);
var count = ArrayLength(enemies);
if (Truth(count == 1))
{
UO.Attack(enemies[0]);
}
else if (Truth(count > 1))
{
UO.Alarm();
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฑฐ๋ฆฌ=0 - ๋์ผ X/Y, maxZ=0 - ๋์ผ Z. body๋ 2๊ฐ์ graphic๋ก ์ ํ๋ฉ๋๋ค. includeSelf=true๋ self๋ฅผ ํ์ฉํ์ง๋ง ์ฌ์ ํ body ๋ฐ aliveOnly์ ์ผ์นํด์ผ ํฉ๋๋ค. ์ด ์์์๋ ๋์ผํ ์ฌ๊ฐํ์ ์๋ ๋ค๋ฅธ ๋ฌธ์๋ฅผ ๋ณด๊ณ ํฉ๋๋ค.
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 sameCell = UO.GetMobiles(0, -1, "0x0190|0x0191", 0, false, true, true, false);
var i = 0;
var others = 0;
while (Truth(i < ArrayLength(sameCell)))
{
if (Truth(sameCell[i] != UO.GetSerial("self")))
{
others += 1;
}
i += 1;
}
if (Truth(others > 0))
{
UO.Alarm();
}
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.RegisterCompactSearchApi [GetMobiles]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetMobiles:CompactGetMobiles(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => CompactGetMobiles(values)๋งค๊ฐ๋ณ์: distance (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetMobiles]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetMobiles:CompactGetMobiles(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => CompactGetMobiles(values)๋งค๊ฐ๋ณ์: distance (Any), notoriety (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetMobiles]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetMobiles:CompactGetMobiles(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => CompactGetMobiles(values)๋งค๊ฐ๋ณ์: distance (Any), notoriety (Any), body (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetMobiles]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetMobiles:CompactGetMobiles(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => CompactGetMobiles(values)๋งค๊ฐ๋ณ์: distance (Any), notoriety (Any), body (Any), maxZ (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetMobiles]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetMobiles:CompactGetMobiles(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => CompactGetMobiles(values)๋งค๊ฐ๋ณ์: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetMobiles]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetMobiles:CompactGetMobiles(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => CompactGetMobiles(values)
UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf) โ UO.GetMobiles(Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any), includeSelf (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetMobiles]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetMobiles:CompactGetMobiles(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => CompactGetMobiles(values)
UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf, aliveOnly) โ UO.GetMobiles(Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any), includeSelf (Any), aliveOnly (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetMobiles]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetMobiles:CompactGetMobiles(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => CompactGetMobiles(values)
UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf, aliveOnly, visibleOnly) โ UO.GetMobiles(Any,Any,Any,Any,Any,Any,Any,Any)
๋งค๊ฐ๋ณ์: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any), includeSelf (Any), aliveOnly (Any), visibleOnly (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [GetMobiles]. -
InjectionScript.Runtime.InjectionApiUO.CompactGetMobiles:CompactGetMobiles(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => CompactGetMobiles(values)ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetNotoriety();
int UO.GetNotoriety(object? id);ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์ ์บ๋ฆญํฐ์ ํํ์ ์ฝ์ต๋๋ค.
-
idโ ์ง์ ๋ ๋จ์ผ ๋งค๊ฐ๋ณ์ ํ์์ ์ ํ์ ๊ฐ์ฒด: serial ์ซ์/16์ง์ ๋ฌธ์์ด, "self", "lasttarget" ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. ๋ ผ์์ด ์์ผ๋ฉด ์์ ์ ์ฑ๊ฒฉ์ด ์ฝํ์ง๋๋ค. ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฝ๊ธฐ ์ ์ UO.Exists๋ฅผ ํ์ธํ์ธ์. ์ ์ ์๋ ์ด๋ฆ์ ๋ฒ์๋ฅผ ์ด์ง ์์ต๋๋ค.
int โ 0=์ ์ ์์, 1=๋ฌด์ฃ, 2=๋๋งน, 3=ํ์, 4=๋ฒ์ฃ์, 5=์ , 6=์ด์ธ์, 7=๋ฌด์ ์ ๋๋ค. ์ด๋ hue, ์นด๋ฅด๋ง ๋๋ ๋ช ์ฑ์ด ์๋ ์ํ ์ฝ๋์ ๋๋ค. ์ ์ ์์ mobile๋ 0์ ์ ๊ณตํฉ๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetNotoriety();
UO.Print("GetNotoriety: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์บ๋ฆญํฐ์ ํํ์ ๊ฐ์น๋ก ์ ์ฅ๋ฉ๋๋ค.
- Convert.ToString๋ ์ถ๋ ฅํ ์ซ์๋ฅผ ๋ณํํ๋ฉฐ ๊ฒฐ๊ณผ์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
var value = UO.GetNotoriety();
UO.Print("GetNotoriety: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ ์์ด ๊ฐ์ ํ ๋ฒ ์ฝ์ต๋๋ค. ์บ๋ฆญํฐ์ ํํ์ ํ์๋ ๊ณ์ฐ์ด๋ ์กฐ๊ฑด์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ซ์ ์๊ณ๊ฐ์ ์คํฌ๋ฆฝํธ ์กฐ๊ฑด์ ์์ด๋ฉฐ ์๋ก์ด ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋๋๋ค. ํ๋์๋ ์์ ์ค๋ช ๋ ์๋ฒ ๋จ์ ๋ฐ ์ ํ ์ฌํญ์ด ์ ์ฅ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.GetNotoriety();
if (Truth(value == 3) || Truth(value == 4))
{
UO.Print("Gray or criminal notoriety");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จ์ผ ์ธ์๋ ๊ฐ์ฒด lasttarget๋ฅผ ์ ํํฉ๋๋ค. ํด๋น serial๋ ํด๋ผ์ด์ธํธ์ ์๋ ค์ ธ์ผ ํฉ๋๋ค. ๊ทธ๋ํฝ/type๋ ์ฌ๊ธฐ๋ก ์ ์ก๋์ง ์์ต๋๋ค.
- Exists๊ฐ ์์์ธ ๊ฒฝ์ฐ์๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ ์์ ์ ์์ต๋๋ค. ๊ฐ๋ฐฉ ์ ์์ดํ ์ ์ขํ๋ ์๋ ํฌ์ธํธ๊ฐ ์๋ ์ปจํ ์ด๋์ ์์น๋ฅผ โโ๊ตฌํฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
var targetValue = UO.GetNotoriety("lasttarget");
UO.Print("Selected value: " + Convert.ToString(targetValue));
}
else
{
UO.Print("Target is not loaded");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [GetNotoriety]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetNotoriety:bridge.GetNotoriety(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.GetNotoriety(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetNotoriety:bridge.GetNotoriety(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getnotoriety": return new InjectionValue(bridge.GetNotoriety(Arg(0)));๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetNotoriety. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetNotoriety:bridge.GetNotoriety(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetNotoriety(int id) => bridge.GetNotoriety(id);๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetNotoriety. -
InjectionScript.Runtime.InjectionApiUO.GetNotoriety:GetNotoriety(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetNotoriety(string id) => GetNotoriety(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetPetsCurrent();์บ๋ฆญํฐ์ ๋ค์ ๊ธธ๋ค์ฌ์ง๊ฑฐ๋ ์ํ๋๋ ์๋ฌผ์ ์ํ ์ถฉ๋ถํ ๊ณต๊ฐ์ด ์๋์ง ๋ฏธ๋ฆฌ ๊ฒฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Followers๋ ์ ์ ๋ ์ ์ด ์ฌ๋กฏ์ ํ์ํ๊ณ , FollowersMax๋ ์ด ํ๋๋ฅผ ๋ํ๋ ๋๋ค. ์ด๊ฒ์ ๊ทผ์ฒ์ ์๋ ๋๋ฌผ์ ์๋ ์ด๋ ๋ช ๋ น Follow๊ฐ ์๋๋๋ค. ์บ๋ฆญํฐ์ ์ํ ์นด์ดํฐ(์ ์ ๋ ์ ์๋๋ฌผ ์ ์ด ์ฌ๋กฏ)๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int - ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์๋ ์ ์๋๋ฌผ ์ ์ด ์ฌ๋กฏ, 0..255๋ฅผ ์ฐจ์งํฉ๋๋ค. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋, ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋, ๋๋ฝ/ํ๊ดด๋ ํ๋ ์ด์ด์ผ ์ ์์ต๋๋ค. ์ด๋ bool, ID ๋๋ type๊ฐ ์๋ ์๋์ ๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋๋ผ ํ๋์ ๋จ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํ์ง ์์ผ๋ฉฐ ๋ฐฐ์ด์ ๋ฐํํ์ง ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, 5์ 3์ด ์ฌ์ฉ ์ค์ด๊ณ 2 ์ฌ๋กฏ์ ๋น์ด ์์ต๋๋ค. 4 ๊ฐ์ ํ ์ฌ๋กฏ์ ์๋ฌผ 4๊ฐ, 4๊ฐ์ ์๋ฌผ 1๊ฐ ๋๋ ๊ธฐํ ์กฐํฉ์ ์๋ฏธํ ์ ์์ต๋๋ค. 2์ ์๋ ์๋ฌผ์ ๊ฒฝ์ฐ "busy < maximum" ์ฒดํฌ ์ฌ๋กฏ์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ต๋ - ํ์ฌ >= 2๊ฐ ํ์ํฉ๋๋ค. ํน์ ์๋ฌผ์ ๋น์ฉ๊ณผ ํ๋๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. FollowersMax๋ฅผ ์์ 5๋ก ๋์ฒดํ์ง ๋ง์ธ์.
- 0๋ ์ ์๋๋ฌผ์ด ๋ถ์ค, ์ฌ๋ง ๋๋ ์๋ฐฉ๋์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. ์ ์๋๋ฌผ์ด ๋น์ด ์๊ฑฐ๋ ์ํ๊ฐ ์์ง ์ ๋ฐ์ดํธ๋์ง ์์์ ์ ์์ต๋๋ค. ์นด์ดํฐ์ ์ฆ๊ฐ๋ ์ ์ด๊ถ ๋ณ๊ฒฝ์ ์ถ๊ฐ์ ์ธ ์ ํธ์ผ ๋ฟ์ ๋๋ค. ์ด๋ค ์๋ฌผ์ด ๊ธธ๋ค์ฌ์ก๋์ง ๊ฒฐ์ ํ์ง ์์ต๋๋ค. ์๋ฒ์ ํซ ์์ฒด์ ๋ฉ์์ง๋ ํ์ธํด๋ณด์ธ์. ์ด ์ฌ๋กฏ์ ๋ง๊ตฌ๊ฐ์ ์ฅ์์ ๋์ผํ์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.Followers ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- PetsCurrent/Followers๋ ์ํ type >= 3์์ ์ ์ ๋ ์ ์ด ์ฌ๋กฏ์ ๋ณด๊ณ ํฉ๋๋ค. ์ ์๋๋ฌผ ํ ๋ง๋ฆฌ๊ฐ ์ฌ๋ฌ ์ฌ๋กฏ์ ์ฐจ์งํ ์ ์์ต๋๋ค. ์ํ ๋ฐ ๊ธธ๋ค์ธ ์๋ฌผ์ ๋ํ ๊ท์น์ ์๋ฒ์์ ์ค์ ํฉ๋๋ค. ์ด๊ฒ์ ๋ณด์ด๋ mobile์ ์ซ์๋ ์๋๊ณ , ID ์ ์๋๋ฌผ์ ๋ชฉ๋ก๋ ์๋๊ณ , ๊ทผ์ฒ์ ์๋ ๋๋ฌผ์ ์ซ์๋ ์๋๋๋ค.
- CharacterStatus๋ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ํ์ํ ๋ณธ๋ฌธ์ ํ์ธํฉ๋๋ค. Weight๋ ์์ฒด ํ์ฅ ์ํ์ธ ์ฌ๋กฏ - type 3, Luck - type 4, ์๋ฒ WeightMax - type 5์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํ์ ์นด์ดํฐ๊ฐ ์๋ ์ปดํฉํธ/์ค๋๋ ํจํค์ง๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์๋ถํฐ ์์๋ฉ๋๋ค. ํตํ๋ ์๋ก์ด ์ํ๋ฅผ ๋ฐ์๋ค๋ ๊ฒ์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetPetsCurrent();
UO.Print("GetPetsCurrent: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ - ์ฌ์ฉ ์ค, ์ต๋ - ์ ํ, freeSlots - ์ฐจ์ด. ์ ์ ์๋/0 ์ ํ ๋๋ ์ผ๊ด์ฑ ์๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ๊ณต๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๊ณ ์ฃผ์ฅํ์ง ์๊ณ ์์ ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ต์ ์ํ๋ง ์ฝ๊ณ ์ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํ์ง ์์ต๋๋ค.
var current = UO.GetPetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
UO.Print("Follower status is unavailable or inconsistent");
return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ ID๊ฐ lasttarget์ ์๋๋ก ์ํ๋ ๋๋ฌผ์ ์ ํํ์ธ์. requiredSlots=2 - ์์ ์ค์ , ์๋ฒ์ ์๋ ์ด ์๋ฌผ์ ์ค์ ๋น์ฉ์ผ๋ก ๋์ฒดํ์ธ์. ๊ณต๊ฐ์ด ๋ถ์กฑํ ๊ฒฝ์ฐ ๋์์ด ์ค์ ๋์ง ์์ผ๋ฉฐ ์คํฌ์ด ํธ์ถ๋์ง ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋์์ ๋๊ธฐ์ด์ ๋จ์ผ ์ธ์ UseSkill("๋๋ฌผ ๊ธธ๋ค์ด๊ธฐ") ์ด์ ์ ์ค๋น๋ฉ๋๋ค. ์๋๋ฅผ ์์ํ๋ค๊ณ ํด์ ์ฑ๊ณต์ด ๋ณด์ฅ๋๋ ๊ฒ์ ์๋๋๋ค. ๊ธฐ์ , ๋ฒ์, ๊ธธ๋ค์ ๊ฐ๋ฅ์ฑ ๋ฐ ์๋ฒ ์๋ต์ด ์ค์ํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var requiredSlots = 2;
var current = UO.GetPetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
{
UO.Print("Not enough known control slots");
return null;
}
var animal = UO.LastTarget();
if (Truth(animal == 0))
{
UO.Print("Select the animal first");
return null;
}
UO.WaitTargetObject(animal);
UO.UseSkill("Animal Taming");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CanAddFollower๋ ์๋ก์ด UO ๋ช ๋ น์ด ์๋๋ผ ์์ ํ ์ ์ธ๋ ์ฌ์ฉ์ ๋์ฐ๋ฏธ์ ๋๋ค. ์บ์ ์ ํ์ด ์ถฉ๋ถํ๋ฉด 1/true๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 0/false๋ฅผ ๋ฐํํฉ๋๋ค. extraSlots ๋งค๊ฐ๋ณ์๋ type/ID๊ฐ ์๋๋ผ ADDED๋๋ ์๋ฌผ์ ๋น์ฉ์ ๋๋ค. 2 - ์; ํด๋น ๊ธฐ๋ฅ์ ๊ธธ๋ค์ด๊ฑฐ๋ ์ํํ์ง ์์ต๋๋ค. ์ ๊ฒ์ ์กฐ์น ์ง์ ์ ๋ฐ๋ณต๋์ด์ผ ํฉ๋๋ค.
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(CanAddFollower(2)))
{
UO.Print("Capacity check passed; verify the creature cost before acting");
}
else
{
UO.Print("Insufficient capacity or unavailable status");
}
return null;
}
dynamic CanAddFollower(dynamic extraSlots)
{
if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.GetPetsCurrent();
var maximum = UO.PetsMax();
if (Truth(maximum <= 0))
{
return false;
}
return extraSlots <= maximum - current;
}
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.RegisterCharacterGetterAliases [GetPetsCurrent]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Followers:bridge.Followers.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.FollowersAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetPetsMax();์บ๋ฆญํฐ์ ๋ค์ ๊ธธ๋ค์ฌ์ง๊ฑฐ๋ ์ํ๋๋ ์๋ฌผ์ ์ํ ์ถฉ๋ถํ ๊ณต๊ฐ์ด ์๋์ง ๋ฏธ๋ฆฌ ๊ฒฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Followers๋ ์ ์ ๋ ์ ์ด ์ฌ๋กฏ์ ํ์ํ๊ณ , FollowersMax๋ ์ด ํ๋๋ฅผ ๋ํ๋ ๋๋ค. ์ด๊ฒ์ ๊ทผ์ฒ์ ์๋ ๋๋ฌผ์ ์๋ ์ด๋ ๋ช ๋ น Follow๊ฐ ์๋๋๋ค. ์บ๋ฆญํฐ์ ์ํ ์นด์ดํฐ(์ต๋ ์ ์๋๋ฌผ ์ ์ด ์ฌ๋กฏ)๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int - ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์๋ ์ต๋ ์ ์๋๋ฌผ ์ ์ด ์ฌ๋กฏ, 0..255. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋, ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋, ๋๋ฝ/ํ๊ดด๋ ํ๋ ์ด์ด์ผ ์ ์์ต๋๋ค. ์ด๋ bool, ID ๋๋ type๊ฐ ์๋ ์๋์ ๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋๋ผ ํ๋์ ๋จ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํ์ง ์์ผ๋ฉฐ ๋ฐฐ์ด์ ๋ฐํํ์ง ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, 5์ 3์ด ์ฌ์ฉ ์ค์ด๊ณ 2 ์ฌ๋กฏ์ ๋น์ด ์์ต๋๋ค. 4 ๊ฐ์ ํ ์ฌ๋กฏ์ ์๋ฌผ 4๊ฐ, 4๊ฐ์ ์๋ฌผ 1๊ฐ ๋๋ ๊ธฐํ ์กฐํฉ์ ์๋ฏธํ ์ ์์ต๋๋ค. 2์ ์๋ ์๋ฌผ์ ๊ฒฝ์ฐ "busy < maximum" ์ฒดํฌ ์ฌ๋กฏ์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ต๋ - ํ์ฌ >= 2๊ฐ ํ์ํฉ๋๋ค. ํน์ ์๋ฌผ์ ๋น์ฉ๊ณผ ํ๋๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. FollowersMax๋ฅผ ์์ 5๋ก ๋์ฒดํ์ง ๋ง์ธ์.
- 0๋ ์ ์๋๋ฌผ์ด ๋ถ์ค, ์ฌ๋ง ๋๋ ์๋ฐฉ๋์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. ์ ์๋๋ฌผ์ด ๋น์ด ์๊ฑฐ๋ ์ํ๊ฐ ์์ง ์ ๋ฐ์ดํธ๋์ง ์์์ ์ ์์ต๋๋ค. ์นด์ดํฐ์ ์ฆ๊ฐ๋ ์ ์ด๊ถ ๋ณ๊ฒฝ์ ์ถ๊ฐ์ ์ธ ์ ํธ์ผ ๋ฟ์ ๋๋ค. ์ด๋ค ์๋ฌผ์ด ๊ธธ๋ค์ฌ์ก๋์ง ๊ฒฐ์ ํ์ง ์์ต๋๋ค. ์๋ฒ์ ํซ ์์ฒด์ ๋ฉ์์ง๋ ํ์ธํด๋ณด์ธ์. ์ด ์ฌ๋กฏ์ ๋ง๊ตฌ๊ฐ์ ์ฅ์์ ๋์ผํ์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.FollowersMax ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- PetsMax/FollowersMax๋ ์ฌ์ ์ฌ๋กฏ์ด ์๋ type >= 3 ์ํ์์ ์๋ฒ๊ฐ ํ์ฉํ๋ ์ด ์ฌ๋กฏ ์ ํ์ ๋ณด๊ณ ํฉ๋๋ค. ํ๋๋ณด๋ค ๋ ๋ง์ ์ฌ๋กฏ์ด ์ ์ ๋์ด ์์ ์ ์์ต๋๋ค. ์ฌ์ ์ฉ๋์ ์ต๋ ์ ๋ฅ๋ก ๊ฐ์ฃผํ๊ณ ์์ ๊ฒฐ๊ณผ๋ฅผ 0๋ก ๋ฐ๊ฟ๋๋ค. ํ์ ์๋ฌด๊ฒ๋ ๊ณต๊ฐํ์ง ์์ผ๋ฉฐ, ๊ธธ๋ค์ด๊ฑฐ๋ ์๊ตฌํ์ง๋ ์์ต๋๋ค.
- CharacterStatus๋ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ํ์ํ ๋ณธ๋ฌธ์ ํ์ธํฉ๋๋ค. Weight๋ ์์ฒด ํ์ฅ ์ํ์ธ ์ฌ๋กฏ - type 3, Luck - type 4, ์๋ฒ WeightMax - type 5์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํ์ ์นด์ดํฐ๊ฐ ์๋ ์ปดํฉํธ/์ค๋๋ ํจํค์ง๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์๋ถํฐ ์์๋ฉ๋๋ค. ํตํ๋ ์๋ก์ด ์ํ๋ฅผ ๋ฐ์๋ค๋ ๊ฒ์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetPetsMax();
UO.Print("GetPetsMax: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ - ์ฌ์ฉ ์ค, ์ต๋ - ์ ํ, freeSlots - ์ฐจ์ด. ์ ์ ์๋/0 ์ ํ ๋๋ ์ผ๊ด์ฑ ์๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ๊ณต๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๊ณ ์ฃผ์ฅํ์ง ์๊ณ ์์ ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ต์ ์ํ๋ง ์ฝ๊ณ ์ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํ์ง ์์ต๋๋ค.
var current = UO.Followers();
var maximum = UO.GetPetsMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
UO.Print("Follower status is unavailable or inconsistent");
return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ ID๊ฐ lasttarget์ ์๋๋ก ์ํ๋ ๋๋ฌผ์ ์ ํํ์ธ์. requiredSlots=2 - ์์ ์ค์ , ์๋ฒ์ ์๋ ์ด ์๋ฌผ์ ์ค์ ๋น์ฉ์ผ๋ก ๋์ฒดํ์ธ์. ๊ณต๊ฐ์ด ๋ถ์กฑํ ๊ฒฝ์ฐ ๋์์ด ์ค์ ๋์ง ์์ผ๋ฉฐ ์คํฌ์ด ํธ์ถ๋์ง ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋์์ ๋๊ธฐ์ด์ ๋จ์ผ ์ธ์ UseSkill("๋๋ฌผ ๊ธธ๋ค์ด๊ธฐ") ์ด์ ์ ์ค๋น๋ฉ๋๋ค. ์๋๋ฅผ ์์ํ๋ค๊ณ ํด์ ์ฑ๊ณต์ด ๋ณด์ฅ๋๋ ๊ฒ์ ์๋๋๋ค. ๊ธฐ์ , ๋ฒ์, ๊ธธ๋ค์ ๊ฐ๋ฅ์ฑ ๋ฐ ์๋ฒ ์๋ต์ด ์ค์ํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var requiredSlots = 2;
var current = UO.Followers();
var maximum = UO.GetPetsMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
{
UO.Print("Not enough known control slots");
return null;
}
var animal = UO.LastTarget();
if (Truth(animal == 0))
{
UO.Print("Select the animal first");
return null;
}
UO.WaitTargetObject(animal);
UO.UseSkill("Animal Taming");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CanAddFollower๋ ์๋ก์ด UO ๋ช ๋ น์ด ์๋๋ผ ์์ ํ ์ ์ธ๋ ์ฌ์ฉ์ ๋์ฐ๋ฏธ์ ๋๋ค. ์บ์ ์ ํ์ด ์ถฉ๋ถํ๋ฉด 1/true๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 0/false๋ฅผ ๋ฐํํฉ๋๋ค. extraSlots ๋งค๊ฐ๋ณ์๋ type/ID๊ฐ ์๋๋ผ ADDED๋๋ ์๋ฌผ์ ๋น์ฉ์ ๋๋ค. 2 - ์; ํด๋น ๊ธฐ๋ฅ์ ๊ธธ๋ค์ด๊ฑฐ๋ ์ํํ์ง ์์ต๋๋ค. ์ ๊ฒ์ ์กฐ์น ์ง์ ์ ๋ฐ๋ณต๋์ด์ผ ํฉ๋๋ค.
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(CanAddFollower(2)))
{
UO.Print("Capacity check passed; verify the creature cost before acting");
}
else
{
UO.Print("Insufficient capacity or unavailable status");
}
return null;
}
dynamic CanAddFollower(dynamic extraSlots)
{
if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.PetsCurrent();
var maximum = UO.GetPetsMax();
if (Truth(maximum <= 0))
{
return false;
}
return extraSlots <= maximum - current;
}
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.RegisterCharacterGetterAliases [GetPetsMax]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.FollowersMax:bridge.FollowersMax.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.FollowersMaxAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsNPC(object? objID);๋ก๋๋ mobile๋ฅผ ๋ช ์์ ์ผ๋ก ์ ๋ฌ๋ serial์ ๋น๊ตํ์ฌ ํ์ธํฉ๋๋ค.
-
objID- ํน์ ๊ฐ์ฒด์ ํ์ serial/ID: int, 16์ง์ ๋ฌธ์์ด ๋๋ ๋ณ์นญ self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค. ์ง์ ๋์ง ์์ ์ด๋ฆ์ 0๋ก ํด์๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ ๋์์ ์ด์ง ์์ต๋๋ค. IsNpc๋ง ๋ฑ๋ก๋ ์ธ์๊ฐ ์๋ ํ์๋ ์์ต๋๋ค. self๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
int 1 - ๋ก๋๋์์ผ๋ ์ญ์ ๋์ง ์์ mobile. int 0 - ์ ์ ์๋ ๊ฐ์ฒด serial ๋๋ ์๊ฒฉ ๊ฐ์ฒด์ ๋๋ค. IsNPC๋ผ๋ ์ด๋ฆ์ "๋นํ๋ ์ด์ด ์บ๋ฆญํฐ ์ ์ฉ"์ ์๋ฏธํ์ง ์์ต๋๋ค. ์์ ์ ์บ๋ฆญํฐ์ ๋ค๋ฅธ ํ๋ ์ด์ด๋ 1๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ์๋ฒ์ ๋ํ ์์ฒญ๋ ์๊ณ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ด๋ํ ํ์๋ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ์ฝ๋ ์๊ฐ์ ๊ฐ๋ฆฌํจ๋ค. UO.Wait ๋๋ ๋ค๋ฅธ ์์ ํ์ ๊ฐ์ฒด์ ํด๋น ํ๋๊ทธ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- ๊ฒ์ ๊ด๋ฆฌ์๋ IsNpc ๋ฐ IsNPC๋ฅผ ๋์ผํ ์ด๋ฆ์ ๋ณํ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. C# ์์ค ์ฝ๋์์๋ ๊ณต๊ฐ ํ์์ ์ ํํ ์ฒ ์๋ฅผ ์ฌ์ฉํ์ธ์. ์ด ๊ฒฐ๊ณผ๋ ํ๋ ์ด์ด๋ฅผ NPC์ ํ์คํ๊ฒ ๊ตฌ๋ณํ ์ ์์ต๋๋ค. ์ด ๊ตฌ๋ณ ๊ท์น์ ์๋ฒ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
C#์์ ์ด๋ฆ์ ๋ฌธ์๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. UO.IsNPC์๋ ์ธ์๊ฐ ํ์ํฉ๋๋ค. ์ธ์๊ฐ ์๋ UO.IsNpc() ํ์์ self๋ฅผ ์ ํํฉ๋๋ค. ๋ ์ด๋ฆ ๋ชจ๋ NPC๋ง์ ํ์ธํ๋ ๊ฒ์ด ์๋๋ผ ํ๋ ์ด์ด๋ฅผ ํฌํจํ์ฌ mobile๋ฅผ ํ์ธํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsNPC(UO.Self());
UO.Print("IsNPC: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด C# ํ์์๋ ์ธ์๊ฐ ํ์ํฉ๋๋ค. ์์ ์ ์บ๋ฆญํฐ๋ 1๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ mobile์ ๋ํ ํ ์คํธ์ด์ง NPC์๋ง ๊ตญํ๋ ํ ์คํธ๋ ์๋๋๋ค.
int mobile = UO.IsNPC(UO.Self());
UO.Print($"Self is a loaded mobile: {mobile != 0}");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ผ๋ จ๋ฒํธ๋ lasttarget์์ ๊ฐ์ ธ์ต๋๋ค. ํด๋ผ์ด์ธํธ์ ์๋ ค์ง mobile๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์ขํ๋ฅผ ์ฝ์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
string target = UO.GetSerial("lasttarget");
if (UO.IsNPC(target) == 0)
return false;
UO.Print($"Mobile coordinates: {UO.GetX(target)}, {UO.GetY(target)}, {UO.GetZ(target)}");
return true;
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๋์ ์ ์ฅํ๋ ์บ๋ฆญํฐ๋ mobile์ด๋ฉฐ, ๋ฐฐ๋ญ์ ์์ดํ ์ ๋๋ค. ๊ฒฐ๊ณผ๋ ๋ก์ปฌ ์ฝ๊ธฐ์ ์๊ฐ์ ๋ํ๋ ๋๋ค.
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()
{
int character = UO.IsNPC(UO.Self());
int bag = UO.IsNPC(UO.Backpack());
UO.Print($"Character mobile flag: {character}; backpack mobile flag: {bag}");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsNpc:bridge.IsNpc(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "isnpc": return new InjectionValue(bridge.IsNpc(Arg(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.IsNpc();
int UO.IsNpc(object? id);-
id- ํน์ ๊ฐ์ฒด์ ํ์ serial/ID: int, 16์ง์ ๋ฌธ์์ด ๋๋ ๋ณ์นญ self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค. ์ง์ ๋์ง ์์ ์ด๋ฆ์ 0๋ก ํด์๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ ๋์์ ์ด์ง ์์ต๋๋ค. IsNpc๋ง ๋ฑ๋ก๋ ์ธ์๊ฐ ์๋ ํ์๋ ์์ต๋๋ค. self๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
int 1 - ๋ก๋๋์์ผ๋ ์ญ์ ๋์ง ์์ mobile. int 0 - ์ ์ ์๋ ๊ฐ์ฒด serial ๋๋ ์๊ฒฉ ๊ฐ์ฒด์ ๋๋ค. IsNPC๋ผ๋ ์ด๋ฆ์ "๋นํ๋ ์ด์ด ์บ๋ฆญํฐ ์ ์ฉ"์ ์๋ฏธํ์ง ์์ต๋๋ค. ์์ ์ ์บ๋ฆญํฐ์ ๋ค๋ฅธ ํ๋ ์ด์ด๋ 1๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ์๋ฒ์ ๋ํ ์์ฒญ๋ ์๊ณ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ด๋ํ ํ์๋ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ์ฝ๋ ์๊ฐ์ ๊ฐ๋ฆฌํจ๋ค. UO.Wait ๋๋ ๋ค๋ฅธ ์์ ํ์ ๊ฐ์ฒด์ ํด๋น ํ๋๊ทธ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- ๊ฒ์ ๊ด๋ฆฌ์๋ IsNpc ๋ฐ IsNPC๋ฅผ ๋์ผํ ์ด๋ฆ์ ๋ณํ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. C# ์์ค ์ฝ๋์์๋ ๊ณต๊ฐ ํ์์ ์ ํํ ์ฒ ์๋ฅผ ์ฌ์ฉํ์ธ์. ์ด ๊ฒฐ๊ณผ๋ ํ๋ ์ด์ด๋ฅผ NPC์ ํ์คํ๊ฒ ๊ตฌ๋ณํ ์ ์์ต๋๋ค. ์ด ๊ตฌ๋ณ ๊ท์น์ ์๋ฒ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.IsNpc();
UO.Print("IsNpc: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ ์๋ ํ์์์๋ self์ ์ ํํฉ๋๋ค. ๊ฒฐ๊ณผ 1/0๋ serial๊ฐ ์๋๋ฉฐ ํ๋ ์ด์ด์ NPC๋ฅผ ๊ตฌ๋ณํ์ง ์์ต๋๋ค.
int mobile = UO.IsNpc();
if (mobile != 0) UO.Print("Self is a loaded mobile");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- lasttarget๋ฅผ ๋ฏธ๋ฆฌ ์ ํํ์ธ์. ๋จผ์ , ๊ฐ์ฒด์ ๋ก๋ฉ์ด ํ์ธ๋ฉ๋๋ค. mobile ๋ถ๋ฅ๋ ๊ทธ์ ์ ๋๊ฐ์ ์ ์ํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
string target = UO.GetSerial("lasttarget");
if (UO.Exists(target) == 0)
UO.Print("Target is not loaded");
else
UO.Print(UO.IsNpc(target) != 0 ? "Mobile: NPC or player" : "Loaded item");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ค๋ฅธ ์ฌ๋์ ์กฐํ์๋ ์๋ฒ์ ์ํด ์ ๊ทํ๋ ์ ์์ต๋๋ค. ์ํ์์๋ ์ ์ฒด ์ํ๋ฅผ ๋ฌป์ง ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
string target = UO.GetSerial("lasttarget");
if (UO.IsNpc(target) != 0)
UO.Print($"Known hits: {UO.GetHP(target)}/{UO.GetMaxHP(target)}");
return null;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.IsNpc. -
InjectionScript.Runtime.InjectionApiUO.IsNpc:IsNpc(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int IsNpc() => IsNpc(bridge.Self);๋งค๊ฐ๋ณ์: id (Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.IsNpc. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsNpc:bridge.IsNpc(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int IsNpc(int id) => bridge.IsNpc(id);๋งค๊ฐ๋ณ์: id (Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.IsNpc. -
InjectionScript.Runtime.InjectionApiUO.IsNpc:IsNpc(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int IsNpc(string id) => IsNpc(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.MobileCanBeRenamed(object? mobID);mobile ์ด๋ฆ์ ๋ฐ๊ฟ ์ ์๋ ํด๋ผ์ด์ธํธ์ ์๋ ค์ง ํ์๋ฅผ ํ์ธํฉ๋๋ค.
-
mobIDโ ํน์ ๊ฐ์ฒด์ ํ์ serial/ID: int, 16์ง์ ๋ฌธ์์ด ๋๋ ๋ณ์นญ self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. ์ง์ ๋์ง ์์ ์ด๋ฆ์ 0๋ก ํด์๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ ๋์์ ์ด์ง ์์ต๋๋ค. ์ธ์๋ ํ์์ ๋๋ค. ์ง์ self๋ฅผ ํต๊ณผํ์ธ์.
int 1 - ๋ก๋๋จ mobile์๋ IsRenamable ์์ฑ์ด ์์ต๋๋ค. int 0 - ์์ฑ์ด ๋๋ฝ๋์๊ฑฐ๋ ๊ฐ์ฒด๊ฐ mobile๊ฐ ์๋๊ฑฐ๋ ์ ์ ์๊ฑฐ๋ ์ญ์ ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ ์๋๋ฌผ์ ๋ํ ๋ง์ง๋ง ์๋ฒ ๊ถํ์ ๋๋ค. ์ด ๋ช ๋ น์ ๊ฐ์ฒด์ ์ด๋ฆ์ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ ํ์ ์์ฒญ์ด ์๋ฒ์์ ์๋ฝ๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ์๋ฒ์ ๋ํ ์์ฒญ๋ ์๊ณ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ด๋ํ ํ์๋ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ๋ ์ฝ๋ ์๊ฐ์ ๊ฐ๋ฆฌํจ๋ค. UO.Wait ๋๋ ๋ค๋ฅธ ์์ ํ์ ๊ฐ์ฒด์ ํด๋น ํ๋๊ทธ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด ์ ์๋๋ฌผ์ ๋ํ ๋ง์ง๋ง ์๋ฒ ๊ถํ์ ๋๋ค. ์ด ๋ช ๋ น์ ๊ฐ์ฒด์ ์ด๋ฆ์ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ ํ์ ์์ฒญ์ด ์๋ฒ์์ ์๋ฝ๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.MobileCanBeRenamed("self");
UO.Print("MobileCanBeRenamed: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- self ์ธ์๋ ํด๋น ๋ฌธ์๋ฅผ ๋ช ์์ ์ผ๋ก ์ ํํฉ๋๋ค. ์ํ - 1/0์๋ง ํด๋น๋ฉ๋๋ค.
- ์๋ฅผ ๋ค์ด ์ ์๋๋ฌผ์ ๋ํ ๋ง์ง๋ง ์๋ฒ ๊ถํ์ ๋๋ค. ์ด ๋ช ๋ น์ ๊ฐ์ฒด์ ์ด๋ฆ์ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ ํ์ ์์ฒญ์ด ์๋ฒ์์ ์๋ฝ๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
var state = UO.MobileCanBeRenamed("self");
if (Truth(state))
{
UO.Print("Rename permission flag is present");
}
else
{
UO.Print("Rename permission flag is absent");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- IsNpc ์ ๋ชฉ ๋ฐ ์ ์ ์๋ ๊ฐ์ฒด๋ ์ ์ธ๋ฉ๋๋ค. target์ ๋ณ๊ฒฝ๋๋ lasttarget์ ๋ํ ์ค์๊ฐ ์ฐธ์กฐ๊ฐ ์๋ ๋จ์ผ serial์ ์ ์ฅํฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ IsRenamable ํ๋๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์ ์ ํ ์ํ๋ฅผ ์์ ํ ํ์๋ง ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var state = UO.MobileCanBeRenamed(target);
UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
}
else
{
UO.Print("No loaded mobile selected");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- UO.Wait(500) โ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ผ์ ์ค์ง๋ฉ๋๋ค. ์ดํ์๋ mobile์ด ์ฌ์ ํ ์กด์ฌํ๋์ง ๋ณ๋๋ก ํ์ธํฉ๋๋ค.
- ๋ ์ด๋ฏธ์ง๊ฐ ๋น๊ต๋ฉ๋๋ค. ์ค๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ด ๋๋ฝ๋ ์ ์์ผ๋ฉฐ ์ด๋ ์๋ฒ ์ด๋ฒคํธ์ ๋ํ ์ง์์ ์ธ ๊ตฌ๋ ์ด ์๋๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var before = UO.MobileCanBeRenamed(target);
await Delay(500);
if (Truth(UO.IsNPC(target)))
{
var after = UO.MobileCanBeRenamed(target);
if (Truth(before != after))
{
UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
}
}
else
{
UO.Print("Mobile left the local world");
}
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: mobID (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CanChangeName:bridge.CanChangeName(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "mobilecanberenamed": return new InjectionValue(bridge.CanChangeName(Arg(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Notoriety();ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์ ์บ๋ฆญํฐ์ ํํ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ 0=์ ์ ์์, 1=๋ฌด์ฃ, 2=๋๋งน, 3=ํ์, 4=๋ฒ์ฃ์, 5=์ , 6=์ด์ธ์, 7=๋ฌด์ ์ ๋๋ค. ์ด๋ hue, ์นด๋ฅด๋ง ๋๋ ๋ช ์ฑ์ด ์๋ ์ํ ์ฝ๋์ ๋๋ค. ์ ์ ์์ mobile๋ 0์ ์ ๊ณตํฉ๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Notoriety();
UO.Print("Notoriety: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์บ๋ฆญํฐ์ ํํ์ ๊ฐ์น๋ก ์ ์ฅ๋ฉ๋๋ค.
- Convert.ToString๋ ์ถ๋ ฅํ ์ซ์๋ฅผ ๋ณํํ๋ฉฐ ๊ฒฐ๊ณผ์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
var value = UO.Notoriety();
UO.Print("Notoriety: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ ์์ด ๊ฐ์ ํ ๋ฒ ์ฝ์ต๋๋ค. ์บ๋ฆญํฐ์ ํํ์ ํ์๋ ๊ณ์ฐ์ด๋ ์กฐ๊ฑด์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ซ์ ์๊ณ๊ฐ์ ์คํฌ๋ฆฝํธ ์กฐ๊ฑด์ ์์ด๋ฉฐ ์๋ก์ด ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋๋๋ค. ํ๋์๋ ์์ ์ค๋ช ๋ ์๋ฒ ๋จ์ ๋ฐ ์ ํ ์ฌํญ์ด ์ ์ฅ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var value = UO.Notoriety();
if (Truth(value == 3) || Truth(value == 4))
{
UO.Print("Gray or criminal notoriety");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ๋ ํธ์ถ ๋ชจ๋ ํ์ฌ ๊ฐ์ ์ฝ์ต๋๋ค. UO.Wait(1000)๋ ์ท ์ฌ์ด์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ผ์ ์ค์ง๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋น๊ต๋๋ ๋ณํ๋ ์บ๋ฆญํฐ์ ํํ์ ๋๋ค. ์๋ ์ธ์์ ์ด๋ค ๊ฒ๋ ๋ฐ๊พธ์ง ์์ผ๋ฉฐ ๋์์ด ๊ธฐ๋ค๋ฆฌ์ง๋ ์์ต๋๋ค. ์ด ์ด ๋ด์ ์ด๋ฒคํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.Notoriety();
await Delay(1000);
var after = UO.Notoriety();
if (Truth(before != after))
{
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Notoriety]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetNotoriety:bridge.GetNotoriety(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.GetNotoriety(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.PetsCurrent();์บ๋ฆญํฐ์ ๋ค์ ๊ธธ๋ค์ฌ์ง๊ฑฐ๋ ์ํ๋๋ ์๋ฌผ์ ์ํ ์ถฉ๋ถํ ๊ณต๊ฐ์ด ์๋์ง ๋ฏธ๋ฆฌ ๊ฒฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Followers๋ ์ ์ ๋ ์ ์ด ์ฌ๋กฏ์ ํ์ํ๊ณ , FollowersMax๋ ์ด ํ๋๋ฅผ ๋ํ๋ ๋๋ค. ์ด๊ฒ์ ๊ทผ์ฒ์ ์๋ ๋๋ฌผ์ ์๋ ์ด๋ ๋ช ๋ น Follow๊ฐ ์๋๋๋ค. ์บ๋ฆญํฐ์ ์ํ ์นด์ดํฐ(์ ์ ๋ ์ ์๋๋ฌผ ์ ์ด ์ฌ๋กฏ)๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int - ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์๋ ์ ์๋๋ฌผ ์ ์ด ์ฌ๋กฏ, 0..255๋ฅผ ์ฐจ์งํฉ๋๋ค. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋, ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋, ๋๋ฝ/ํ๊ดด๋ ํ๋ ์ด์ด์ผ ์ ์์ต๋๋ค. ์ด๋ bool, ID ๋๋ type๊ฐ ์๋ ์๋์ ๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋๋ผ ํ๋์ ๋จ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํ์ง ์์ผ๋ฉฐ ๋ฐฐ์ด์ ๋ฐํํ์ง ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, 5์ 3์ด ์ฌ์ฉ ์ค์ด๊ณ 2 ์ฌ๋กฏ์ ๋น์ด ์์ต๋๋ค. 4 ๊ฐ์ ํ ์ฌ๋กฏ์ ์๋ฌผ 4๊ฐ, 4๊ฐ์ ์๋ฌผ 1๊ฐ ๋๋ ๊ธฐํ ์กฐํฉ์ ์๋ฏธํ ์ ์์ต๋๋ค. 2์ ์๋ ์๋ฌผ์ ๊ฒฝ์ฐ "busy < maximum" ์ฒดํฌ ์ฌ๋กฏ์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ต๋ - ํ์ฌ >= 2๊ฐ ํ์ํฉ๋๋ค. ํน์ ์๋ฌผ์ ๋น์ฉ๊ณผ ํ๋๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. FollowersMax๋ฅผ ์์ 5๋ก ๋์ฒดํ์ง ๋ง์ธ์.
- 0๋ ์ ์๋๋ฌผ์ด ๋ถ์ค, ์ฌ๋ง ๋๋ ์๋ฐฉ๋์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. ์ ์๋๋ฌผ์ด ๋น์ด ์๊ฑฐ๋ ์ํ๊ฐ ์์ง ์ ๋ฐ์ดํธ๋์ง ์์์ ์ ์์ต๋๋ค. ์นด์ดํฐ์ ์ฆ๊ฐ๋ ์ ์ด๊ถ ๋ณ๊ฒฝ์ ์ถ๊ฐ์ ์ธ ์ ํธ์ผ ๋ฟ์ ๋๋ค. ์ด๋ค ์๋ฌผ์ด ๊ธธ๋ค์ฌ์ก๋์ง ๊ฒฐ์ ํ์ง ์์ต๋๋ค. ์๋ฒ์ ํซ ์์ฒด์ ๋ฉ์์ง๋ ํ์ธํด๋ณด์ธ์. ์ด ์ฌ๋กฏ์ ๋ง๊ตฌ๊ฐ์ ์ฅ์์ ๋์ผํ์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.Followers ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- PetsCurrent/Followers๋ ์ํ type >= 3์์ ์ ์ ๋ ์ ์ด ์ฌ๋กฏ์ ๋ณด๊ณ ํฉ๋๋ค. ์ ์๋๋ฌผ ํ ๋ง๋ฆฌ๊ฐ ์ฌ๋ฌ ์ฌ๋กฏ์ ์ฐจ์งํ ์ ์์ต๋๋ค. ์ํ ๋ฐ ๊ธธ๋ค์ธ ์๋ฌผ์ ๋ํ ๊ท์น์ ์๋ฒ์์ ์ค์ ํฉ๋๋ค. ์ด๊ฒ์ ๋ณด์ด๋ mobile์ ์ซ์๋ ์๋๊ณ , ID ์ ์๋๋ฌผ์ ๋ชฉ๋ก๋ ์๋๊ณ , ๊ทผ์ฒ์ ์๋ ๋๋ฌผ์ ์ซ์๋ ์๋๋๋ค.
- CharacterStatus๋ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ํ์ํ ๋ณธ๋ฌธ์ ํ์ธํฉ๋๋ค. Weight๋ ์์ฒด ํ์ฅ ์ํ์ธ ์ฌ๋กฏ - type 3, Luck - type 4, ์๋ฒ WeightMax - type 5์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํ์ ์นด์ดํฐ๊ฐ ์๋ ์ปดํฉํธ/์ค๋๋ ํจํค์ง๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์๋ถํฐ ์์๋ฉ๋๋ค. ํตํ๋ ์๋ก์ด ์ํ๋ฅผ ๋ฐ์๋ค๋ ๊ฒ์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.PetsCurrent();
UO.Print("PetsCurrent: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ - ์ฌ์ฉ ์ค, ์ต๋ - ์ ํ, freeSlots - ์ฐจ์ด. ์ ์ ์๋/0 ์ ํ ๋๋ ์ผ๊ด์ฑ ์๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ๊ณต๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๊ณ ์ฃผ์ฅํ์ง ์๊ณ ์์ ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ต์ ์ํ๋ง ์ฝ๊ณ ์ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํ์ง ์์ต๋๋ค.
var current = UO.PetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
UO.Print("Follower status is unavailable or inconsistent");
return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ ID๊ฐ lasttarget์ ์๋๋ก ์ํ๋ ๋๋ฌผ์ ์ ํํ์ธ์. requiredSlots=2 - ์์ ์ค์ , ์๋ฒ์ ์๋ ์ด ์๋ฌผ์ ์ค์ ๋น์ฉ์ผ๋ก ๋์ฒดํ์ธ์. ๊ณต๊ฐ์ด ๋ถ์กฑํ ๊ฒฝ์ฐ ๋์์ด ์ค์ ๋์ง ์์ผ๋ฉฐ ์คํฌ์ด ํธ์ถ๋์ง ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋์์ ๋๊ธฐ์ด์ ๋จ์ผ ์ธ์ UseSkill("๋๋ฌผ ๊ธธ๋ค์ด๊ธฐ") ์ด์ ์ ์ค๋น๋ฉ๋๋ค. ์๋๋ฅผ ์์ํ๋ค๊ณ ํด์ ์ฑ๊ณต์ด ๋ณด์ฅ๋๋ ๊ฒ์ ์๋๋๋ค. ๊ธฐ์ , ๋ฒ์, ๊ธธ๋ค์ ๊ฐ๋ฅ์ฑ ๋ฐ ์๋ฒ ์๋ต์ด ์ค์ํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var requiredSlots = 2;
var current = UO.PetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
{
UO.Print("Not enough known control slots");
return null;
}
var animal = UO.LastTarget();
if (Truth(animal == 0))
{
UO.Print("Select the animal first");
return null;
}
UO.WaitTargetObject(animal);
UO.UseSkill("Animal Taming");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CanAddFollower๋ ์๋ก์ด UO ๋ช ๋ น์ด ์๋๋ผ ์์ ํ ์ ์ธ๋ ์ฌ์ฉ์ ๋์ฐ๋ฏธ์ ๋๋ค. ์บ์ ์ ํ์ด ์ถฉ๋ถํ๋ฉด 1/true๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 0/false๋ฅผ ๋ฐํํฉ๋๋ค. extraSlots ๋งค๊ฐ๋ณ์๋ type/ID๊ฐ ์๋๋ผ ADDED๋๋ ์๋ฌผ์ ๋น์ฉ์ ๋๋ค. 2 - ์; ํด๋น ๊ธฐ๋ฅ์ ๊ธธ๋ค์ด๊ฑฐ๋ ์ํํ์ง ์์ต๋๋ค. ์ ๊ฒ์ ์กฐ์น ์ง์ ์ ๋ฐ๋ณต๋์ด์ผ ํฉ๋๋ค.
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(CanAddFollower(2)))
{
UO.Print("Capacity check passed; verify the creature cost before acting");
}
else
{
UO.Print("Insufficient capacity or unavailable status");
}
return null;
}
dynamic CanAddFollower(dynamic extraSlots)
{
if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.PetsCurrent();
var maximum = UO.PetsMax();
if (Truth(maximum <= 0))
{
return false;
}
return extraSlots <= maximum - current;
}
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.Followers:bridge.Followers.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "petscurrent": return new InjectionValue(bridge.Followers);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.PetsMax();์บ๋ฆญํฐ์ ๋ค์ ๊ธธ๋ค์ฌ์ง๊ฑฐ๋ ์ํ๋๋ ์๋ฌผ์ ์ํ ์ถฉ๋ถํ ๊ณต๊ฐ์ด ์๋์ง ๋ฏธ๋ฆฌ ๊ฒฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Followers๋ ์ ์ ๋ ์ ์ด ์ฌ๋กฏ์ ํ์ํ๊ณ , FollowersMax๋ ์ด ํ๋๋ฅผ ๋ํ๋ ๋๋ค. ์ด๊ฒ์ ๊ทผ์ฒ์ ์๋ ๋๋ฌผ์ ์๋ ์ด๋ ๋ช ๋ น Follow๊ฐ ์๋๋๋ค. ์บ๋ฆญํฐ์ ์ํ ์นด์ดํฐ(์ต๋ ์ ์๋๋ฌผ ์ ์ด ์ฌ๋กฏ)๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int - ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์๋ ์ต๋ ์ ์๋๋ฌผ ์ ์ด ์ฌ๋กฏ, 0..255. 0๋ ์ค์ ๊ฐ์ด๊ฑฐ๋, ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋, ๋๋ฝ/ํ๊ดด๋ ํ๋ ์ด์ด์ผ ์ ์์ต๋๋ค. ์ด๋ bool, ID ๋๋ type๊ฐ ์๋ ์๋์ ๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋๋ผ ํ๋์ ๋จ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ๋ช ๋ น์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํ์ง ์์ผ๋ฉฐ ๋ฐฐ์ด์ ๋ฐํํ์ง ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด, 5์ 3์ด ์ฌ์ฉ ์ค์ด๊ณ 2 ์ฌ๋กฏ์ ๋น์ด ์์ต๋๋ค. 4 ๊ฐ์ ํ ์ฌ๋กฏ์ ์๋ฌผ 4๊ฐ, 4๊ฐ์ ์๋ฌผ 1๊ฐ ๋๋ ๊ธฐํ ์กฐํฉ์ ์๋ฏธํ ์ ์์ต๋๋ค. 2์ ์๋ ์๋ฌผ์ ๊ฒฝ์ฐ "busy < maximum" ์ฒดํฌ ์ฌ๋กฏ์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ต๋ - ํ์ฌ >= 2๊ฐ ํ์ํฉ๋๋ค. ํน์ ์๋ฌผ์ ๋น์ฉ๊ณผ ํ๋๋ ์๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค. FollowersMax๋ฅผ ์์ 5๋ก ๋์ฒดํ์ง ๋ง์ธ์.
- 0๋ ์ ์๋๋ฌผ์ด ๋ถ์ค, ์ฌ๋ง ๋๋ ์๋ฐฉ๋์์์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. ์ ์๋๋ฌผ์ด ๋น์ด ์๊ฑฐ๋ ์ํ๊ฐ ์์ง ์ ๋ฐ์ดํธ๋์ง ์์์ ์ ์์ต๋๋ค. ์นด์ดํฐ์ ์ฆ๊ฐ๋ ์ ์ด๊ถ ๋ณ๊ฒฝ์ ์ถ๊ฐ์ ์ธ ์ ํธ์ผ ๋ฟ์ ๋๋ค. ์ด๋ค ์๋ฌผ์ด ๊ธธ๋ค์ฌ์ก๋์ง ๊ฒฐ์ ํ์ง ์์ต๋๋ค. ์๋ฒ์ ํซ ์์ฒด์ ๋ฉ์์ง๋ ํ์ธํด๋ณด์ธ์. ์ด ์ฌ๋กฏ์ ๋ง๊ตฌ๊ฐ์ ์ฅ์์ ๋์ผํ์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.FollowersMax ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- PetsMax/FollowersMax๋ ์ฌ์ ์ฌ๋กฏ์ด ์๋ type >= 3 ์ํ์์ ์๋ฒ๊ฐ ํ์ฉํ๋ ์ด ์ฌ๋กฏ ์ ํ์ ๋ณด๊ณ ํฉ๋๋ค. ํ๋๋ณด๋ค ๋ ๋ง์ ์ฌ๋กฏ์ด ์ ์ ๋์ด ์์ ์ ์์ต๋๋ค. ์ฌ์ ์ฉ๋์ ์ต๋ ์ ๋ฅ๋ก ๊ฐ์ฃผํ๊ณ ์์ ๊ฒฐ๊ณผ๋ฅผ 0๋ก ๋ฐ๊ฟ๋๋ค. ํ์ ์๋ฌด๊ฒ๋ ๊ณต๊ฐํ์ง ์์ผ๋ฉฐ, ๊ธธ๋ค์ด๊ฑฐ๋ ์๊ตฌํ์ง๋ ์์ต๋๋ค.
- CharacterStatus๋ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ํ์ํ ๋ณธ๋ฌธ์ ํ์ธํฉ๋๋ค. Weight๋ ์์ฒด ํ์ฅ ์ํ์ธ ์ฌ๋กฏ - type 3, Luck - type 4, ์๋ฒ WeightMax - type 5์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํ์ ์นด์ดํฐ๊ฐ ์๋ ์ปดํฉํธ/์ค๋๋ ํจํค์ง๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์๋ถํฐ ์์๋ฉ๋๋ค. ํตํ๋ ์๋ก์ด ์ํ๋ฅผ ๋ฐ์๋ค๋ ๊ฒ์ ์ฆ๋ช ํ์ง ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.PetsMax();
UO.Print("PetsMax: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ - ์ฌ์ฉ ์ค, ์ต๋ - ์ ํ, freeSlots - ์ฐจ์ด. ์ ์ ์๋/0 ์ ํ ๋๋ ์ผ๊ด์ฑ ์๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ๊ณต๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๊ณ ์ฃผ์ฅํ์ง ์๊ณ ์์ ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ์ด ๋ช ๋ น์ ์ต์ ์ํ๋ง ์ฝ๊ณ ์ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํ์ง ์์ต๋๋ค.
var current = UO.Followers();
var maximum = UO.PetsMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
UO.Print("Follower status is unavailable or inconsistent");
return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ ID๊ฐ lasttarget์ ์๋๋ก ์ํ๋ ๋๋ฌผ์ ์ ํํ์ธ์. requiredSlots=2 - ์์ ์ค์ , ์๋ฒ์ ์๋ ์ด ์๋ฌผ์ ์ค์ ๋น์ฉ์ผ๋ก ๋์ฒดํ์ธ์. ๊ณต๊ฐ์ด ๋ถ์กฑํ ๊ฒฝ์ฐ ๋์์ด ์ค์ ๋์ง ์์ผ๋ฉฐ ์คํฌ์ด ํธ์ถ๋์ง ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋์์ ๋๊ธฐ์ด์ ๋จ์ผ ์ธ์ UseSkill("๋๋ฌผ ๊ธธ๋ค์ด๊ธฐ") ์ด์ ์ ์ค๋น๋ฉ๋๋ค. ์๋๋ฅผ ์์ํ๋ค๊ณ ํด์ ์ฑ๊ณต์ด ๋ณด์ฅ๋๋ ๊ฒ์ ์๋๋๋ค. ๊ธฐ์ , ๋ฒ์, ๊ธธ๋ค์ ๊ฐ๋ฅ์ฑ ๋ฐ ์๋ฒ ์๋ต์ด ์ค์ํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var requiredSlots = 2;
var current = UO.Followers();
var maximum = UO.PetsMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
{
UO.Print("Not enough known control slots");
return null;
}
var animal = UO.LastTarget();
if (Truth(animal == 0))
{
UO.Print("Select the animal first");
return null;
}
UO.WaitTargetObject(animal);
UO.UseSkill("Animal Taming");
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- CanAddFollower๋ ์๋ก์ด UO ๋ช ๋ น์ด ์๋๋ผ ์์ ํ ์ ์ธ๋ ์ฌ์ฉ์ ๋์ฐ๋ฏธ์ ๋๋ค. ์บ์ ์ ํ์ด ์ถฉ๋ถํ๋ฉด 1/true๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 0/false๋ฅผ ๋ฐํํฉ๋๋ค. extraSlots ๋งค๊ฐ๋ณ์๋ type/ID๊ฐ ์๋๋ผ ADDED๋๋ ์๋ฌผ์ ๋น์ฉ์ ๋๋ค. 2 - ์; ํด๋น ๊ธฐ๋ฅ์ ๊ธธ๋ค์ด๊ฑฐ๋ ์ํํ์ง ์์ต๋๋ค. ์ ๊ฒ์ ์กฐ์น ์ง์ ์ ๋ฐ๋ณต๋์ด์ผ ํฉ๋๋ค.
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(CanAddFollower(2)))
{
UO.Print("Capacity check passed; verify the creature cost before acting");
}
else
{
UO.Print("Insufficient capacity or unavailable status");
}
return null;
}
dynamic CanAddFollower(dynamic extraSlots)
{
if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
{
return false;
}
var current = UO.PetsCurrent();
var maximum = UO.PetsMax();
if (Truth(maximum <= 0))
{
return false;
}
return extraSlots <= maximum - current;
}
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.FollowersMax:bridge.FollowersMax.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "petsmax": return new InjectionValue(bridge.FollowersMax);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Rename(object? mobile, object? newName);์บ๋ฆญํฐ/ํซ ์ด๋ฆ ๋ณ๊ฒฝ์ ์์ฒญํฉ๋๋ค.
-
mobileโ ์ง๋ ฌ/ID ๊ฐ์ฒด: int, ์ซ์/16์ง์ ๋ฌธ์์ด ๋๋ ์ค์ ๋ ๋ณ์นญ(์: "lasttarget"). ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ ๋ก๋๋ ๊ฐ์ฒด๋ฅผ ํ์ธํ์ญ์์ค. -
newNameโ ToString์ ํตํ ํ ์คํธ; ์ ์ก๋ ์ํ๋ก ์ ์ฅ๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ์์๋ serial์ด๊ณ ๊ทธ ๋ค์์ด ์ ์ด๋ฆ์ ๋๋ค. Bridge.RenameMobile๊ฐ GameActions.Rename(serial, ์ด๋ฆ)์๊ฒ ์ ํ๋ฅผ ๊ฒ๋๋ค. API๋ CanChangeName๋ฅผ ํ์ธํ๊ฑฐ๋ ๋ก์ปฌ Name ์์ฒด๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
- ์๋ฒ๋ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ ๊ถํ์ ํ์ธํฉ๋๋ค. ์ ์๋๋ฌผ์ ๊ฒฝ์ฐ ๋จผ์ MobileCanBeRenamed๋ฅผ ํ์ธํ์ธ์. ์์ฒญ์ด ์ด๋ฆ ์น์ธ์ ๋ณด์ฅํ์ง๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Rename");
UO.Rename(UO.GetSerial("lasttarget"), "Companion");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์บ๋ฆญํฐ/ํซ ์ด๋ฆ ๋ณ๊ฒฝ์ ์์ฒญํฉ๋๋ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.MobileCanBeRenamed(id)))
{
UO.Rename(id, "Companion");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์๋ serial์ด๊ณ ๊ทธ ๋ค์์ด ์ ์ด๋ฆ์ ๋๋ค. Bridge.RenameMobile๊ฐ GameActions.Rename(serial, ์ด๋ฆ)์๊ฒ ์ ํ๋ฅผ ๊ฒ๋๋ค. API๋ CanChangeName๋ฅผ ํ์ธํ๊ฑฐ๋ ๋ก์ปฌ Name ์์ฒด๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)) && Truth(UO.MobileCanBeRenamed(id)))
{
UO.Rename(id, "Guardian");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๋ฒ๋ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ ๊ถํ์ ํ์ธํฉ๋๋ค. ์ ์๋๋ฌผ์ ๊ฒฝ์ฐ ๋จผ์ MobileCanBeRenamed๋ฅผ ํ์ธํ์ธ์. ์์ฒญ์ด ์ด๋ฆ ์น์ธ์ ๋ณด์ฅํ์ง๋ ์์ต๋๋ค.
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()
{
RenamePet(UO.GetSerial("lasttarget"), "Companion");
return null;
}
void RenamePet(dynamic id, dynamic name)
{
if (Truth(UO.MobileCanBeRenamed(id)) && Truth(Len(name) > 0))
{
UO.Rename(id, name);
}
}
int Len(object? value) => Convert.ToString(value)?.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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: mobile (Any), newName (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.RenameMobile:bridge.RenameMobile(Arg(0, bridge.LastTarget), Text(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0, bridge.LastTarget). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Text:Text(1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastTarget:bridge.LastTarget.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "rename": bridge.RenameMobile(Arg(0, bridge.LastTarget), Text(1)); break;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.RenameMobile(object? mobID, object? newName);์บ๋ฆญํฐ/ํซ ์ด๋ฆ ๋ณ๊ฒฝ์ ์์ฒญํฉ๋๋ค.
-
mobIDโ ์ง๋ ฌ/ID ๊ฐ์ฒด: int, ์ซ์/16์ง์ ๋ฌธ์์ด ๋๋ ์ค์ ๋ ๋ณ์นญ(์: "lasttarget"). ์ด๊ฒ์ graphic/type๊ฐ ์๋๋๋ค. ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ์ ๋ก๋๋ ๊ฐ์ฒด๋ฅผ ํ์ธํ์ญ์์ค. -
newNameโ ToString์ ํตํ ํ ์คํธ; ์ ์ก๋ ์ํ๋ก ์ ์ฅ๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- ์์๋ serial์ด๊ณ ๊ทธ ๋ค์์ด ์ ์ด๋ฆ์ ๋๋ค. Bridge.RenameMobile๊ฐ GameActions.Rename(serial, ์ด๋ฆ)์๊ฒ ์ ํ๋ฅผ ๊ฒ๋๋ค. API๋ CanChangeName๋ฅผ ํ์ธํ๊ฑฐ๋ ๋ก์ปฌ Name ์์ฒด๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
- ์๋ฒ๋ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ ๊ถํ์ ํ์ธํฉ๋๋ค. ์ ์๋๋ฌผ์ ๊ฒฝ์ฐ ๋จผ์ MobileCanBeRenamed๋ฅผ ํ์ธํ์ธ์. ์์ฒญ์ด ์ด๋ฆ ์น์ธ์ ๋ณด์ฅํ์ง๋ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.RenameMobile");
UO.RenameMobile(UO.GetSerial("lasttarget"), "Companion");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์บ๋ฆญํฐ/ํซ ์ด๋ฆ ๋ณ๊ฒฝ์ ์์ฒญํฉ๋๋ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.MobileCanBeRenamed(id)))
{
UO.RenameMobile(id, "Companion");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์๋ serial์ด๊ณ ๊ทธ ๋ค์์ด ์ ์ด๋ฆ์ ๋๋ค. Bridge.RenameMobile๊ฐ GameActions.Rename(serial, ์ด๋ฆ)์๊ฒ ์ ํ๋ฅผ ๊ฒ๋๋ค. API๋ CanChangeName๋ฅผ ํ์ธํ๊ฑฐ๋ ๋ก์ปฌ Name ์์ฒด๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)) && Truth(UO.MobileCanBeRenamed(id)))
{
UO.RenameMobile(id, "Guardian");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์๋ฒ๋ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ ๊ถํ์ ํ์ธํฉ๋๋ค. ์ ์๋๋ฌผ์ ๊ฒฝ์ฐ ๋จผ์ MobileCanBeRenamed๋ฅผ ํ์ธํ์ธ์. ์์ฒญ์ด ์ด๋ฆ ์น์ธ์ ๋ณด์ฅํ์ง๋ ์์ต๋๋ค.
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()
{
RenamePet(UO.GetSerial("lasttarget"), "Companion");
return null;
}
void RenamePet(dynamic id, dynamic name)
{
if (Truth(UO.MobileCanBeRenamed(id)) && Truth(Len(name) > 0))
{
UO.RenameMobile(id, name);
}
}
int Len(object? value) => Convert.ToString(value)?.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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: mobID (Any), newName (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.RenameMobile:bridge.RenameMobile(Arg(0), Text(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(1).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "renamemobile": bridge.RenameMobile(Arg(0), Text(1)); return InjectionValue.Unit;