KO UO Topic character - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
์บ๋ฆญํฐ์ ์ํ, ํน์ฑ, ์ ํญ ๋ฐ ์ฅ๋น. ํน์ ์ํฐํฐ์ ๊ฒฝ์ฐ ๋ช ๋ น ์นด๋์ serial๊ฐ ํฌํจ๋ ์ค๋ฒ๋ก๋๋ฅผ ์ฌ์ฉํ์ธ์.
UO.Self ยท UO.CharacterTitle ยท UO.CharName ยท UO.CharTitle ยท UO.GetRace ยท UO.GetSex ยท UO.Race ยท UO.Sex ยท UO.IsFemale ยท UO.GetTitle
UO.Armor ยท UO.GetArmor ยท UO.HP ยท UO.GetHP ยท UO.Life ยท UO.GetLife ยท UO.MaxHP ยท UO.GetMaxHP ยท UO.MaxLife ยท UO.GetMaxLife ยท UO.Mana ยท UO.GetMana ยท UO.MaxMana ยท UO.GetMaxMana ยท UO.Stam ยท UO.GetStam ยท UO.Stamina ยท UO.GetStamina ยท UO.MaxStam ยท UO.GetMaxStam ยท UO.MaxStamina ยท UO.GetMaxStamina ยท UO.Str ยท UO.GetStr ยท UO.Strength ยท UO.GetStrength ยท UO.Dex ยท UO.GetDex ยท UO.Dexterity ยท UO.GetDexterity ยท UO.Int ยท UO.GetInt ยท UO.Intelligence ยท UO.GetIntelligence ยท UO.Weight ยท UO.GetWeight ยท UO.MaxWeight ยท UO.GetMaxWeight ยท UO.Luck ยท UO.GetLuck ยท UO.Gold ยท UO.GetGold ยท UO.GetStatLockState ยท UO.SetStatLockState ยท UO.SetStatState ยท UO.RequestStats ยท UO.GetStatus ยท UO.GetPlayerStatusText ยท UO.LastStatus ยท UO.LastStatusX ยท UO.LastStatusY ยท UO.GetARStatus ยท UO.SetARStatus ยท UO.SetARExtParams
UO.Alive ยท UO.GetAlive ยท UO.IsAlive ยท UO.Dead ยท UO.GetDead ยท UO.IsDead ยท UO.Hidden ยท UO.GetHidden ยท UO.IsHidden ยท UO.Poison ยท UO.Poisoned ยท UO.GetPoisoned ยท UO.IsPoisoned ยท UO.Frozen ยท UO.GetFrozen ยท UO.IsFrozen ยท UO.Paralyzed ยท UO.GetParalisa ยท UO.GetParalysed ยท UO.GetParalyzed ยท UO.IsParalysed ยท UO.IsParalyzed ยท UO.Flying ยท UO.GetFlying ยท UO.IsFlying ยท UO.ToggleFly ยท UO.GetYellowBar ยท UO.IsYellowHits ยท UO.TicksDead
UO.PhysicalResist ยท UO.GetPhysicalResist ยท UO.ResistPhysical ยท UO.GetResistPhysical ยท UO.FireResist ยท UO.GetFireResist ยท UO.ResistFire ยท UO.GetResistFire ยท UO.ColdResist ยท UO.GetColdResist ยท UO.ResistCold ยท UO.GetResistCold ยท UO.PoisonResist ยท UO.GetPoisonResist ยท UO.ResistPoison ยท UO.GetResistPoison ยท UO.EnergyResist ยท UO.GetEnergyResist ยท UO.ResistEnergy ยท UO.GetResistEnergy ยท UO.GetResist
UO.GetEquipment ยท UO.ObjAtLayer ยท UO.ObjAtLayerEx ยท UO.Equip ยท UO.EquipT ยท UO.EquipItems ยท UO.Unequip ยท UO.UnequipItems ยท UO.WearItem ยท UO.EquipLastWeapon ยท UO.RemoveEarrings ยท UO.RemoveHat ยท UO.RemoveNeckless ยท UO.RemoveRing
UO.Dress ยท UO.Undress ยท UO.SetDress ยท UO.UnsetDress ยท UO.DressSavedSet ยท UO.EquipDressSet ยท UO.DressSpeed ยท UO.SetDressSpeed
UO.Arm ยท UO.Disarm ยท UO.SetArm ยท UO.UnsetArm
UO.UseSelfPaperdollScroll ยท UO.UseOtherPaperdollScroll
๋ชจ๋ ๋ ์ด์ด: ๋ชฉ์ , ์๋ฏธ ๋ฐ ์์. ์ฅ์ฐฉํ ์์ดํ ์ ๋ ์ด์ด ๋ฒํธ serial์ graphic๋ ๋ค๋ฅธ ๊ฐ์ ๋๋ค.
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
var value = UO.HP();
UO.Print("HP: " + Convert.ToString(value));๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
object? hand = UO.ObjAtLayer("Rhand");
if (hand is string serial)
{
UO.Print("Right hand serial: " + serial);
}
else
{
UO.Print("Right hand is empty or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Alive();
int UO.Alive(object? value);์ฌ๋ง ํ์ ์ด ์๋ ๋ฌผ์ฒด์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
-
valueโ ํ์๋ ํ์์ ์ ํ์ ๊ฐ์ฒด: serial ์ซ์/16์ง์ ๋ฌธ์์ด, self, lasttarget ๋๋ ๋ฑ๋ก๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type๊ฐ ์๋๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ์ผ๋ถ ํ์์ ์ ์ ์๋ ํ ์คํธ๋ก ์ธํด ๋ณํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ํํ๊ธฐ ์ ์ ์ด๋ฆ์ ํ์ธํ์ธ์.
์ซ์ ํ๋๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ๋์ง ์์). ์ด๊ฒ์ ์ซ์ ํ๋๊ทธ์ ๋๋ค: C#์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์!= 0 ๋๋ ๊ฒฐ๊ณผ == 0. int์ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ๋น๊ตํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค. 1 - ์์ฑ serial์ด ์กด์ฌํ๋ฉฐ ์ฃฝ์ ๊ฒ์ผ๋ก ํ์๋์ง ์์ต๋๋ค. ์ ๋ช ํ ํญ๋ชฉ์ 1๋ ์ ๊ณตํฉ๋๋ค. ์ด๋ mobile ํํฐ๊ฐ ์๋๋๋ค. ์ฃฝ์๊ฑฐ๋ ์์ด์ง ๊ฐ์ฒด๋ 0์ ์ ๊ณตํฉ๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ๋์์ ์ด์ง ์๊ณ , ์ํ๋ฅผ ์์ฒญํ์ง ์์ผ๋ฉฐ, ํ๋๊ทธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค. ์ญ์ ๋ ๊ฐ์ฒด๋ ํด๋น ํญ๋ชฉ์ด ์ฌ์ ์์ ์ญ์ ๋๊ธฐ ์ ์๋ ๋๋ฝ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Alive();
UO.Print("Alive: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self๋ก ์ฝ์ต๋๋ค. active๋ ๊ฒฐ๊ณผ๋ฅผ ํ ๋ฒ ์ ์ฅํฉ๋๋ค. true ๋ฐ false๋ ๋ ๊ฐ์ ๋ถ๊ธฐ๋ฅผ ์ ์ํฉ๋๋ค. Print ์์ ๋ฉ์์ง๋ง ํ์๋ฉ๋๋ค.
var active = UO.Alive();
if (Truth(Truth(active) == true))
{
UO.Print("State is active");
}
else
{
UO.Print("State is inactive or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- lasttarget โ ์ด์ ์ ์ ํํ ๊ฐ์ฒด. Exists๋ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. obj๊ฐ ์ ์ผํ ๋งค๊ฐ๋ณ์ ReadState์ ๋๋ค. ์ด ํจ์๋ ์์ ์์ด ๋ช ๋ น ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ํด๋น ์ ์๋ ๋ณต์ฌ๋ ์ฝ๋์ ํฌํจ๋์ด ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
var observed = ReadState("lasttarget");
UO.Print("State 1/0: " + Convert.ToString(observed));
}
return null;
}
dynamic ReadState(dynamic obj)
{
return UO.Alive(obj);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ๋ ๋ฒ์ ํธ์ถ์ self, UO.Wait(500)๋ฅผ ์ฝ๊ณ 500 ๋ฐ๋ฆฌ์ด๋ฅผ ์ค์ ํฉ๋๋ค. ๋ ์ด๋ฏธ์ง๊ฐ ๋น๊ต๋ฉ๋๋ค. ์ค๊ฐ ์ ํ์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค. ๋์๋ ๊ธฐ๋ค๋ฆผ์ ์์ต๋๋ค.
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.Alive();
await Delay(500);
var after = UO.Alive();
if (Truth(before != after))
{
UO.Print("State changed: " + Convert.ToString(before) + " -> " + 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 [Alive]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Exists:bridge.Exists(serial). -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases::IsDeadState:IsDeadState(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
serial => serial > 0 && bridge.Exists(serial) != 0 && IsDeadState(serial) == 0 ? 1 : 0๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => getter(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Alive]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Exists:bridge.Exists(serial). -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases::IsDeadState:IsDeadState(serial). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(value).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
serial => serial > 0 && bridge.Exists(serial) != 0 && IsDeadState(serial) == 0 ? 1 : 0๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
value => getter(GetObject(value))API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Arm(object? name);์ด์ ์ ์ ์ฅํ ๋ช ๋ช ๋ ๋ฌด๊ธฐ ๋ฐ ๋ฐฉํจ ์ธํธ๋ฅผ ๋ณต์ํฉ๋๋ค.
-
nameโ "travel" ๋๋ "battle"๊ณผ ๊ฐ์ ์ธํธ์ ๋ฌธ์์ด ์ด๋ฆ์ ๋๋ค. ์ด๋ฆ์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์๋ฅ์ ๋ฌด๊ธฐ ์ธํธ๋ ๋ณ๋๋ก ์ ์ฅ๋ฉ๋๋ค. ๋ ๋ค์ ๋์ผํ ์ด๋ฆ์ด ํ์ฉ๋ฉ๋๋ค. ์ด๊ฒ์ ID ์ฌ๋ฌผ์ด๋ ํ์ผ ์ด๋ฆ์ด ์๋๋๋ค. SetDress๋ง ์ด๋ฆ์ด ์๋ ๊ฒ์ ํ์ฉํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ DressSavedSet/EquipDressSet์ ๋ํด ๋ณ๋์ ์ธํธ๊ฐ ๊ธฐ๋ก๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํ๊ฑฐ๋ true์ ๋น๊ตํ์ง ๋ง์ธ์. ์ ์ฅํ๊ณ ์ญ์ ํ๋ฉด ์ฅ๋น๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ด ์๋๋ผ ํญ๋ชฉ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
- ์๋ฅ: ๋ ์ด์ด๋ 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. ๋ฌด๊ธฐ: 1 ๋ฐ 2๋ง ํด๋น. ๋จธ๋ฆฌ์นด๋ฝ, ์์ผ, ๋ฐฐ๋ญ, ๋๋ฌผ, ์ํ์ ์ด ์ธํธ์ ํฌํจ๋์ง ์์ต๋๋ค.
- ์ด๋ฏธ ๋ก๋๋ ํน์ serial ํญ๋ชฉ์ ์์ฒด ๋ ์ด์ด์ ๊ธฐ๋ก๋ฉ๋๋ค. ๋์ผํ ์ด๋ฆ์ ๋ค์ ์ ์ฅํ๋ฉด ํญ๋ชฉ์ด ๋์ฒด๋ฉ๋๋ค. ๋น ๋ ์ด์ด๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ณต์๋๋ฉด ํด๋น ์ ์ ๋ ์ด์ด๊ฐ ์์ฒด ๋ฐฑํฉ์ผ๋ก ํด์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ ์ฅ๋ ์์ ํ ๋น์ด ์๋ ์ธํธ๋ ํด๋น ๋ ์ด์ด์์ ํญ๋ชฉ์ ์ ๊ฑฐํฉ๋๋ค.
- ์ธํธ๋ ๋ฐํ์ ์ํ๋ก ์ ์ฅ๋ฉ๋๋ค. ํธ์ถ ์์ฒด๋ ํ์ผ์ ์์ฑํ์ง ์์ผ๋ฉฐ ์ธํธ๊ฐ ๋ค๋ฅธ ํ๋กํ์ด๋ ์ ๋ฐํ์์ผ๋ก ์ ์ก๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ๋จผ์ ์ํ๋ ์ธํธ๋ฅผ ์ฌ์ฉ๋ ์ํ๋ก ์ ์ฅํฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ์ผ๋ฐ ์ํ๋ฅผ ๋ก๋/์ ์ฅํ๋ ๊ฒ์ ๋ณ๋์ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
- ํ์ฌ์ โโ์ ์ฅ๋ ID ์ฌ์ด์ ์ ํํ ์ผ์น๋ ๋ค์ ์ฌ์ฉ๋๊ฑฐ๋ ๋ฐ์ํ์ง ์๊ณ ๊ฑด๋๋๋๋ค. ๋๋ฝ๋ ํญ๋ชฉ์ ์ ์ฌํ type๋ก ๋์ฒด๋์ง ์์ต๋๋ค. ํ ์์ ์ด ์คํจํด๋ ์ฑ๊ณตํ ์์ ์ด ์ทจ์๋์ง ์์ผ๋ฉฐ ๋ค๋ฅธ ์์ ์ ์๋๋ฅผ ๋ฐฉํดํ์ง ์์ต๋๋ค. ์๋ ๋กค๋ฐฑ์ ์์ต๋๋ค. ์ฐ๊ฒฐ๊ณผ ๋ก๋๋ ๋ด์ฉ์ด ํ์ํฉ๋๋ค. ์ ๊ฑฐํ๋ฉด ์ค์ ๋ฐฐ๋ญ์ด ์ฌ์ฉ๋ฉ๋๋ค.
- UO.Set("equipfordress", 0)๋ ์์ดํ ์ฌ์ฉ ์์ฒญ์ ์ ํํฉ๋๋ค(์ด๊ธฐ ๋ชจ๋). 0์ด ์๋ ๊ฐ - ํฝ์ /์ฅ์ฐฉ. ๋ ๋ชจ๋ ๋ชจ๋์์ ์ํ๋ ์จ์ด๋ฌ๋ธ ๋ ์ด์ด๋ฅผ ํ์ธํฉ๋๋ค. ์ด๋ฏธ ์ฐฉ์ฉํ ์์ดํ ์ ๋ฐ๋ณต ์ฌ์ฉ์ผ๋ก ์ ํํ ์ ์์ต๋๋ค. DressSpeed์ ์์ฒญ ์๋ฝ ์ดํ ์ ํจํ๋ฉฐ, ์ฒ ํ๋ DropDelay๋ฅผ ์ถ๊ฐ๋ก ์กด์คํฉ๋๋ค.
- Dress ๋ฐ Arm๋ ์คํจ ์์๋ void๋ฅผ ๋ฐํํฉ๋๋ค. ์์ฒญ์ด ์๋ฝ๋์๋ค๋ ๋ฉ์์ง๋ ์๋ฒ์ ํ์ธ์ ์๋ฏธํ์ง ์์ต๋๋ค. ์ฐฉ์ฉ์ ๋ฐ๋ผ ๊ณ์ ์งํํ๋ ค๋ฉด ๊ธฐ๋์น๊ฐ ์ ํ๋ ์ค์ ๋ ์ด์ด๋ฅผ ํ์ธํ์ธ์.
- UO.SetDress ยท UO.Dress ยท UO.DressSavedSet ยท UO.SetArm ยท UO.Arm ยท UO.DressSpeed
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Arm");
UO.Arm("battle");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ ์ธํธ๋ ๋์ผํ ๋ฐํ์ ์ํ์์ ์ด์ ์ ์ ์ฅ๋์ด์ผ ํฉ๋๋ค. ๊ฐ ๋ณต์ ์ง์ ์ SetDress/SetArm๋ฅผ ํธ์ถํ์ง ๋ง์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ํ์ฌ ํญ๋ชฉ์ผ๋ก ๋์์ ๋ฎ์ด์ฐ๊ฒ ๋ฉ๋๋ค.
UO.Arm("battle");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0์ด ์๋ ์ฅ๋น๋ ํฝ์ /์ฅ๋น๋ฅผ ์ ํํฉ๋๋ค. 350 โ ๋ฐ๋ฆฌ์ด DressSpeed. ์ด๋ฌํ ์ค์ ์ ์์ ์ดํ ๋ฐํ์์๋ ์ ์ง๋ฉ๋๋ค. ์ ๊ฑฐ ๋ฐ ์ฐฉ์ฉ์ ์๋ฒ์์ ๊ฒฐ์ ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Set("equipfordress", 1);
UO.DressSpeed(350);
UO.Arm("battle");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- lasttarget โ ID ์ด์ ์ ์ ์ฅ๋ ์ธํธ์ ํฌํจ๋์ด์ผ ํ๋ ํญ๋ชฉ์ ๋๋ค. ์ปจํธ๋กค ๋ ์ด์ด 3๋ ์ ๋ฐ์ ์๋ฏธํ๊ณ , 1๋ ์ค๋ฅธ์์ ์๋ฏธํฉ๋๋ค. AwaitSlot๋ 100 ms ์ผ์ ์ค์ง๋ฅผ ํตํด ์ต๋ 20 ๊ฒ์ฌ๋ฅผ ์ํํ๊ณ ๋ช ๋ น์ ๋ฐ๋ณตํ์ง ์์ต๋๋ค. ์ด๋ ์ ์ฒด ์ธํธ๊ฐ ์๋ ์ ํํ ํญ๋ชฉ๋ง ํ์ธํฉ๋๋ค.
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 expected = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(expected == 0))
{
return 0;
}
UO.Arm("battle");
return AwaitSlot(1, expected);
return null;
}
dynamic AwaitSlot(dynamic layer, dynamic expected)
{
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == expected))
{
return 1;
}
UO.Wait(100);
}
return 0;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: name (String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Arm. -
InjectionScript.Runtime.InjectionApiUO.Equip:Equip(name, armSets, weaponLayers, "Weapon set requests processed.", "No weapons set with setarm.").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void Arm(string name)
=> Equip(name, armSets, weaponLayers, "Weapon set requests processed.", "No weapons set with setarm.");ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Armor();ํ์ฌ ์บ๋ฆญํฐ์ ์ ํญ ํ๋(๋ฌผ๋ฆฌ ๋ฐฉ์ด๊ตฌ/์ ํญ)๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์๋ช ๋ ์ํ ๊ฐ, -32768..32767์ ๋๋ค. ์์ ๊ฐ์ด ์ ์ง๋ฉ๋๋ค. 0๋ ์ค์ ์ ํญ, ๋ฐ์ดํฐ ๋ถ์กฑ ๋๋ ํ๋ ์ด์ด ๋๋ฝ/ํ๊ดด์ผ ์ ์์ต๋๋ค. GetResist๋ ์ ์ ์๋ ์ ํ๊ธฐ์ ๋ํด 0๋ ์ ๊ณตํฉ๋๋ค. bool, ID, ์คํฌ ํ๊ณ๋ ์ ํญ ํ๊ณ๊ฐ ์๋๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋ 1์ ์ ์๋ฏธํฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.PhysicalResistance ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- PhysicalResistance - ์๋ฒ ๊ฐ์ท/์ํ ํ๋: ํด๋์ ์๋ฒ๋ ๊ฐ์ท ๋ฑ๊ธ์ ์ ์กํ ์ ์์ผ๋ฉฐ, ์ ํญ์ด ์๋ ๊ท์น์ ๋ฌผ๋ฆฌ์ ์ ํญ์ ์ ์กํ ์ ์์ต๋๋ค. API๋ ์๋ก ๋ณํ๋์ง ์์ผ๋ฉฐ ํผํด ๊ฐ์์จ์ ๊ณ์ฐํ์ง ์์ต๋๋ค. Armor ๋ฐ ๋ฌผ๋ฆฌ์ ๋ณ์นญ์ ๋์ผํ ํ๋๋ฅผ ์ฝ์ต๋๋ค.
- CharacterStatus๋ ์ด๋ฆ, ์ฒด๋ ฅ, ์์ ์ ํน์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ํ์ํ ์ ์ฒด๋ฅผ ํ์ธํ ๋ค์ ๊ฐ ์ ํญ ๋จ์ด๋ฅผ ์๋ช ๋ Int16์ผ๋ก ๋ณํํฉ๋๋ค. ์๋ฆฐ ํ์ ๋ณธ๋ฌธ์ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ ํ์ ๊ผฌ๋ฆฌ type 6๋ ๋์ผํ ๊ท์น์ ์ ์งํฉ๋๋ค. ์ ํญ ๋ช ๋ น์ ์ต๋ ํ๊ณ๋ฅผ ์ฝ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Armor();
UO.Print("Armor: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค. ๋ ผ์์ ์์ต๋๋ค. ์์ ์ ์ฑ๊ฒฉ์ ์ฝ์ ์ ์์ต๋๋ค.
var value = UO.Armor();
UO.Print("PhysicalResistance: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ํ ์ฌ์ด์๋ UO.Wait(500) ๋ฐ๋ฆฌ์ด๊ฐ ์์ต๋๋ค. ์ฐจ์ด๋ ์์๊ฐ ๋ ์ ์์ต๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค. ์ผ์ ์ ์ง๋ ์ง์ฐ API์ด ์๋ ์๋ฅผ ๋ํ๋ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Armor();
await Delay(500);
var after = UO.Armor();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=50๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. ResistanceAtLeast๋ ๋๋ฝ๋ ํ๋ ์ด์ด๋ฅผ ๊ฑฐ๋ถํ๊ณ ํ๋์ ๊ฐ์ ์ฝ๊ณ bool๋ฅผ ๋ฐํํฉ๋๋ค: true ๋๋ ๊ฐ >= ์ต์์ธ ๊ฒฝ์ฐ false. ์ ํญ ์์ฒด๋ bool๊ฐ ์๋๋๋ค. ํจ์๋ ์๋์ ์์ ํ ์ ์ธ๋์ด ์์ต๋๋ค.
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(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.Armor();
return value >= minimum;
}
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.Armor:bridge.Armor.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "armor": return new InjectionValue(bridge.Armor);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.CharName();์บ๋ฆญํฐ์ ์ด๋ฆ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
string์ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ ค์ง ์ด๋ฆ์ ๋๋ค. ๋น ๋ฌธ์์ด์ ๋น์ด ์๊ฑฐ๋ ์ ์ ์๋ ๊ฐ ๋๋ ๊ฐ์ฒด๊ฐ ์์์ ์๋ฏธํฉ๋๋ค. serial ๋๋ ํ๋กํ ๊ฒฝ๋ก๊ฐ ์๋๋๋ค. ๊ฒ์ ์ด๋ฆ/์ ๋ชฉ์ ์ธ์ด IDE๋ก ๋ฒ์ญ๋์ง ์์ต๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.CharName();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋งค๊ฐ๋ณ์ ์์: self๋ฅผ ์ฝ์ต๋๋ค.
- ๋น ๋ฌธ์์ด์ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ด๊ฒ์ "0" ํ ์คํธ๊ฐ ์๋๋๋ค.
var text = UO.CharName();
if (Truth(text != ""))
{
UO.Print(text);
}
else
{
UO.Print("Text is unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น์ ์ ์บ๋ฆญํฐ๊ฐ ์ฝํ์ง๊ณ , ๊ทธ ๊ฐ์ ๋ผ์ธ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
-
- ์ฐ์ฐ์๋ ๋ฌธ์์ด์ ๊ฒฐํฉํฉ๋๋ค. ์ด ๊ฒฐ๊ณผ์๋ Convert.ToString๊ฐ ํ์ํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var text = UO.CharName();
UO.Print("Player ะธะผั: " + text);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ํธ์ถ ๋ชจ๋ self๋ฅผ ์ฐธ์กฐํฉ๋๋ค. UO.Wait๋ ์ผ์ ์ ์ง 1000ms๋ฅผ ์ค์ ํฉ๋๋ค.
- ๊ทธ ์ฐจ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ์ธ์์ ๋ ๋๋ ๊ฒ์ ์๋ฏธํ ์ ์์ต๋๋ค. ์ด ์์์๋ ์ด๋ฆ์ด๋ ์ ๋ชฉ์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var previous = UO.CharName();
await Delay(1000);
var current = UO.CharName();
if (Truth(previous != current))
{
UO.Print("Updated text: " + current);
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetName:bridge.GetName(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getname":
case "charname": return new InjectionValue(bridge.GetName(Arg(0, bridge.Self)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.CharTitle();์บ๋ฆญํฐ์ ์ ๋ชฉ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
string์ ๊ณ ๊ฐ์๊ฒ ์๋ ค์ง ์ ๋ชฉ์ ๋๋ค. ๋น ๋ฌธ์์ด์ ๋น์ด ์๊ฑฐ๋ ์ ์ ์๋ ๊ฐ ๋๋ ๊ฐ์ฒด๊ฐ ์์์ ์๋ฏธํฉ๋๋ค. serial ๋๋ ํ๋กํ ๊ฒฝ๋ก๊ฐ ์๋๋๋ค. ๊ฒ์ ์ด๋ฆ/์ ๋ชฉ์ ์ธ์ด IDE๋ก ๋ฒ์ญ๋์ง ์์ต๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.CharTitle();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋งค๊ฐ๋ณ์ ์์: self๋ฅผ ์ฝ์ต๋๋ค.
- ๋น ๋ฌธ์์ด์ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ด๊ฒ์ "0" ํ ์คํธ๊ฐ ์๋๋๋ค.
var text = UO.CharTitle();
if (Truth(text != ""))
{
UO.Print(text);
}
else
{
UO.Print("Text is unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น์ ์ ์บ๋ฆญํฐ๊ฐ ์ฝํ์ง๊ณ , ๊ทธ ๊ฐ์ ๋ผ์ธ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
-
- ์ฐ์ฐ์๋ ๋ฌธ์์ด์ ๊ฒฐํฉํฉ๋๋ค. ์ด ๊ฒฐ๊ณผ์๋ Convert.ToString๊ฐ ํ์ํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var text = UO.CharTitle();
UO.Print("Player ัะธััะป: " + text);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ํธ์ถ ๋ชจ๋ self๋ฅผ ์ฐธ์กฐํฉ๋๋ค. UO.Wait๋ ์ผ์ ์ ์ง 1000ms๋ฅผ ์ค์ ํฉ๋๋ค.
- ๊ทธ ์ฐจ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ์ธ์์ ๋ ๋๋ ๊ฒ์ ์๋ฏธํ ์ ์์ต๋๋ค. ์ด ์์์๋ ์ด๋ฆ์ด๋ ์ ๋ชฉ์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var previous = UO.CharTitle();
await Delay(1000);
var current = UO.CharTitle();
if (Truth(previous != current))
{
UO.Print("Updated text: " + current);
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CharacterTitle:bridge.CharacterTitle.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "chartitle": return new InjectionValue(bridge.CharacterTitle);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
string UO.CharacterTitle();์บ๋ฆญํฐ์ ์ ๋ชฉ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
string์ ๊ณ ๊ฐ์๊ฒ ์๋ ค์ง ์ ๋ชฉ์ ๋๋ค. ๋น ๋ฌธ์์ด์ ๋น์ด ์๊ฑฐ๋ ์ ์ ์๋ ๊ฐ ๋๋ ๊ฐ์ฒด๊ฐ ์์์ ์๋ฏธํฉ๋๋ค. serial ๋๋ ํ๋กํ ๊ฒฝ๋ก๊ฐ ์๋๋๋ค. ๊ฒ์ ์ด๋ฆ/์ ๋ชฉ์ ์ธ์ด IDE๋ก ๋ฒ์ญ๋์ง ์์ต๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.CharacterTitle();
UO.Print("CharacterTitle: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋งค๊ฐ๋ณ์ ์์: self๋ฅผ ์ฝ์ต๋๋ค.
- ๋น ๋ฌธ์์ด์ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ด๊ฒ์ "0" ํ ์คํธ๊ฐ ์๋๋๋ค.
var text = UO.CharacterTitle();
if (Truth(text != ""))
{
UO.Print(text);
}
else
{
UO.Print("Text is unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น์ ์ ์บ๋ฆญํฐ๊ฐ ์ฝํ์ง๊ณ , ๊ทธ ๊ฐ์ ๋ผ์ธ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
-
- ์ฐ์ฐ์๋ ๋ฌธ์์ด์ ๊ฒฐํฉํฉ๋๋ค. ์ด ๊ฒฐ๊ณผ์๋ Convert.ToString๊ฐ ํ์ํ์ง ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
var text = UO.CharacterTitle();
UO.Print("Player ัะธััะป: " + text);
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ํธ์ถ ๋ชจ๋ self๋ฅผ ์ฐธ์กฐํฉ๋๋ค. UO.Wait๋ ์ผ์ ์ ์ง 1000ms๋ฅผ ์ค์ ํฉ๋๋ค.
- ๊ทธ ์ฐจ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ์ธ์์ ๋ ๋๋ ๊ฒ์ ์๋ฏธํ ์ ์์ต๋๋ค. ์ด ์์์๋ ์ด๋ฆ์ด๋ ์ ๋ชฉ์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var previous = UO.CharacterTitle();
await Delay(1000);
var current = UO.CharacterTitle();
if (Truth(previous != current))
{
UO.Print("Updated text: " + current);
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [CharacterTitle]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CharacterTitle:bridge.CharacterTitle.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.CharacterTitleAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.ColdResist();ํ์ฌ ์บ๋ฆญํฐ์ ์ ํญ ํ๋: ์ฝ๋๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์๋ช ๋ ์ํ ๊ฐ, -32768..32767์ ๋๋ค. ์์ ๊ฐ์ด ์ ์ง๋ฉ๋๋ค. 0๋ ์ค์ ์ ํญ, ๋ฐ์ดํฐ ๋ถ์กฑ ๋๋ ํ๋ ์ด์ด ๋๋ฝ/ํ๊ดด์ผ ์ ์์ต๋๋ค. GetResist๋ ์ ์ ์๋ ์ ํ๊ธฐ์ ๋ํด 0๋ ์ ๊ณตํฉ๋๋ค. bool, ID, ์คํฌ ํ๊ณ๋ ์ ํญ ํ๊ณ๊ฐ ์๋๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋ 1์ ์ ์๋ฏธํฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.ColdResistance ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- ์์ ํ๋๋ ํ์ฅ๋ CharacterStatus (0x11), type >= 4๋ก ์ ๊ณต๋ฉ๋๋ค. ๋ช ๋ น ์์ฒด๋ ์๋ฒ ์๋๋ฅผ ํ์ธํ์ง ์์ต๋๋ค. ์ด๋ฌํ ํ๋๊ฐ ์๋ ์์ถ/์ด์ ์ํ๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์์๋ 0์ ๋๋ค. ๋ ์ ํญ์ Poisoned ํ๋๊ทธ๊ฐ ์๋๋๋ค. ๋ํ ์ฃผ๋ฌธ ์ ํญ ์คํฌ๋ ์๋๋๋ค.
- CharacterStatus๋ ์ด๋ฆ, ์ฒด๋ ฅ, ์์ ์ ํน์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ํ์ํ ์ ์ฒด๋ฅผ ํ์ธํ ๋ค์ ๊ฐ ์ ํญ ๋จ์ด๋ฅผ ์๋ช ๋ Int16์ผ๋ก ๋ณํํฉ๋๋ค. ์๋ฆฐ ํ์ ๋ณธ๋ฌธ์ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ ํ์ ๊ผฌ๋ฆฌ type 6๋ ๋์ผํ ๊ท์น์ ์ ์งํฉ๋๋ค. ์ ํญ ๋ช ๋ น์ ์ต๋ ํ๊ณ๋ฅผ ์ฝ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.ColdResist();
UO.Print("ColdResist: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค. ๋ ผ์์ ์์ต๋๋ค. ์์ ์ ์ฑ๊ฒฉ์ ์ฝ์ ์ ์์ต๋๋ค.
var value = UO.ColdResist();
UO.Print("ColdResistance: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ํ ์ฌ์ด์๋ UO.Wait(500) ๋ฐ๋ฆฌ์ด๊ฐ ์์ต๋๋ค. ์ฐจ์ด๋ ์์๊ฐ ๋ ์ ์์ต๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค. ์ผ์ ์ ์ง๋ ์ง์ฐ API์ด ์๋ ์๋ฅผ ๋ํ๋ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.ColdResist();
await Delay(500);
var after = UO.ColdResist();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=50๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. ResistanceAtLeast๋ ๋๋ฝ๋ ํ๋ ์ด์ด๋ฅผ ๊ฑฐ๋ถํ๊ณ ํ๋์ ๊ฐ์ ์ฝ๊ณ bool๋ฅผ ๋ฐํํฉ๋๋ค: true ๋๋ ๊ฐ >= ์ต์์ธ ๊ฒฝ์ฐ false. ์ ํญ ์์ฒด๋ bool๊ฐ ์๋๋๋ค. ํจ์๋ ์๋์ ์์ ํ ์ ์ธ๋์ด ์์ต๋๋ค.
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(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.ColdResist();
return value >= minimum;
}
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.ColdResistance:bridge.ColdResistance.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "coldresist": return new InjectionValue(bridge.ColdResistance);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Dead();
int UO.Dead(object? id);์บ๋ฆญํฐ ์ฌ๋ง์ ํ์ธํฉ๋๋ค.
-
idโ ํ์๋ ํ์์ ์ ํ์ ๊ฐ์ฒด: serial ์ซ์/16์ง์ ๋ฌธ์์ด, self, lasttarget ๋๋ ๋ฑ๋ก๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type๊ฐ ์๋๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ์ผ๋ถ ํ์์ ์ ์ ์๋ ํ ์คํธ๋ก ์ธํด ๋ณํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ํํ๊ธฐ ์ ์ ์ด๋ฆ์ ํ์ธํ์ธ์.
์ซ์ ํ๋๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ ์ ๋จ). ์ด๊ฒ์ ์ซ์ ํ๋๊ทธ์ ๋๋ค: C#์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์!= 0 ๋๋ ๊ฒฐ๊ณผ == 0. int์ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ๋น๊ตํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค. 1 - mobile์๋ IsDead์ด ์๊ณ , 0์๋ ๋ถํธ๊ฐ ์๊ฑฐ๋ mobile๊ฐ ์์ต๋๋ค. HP=0 ๊ทธ ์์ฒด๊ฐ ์ฃฝ์์ ์๋ฏธํ๋ ๊ฒ์ ์๋๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ๋์์ ์ด์ง ์๊ณ , ์ํ๋ฅผ ์์ฒญํ์ง ์์ผ๋ฉฐ, ํ๋๊ทธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค. ์ญ์ ๋ ๊ฐ์ฒด๋ ํด๋น ํญ๋ชฉ์ด ์ฌ์ ์์ ์ญ์ ๋๊ธฐ ์ ์๋ ๋๋ฝ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Dead();
UO.Print("Dead: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self๋ก ์ฝ์ต๋๋ค. active๋ ๊ฒฐ๊ณผ๋ฅผ ํ ๋ฒ ์ ์ฅํฉ๋๋ค. true ๋ฐ false๋ ๋ ๊ฐ์ ๋ถ๊ธฐ๋ฅผ ์ ์ํฉ๋๋ค. Print ์์ ๋ฉ์์ง๋ง ํ์๋ฉ๋๋ค.
var active = UO.Dead();
if (Truth(Truth(active) == true))
{
UO.Print("State is active");
}
else
{
UO.Print("State is inactive or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- lasttarget โ ์ด์ ์ ์ ํํ ๊ฐ์ฒด. Exists๋ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. obj๊ฐ ์ ์ผํ ๋งค๊ฐ๋ณ์ ReadState์ ๋๋ค. ์ด ํจ์๋ ์์ ์์ด ๋ช ๋ น ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ํด๋น ์ ์๋ ๋ณต์ฌ๋ ์ฝ๋์ ํฌํจ๋์ด ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
var observed = ReadState("lasttarget");
UO.Print("State 1/0: " + Convert.ToString(observed));
}
return null;
}
dynamic ReadState(dynamic obj)
{
return UO.Dead(obj);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ๋ ๋ฒ์ ํธ์ถ์ self, UO.Wait(500)๋ฅผ ์ฝ๊ณ 500 ๋ฐ๋ฆฌ์ด๋ฅผ ์ค์ ํฉ๋๋ค. ๋ ์ด๋ฏธ์ง๊ฐ ๋น๊ต๋ฉ๋๋ค. ์ค๊ฐ ์ ํ์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค. ๋์๋ ๊ธฐ๋ค๋ฆผ์ ์์ต๋๋ค.
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.Dead();
await Delay(500);
var after = UO.Dead();
if (Truth(before != after))
{
UO.Print("State changed: " + Convert.ToString(before) + " -> " + 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.Dead. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Dead:bridge.Dead().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Dead() => bridge.Dead();๋งค๊ฐ๋ณ์: id (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Dead. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id). -
InjectionScript.Runtime.InjectionApiUO.Dead:Dead(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsDead:bridge.IsDead(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Dead(InjectionValue id)
{
int serial = GetObject(id);
if (serial == bridge.Self)
return Dead();
return serial > 0 ? bridge.IsDead(serial) : 0;
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Dex();์บ๋ฆญํฐ์ ํ์ฌ ๋ฏผ์ฒฉ์ฑ(Dexterity, DEX)์ ์ฝ์ด์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ํ์ฌ ํต๊ณ ํฌ์ธํธ, 0..65535; ๋ฐฑ๋ถ์จ, ID, ์คํฌ, ์ ๊ธ ๋ชจ๋ ๋๋ bool๊ฐ ์๋๋๋ค. 0๋ ๋๋ฝ/์ญ์ ๋ ๋ฌธ์ ๋๋ ์ ๊ทผํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๊ธฐ๋ ํฉ๋๋ค. == true๊ฐ ์๋ ์์น ์๊ตฌ ์ฌํญ๊ณผ ๋น๊ตํ์ญ์์ค. ์ด๋ ์คํ ํ๋๋ ์์ ์์ด ๋ณด์ฅ๋ ๊ธฐ๋ณธ ๊ฐ์ด ์๋๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- Player๋ฅผ ์ฝ์ต๋๋ค.Dexterity Player๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์กด์ฌํ๋ ์ฃฝ์ ์บ๋ฆญํฐ๋ ์ ๊ฑฐ๋ ๊ฐ์ฒด๊ฐ ์๋๋๋ค. ์คํ ์ HP, ๋ง๋, ์ฒด๋ ฅ์ผ๋ก ๊ณ์ฐ๋์ง ์์ต๋๋ค.
- GetStr/GetInt/GetDex ObjID๋ฅผ ์๋ฝํฉ๋๋ค. PlayerMobile ๋ฐ์ดํฐ๋ self์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ serial - 0์ ๊ฒฝ์ฐ, ๋ก๋๋ mobile์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ํน์ฑ์ ๋์ฒด๋๊ฑฐ๋ ์ถ์ธก๋์ง ์์ต๋๋ค.
- Invoke๋ ์คํฌ๋ฆฝํธ๋ก ๋๊ธฐ๋ฅผ ์ทจ์ํ๋ ๊ธฐ๋ฅ์ ํตํด ๊ฒ์ ์คํธ๋ฆผ์์ ์ฝ๊ธฐ๋ฅผ ์ํํฉ๋๋ค. ์ํ๋ฅผ ์ฟผ๋ฆฌํ์ง ์์ผ๋ฉฐ, ๋์์ ์ด์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ, ํน์ฑ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ์ง์ฐ์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
UO.Dex(),UO.Dexterity(),UO.GetDex(),UO.GetDexterity().
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Dex();
UO.Print("Dex: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- value๋ ์ซ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ณํํฉ๋๋ค.ToString ์ก์ง์ฉ์ผ๋ก ํฌ๋งทํฉ๋๋ค. ๋ ผ์์ด๋ ์บ๋ฆญํฐ ํ๋์ด ์์ต๋๋ค.
var value = UO.Dex();
UO.Print("Dexterity: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ณ๋์ 1000 ms ์ ํ; UO.Wait ์์์ ์ถ๊ฐ๋์์ต๋๋ค. Change=after-before๋ ์์, 0 ๋๋ ์์์ผ ์ ์์ต๋๋ค. ๊ทธ ์์ฒด๋ก๋ ๋ชจ๋ ์ค๊ฐ ์ ๋ฐ์ดํธ์ ์๋ ์ข ๋ฃ๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Dex();
await Delay(1000);
var after = UO.Dex();
var change = after - before;
UO.Print("Change: " + Convert.ToString(change));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=80๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. AttributeAtLeast(์ต์)๋ ๋๋ฝ๋ ๋ฌธ์๋ฅผ ๊ฑฐ๋ถํ๊ณ ํน์ฑ์ ํ ๋ฒ ์ฝ๊ณ bool๋ฅผ ๋ฐํํฉ๋๋ค: true ๋๋ >= ์ต์์ธ ๊ฒฝ์ฐ false. ๋ ผ๋ฆฌ์ ์๋ฏธ๋ ํน์ฑ ์์ฒด๊ฐ ์๋ ๋น๊ต์ ์ํด ๋ถ์ฌ๋ฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (Truth(Truth(AttributeAtLeast(80)) == true))
{
UO.Print("Requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic AttributeAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.Dex();
return value >= minimum;
}
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.Dexterity:bridge.Dexterity.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "dex": return new InjectionValue(bridge.Dexterity);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Dexterity();์บ๋ฆญํฐ์ ํ์ฌ ๋ฏผ์ฒฉ์ฑ(Dexterity, DEX)์ ์ฝ์ด์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ํ์ฌ ํต๊ณ ํฌ์ธํธ, 0..65535; ๋ฐฑ๋ถ์จ, ID, ์คํฌ, ์ ๊ธ ๋ชจ๋ ๋๋ bool๊ฐ ์๋๋๋ค. 0๋ ๋๋ฝ/์ญ์ ๋ ๋ฌธ์ ๋๋ ์ ๊ทผํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๊ธฐ๋ ํฉ๋๋ค. == true๊ฐ ์๋ ์์น ์๊ตฌ ์ฌํญ๊ณผ ๋น๊ตํ์ญ์์ค. ์ด๋ ์คํ ํ๋๋ ์์ ์์ด ๋ณด์ฅ๋ ๊ธฐ๋ณธ ๊ฐ์ด ์๋๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- Player๋ฅผ ์ฝ์ต๋๋ค.Dexterity Player๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์กด์ฌํ๋ ์ฃฝ์ ์บ๋ฆญํฐ๋ ์ ๊ฑฐ๋ ๊ฐ์ฒด๊ฐ ์๋๋๋ค. ์คํ ์ HP, ๋ง๋, ์ฒด๋ ฅ์ผ๋ก ๊ณ์ฐ๋์ง ์์ต๋๋ค.
- GetStr/GetInt/GetDex ObjID๋ฅผ ์๋ฝํฉ๋๋ค. PlayerMobile ๋ฐ์ดํฐ๋ self์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ serial - 0์ ๊ฒฝ์ฐ, ๋ก๋๋ mobile์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ํน์ฑ์ ๋์ฒด๋๊ฑฐ๋ ์ถ์ธก๋์ง ์์ต๋๋ค.
- Invoke๋ ์คํฌ๋ฆฝํธ๋ก ๋๊ธฐ๋ฅผ ์ทจ์ํ๋ ๊ธฐ๋ฅ์ ํตํด ๊ฒ์ ์คํธ๋ฆผ์์ ์ฝ๊ธฐ๋ฅผ ์ํํฉ๋๋ค. ์ํ๋ฅผ ์ฟผ๋ฆฌํ์ง ์์ผ๋ฉฐ, ๋์์ ์ด์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ, ํน์ฑ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ์ง์ฐ์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
UO.Dex(),UO.Dexterity(),UO.GetDex(),UO.GetDexterity().
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Dexterity();
UO.Print("Dexterity: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- value๋ ์ซ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ณํํฉ๋๋ค.ToString ์ก์ง์ฉ์ผ๋ก ํฌ๋งทํฉ๋๋ค. ๋ ผ์์ด๋ ์บ๋ฆญํฐ ํ๋์ด ์์ต๋๋ค.
var value = UO.Dexterity();
UO.Print("Dexterity: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ณ๋์ 1000 ms ์ ํ; UO.Wait ์์์ ์ถ๊ฐ๋์์ต๋๋ค. Change=after-before๋ ์์, 0 ๋๋ ์์์ผ ์ ์์ต๋๋ค. ๊ทธ ์์ฒด๋ก๋ ๋ชจ๋ ์ค๊ฐ ์ ๋ฐ์ดํธ์ ์๋ ์ข ๋ฃ๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.Dexterity();
await Delay(1000);
var after = UO.Dexterity();
var change = after - before;
UO.Print("Change: " + Convert.ToString(change));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=80๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. AttributeAtLeast(์ต์)๋ ๋๋ฝ๋ ๋ฌธ์๋ฅผ ๊ฑฐ๋ถํ๊ณ ํน์ฑ์ ํ ๋ฒ ์ฝ๊ณ bool๋ฅผ ๋ฐํํฉ๋๋ค: true ๋๋ >= ์ต์์ธ ๊ฒฝ์ฐ false. ๋ ผ๋ฆฌ์ ์๋ฏธ๋ ํน์ฑ ์์ฒด๊ฐ ์๋ ๋น๊ต์ ์ํด ๋ถ์ฌ๋ฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (Truth(Truth(AttributeAtLeast(80)) == true))
{
UO.Print("Requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic AttributeAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.Dexterity();
return value >= minimum;
}
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 [Dexterity]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Dexterity:bridge.Dexterity.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.DexterityAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Disarm();์์์ ๋ฌด๊ธฐ์ ๋ฐฉํจ๋ฅผ ์ ๊ฑฐํฉ๋๋ค: ๋ ์ด์ด 1 ๋ฐ 2. ์๋ฅ์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ๋ก์ปฌ ์์ ํ์ฉ, 0 (์กฐ๊ฑด ์ถฉ์กฑ ์ ๋จ) - ๊ฑฐ๋ถ. ์ด๋ ์๋ฒ ํ์ธ๋ ์๋๊ณ ID๋ ์๋๊ณ , ์๋๋ ์๋๋๋ค. ๋์ค์ ์๋ฒ๊ฐ ์คํจํ ์ ์์ต๋๋ค. ๋ต๋ณ ํ ์ค์ ์ฅ๋น๋ฅผ ํ์ธํ์ธ์.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก๋๋ ํญ๋ชฉ๊ณผ ์์ ๋ก์ด ์ ๋๋๊ทธ๊ฐ ํ์ํฉ๋๋ค. ์ ๊ฑฐํ ๋๋ ์ค์ ๋ฐฐ๋ญ self๊ฐ ํ์ํ๋ฉฐ ์๋น ๋ฐฐ๋ญ GrabBag์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ์ ์ ์๊ฑฐ๋ ํ์๋์๊ฑฐ๋ ๋ถ์ ํฉํ ํ๋ชฉ์ ๊ฑฐ๋ถ๋ฉ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ํญ๋ชฉ์ UnequipItems๋ฅผ ํตํด ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์ธํธ๋ ์์์ฑ ํธ๋์ญ์ ์ด ์๋๋๋ค.
- EquipItems/UnequipItems๋ ์น์ธ๋ ์์ ์ดํ ๋ค์ ์์ ์ด์ ์ DressSpeed๋ฅผ ์ ์ฉํฉ๋๋ค. Disarm/Undress - ๊ฐ ์ ์ ๋ ์ด์ด ๋ค์. ์ถ๊ธ์ ์บ๋ฆฌ๊ฐ ํ์ฉ๋๋ ๊ฒฝ์ฐ DropDelay๋ฅผ ์ถ๊ฐ๋ก ์กด์คํฉ๋๋ค. ๋ค๋ฅธ ๋ฐํ์์ ๋์ผํ ์ค์ ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๊ฐ์์ ์๋ฒ ์ ํ์ โโ๋ฌด์ํ์ง ์์ต๋๋ค.
- ์๋ชป๋ ํธ์ถ ํ์, ์ ์ ์๋ ๋ ์ด์ด ์ด๋ฆ ๋๋ ์ซ์๋ก ๋ณํํ ์ ์๋ ๊ฐ์ผ๋ก ์ธํด 0 ๋์ ์คํฌ๋ฆฝํธ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ฅ๋น ์ค๋ ์ท์๋ ์ด๋ฏธ ๋ก๋๋ ๋ฐ์ดํฐ๋ง ํฌํจ๋ฉ๋๋ค. ์ด์์คํดํธ์์๋ ChangeAndConfirm ๋ ์ด์ด=1๊ฐ ์ค๋ฅธ์์ ๋๋ค. ๋ ๋ค๋ฅธ ์ ์ ์ค์ ๋ ์ด์ด๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค.
- ๋ฐฐ์ด์ ๊ฒฝ์ฐ 1๋ ๋์ด๋ ๋ชจ๋ ์์ ์ด ํ์ฉ๋จ์ ์๋ฏธํฉ๋๋ค. ๊ฑฐ๋ถํ๋ ๊ฒฝ์ฐ 0๊ฐ ๋ฐํ๋ฉ๋๋ค. ๋๋จธ์ง ์์๋ ๊ณ์ ์ฒ๋ฆฌ๋๋ฉฐ ๋กค๋ฐฑ์ ์์ต๋๋ค. ๋น ๋ฐฐ์ด์ ์๋ฌด๋ฐ ์์ ์์ด 1๋ฅผ ์์ฑํฉ๋๋ค. Disarm/Undress ํ์ํ ๋ ์ด์ด๊ฐ ์ด๋ฏธ ๋น์ด ์๋ ๊ฒฝ์ฐ์๋ 1๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ถ๋ถ์ ์ธ ์คํจ๋ 0๋ฅผ ์ ๊ณตํฉ๋๋ค.
- UO.EquipItems ยท UO.UnequipItems ยท UO.DressSpeed ยท UO.DropDelay ยท UO.ObjAtLayerEx
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Disarm();
UO.Print("Disarm: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ , ๊ฒ์์์ ์ ์ ํ ํญ๋ชฉ์ ์ ํํ์ธ์: lasttarget - ID. Equip/WearItem ์์์ 1 ๋ ์ด์ด์๋ ๋ณด์กฐ ๋ฌด๊ธฐ๊ฐ ํ์ํฉ๋๋ค. Unequip(1)๋ ์ค๋ฅธ์์ ์ ๊ฑฐํฉ๋๋ค. Disarm/Undress ์์ฒด ๊ณ ์ ๋ ์ด์ด๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํฉ๋๋ค. ๊ฑฐ์ ํ์๋ ์๋ ์ฌ์์ด ๋์ง ์์ต๋๋ค.
return UO.Disarm();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฅ์ฐฉ ๋ฐฉ๋ฒ์ ์์ด์ 0x0F5E๋ ๊ฒ์ ์์์ด๊ณ , 0x1B76๋ ๋ฐฉํจ์ ์์์ ๋๋ค. FindType๋ ๋ฐฐ๋ญ์ ๋ก๋๋ ํญ๋ชฉ ์ค์์ ํด๋น ํญ๋ชฉ์ ์ฐพ๊ณ , ASC๋ ๋ฐํ๋ 16์ง์-ID๋ฅผ ๋ณํํฉ๋๋ค. ์ ๊ฑฐํ๋ ค๋ฉด ํ์ฌ ๋ ์ด์ด๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค. ํ์ํ ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์์ผ๋ฉด ์คํฌ๋ฆฝํธ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ๋ฐฐ์ด์ ๋ ๊ฐ์ ID๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ฐ ํญ๋ชฉ์ ์์ ํ ์ ์ก๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var first = UO.ObjAtLayerEx(1, UO.Self());
var second = UO.ObjAtLayerEx(2, UO.Self());
if (Truth(first == 0) || Truth(second == 0))
{
return 0;
}
UO.AddObject("saved_first", first);
UO.AddObject("saved_second", second);
return UO.Disarm();
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ChangeAndConfirm๋ ๋ช ๋ น์ ํ ๋ฒ ์คํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ 100ms์ ์ผ์ ์ค์ง๋ฅผ ํตํด ์ต๋ 20ํ๊น์ง ์ค์ ์ํ๋ฅผ ํ์ธํฉ๋๋ค. 1 - ๊ฒ์ฌ ๊ฒฐ๊ณผ ์์ ์ํ๊ฐ ํ์ธ๋์์ต๋๋ค. 0 - ์คํจ ๋๋ ๋ง๋ฃ๋ ๋๊ธฐ์ ๋๋ค. ์ด๋ ์๋ก์ด ๋ด์ฅ ๋ช ๋ น์ด ์๋ ๋์ฐ๋ฏธ์ ๊ฒฐ๊ณผ์ ๋๋ค. ์์ ์์ฒด๋ฅผ ํธ์ถํ๋ ๋ฐ์๋ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
return ChangeAndConfirm();
return null;
}
dynamic ChangeAndConfirm()
{
if (!(Truth(UO.Disarm())))
{
return 0;
}
dynamic[] layers = new dynamic[checked((int)(1) + 1)];
layers[0] = 1;
layers[1] = 2;
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
dynamic empty = true;
for (int i = (int)(0); i <= ArrayLength(layers) - 1; i += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layers[i], UO.Self()) != 0))
{
empty = false;
}
}
if (Truth(empty))
{
return 1;
}
UO.Wait(100);
}
return 0;
}
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Disarm. -
InjectionScript.Runtime.InjectionApiUO.Unequip:Unequip(weaponLayers, "Weapons disarmed.").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Disarm()
=> Unequip(weaponLayers, "Weapons disarmed.");int UO.Dismount();Mount์ Dismount๋ ์๋ ๋๋ธ ํด๋ฆญ์ด๋ ์ ํฌ ๋ชจ๋ ๊ณต๊ฒฉ ์ฒ๋ฆฌ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๊ฐ์ฒด ์ฌ์ฉ ์์ฒญ์ ์ ์กํฉ๋๋ค. int๋ Mount ๋ ์ด์ด์ ํ์ฌ ์์ดํ serial์ด๋ฉฐ ์ฑ๊ณต ์ฌ๋ถ๊ฐ ์๋๋๋ค. ์๋ฒ ์๋ต์ ๋น๋๊ธฐ์ด๋ฏ๋ก Mount๊ฐ ์์ง 0, Dismount๊ฐ ์ ๊ฑฐ ์ serial์ ๋ฐํํ ์ ์์ต๋๋ค. ์๋ต ํ ObjAtLayer("Mount")๋ฅผ ํ์ธํ์ธ์.
๋งค๊ฐ๋ณ์ ์์.
๊ฐ ์ฝ๋ ๋ธ๋ก์ ์์ ํ ๋ ๋ฆฝ .csx์ ๋๋ค. ์์ serial, type๊ณผ ์ขํ๋ฅผ ๋ฐ๊พธ์ธ์. ์ธ์ ์์์ C# ๋ช ๋ช ๋ ์ธ์๋ ์๊ทธ๋์ฒ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
#dismount
๊ฐ ์ฝ๋ ๋ธ๋ก์ ์์ ํ ๋ ๋ฆฝ .csx์ ๋๋ค. ์์ serial, type๊ณผ ์ขํ๋ฅผ ๋ฐ๊พธ์ธ์. ์ธ์ ์์์ C# ๋ช ๋ช ๋ ์ธ์๋ ์๊ทธ๋์ฒ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
int mountLayerSerial = UO.Dismount();
UO.Print(UO.Int2Hex(mountLayerSerial));var before = UO.ObjAtLayer("Mount");
int currentSerial = UO.Dismount();
UO.Print($"{before} -> {UO.Int2Hex(currentSerial)}");UO.Dismount();
await WaitAsync(250);
UO.Print(Convert.ToString(UO.ObjAtLayer("Mount")));new CommandSample().Execute(UO);
sealed class CommandSample
{
public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
{
int mountLayerSerial = api.Dismount();
api.Print(api.Int2Hex(mountLayerSerial));
}
}CSharpGameApi.Dismount
-> CSharpScriptGlobals
-> InjectionScript.Runtime.InjectionApiUO.Dismount
ClassicUOInjectionApiBridge -> NativeMountController.Request
-> OutgoingPackets.Send_UseObjectRequest (0x06)
-> MountedLayerSerialUnsafe -> Player.FindItemByLayer(Layer.Mount)
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.Dress(object? name);์ด์ ์ ์ ์ฅํ ์ด๋ฆ์ ์๋ฅ ์ธํธ๋ฅผ ๋ณต์ํฉ๋๋ค.
-
nameโ "travel" ๋๋ "battle"๊ณผ ๊ฐ์ ์ธํธ์ ๋ฌธ์์ด ์ด๋ฆ์ ๋๋ค. ์ด๋ฆ์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์๋ฅ์ ๋ฌด๊ธฐ ์ธํธ๋ ๋ณ๋๋ก ์ ์ฅ๋ฉ๋๋ค. ๋ ๋ค์ ๋์ผํ ์ด๋ฆ์ด ํ์ฉ๋ฉ๋๋ค. ์ด๊ฒ์ ID ์ฌ๋ฌผ์ด๋ ํ์ผ ์ด๋ฆ์ด ์๋๋๋ค. SetDress๋ง ์ด๋ฆ์ด ์๋ ๊ฒ์ ํ์ฉํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ DressSavedSet/EquipDressSet์ ๋ํด ๋ณ๋์ ์ธํธ๊ฐ ๊ธฐ๋ก๋ฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํ๊ฑฐ๋ true์ ๋น๊ตํ์ง ๋ง์ธ์. ์ ์ฅํ๊ณ ์ญ์ ํ๋ฉด ์ฅ๋น๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ด ์๋๋ผ ํญ๋ชฉ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
- ์๋ฅ: ๋ ์ด์ด๋ 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. ๋ฌด๊ธฐ: 1 ๋ฐ 2๋ง ํด๋น. ๋จธ๋ฆฌ์นด๋ฝ, ์์ผ, ๋ฐฐ๋ญ, ๋๋ฌผ, ์ํ์ ์ด ์ธํธ์ ํฌํจ๋์ง ์์ต๋๋ค.
- ์ด๋ฏธ ๋ก๋๋ ํน์ serial ํญ๋ชฉ์ ์์ฒด ๋ ์ด์ด์ ๊ธฐ๋ก๋ฉ๋๋ค. ๋์ผํ ์ด๋ฆ์ ๋ค์ ์ ์ฅํ๋ฉด ํญ๋ชฉ์ด ๋์ฒด๋ฉ๋๋ค. ๋น ๋ ์ด์ด๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ณต์๋๋ฉด ํด๋น ์ ์ ๋ ์ด์ด๊ฐ ์์ฒด ๋ฐฑํฉ์ผ๋ก ํด์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ ์ฅ๋ ์์ ํ ๋น์ด ์๋ ์ธํธ๋ ํด๋น ๋ ์ด์ด์์ ํญ๋ชฉ์ ์ ๊ฑฐํฉ๋๋ค.
- ์ธํธ๋ ๋ฐํ์ ์ํ๋ก ์ ์ฅ๋ฉ๋๋ค. ํธ์ถ ์์ฒด๋ ํ์ผ์ ์์ฑํ์ง ์์ผ๋ฉฐ ์ธํธ๊ฐ ๋ค๋ฅธ ํ๋กํ์ด๋ ์ ๋ฐํ์์ผ๋ก ์ ์ก๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ๋จผ์ ์ํ๋ ์ธํธ๋ฅผ ์ฌ์ฉ๋ ์ํ๋ก ์ ์ฅํฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ์ผ๋ฐ ์ํ๋ฅผ ๋ก๋/์ ์ฅํ๋ ๊ฒ์ ๋ณ๋์ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
- ํ์ฌ์ โโ์ ์ฅ๋ ID ์ฌ์ด์ ์ ํํ ์ผ์น๋ ๋ค์ ์ฌ์ฉ๋๊ฑฐ๋ ๋ฐ์ํ์ง ์๊ณ ๊ฑด๋๋๋๋ค. ๋๋ฝ๋ ํญ๋ชฉ์ ์ ์ฌํ type๋ก ๋์ฒด๋์ง ์์ต๋๋ค. ํ ์์ ์ด ์คํจํด๋ ์ฑ๊ณตํ ์์ ์ด ์ทจ์๋์ง ์์ผ๋ฉฐ ๋ค๋ฅธ ์์ ์ ์๋๋ฅผ ๋ฐฉํดํ์ง ์์ต๋๋ค. ์๋ ๋กค๋ฐฑ์ ์์ต๋๋ค. ์ฐ๊ฒฐ๊ณผ ๋ก๋๋ ๋ด์ฉ์ด ํ์ํฉ๋๋ค. ์ ๊ฑฐํ๋ฉด ์ค์ ๋ฐฐ๋ญ์ด ์ฌ์ฉ๋ฉ๋๋ค.
- UO.Set("equipfordress", 0)๋ ์์ดํ ์ฌ์ฉ ์์ฒญ์ ์ ํํฉ๋๋ค(์ด๊ธฐ ๋ชจ๋). 0์ด ์๋ ๊ฐ - ํฝ์ /์ฅ์ฐฉ. ๋ ๋ชจ๋ ๋ชจ๋์์ ์ํ๋ ์จ์ด๋ฌ๋ธ ๋ ์ด์ด๋ฅผ ํ์ธํฉ๋๋ค. ์ด๋ฏธ ์ฐฉ์ฉํ ์์ดํ ์ ๋ฐ๋ณต ์ฌ์ฉ์ผ๋ก ์ ํํ ์ ์์ต๋๋ค. DressSpeed์ ์์ฒญ ์๋ฝ ์ดํ ์ ํจํ๋ฉฐ, ์ฒ ํ๋ DropDelay๋ฅผ ์ถ๊ฐ๋ก ์กด์คํฉ๋๋ค.
- Dress ๋ฐ Arm๋ ์คํจ ์์๋ void๋ฅผ ๋ฐํํฉ๋๋ค. ์์ฒญ์ด ์๋ฝ๋์๋ค๋ ๋ฉ์์ง๋ ์๋ฒ์ ํ์ธ์ ์๋ฏธํ์ง ์์ต๋๋ค. ์ฐฉ์ฉ์ ๋ฐ๋ผ ๊ณ์ ์งํํ๋ ค๋ฉด ๊ธฐ๋์น๊ฐ ์ ํ๋ ์ค์ ๋ ์ด์ด๋ฅผ ํ์ธํ์ธ์.
- UO.SetDress ยท UO.Dress ยท UO.DressSavedSet ยท UO.SetArm ยท UO.Arm ยท UO.DressSpeed
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.Dress");
UO.Dress("travel");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ ์ธํธ๋ ๋์ผํ ๋ฐํ์ ์ํ์์ ์ด์ ์ ์ ์ฅ๋์ด์ผ ํฉ๋๋ค. ๊ฐ ๋ณต์ ์ง์ ์ SetDress/SetArm๋ฅผ ํธ์ถํ์ง ๋ง์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ํ์ฌ ํญ๋ชฉ์ผ๋ก ๋์์ ๋ฎ์ด์ฐ๊ฒ ๋ฉ๋๋ค.
UO.Dress("travel");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0์ด ์๋ ์ฅ๋น๋ ํฝ์ /์ฅ๋น๋ฅผ ์ ํํฉ๋๋ค. 350 โ ๋ฐ๋ฆฌ์ด DressSpeed. ์ด๋ฌํ ์ค์ ์ ์์ ์ดํ ๋ฐํ์์๋ ์ ์ง๋ฉ๋๋ค. ์ ๊ฑฐ ๋ฐ ์ฐฉ์ฉ์ ์๋ฒ์์ ๊ฒฐ์ ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Set("equipfordress", 1);
UO.DressSpeed(350);
UO.Dress("travel");
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- lasttarget โ ID ์ด์ ์ ์ ์ฅ๋ ์ธํธ์ ํฌํจ๋์ด์ผ ํ๋ ํญ๋ชฉ์ ๋๋ค. ์ปจํธ๋กค ๋ ์ด์ด 3๋ ์ ๋ฐ์ ์๋ฏธํ๊ณ , 1๋ ์ค๋ฅธ์์ ์๋ฏธํฉ๋๋ค. AwaitSlot๋ 100 ms ์ผ์ ์ค์ง๋ฅผ ํตํด ์ต๋ 20 ๊ฒ์ฌ๋ฅผ ์ํํ๊ณ ๋ช ๋ น์ ๋ฐ๋ณตํ์ง ์์ต๋๋ค. ์ด๋ ์ ์ฒด ์ธํธ๊ฐ ์๋ ์ ํํ ํญ๋ชฉ๋ง ํ์ธํฉ๋๋ค.
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 expected = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(expected == 0))
{
return 0;
}
UO.Dress("travel");
return AwaitSlot(3, expected);
return null;
}
dynamic AwaitSlot(dynamic layer, dynamic expected)
{
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == expected))
{
return 1;
}
UO.Wait(100);
}
return 0;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: name (String)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Dress. -
InjectionScript.Runtime.InjectionApiUO.Equip:Equip(name, dressSets, dressLayers, "Clothing set requests processed.", "No clothing set with setdress.").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void Dress(string name)
=> Equip(name, dressSets, dressLayers, "Clothing set requests processed.", "No clothing set with setdress.");ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.DressSavedSet();์ด๋ฆ ์์ด UO.SetDress()๋ฅผ ํธ์ถํ์ฌ ์ ์ฅํ ์ท ์ธํธ๋ฅผ ๋ณต์ํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
์ค์ ๋ก ์ซ์ ํ๋๊ทธ int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ํ์ํ ๋ชจ๋ ์์ฒญ์ด ๋ก์ปฌ์์ ์น์ธ๋์๊ฑฐ๋ ํ์ํ ๋ ์ด์ด๊ฐ ์ด๋ฏธ ์ผ์นํ์ต๋๋ค. 0 (์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์) - ์ ํ ๊ฑธ๊ธฐ, ์ฐ๊ฒฐ ์์ ๋๋ ํ๋ ์ด์์ ์์ฒญ์ด ๊ฑฐ๋ถ๋์์ต๋๋ค. ๋ฑ๋ก object? ์ด๊ฒ์ ํ์ฉํฉ๋๋ค int. ์ด๋ ID, ์ฐฉ์ฉ ์์ดํ ๊ฐ์, ์๋ฒ ํ์ธ์ด ์๋๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ์๋ฅ: ๋ ์ด์ด๋ 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. ๋ฌด๊ธฐ: 1 ๋ฐ 2๋ง ํด๋น. ๋จธ๋ฆฌ์นด๋ฝ, ์์ผ, ๋ฐฐ๋ญ, ๋๋ฌผ, ์ํ์ ์ด ์ธํธ์ ํฌํจ๋์ง ์์ต๋๋ค.
- ์ด๋ฏธ ๋ก๋๋ ํน์ serial ํญ๋ชฉ์ ์์ฒด ๋ ์ด์ด์ ๊ธฐ๋ก๋ฉ๋๋ค. ๋์ผํ ์ด๋ฆ์ ๋ค์ ์ ์ฅํ๋ฉด ํญ๋ชฉ์ด ๋์ฒด๋ฉ๋๋ค. ๋น ๋ ์ด์ด๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ณต์๋๋ฉด ํด๋น ์ ์ ๋ ์ด์ด๊ฐ ์์ฒด ๋ฐฑํฉ์ผ๋ก ํด์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ ์ฅ๋ ์์ ํ ๋น์ด ์๋ ์ธํธ๋ ํด๋น ๋ ์ด์ด์์ ํญ๋ชฉ์ ์ ๊ฑฐํฉ๋๋ค.
- ์ธํธ๋ ๋ฐํ์ ์ํ๋ก ์ ์ฅ๋ฉ๋๋ค. ํธ์ถ ์์ฒด๋ ํ์ผ์ ์์ฑํ์ง ์์ผ๋ฉฐ ์ธํธ๊ฐ ๋ค๋ฅธ ํ๋กํ์ด๋ ์ ๋ฐํ์์ผ๋ก ์ ์ก๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ๋จผ์ ์ํ๋ ์ธํธ๋ฅผ ์ฌ์ฉ๋ ์ํ๋ก ์ ์ฅํฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ์ผ๋ฐ ์ํ๋ฅผ ๋ก๋/์ ์ฅํ๋ ๊ฒ์ ๋ณ๋์ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
- ํ์ฌ์ โโ์ ์ฅ๋ ID ์ฌ์ด์ ์ ํํ ์ผ์น๋ ๋ค์ ์ฌ์ฉ๋๊ฑฐ๋ ๋ฐ์ํ์ง ์๊ณ ๊ฑด๋๋๋๋ค. ๋๋ฝ๋ ํญ๋ชฉ์ ์ ์ฌํ type๋ก ๋์ฒด๋์ง ์์ต๋๋ค. ํ ์์ ์ด ์คํจํด๋ ์ฑ๊ณตํ ์์ ์ด ์ทจ์๋์ง ์์ผ๋ฉฐ ๋ค๋ฅธ ์์ ์ ์๋๋ฅผ ๋ฐฉํดํ์ง ์์ต๋๋ค. ์๋ ๋กค๋ฐฑ์ ์์ต๋๋ค. ์ฐ๊ฒฐ๊ณผ ๋ก๋๋ ๋ด์ฉ์ด ํ์ํฉ๋๋ค. ์ ๊ฑฐํ๋ฉด ์ค์ ๋ฐฐ๋ญ์ด ์ฌ์ฉ๋ฉ๋๋ค.
- UO.Set("equipfordress", 0)๋ ์์ดํ ์ฌ์ฉ ์์ฒญ์ ์ ํํฉ๋๋ค(์ด๊ธฐ ๋ชจ๋). 0์ด ์๋ ๊ฐ - ํฝ์ /์ฅ์ฐฉ. ๋ ๋ชจ๋ ๋ชจ๋์์ ์ํ๋ ์จ์ด๋ฌ๋ธ ๋ ์ด์ด๋ฅผ ํ์ธํฉ๋๋ค. ์ด๋ฏธ ์ฐฉ์ฉํ ์์ดํ ์ ๋ฐ๋ณต ์ฌ์ฉ์ผ๋ก ์ ํํ ์ ์์ต๋๋ค. DressSpeed์ ์์ฒญ ์๋ฝ ์ดํ ์ ํจํ๋ฉฐ, ์ฒ ํ๋ DropDelay๋ฅผ ์ถ๊ฐ๋ก ์กด์คํฉ๋๋ค.
- Dress ๋ฐ Arm๋ ์คํจ ์์๋ null๋ฅผ ๋ฐํํฉ๋๋ค. ์์ฒญ์ด ์๋ฝ๋์๋ค๋ ๋ฉ์์ง๋ ์๋ฒ์ ํ์ธ์ ์๋ฏธํ์ง ์์ต๋๋ค. ์ฐฉ์ฉ์ ๋ฐ๋ผ ๊ณ์ ์งํํ๋ ค๋ฉด ๊ธฐ๋์น๊ฐ ์ ํ๋ ์ค์ ๋ ์ด์ด๋ฅผ ํ์ธํ์ธ์.
- UO.SetDress ยท UO.Dress ยท UO.DressSavedSet ยท UO.SetArm ยท UO.Arm ยท UO.DressSpeed
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.DressSavedSet();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ ์ธํธ๋ ๋์ผํ ๋ฐํ์ ์ํ์์ ์ด์ ์ ์ ์ฅ๋์ด์ผ ํฉ๋๋ค. ๊ฐ ๋ณต์ ์ง์ ์ SetDress/SetArm๋ฅผ ํธ์ถํ์ง ๋ง์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ํ์ฌ ํญ๋ชฉ์ผ๋ก ๋์์ ๋ฎ์ด์ฐ๊ฒ ๋ฉ๋๋ค.
return UO.DressSavedSet();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0์ด ์๋ ์ฅ๋น๋ ํฝ์ /์ฅ๋น๋ฅผ ์ ํํฉ๋๋ค. 350 โ ๋ฐ๋ฆฌ์ด DressSpeed. ์ด๋ฌํ ์ค์ ์ ์์ ์ดํ ๋ฐํ์์๋ ์ ์ง๋ฉ๋๋ค. ์ ๊ฑฐ ๋ฐ ์ฐฉ์ฉ์ ์๋ฒ์์ ๊ฒฐ์ ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Set("equipfordress", 1);
UO.DressSpeed(350);
return UO.DressSavedSet();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- lasttarget โ ID ์ด์ ์ ์ ์ฅ๋ ์ธํธ์ ํฌํจ๋์ด์ผ ํ๋ ํญ๋ชฉ์ ๋๋ค. ์ปจํธ๋กค ๋ ์ด์ด 3๋ ์ ๋ฐ์ ์๋ฏธํ๊ณ , 1๋ ์ค๋ฅธ์์ ์๋ฏธํฉ๋๋ค. AwaitSlot๋ 100 ms ์ผ์ ์ค์ง๋ฅผ ํตํด ์ต๋ 20 ๊ฒ์ฌ๋ฅผ ์ํํ๊ณ ๋ช ๋ น์ ๋ฐ๋ณตํ์ง ์์ต๋๋ค. ์ด๋ ์ ์ฒด ์ธํธ๊ฐ ์๋ ์ ํํ ํญ๋ชฉ๋ง ํ์ธํฉ๋๋ค.
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 expected = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(expected == 0))
{
return 0;
}
if (!(Truth(UO.DressSavedSet())))
{
return 0;
}
return AwaitSlot(3, expected);
return null;
}
dynamic AwaitSlot(dynamic layer, dynamic expected)
{
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == expected))
{
return 1;
}
UO.Wait(100);
}
return 0;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.Equip:Equip("__stealth_saved_set__", dressSets, dressLayers, "Clothing set requests processed.", "No clothing set with setdress.").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "dresssavedset":
case "equipdressset": return new InjectionValue(Equip("__stealth_saved_set__", dressSets, dressLayers, "Clothing set requests processed.", "No clothing set with setdress."));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.DressSpeed();
dynamic UO.DressSpeed(object? value);ํ์ฌ ๋ฐํ์์์ ์ท ์ ๊ธฐ/๋ฒ๊ธฐ ์์ ์ฌ์ด์ ์ผ์ ์ค์ง๋ฅผ ์ฝ๊ฑฐ๋ ์ค์ ํฉ๋๋ค. ์๋ฒ ๊ท์น์ ๋ํด ์ผ๋ จ์ ์์ ์ ๋๋ฌด ๋นจ๋ฆฌ ๋ณด๋ด๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
-
value- ์ ํ์ ์ธ ๋ฐ๋ฆฌ์ด์ ๋๋ค. ๋ ผ์ ์์ด - ์ฝ๊ธฐ; ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ด 10..10000๋ก ์ ํ๋ฉ๋๋ค. ์ง์ฐ์ด ์์ง ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ ๋ฐํ์์ ์ด๊ธฐ ๊ฐ์ 0์ผ ์ ์์ต๋๋ค. ์ด ๋ช ๋ น์ ์ฌ์ฉํ์ฌ 0๋ฅผ ์ธ ์ ์์ต๋๋ค.
์ธ์ ์์: int, ํ์ฌ ๋ฐ๋ฆฌ์ด. ์ธ์ ํฌํจ: null, ๋ฐํ ๊ฐ ์์; ๊ทธ๋ฐ ๋ค์ UO.DressSpeed()๋ฅผ ๋ณ๋๋ก ์ฝ์ผ์ญ์์ค. ์ด๊ฒ์ bool๊ฐ ์๋๋๋ค.
- EquipItems/UnequipItems๋ ์น์ธ๋ ์์ ์ดํ ๋ค์ ์์ ์ด์ ์ DressSpeed๋ฅผ ์ ์ฉํฉ๋๋ค. Disarm/Undress - ๊ฐ ์ ์ ๋ ์ด์ด ๋ค์. ์ถ๊ธ์ ์บ๋ฆฌ๊ฐ ํ์ฉ๋๋ ๊ฒฝ์ฐ DropDelay๋ฅผ ์ถ๊ฐ๋ก ์กด์คํฉ๋๋ค. ๋ค๋ฅธ ๋ฐํ์์ ๋์ผํ ์ค์ ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๊ฐ์์ ์๋ฒ ์ ํ์ โโ๋ฌด์ํ์ง ์์ต๋๋ค.
- UO.EquipItems ยท UO.UnequipItems ยท UO.DressSpeed ยท UO.DropDelay ยท UO.ObjAtLayerEx
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.DressSpeed();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ์ผ์ ์ ์ง๋ฅผ ์ฝ๊ณ ๋ค์ ์ธํธ์ ์ต์๊ฐ์ ์ ํํ์ญ์์ค. 0๋ ์์ง ์ค์ ๋์ง ์์ ์ง์ฐ์ ์๋ฏธํฉ๋๋ค.
var delay = UO.DressSpeed();
if (Truth(delay < 350))
{
UO.DressSpeed(350);
}
return UO.DressSpeed();
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 350 ms ๋ก ์ค์ ํ๊ณ ์ ์ฅ๋ ๊ฐ์ ๋ณ๋๋ก ํ์ธํฉ๋๋ค. setter์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์์ ํ ๋นํ ์ ์์ต๋๋ค. setter๋ ๋จ์๋ฅผ ๋ฐํํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.DressSpeed(350);
return UO.DressSpeed();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ConfigureDressDelay๋ ์คํฌ๋ฆฝํธ ์ค์ ์ ์๋ฝํฉ๋๋ค. 15000๋ 10000ms๋ก ์ ํ๋ฉ๋๋ค. ๋์ฐ๋ฏธ๋ ์ค์ ์ ์ฅ๋ ๋ฐ๋ฆฌ์ด๋ฅผ ๋ฐํํฉ๋๋ค.
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()
{
return ConfigureDressDelay(15000);
return null;
}
dynamic ConfigureDressDelay(dynamic requested)
{
UO.DressSpeed(requested);
return UO.DressSpeed();
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.SetDressSpeed:SetDressSpeed(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "dressspeed":
if (arguments.Length > 0) { SetDressSpeed(Arg(0)); return InjectionValue.Unit; }
return new InjectionValue(state.DressSpeed);๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.SetDressSpeed:SetDressSpeed(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "dressspeed":
if (arguments.Length > 0) { SetDressSpeed(Arg(0)); return InjectionValue.Unit; }
return new InjectionValue(state.DressSpeed);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.EnergyResist();ํ์ฌ ์บ๋ฆญํฐ์ ์ ํญ์ฅ์ธ ์๋์ง๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์๋ช ๋ ์ํ ๊ฐ, -32768..32767์ ๋๋ค. ์์ ๊ฐ์ด ์ ์ง๋ฉ๋๋ค. 0๋ ์ค์ ์ ํญ, ๋ฐ์ดํฐ ๋ถ์กฑ ๋๋ ํ๋ ์ด์ด ๋๋ฝ/ํ๊ดด์ผ ์ ์์ต๋๋ค. GetResist๋ ์ ์ ์๋ ์ ํ๊ธฐ์ ๋ํด 0๋ ์ ๊ณตํฉ๋๋ค. bool, ID, ์คํฌ ํ๊ณ๋ ์ ํญ ํ๊ณ๊ฐ ์๋๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋ 1์ ์ ์๋ฏธํฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.EnergyResistance ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- ์์ ํ๋๋ ํ์ฅ๋ CharacterStatus (0x11), type >= 4๋ก ์ ๊ณต๋ฉ๋๋ค. ๋ช ๋ น ์์ฒด๋ ์๋ฒ ์๋๋ฅผ ํ์ธํ์ง ์์ต๋๋ค. ์ด๋ฌํ ํ๋๊ฐ ์๋ ์์ถ/์ด์ ์ํ๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์์๋ 0์ ๋๋ค. ๋ ์ ํญ์ Poisoned ํ๋๊ทธ๊ฐ ์๋๋๋ค. ๋ํ ์ฃผ๋ฌธ ์ ํญ ์คํฌ๋ ์๋๋๋ค.
- CharacterStatus๋ ์ด๋ฆ, ์ฒด๋ ฅ, ์์ ์ ํน์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ํ์ํ ์ ์ฒด๋ฅผ ํ์ธํ ๋ค์ ๊ฐ ์ ํญ ๋จ์ด๋ฅผ ์๋ช ๋ Int16์ผ๋ก ๋ณํํฉ๋๋ค. ์๋ฆฐ ํ์ ๋ณธ๋ฌธ์ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ ํ์ ๊ผฌ๋ฆฌ type 6๋ ๋์ผํ ๊ท์น์ ์ ์งํฉ๋๋ค. ์ ํญ ๋ช ๋ น์ ์ต๋ ํ๊ณ๋ฅผ ์ฝ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.EnergyResist();
UO.Print("EnergyResist: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค. ๋ ผ์์ ์์ต๋๋ค. ์์ ์ ์ฑ๊ฒฉ์ ์ฝ์ ์ ์์ต๋๋ค.
var value = UO.EnergyResist();
UO.Print("EnergyResistance: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ํ ์ฌ์ด์๋ UO.Wait(500) ๋ฐ๋ฆฌ์ด๊ฐ ์์ต๋๋ค. ์ฐจ์ด๋ ์์๊ฐ ๋ ์ ์์ต๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค. ์ผ์ ์ ์ง๋ ์ง์ฐ API์ด ์๋ ์๋ฅผ ๋ํ๋ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.EnergyResist();
await Delay(500);
var after = UO.EnergyResist();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=50๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. ResistanceAtLeast๋ ๋๋ฝ๋ ํ๋ ์ด์ด๋ฅผ ๊ฑฐ๋ถํ๊ณ ํ๋์ ๊ฐ์ ์ฝ๊ณ bool๋ฅผ ๋ฐํํฉ๋๋ค: true ๋๋ ๊ฐ >= ์ต์์ธ ๊ฒฝ์ฐ false. ์ ํญ ์์ฒด๋ bool๊ฐ ์๋๋๋ค. ํจ์๋ ์๋์ ์์ ํ ์ ์ธ๋์ด ์์ต๋๋ค.
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(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.EnergyResist();
return value >= minimum;
}
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.EnergyResistance:bridge.EnergyResistance.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "energyresist": return new InjectionValue(bridge.EnergyResistance);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Equip(object? layer, object? id);์ ํํ ์์ดํ ์ ์บ๋ฆญํฐ์ ์ง์ ๋ ๋ ์ด์ด์ ์ฅ์ฐฉํฉ๋๋ค.
-
layer- ๋ ์ด์ด ๋ฒํธ(์: 1 - ์ค๋ฅธ์ชฝ, 2 - ์ผ์ชฝ) Equip ๋ฐ Unequip๋ "Rhand"์ ๊ฐ์ ๋ ์ด์ด ์ด๋ฆ์ ํ์ฉํฉ๋๋ค. WearItem๋ ์ซ์ ๋ ์ด์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ ์ด์ด๋ ์์ดํ ์ ์จ์ด๋ฌ๋ธ ๋ ์ด์ด์ ์ผ์นํด์ผ ํฉ๋๋ค. graphic๋ ์๋๊ณ ID๋ ์๋๋๋ค. -
id- ๋ก๋๋ ํน์ ํญ๋ชฉ์ ID: ์ ์, 16์ง์ ๋ฌธ์์ด, "lasttarget" ๋๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type๊ฐ ์๋๋๋ค. 0x0F5E๊ฐ ๋จผ์ graphic์ ๊ฒ์ ์ฐพ๊ณ ID๋ก ๊ฐ์ ธ์ค๋ ์์ ๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ๋ก์ปฌ ์์ ํ์ฉ, 0 (์กฐ๊ฑด ์ถฉ์กฑ ์ ๋จ) - ๊ฑฐ๋ถ. ์ด๋ ์๋ฒ ํ์ธ๋ ์๋๊ณ ID๋ ์๋๊ณ , ์๋๋ ์๋๋๋ค. ๋์ค์ ์๋ฒ๊ฐ ์คํจํ ์ ์์ต๋๋ค. ๋ต๋ณ ํ ์ค์ ์ฅ๋น๋ฅผ ํ์ธํ์ธ์.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก๋๋ ํญ๋ชฉ๊ณผ ์์ ๋ก์ด ์ ๋๋๊ทธ๊ฐ ํ์ํฉ๋๋ค. ์ ๊ฑฐํ ๋๋ ์ค์ ๋ฐฐ๋ญ self๊ฐ ํ์ํ๋ฉฐ ์๋น ๋ฐฐ๋ญ GrabBag์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ์ ์ ์๊ฑฐ๋ ํ์๋์๊ฑฐ๋ ๋ถ์ ํฉํ ํ๋ชฉ์ ๊ฑฐ๋ถ๋ฉ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ํญ๋ชฉ์ UnequipItems๋ฅผ ํตํด ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์ธํธ๋ ์์์ฑ ํธ๋์ญ์ ์ด ์๋๋๋ค.
- EquipItems/UnequipItems๋ ์น์ธ๋ ์์ ์ดํ ๋ค์ ์์ ์ด์ ์ DressSpeed๋ฅผ ์ ์ฉํฉ๋๋ค. Disarm/Undress - ๊ฐ ์ ์ ๋ ์ด์ด ๋ค์. ์ถ๊ธ์ ์บ๋ฆฌ๊ฐ ํ์ฉ๋๋ ๊ฒฝ์ฐ DropDelay๋ฅผ ์ถ๊ฐ๋ก ์กด์คํฉ๋๋ค. ๋ค๋ฅธ ๋ฐํ์์ ๋์ผํ ์ค์ ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๊ฐ์์ ์๋ฒ ์ ํ์ โโ๋ฌด์ํ์ง ์์ต๋๋ค.
- ์๋ชป๋ ํธ์ถ ํ์, ์ ์ ์๋ ๋ ์ด์ด ์ด๋ฆ ๋๋ ์ซ์๋ก ๋ณํํ ์ ์๋ ๊ฐ์ผ๋ก ์ธํด 0 ๋์ ์คํฌ๋ฆฝํธ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ฅ๋น ์ค๋ ์ท์๋ ์ด๋ฏธ ๋ก๋๋ ๋ฐ์ดํฐ๋ง ํฌํจ๋ฉ๋๋ค. ์ด์์คํดํธ์์๋ ChangeAndConfirm ๋ ์ด์ด=1๊ฐ ์ค๋ฅธ์์ ๋๋ค. ๋ ๋ค๋ฅธ ์ ์ ์ค์ ๋ ์ด์ด๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค.
- UO.EquipItems ยท UO.UnequipItems ยท UO.DressSpeed ยท UO.DropDelay ยท UO.ObjAtLayerEx
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
int item = UO.LastTarget();
if (item != 0)
UO.Print("Accepted flag: " + UO.Equip(1, item));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ , ๊ฒ์์์ ์ ์ ํ ํญ๋ชฉ์ ์ ํํ์ธ์: lasttarget - ID. Equip/WearItem ์์์ 1 ๋ ์ด์ด์๋ ๋ณด์กฐ ๋ฌด๊ธฐ๊ฐ ํ์ํฉ๋๋ค. Unequip(1)๋ ์ค๋ฅธ์์ ์ ๊ฑฐํฉ๋๋ค. Disarm/Undress ์์ฒด ๊ณ ์ ๋ ์ด์ด๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํฉ๋๋ค. ๊ฑฐ์ ํ์๋ ์๋ ์ฌ์์ด ๋์ง ์์ต๋๋ค.
var item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
return 0;
}
return UO.Equip(1, item);
int Asc(object? value, int fallback = 0) { string text = Convert.ToString(value) ?? ""; if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback; return int.TryParse(text, out int number) ? number : fallback; }
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฅ์ฐฉ ๋ฐฉ๋ฒ์ ์์ด์ 0x0F5E๋ ๊ฒ์ ์์์ด๊ณ , 0x1B76๋ ๋ฐฉํจ์ ์์์ ๋๋ค. FindType๋ ๋ฐฐ๋ญ์ ๋ก๋๋ ํญ๋ชฉ ์ค์์ ํด๋น ํญ๋ชฉ์ ์ฐพ๊ณ , ASC๋ ๋ฐํ๋ 16์ง์-ID๋ฅผ ๋ณํํฉ๋๋ค. ์ ๊ฑฐํ๋ ค๋ฉด ํ์ฌ ๋ ์ด์ด๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค. ํ์ํ ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์์ผ๋ฉด ์คํฌ๋ฆฝํธ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ๋ฐฐ์ด์ ๋ ๊ฐ์ ID๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ฐ ํญ๋ชฉ์ ์์ ํ ์ ์ก๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var first = Asc(UO.FindType(0x0F5E, -1, "backpack"), 0);
var second = Asc(UO.FindType(0x1B76, -1, "backpack"), 0);
if (Truth(first == 0) || Truth(second == 0))
{
return 0;
}
UO.AddObject("saved_first", first);
UO.AddObject("saved_second", second);
var firstOk = UO.Equip(1, first);
var secondOk = UO.Equip(2, second);
return firstOk != 0 && secondOk != 0;
return null;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ChangeAndConfirm๋ ๋ช ๋ น์ ํ ๋ฒ ์คํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ 100ms์ ์ผ์ ์ค์ง๋ฅผ ํตํด ์ต๋ 20ํ๊น์ง ์ค์ ์ํ๋ฅผ ํ์ธํฉ๋๋ค. 1 - ๊ฒ์ฌ ๊ฒฐ๊ณผ ์์ ์ํ๊ฐ ํ์ธ๋์์ต๋๋ค. 0 - ์คํจ ๋๋ ๋ง๋ฃ๋ ๋๊ธฐ์ ๋๋ค. ์ด๋ ์๋ก์ด ๋ด์ฅ ๋ช ๋ น์ด ์๋ ๋์ฐ๋ฏธ์ ๊ฒฐ๊ณผ์ ๋๋ค. ์์ ์์ฒด๋ฅผ ํธ์ถํ๋ ๋ฐ์๋ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
return 0;
}
return ChangeAndConfirm(1, item);
return null;
}
dynamic ChangeAndConfirm(dynamic layer, dynamic item)
{
if (Truth(item == 0))
{
return 0;
}
if (!(Truth(UO.Equip(layer, item))))
{
return 0;
}
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == item))
{
return 1;
}
UO.Wait(100);
}
return 0;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: layer (Any/String), id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.Equip:Equip(Text(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Equip:bridge.Equip(Arg(0), Arg(1)).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "equip":
return new InjectionValue(arguments[0].Kind == InjectionValueKind.String ? Equip(Text(0), Arg(1)) : bridge.Equip(Arg(0), Arg(1)));๋งค๊ฐ๋ณ์: layer (Any/String), id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Equip. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Equip:bridge.Equip(ConvertLayer(layer), id). -
InjectionScript.Runtime.InjectionApiUO.ConvertLayer:ConvertLayer(layer).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Equip(string layer, int id) => bridge.Equip(ConvertLayer(layer), id);๋งค๊ฐ๋ณ์: layer (Any/String), id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Equip. -
InjectionScript.Runtime.InjectionApiUO.Equip:Equip(layer, GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Equip(string layer, string id) => Equip(layer, GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.EquipDressSet();๋์ฒด ์ด๋ฆ DressSavedSet: ์ด๋ฆ์ด ์ง์ ๋์ง ์์ ๋์ผํ ์ท ์ธํธ๋ฅผ ๋ณต์ํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
์ค์ ๋ก ์ซ์ ํ๋๊ทธ int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ํ์ํ ๋ชจ๋ ์์ฒญ์ด ๋ก์ปฌ์์ ์น์ธ๋์๊ฑฐ๋ ํ์ํ ๋ ์ด์ด๊ฐ ์ด๋ฏธ ์ผ์นํ์ต๋๋ค. 0 (์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์) - ์ ํ ๊ฑธ๊ธฐ, ์ฐ๊ฒฐ ์์ ๋๋ ํ๋ ์ด์์ ์์ฒญ์ด ๊ฑฐ๋ถ๋์์ต๋๋ค. ๋ฑ๋ก object? ์ด๊ฒ์ ํ์ฉํฉ๋๋ค int. ์ด๋ ID, ์ฐฉ์ฉ ์์ดํ ๊ฐ์, ์๋ฒ ํ์ธ์ด ์๋๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ์๋ฅ: ๋ ์ด์ด๋ 3,4,5,6,7,8,10,12,13,14,17,18,19,20,22,23,24. ๋ฌด๊ธฐ: 1 ๋ฐ 2๋ง ํด๋น. ๋จธ๋ฆฌ์นด๋ฝ, ์์ผ, ๋ฐฐ๋ญ, ๋๋ฌผ, ์ํ์ ์ด ์ธํธ์ ํฌํจ๋์ง ์์ต๋๋ค.
- ์ด๋ฏธ ๋ก๋๋ ํน์ serial ํญ๋ชฉ์ ์์ฒด ๋ ์ด์ด์ ๊ธฐ๋ก๋ฉ๋๋ค. ๋์ผํ ์ด๋ฆ์ ๋ค์ ์ ์ฅํ๋ฉด ํญ๋ชฉ์ด ๋์ฒด๋ฉ๋๋ค. ๋น ๋ ์ด์ด๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ณต์๋๋ฉด ํด๋น ์ ์ ๋ ์ด์ด๊ฐ ์์ฒด ๋ฐฑํฉ์ผ๋ก ํด์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ ์ฅ๋ ์์ ํ ๋น์ด ์๋ ์ธํธ๋ ํด๋น ๋ ์ด์ด์์ ํญ๋ชฉ์ ์ ๊ฑฐํฉ๋๋ค.
- ์ธํธ๋ ๋ฐํ์ ์ํ๋ก ์ ์ฅ๋ฉ๋๋ค. ํธ์ถ ์์ฒด๋ ํ์ผ์ ์์ฑํ์ง ์์ผ๋ฉฐ ์ธํธ๊ฐ ๋ค๋ฅธ ํ๋กํ์ด๋ ์ ๋ฐํ์์ผ๋ก ์ ์ก๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ๋จผ์ ์ํ๋ ์ธํธ๋ฅผ ์ฌ์ฉ๋ ์ํ๋ก ์ ์ฅํฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ์ผ๋ฐ ์ํ๋ฅผ ๋ก๋/์ ์ฅํ๋ ๊ฒ์ ๋ณ๋์ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
- ํ์ฌ์ โโ์ ์ฅ๋ ID ์ฌ์ด์ ์ ํํ ์ผ์น๋ ๋ค์ ์ฌ์ฉ๋๊ฑฐ๋ ๋ฐ์ํ์ง ์๊ณ ๊ฑด๋๋๋๋ค. ๋๋ฝ๋ ํญ๋ชฉ์ ์ ์ฌํ type๋ก ๋์ฒด๋์ง ์์ต๋๋ค. ํ ์์ ์ด ์คํจํด๋ ์ฑ๊ณตํ ์์ ์ด ์ทจ์๋์ง ์์ผ๋ฉฐ ๋ค๋ฅธ ์์ ์ ์๋๋ฅผ ๋ฐฉํดํ์ง ์์ต๋๋ค. ์๋ ๋กค๋ฐฑ์ ์์ต๋๋ค. ์ฐ๊ฒฐ๊ณผ ๋ก๋๋ ๋ด์ฉ์ด ํ์ํฉ๋๋ค. ์ ๊ฑฐํ๋ฉด ์ค์ ๋ฐฐ๋ญ์ด ์ฌ์ฉ๋ฉ๋๋ค.
- UO.Set("equipfordress", 0)๋ ์์ดํ ์ฌ์ฉ ์์ฒญ์ ์ ํํฉ๋๋ค(์ด๊ธฐ ๋ชจ๋). 0์ด ์๋ ๊ฐ - ํฝ์ /์ฅ์ฐฉ. ๋ ๋ชจ๋ ๋ชจ๋์์ ์ํ๋ ์จ์ด๋ฌ๋ธ ๋ ์ด์ด๋ฅผ ํ์ธํฉ๋๋ค. ์ด๋ฏธ ์ฐฉ์ฉํ ์์ดํ ์ ๋ฐ๋ณต ์ฌ์ฉ์ผ๋ก ์ ํํ ์ ์์ต๋๋ค. DressSpeed์ ์์ฒญ ์๋ฝ ์ดํ ์ ํจํ๋ฉฐ, ์ฒ ํ๋ DropDelay๋ฅผ ์ถ๊ฐ๋ก ์กด์คํฉ๋๋ค.
- Dress ๋ฐ Arm๋ ์คํจ ์์๋ null๋ฅผ ๋ฐํํฉ๋๋ค. ์์ฒญ์ด ์๋ฝ๋์๋ค๋ ๋ฉ์์ง๋ ์๋ฒ์ ํ์ธ์ ์๋ฏธํ์ง ์์ต๋๋ค. ์ฐฉ์ฉ์ ๋ฐ๋ผ ๊ณ์ ์งํํ๋ ค๋ฉด ๊ธฐ๋์น๊ฐ ์ ํ๋ ์ค์ ๋ ์ด์ด๋ฅผ ํ์ธํ์ธ์.
- UO.SetDress ยท UO.Dress ยท UO.DressSavedSet ยท UO.SetArm ยท UO.Arm ยท UO.DressSpeed
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.EquipDressSet();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ ์ธํธ๋ ๋์ผํ ๋ฐํ์ ์ํ์์ ์ด์ ์ ์ ์ฅ๋์ด์ผ ํฉ๋๋ค. ๊ฐ ๋ณต์ ์ง์ ์ SetDress/SetArm๋ฅผ ํธ์ถํ์ง ๋ง์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ํ์ฌ ํญ๋ชฉ์ผ๋ก ๋์์ ๋ฎ์ด์ฐ๊ฒ ๋ฉ๋๋ค.
return UO.EquipDressSet();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 0์ด ์๋ ์ฅ๋น๋ ํฝ์ /์ฅ๋น๋ฅผ ์ ํํฉ๋๋ค. 350 โ ๋ฐ๋ฆฌ์ด DressSpeed. ์ด๋ฌํ ์ค์ ์ ์์ ์ดํ ๋ฐํ์์๋ ์ ์ง๋ฉ๋๋ค. ์ ๊ฑฐ ๋ฐ ์ฐฉ์ฉ์ ์๋ฒ์์ ๊ฒฐ์ ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
UO.Set("equipfordress", 1);
UO.DressSpeed(350);
return UO.EquipDressSet();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- lasttarget โ ID ์ด์ ์ ์ ์ฅ๋ ์ธํธ์ ํฌํจ๋์ด์ผ ํ๋ ํญ๋ชฉ์ ๋๋ค. ์ปจํธ๋กค ๋ ์ด์ด 3๋ ์ ๋ฐ์ ์๋ฏธํ๊ณ , 1๋ ์ค๋ฅธ์์ ์๋ฏธํฉ๋๋ค. AwaitSlot๋ 100 ms ์ผ์ ์ค์ง๋ฅผ ํตํด ์ต๋ 20 ๊ฒ์ฌ๋ฅผ ์ํํ๊ณ ๋ช ๋ น์ ๋ฐ๋ณตํ์ง ์์ต๋๋ค. ์ด๋ ์ ์ฒด ์ธํธ๊ฐ ์๋ ์ ํํ ํญ๋ชฉ๋ง ํ์ธํฉ๋๋ค.
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 expected = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(expected == 0))
{
return 0;
}
if (!(Truth(UO.EquipDressSet())))
{
return 0;
}
return AwaitSlot(3, expected);
return null;
}
dynamic AwaitSlot(dynamic layer, dynamic expected)
{
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == expected))
{
return 1;
}
UO.Wait(100);
}
return 0;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.Equip:Equip("__stealth_saved_set__", dressSets, dressLayers, "Clothing set requests processed.", "No clothing set with setdress.").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "dresssavedset":
case "equipdressset": return new InjectionValue(Equip("__stealth_saved_set__", dressSets, dressLayers, "Clothing set requests processed.", "No clothing set with setdress."));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.EquipItems(object? items);ํ๋์ ์์ดํ ๋๋ ์ฌ๋ฌ ์์ดํ ์ ์ฅ์ฐฉํ์ธ์. ๊ฐ ์์ดํ ์ ๋ ์ด์ด๋ ์จ์ด๋ฌ๋ธ ๋ฐ์ดํฐ์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ฏ๋ก ๋ฐฑํฉ์๋ ์ฐฉ์ฉํ ์ ์์ต๋๋ค.
-
items- ํ์ ID ๋๋ ํญ๋ชฉ ๋ฐฐ์ด ID. ๋ฐฐ์ด ์์๋ ์ซ์ ๋๋ ์ซ์ํ 16์ง์ ๋ฌธ์์ด์ ๋๋ค. ๋จ์ผ ์ธ์์๋ "lasttarget"/name AddObject๋ ํ์ฉ๋ฉ๋๋ค. ๋ฐฐ์ด์ ๊ฒฝ์ฐ ์ธ๋ฑ์ค 0 ๋ฐ 1์ ์๋ ๋ ์์์ ๋ํด ๋ณ์ ์ ์ธ ํญ๋ชฉ[1]์ ์ฌ์ฉํฉ๋๋ค. ๋ ์ด์ด ๋ฒํธ๋ type๊ฐ ์๋ ์ฌ๋ฌผ์ด ์ ์ก๋ฉ๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ๋ก์ปฌ ์์ ํ์ฉ, 0 (์กฐ๊ฑด ์ถฉ์กฑ ์ ๋จ) - ๊ฑฐ๋ถ. ์ด๋ ์๋ฒ ํ์ธ๋ ์๋๊ณ ID๋ ์๋๊ณ , ์๋๋ ์๋๋๋ค. ๋์ค์ ์๋ฒ๊ฐ ์คํจํ ์ ์์ต๋๋ค. ๋ต๋ณ ํ ์ค์ ์ฅ๋น๋ฅผ ํ์ธํ์ธ์.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก๋๋ ํญ๋ชฉ๊ณผ ์์ ๋ก์ด ์ ๋๋๊ทธ๊ฐ ํ์ํฉ๋๋ค. ์ ๊ฑฐํ ๋๋ ์ค์ ๋ฐฐ๋ญ self๊ฐ ํ์ํ๋ฉฐ ์๋น ๋ฐฐ๋ญ GrabBag์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ์ ์ ์๊ฑฐ๋ ํ์๋์๊ฑฐ๋ ๋ถ์ ํฉํ ํ๋ชฉ์ ๊ฑฐ๋ถ๋ฉ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ํญ๋ชฉ์ UnequipItems๋ฅผ ํตํด ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์ธํธ๋ ์์์ฑ ํธ๋์ญ์ ์ด ์๋๋๋ค.
- EquipItems/UnequipItems๋ ์น์ธ๋ ์์ ์ดํ ๋ค์ ์์ ์ด์ ์ DressSpeed๋ฅผ ์ ์ฉํฉ๋๋ค. Disarm/Undress - ๊ฐ ์ ์ ๋ ์ด์ด ๋ค์. ์ถ๊ธ์ ์บ๋ฆฌ๊ฐ ํ์ฉ๋๋ ๊ฒฝ์ฐ DropDelay๋ฅผ ์ถ๊ฐ๋ก ์กด์คํฉ๋๋ค. ๋ค๋ฅธ ๋ฐํ์์ ๋์ผํ ์ค์ ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๊ฐ์์ ์๋ฒ ์ ํ์ โโ๋ฌด์ํ์ง ์์ต๋๋ค.
- ์๋ชป๋ ํธ์ถ ํ์, ์ ์ ์๋ ๋ ์ด์ด ์ด๋ฆ ๋๋ ์ซ์๋ก ๋ณํํ ์ ์๋ ๊ฐ์ผ๋ก ์ธํด 0 ๋์ ์คํฌ๋ฆฝํธ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ฅ๋น ์ค๋ ์ท์๋ ์ด๋ฏธ ๋ก๋๋ ๋ฐ์ดํฐ๋ง ํฌํจ๋ฉ๋๋ค. ์ด์์คํดํธ์์๋ ChangeAndConfirm ๋ ์ด์ด=1๊ฐ ์ค๋ฅธ์์ ๋๋ค. ๋ ๋ค๋ฅธ ์ ์ ์ค์ ๋ ์ด์ด๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค.
- ๋ฐฐ์ด์ ๊ฒฝ์ฐ 1๋ ๋์ด๋ ๋ชจ๋ ์์ ์ด ํ์ฉ๋จ์ ์๋ฏธํฉ๋๋ค. ๊ฑฐ๋ถํ๋ ๊ฒฝ์ฐ 0๊ฐ ๋ฐํ๋ฉ๋๋ค. ๋๋จธ์ง ์์๋ ๊ณ์ ์ฒ๋ฆฌ๋๋ฉฐ ๋กค๋ฐฑ์ ์์ต๋๋ค. ๋น ๋ฐฐ์ด์ ์๋ฌด๋ฐ ์์ ์์ด 1๋ฅผ ์์ฑํฉ๋๋ค. Disarm/Undress ํ์ํ ๋ ์ด์ด๊ฐ ์ด๋ฏธ ๋น์ด ์๋ ๊ฒฝ์ฐ์๋ 1๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ถ๋ถ์ ์ธ ์คํจ๋ 0๋ฅผ ์ ๊ณตํฉ๋๋ค.
- UO.EquipItems ยท UO.UnequipItems ยท UO.DressSpeed ยท UO.DropDelay ยท UO.ObjAtLayerEx
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.EquipItems(UO.LastTarget());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ , ๊ฒ์์์ ์ ์ ํ ํญ๋ชฉ์ ์ ํํ์ธ์: lasttarget - ID. Equip/WearItem ์์์ 1 ๋ ์ด์ด์๋ ๋ณด์กฐ ๋ฌด๊ธฐ๊ฐ ํ์ํฉ๋๋ค. Unequip(1)๋ ์ค๋ฅธ์์ ์ ๊ฑฐํฉ๋๋ค. Disarm/Undress ์์ฒด ๊ณ ์ ๋ ์ด์ด๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํฉ๋๋ค. ๊ฑฐ์ ํ์๋ ์๋ ์ฌ์์ด ๋์ง ์์ต๋๋ค.
var item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
return 0;
}
return UO.EquipItems(item);
int Asc(object? value, int fallback = 0) { string text = Convert.ToString(value) ?? ""; if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback; return int.TryParse(text, out int number) ? number : fallback; }
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฅ์ฐฉ ๋ฐฉ๋ฒ์ ์์ด์ 0x0F5E๋ ๊ฒ์ ์์์ด๊ณ , 0x1B76๋ ๋ฐฉํจ์ ์์์ ๋๋ค. FindType๋ ๋ฐฐ๋ญ์ ๋ก๋๋ ํญ๋ชฉ ์ค์์ ํด๋น ํญ๋ชฉ์ ์ฐพ๊ณ , ASC๋ ๋ฐํ๋ 16์ง์-ID๋ฅผ ๋ณํํฉ๋๋ค. ์ ๊ฑฐํ๋ ค๋ฉด ํ์ฌ ๋ ์ด์ด๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค. ํ์ํ ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์์ผ๋ฉด ์คํฌ๋ฆฝํธ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ๋ฐฐ์ด์ ๋ ๊ฐ์ ID๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ฐ ํญ๋ชฉ์ ์์ ํ ์ ์ก๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var first = Asc(UO.FindType(0x0F5E, -1, "backpack"), 0);
var second = Asc(UO.FindType(0x1B76, -1, "backpack"), 0);
if (Truth(first == 0) || Truth(second == 0))
{
return 0;
}
UO.AddObject("saved_first", first);
UO.AddObject("saved_second", second);
dynamic[] items = new dynamic[checked((int)(1) + 1)];
items[0] = first;
items[1] = second;
return UO.EquipItems(items);
return null;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ChangeAndConfirm๋ ๋ช ๋ น์ ํ ๋ฒ ์คํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ 100ms์ ์ผ์ ์ค์ง๋ฅผ ํตํด ์ต๋ 20ํ๊น์ง ์ค์ ์ํ๋ฅผ ํ์ธํฉ๋๋ค. 1 - ๊ฒ์ฌ ๊ฒฐ๊ณผ ์์ ์ํ๊ฐ ํ์ธ๋์์ต๋๋ค. 0 - ์คํจ ๋๋ ๋ง๋ฃ๋ ๋๊ธฐ์ ๋๋ค. ์ด๋ ์๋ก์ด ๋ด์ฅ ๋ช ๋ น์ด ์๋ ๋์ฐ๋ฏธ์ ๊ฒฐ๊ณผ์ ๋๋ค. ์์ ์์ฒด๋ฅผ ํธ์ถํ๋ ๋ฐ์๋ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var item = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(item == 0))
{
return 0;
}
return ChangeAndConfirm(1, item);
return null;
}
dynamic ChangeAndConfirm(dynamic layer, dynamic item)
{
if (Truth(item == 0))
{
return 0;
}
if (!(Truth(UO.EquipItems(item))))
{
return 0;
}
for (int attempt = (int)(1); attempt <= 20; attempt += (int)(1))
{
if (Truth(UO.ObjAtLayerEx(layer, UO.Self()) == item))
{
return 1;
}
UO.Wait(100);
}
return 0;
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: items (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ChangeEquipmentItems:ChangeEquipmentItems(ArrayArg(0), true). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::ArrayArg:ArrayArg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "equipitems":
return new InjectionValue(ChangeEquipmentItems(ArrayArg(0), true));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.EquipLastWeapon();๋ง์ง๋ง์ผ๋ก ์ ์ฅ๋ ์ค๋ฅธ์, ์ผ์ ์์ดํ ์ ์ฌ์ฅ์ฐฉ์ ์์ฒญํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- Bridge๋ _lastRightHand ๋ฐ _lastLeftHand๋ฅผ ์ ์ฅํฉ๋๋ค. 0์ด ์๋ ์ค๋ฅธ์ชฝ serial๋ Equip(OneHanded), 0์ด ์๋ ์ผ์ชฝ์ Equip(TwoHanded)๋ก ์ ์ก๋ฉ๋๋ค. ๋น ํญ๋ชฉ์ ๊ฑด๋๋๋๋ค. ์ด๋ ์๋ฒ์ ์ํ ์์ ํ์ธ ๋ณต๊ตฌ๊ฐ ์๋ ๋ ๊ฐ์ง ๊ฐ๋ฅํ ์์ฒญ์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.EquipLastWeapon");
UO.EquipLastWeapon();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ฅ๋ ๋ธ๋ฆฟ์ง serial ์๋ง ์ฌ์ฉ๋ฉ๋๋ค.
UO.EquipLastWeapon();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ฒญ์ด ์ ์ก๋๊ธฐ ์ ์ ์ฐ๊ฒฐ ํ ์คํธ๊ฐ ์ํ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Connected()))
{
UO.EquipLastWeapon();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ ํ ์ ์ธ๋ ๋์ฐ๋ฏธ๋ ํ ์ธํธ์ ์์ด ๋ณต์๋๋๋ก ํฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
RestoreWeapons();
return null;
}
void RestoreWeapons()
{
UO.EquipLastWeapon();
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.EquipLastWeapon:bridge.EquipLastWeapon().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "equiplastweapon": bridge.EquipLastWeapon(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.EquipT(object? layer, object? @type);-
layerโ ์ฅ๋น ๋ ์ด์ด. "Rhand" ์ค์ ์ค๋ฅธ์(1)์ด๊ณ , "Lhand"๋ ์ผ์(2)์ ๋๋ค. ์ซ์๋ ํ์ฉ๋ฉ๋๋ค. ์ธ์๋ ๋ชจ๋ ์ด๋ฆ์ ๋ ์ด์ด ํ ์ด๋ธ์ ๋์ด๋ฉ๋๋ค. ๋ฌธ์์ด "1"์ ์ซ์ 1๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค. ์ ์ ์๋ ๋ฌธ์์ด ์ด๋ฆ์ผ๋ก ์ธํด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฌ๋ฌผ ์์ฒด์ ์ค์ ๋ ์ด์ด๋ฅผ ์ ํํฉ๋๋ค. ๋ช ๋ น์ ์ ํจํ ์ฌ๋กฏ์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. -
type- ํ๋์ graphic ํญ๋ชฉ(์: 0x0F51) - ๋จ๊ฒ. ๊ทธ๊ฒ์ ํน์ ์ฌ๋ฌผ์ serial๋ ์๋๊ณ ์ ์ฒด mobile์ graphic๋ ์๋๋๋ค. ์ซ์ ๋๋ ์ซ์ 16์ง์ ๋ฌธ์์ด์ ๋๋ค. ์์์ด ์ง์ ๋์ง ์์์ต๋๋ค. hue๊ฐ ๊ฒ์๋ฉ๋๋ค. ๊ฒ์์๋ ๋ฐฐ๋ญ์ ๋ก๋๋ ํ์ ์ปจํ ์ด๋๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ํฌํจ๋ฉ๋๋ค. -1/0xFFFF ์ฌ๊ธฐ์ ์์ผ๋์นด๋ ๊ฒ์์ ๋ฌด๊ธฐ ์ ํ์ ๊ฑฐ์ ์ธ๋ชจ๊ฐ ์์ผ๋ฏ๋ก ๋ ์ด์ด์ ์ผ์นํ์ง ์๋ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ์ด ์ ํ๋ฉ๋๋ค.
void: ์ด C# ํ์์ ๊ฐ์ ๋ฐํํ์ง ์์ต๋๋ค. ํธ์ถ์ ๋ณ์์ ํ ๋นํ์ง ๋ง๊ณ if์์ ์ฌ์ฉํ์ง ๋ง์ธ์. ๋ ๊ฐ์ ์ ์ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ ์๋ฝ์ ํ ์คํธํ๋ ค๋ฉด UO.Equipt์ ์ฌ์ฉํ์ธ์. ๋ ๊ฒฝ์ฐ ๋ชจ๋ ObjAtLayer, GetType๋ฅผ ํตํด ์๋ฒ๊ฐ ์๋ตํ ํ ์ค์ ์ฅ๋น๋ฅผ ํ์ธํฉ๋๋ค.
- ๋ ์ธ์๊ฐ ๋ชจ๋ ํ์ํฉ๋๋ค. ๋จผ์ FindType๊ฐ ๋ฐฐ๋ญ์์ ํญ๋ชฉ์ ์ฐพ์ ๋ค์ Equip๊ฐ ์ ํฉ์ฑ์ ํ์ธํฉ๋๋ค. ๊ฒ์์ ์ ์ฒด ๊ฒฐ๊ณผ FindItem/FindCount/GetFoundItems๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ์ผ์นํ๋ ํญ๋ชฉ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ ๊ฒ์์ ์ ํฉํ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ์ด ์ ํ๋ฉ๋๋ค. ํ์ง์ด๋ hue, ์ด๋ฆ์ ๋ณ๋๋ก ์ ํํ์ค ์ ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ์จ์ด๋ฌ๋ธ ํ๋๊ทธ, ์์ดํ ์ ์ค์ ๋ ์ด์ด(1..29) ๋ฐ ๋ฆฌํํ ๋ฅ๋ ฅ์ ํ์ธํฉ๋๋ค. ํญ๋ชฉ์ ๋ก๋ํด์ผ ํฉ๋๋ค. ์๋ฒ๋ ์ฐฉ์ฉ ํ์ฉ ์ฌ๋ถ๋ฅผ ์ถ๊ฐ๋ก ๊ฒฐ์ ํฉ๋๋ค. ์๋ฝ๋ ๋ก์ปฌ ์์ฒญ์ด ์ฑ๊ณต์ ์ฆ๋ช ํ์ง๋ ์์ต๋๋ค.
- ํญ๋ชฉ์ด ๋๋ฝ๋ ๊ฒฝ์ฐ void ์์์ ํญ๋ชฉ์ ์ฐพ์ ์ ์์ต๋๋ค.๋ผ๋ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. ์ซ์ ํ์์ 0์ ๋ฐํํฉ๋๋ค. ์์/serial๋ณ๋ก ํน์ ํญ๋ชฉ์ ์ ํํด์ผ ํ๋ ๊ฒฝ์ฐ FindType์ Equip๋ฅผ ๊ตฌ๋ถํ์ฌ ์ฌ์ฉํ์ธ์. UO.Equip๋ ์ฐพ์ ํญ๋ชฉ์ ID๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋์์ ๋ค๋ฅธ ํญ๋ชฉ ์ ์ก์ ์์ํ์ง ๋ง์ญ์์ค. ๋์์ ๋์์ด ๋ฐ๋ณตํ๊ธฐ๋ณด๋ค๋ ๋ ์ด์ด์ ๋ณํ๋ฅผ ํ์ธํด๋ณด์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.EquipT");
UO.EquipT("Rhand", 0x0F51);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Rhand ๋ผ์ธ์ ์ค๋ฅธ์ชฝ ๋ ์ด์ด๋ฅผ ์ ํํฉ๋๋ค. ๋จ๊ฒ์ ์ง์ ์ค์ ๋ฐฐ๋ญ์ ๋ฃ์ด ์ ๊ทผํ ์ ์์ด์ผ ํฉ๋๋ค. ๋ชจ๋ ์์; ์ธ์์ ์๋ ํญ์ 2์ ๋๋ค.
if (Truth(UO.Connected()))
{
UO.EquipT("Rhand", 0x0F51);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 1 - ๋ ์ด์ด, 0x0F51 - type. ๋ฌธ์์ด C# ํ์ EquipT๋ void๋ฅผ ๋ฐํํฉ๋๋ค. ์์ฒญ์ ์๋ฝ ์ฌ๋ถ๋ ๊ฒฐ๊ณผ๋ก ํ์ธํ ์ ์์ต๋๋ค. 300 ms - ์๋ฅผ ๋ค์ด ์ ์ ๊ธฐ๋ค๋ฆฌ์ธ์. ์ดํ์ ์๋ฌด๊ฒ๋ ์๋ค๊ณ ํด์ ํ์คํ ์๋ฒ ์ค๋ฅ๊ฐ ์ ์ฆ๋์ง๋ ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
UO.EquipT("Rhand", 0x0F51);
await Delay(300);
var worn = UO.ObjAtLayer(1);
if (Truth(worn != 0) && Truth(UO.GetType(worn) == 0x0F51))
{
UO.AddObject("equipped_dagger", worn);
}
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- timeoutMs=2000๋ ์ต๋ ๋๊ธฐ ์๊ฐ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ง์ ํฉ๋๋ค. 50ms๋ง๋ค ํ์ธํ๋ฉด ์ฌ์ฅ๋น๊ฐ ์ ์ก๋์ง ์์ต๋๋ค. ์ด ์ฌ์ฉ์ ์ ์ ๊ธฐ๋ฅ์ true๋ ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฏธ ๋ ์ด์ด์์ ์ํ๋ type๋ฅผ ๋ณด๊ณ ์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ ๋ฐํ๋ Equipt ์์ฒญ ์๋ฝ๋ณด๋ค ๋ ๊ฐ๋ ฅํ ํ์ธ์ ๋๋ค.
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()
{
if (Truth(UO.Connected()) && !(Truth(await EnsureDagger(2000))))
{
UO.Print("Dagger was not confirmed within the timeout");
}
return null;
}
async Task<dynamic> EnsureDagger(dynamic timeoutMs)
{
var worn = UO.ObjAtLayer(1);
if (Truth(worn != 0) && Truth(UO.GetType(worn) == 0x0F51))
{
return true;
}
UO.EquipT("Rhand", 0x0F51);
var started = Now();
while (Truth(Now() - started < timeoutMs))
{
await Delay(50);
worn = UO.ObjAtLayer(1);
if (Truth(worn != 0) && Truth(UO.GetType(worn) == 0x0F51))
{
return true;
}
}
return false;
}
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;
private int Now() => global::ClassicUO.CSharp.CSharpScriptContext.Current.Now();
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: layer (Any), type (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.EquipT. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.FindType:bridge.FindType(ResolveType(type), -1, bridge.Backpack, -1, true). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(type). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("No item found."). -
InjectionScript.Runtime.InjectionApiUO.Equip:Equip(layer.String, obj). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Equip:bridge.Equip(NumberConversions.ToInt(layer), obj). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(layer). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Backpack:bridge.Backpack.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public void EquipT(InjectionValue layer, InjectionValue type)
{
var obj = bridge.FindType(ResolveType(type), -1, bridge.Backpack, -1, true);
if (obj == 0)
{
SystemMessage("No item found.");
return;
}
if (layer.Kind == InjectionValueKind.String)
Equip(layer.String, obj);
else
bridge.Equip(NumberConversions.ToInt(layer), obj);
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Equipt(object? layer, object? @type);-
layer/ ๋ ์ด์ด - ์ฅ๋น ๋ ์ด์ด์ ์ ์์ ๋๋ค. ์ค๋ฅธ์ - 1, ์ผ์ชฝ - 2. ์ค์ ์์ดํ ์ฌ๋กฏ์ ์ ํํ์ธ์. -
type/ type - ์์ดํ ์ ์ ์ฒด graphic(์: ๋จ๊ฒ์ ๊ฒฝ์ฐ 0x0F51). ์ด๊ฒ์ serial๊ฐ ์๋๋๋ค. ๋ฐฐ๋ญ๊ณผ ์ค์ฒฉ๋ ์ปจํ ์ด๋์ ์ ์ฌ๋ ๋ด์ฉ๋ฌผ์์ hue๋ฅผ ๊ฒ์ํฉ๋๋ค.
์ด C# ์์์ int๋ฅผ ๋ฐํํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ๋ณต์ฅ ์์ฒญ์ ์๋ฝํ ๊ฒฝ์ฐ 1, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ 0๋ฅผ ๋ฐํํฉ๋๋ค. ๋ ๊ฐ์ ์ ์(๋ ์ด์ด ๋ฒํธ ๋ฐ graphic)๋ฅผ ์ ๋ฌํฉ๋๋ค. ๋ฌธ์์ด ๊ฐ์ ๋ค๋ฅธ ๋ฐํ์ ๊ณ์ฝ์ ์ ํํ๋ฏ๋ก ์ด ํ์์๋ ์ ํฉํ์ง ์์ต๋๋ค. ํธ์ถ์ ์๋ฒ ํ์ธ์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ๋ฌธ์์ด ๋ ์ด์ด ์ด๋ฆ์ ๊ฒฝ์ฐ UO.EquipT๋ฅผ ์ฌ์ฉํ๋ฉด void๊ฐ ๋ฐํ๋ฉ๋๋ค.
- ๋ ์ธ์๊ฐ ๋ชจ๋ ํ์ํฉ๋๋ค. ๋จผ์ FindType๊ฐ ๋ฐฐ๋ญ์์ ํญ๋ชฉ์ ์ฐพ์ ๋ค์ Equip๊ฐ ์ ํฉ์ฑ์ ํ์ธํฉ๋๋ค. ๊ฒ์์ ์ ์ฒด ๊ฒฐ๊ณผ FindItem/FindCount/GetFoundItems๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ์ผ์นํ๋ ํญ๋ชฉ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ ๊ฒ์์ ์ ํฉํ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ์ด ์ ํ๋ฉ๋๋ค. ํ์ง์ด๋ hue, ์ด๋ฆ์ ๋ณ๋๋ก ์ ํํ์ค ์ ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ์จ์ด๋ฌ๋ธ ํ๋๊ทธ, ์์ดํ ์ ์ค์ ๋ ์ด์ด(1..29) ๋ฐ ๋ฆฌํํ ๋ฅ๋ ฅ์ ํ์ธํฉ๋๋ค. ํญ๋ชฉ์ ๋ก๋ํด์ผ ํฉ๋๋ค. ์๋ฒ๋ ์ฐฉ์ฉ ํ์ฉ ์ฌ๋ถ๋ฅผ ์ถ๊ฐ๋ก ๊ฒฐ์ ํฉ๋๋ค. ์๋ฝ๋ ๋ก์ปฌ ์์ฒญ์ด ์ฑ๊ณต์ ์ฆ๋ช ํ์ง๋ ์์ต๋๋ค.
- ํญ๋ชฉ์ด ๋๋ฝ๋ ๊ฒฝ์ฐ null ์์์ ํญ๋ชฉ์ ์ฐพ์ ์ ์์ต๋๋ค.๋ผ๋ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. ์ซ์ ํ์์ 0์ ๋ฐํํฉ๋๋ค. ์์/serial๋ณ๋ก ํน์ ํญ๋ชฉ์ ์ ํํด์ผ ํ๋ ๊ฒฝ์ฐ FindType์ Equip๋ฅผ ๊ตฌ๋ถํ์ฌ ์ฌ์ฉํ์ธ์. UO.Equip๋ ์ฐพ์ ํญ๋ชฉ์ ID๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋์์ ๋ค๋ฅธ ํญ๋ชฉ ์ ์ก์ ์์ํ์ง ๋ง์ญ์์ค. ๋์์ ๋์์ด ๋ฐ๋ณตํ๊ธฐ๋ณด๋ค๋ ๋ ์ด์ด์ ๋ณํ๋ฅผ ํ์ธํด๋ณด์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Equipt(1, 0x0F51);
UO.Print("Equipt: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ์ธ์๋ ๋ชจ๋ ์ ์์ ๋๋ค(๋จ๊ฒ์ ๋ ์ด์ด 1 ๋ฐ graphic). 1 ๊ฐ์ ์๋ฒ๊ฐ ์๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ์๋ฝํ์์ ํ์ธํฉ๋๋ค.
int accepted = UO.Equipt(1, 0x0F51);
UO.Print(accepted != 0 ? "Equip request accepted locally" : "Equip request not accepted");๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ํ์ธ์ ๋์ฒดํ์ง ์์ต๋๋ค. ๋ ์ด์ด์ ์ค์ ๋ด์ฉ์ ์ฝ์ต๋๋ค. ์คํฌ๋ฆฝํธ๋ ์ ์ก์ ๋์์ด ๋ฐ๋ณตํ์ง ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
int accepted = UO.Equipt(1, 0x0F51);
if (accepted == 0)
return false;
await WaitAsync(300);
int worn = UO.ObjAtLayer(1);
return worn != 0 && UO.GetType(worn) == 0x0F51;
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋จผ์ ํ์ฌ ์ฅ๋น๋ฅผ ํ์ธํฉ๋๋ค. ํ ๋ฒ์ ์์ฒญ ์ดํ์๋ ํ์ธ ์๋๊ฐ 20๋ฒ์ผ๋ก ์ ํ๋ฉ๋๋ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
return await EnsureDagger();
return null;
}
async Task<bool> EnsureDagger()
{
int current = UO.ObjAtLayer(1);
if (current != 0 && UO.GetType(current) == 0x0F51)
return true;
if (UO.Equipt(1, 0x0F51) == 0)
return false;
for (int attempt = 0; attempt < 20; attempt++)
{
await WaitAsync(100);
current = UO.ObjAtLayer(1);
if (current != 0 && UO.GetType(current) == 0x0F51)
return true;
}
return false;
}
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: layer (Integer), type (Integer)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Equipt. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.FindType:bridge.FindType(type, -1, bridge.Backpack, -1, true). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Equip:bridge.Equip(layer, item). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Backpack:bridge.Backpack.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Equipt(int layer, int type)
{
int item = bridge.FindType(type, -1, bridge.Backpack, -1, true);
return item == 0 ? 0 : bridge.Equip(layer, item);
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.FireResist();ํ์ฌ ์บ๋ฆญํฐ์ ์ ํญ ํ๋์ธ ๋ถ์ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์๋ช ๋ ์ํ ๊ฐ, -32768..32767์ ๋๋ค. ์์ ๊ฐ์ด ์ ์ง๋ฉ๋๋ค. 0๋ ์ค์ ์ ํญ, ๋ฐ์ดํฐ ๋ถ์กฑ ๋๋ ํ๋ ์ด์ด ๋๋ฝ/ํ๊ดด์ผ ์ ์์ต๋๋ค. GetResist๋ ์ ์ ์๋ ์ ํ๊ธฐ์ ๋ํด 0๋ ์ ๊ณตํฉ๋๋ค. bool, ID, ์คํฌ ํ๊ณ๋ ์ ํญ ํ๊ณ๊ฐ ์๋๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋ 1์ ์ ์๋ฏธํฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.FireResistance ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- ์์ ํ๋๋ ํ์ฅ๋ CharacterStatus (0x11), type >= 4๋ก ์ ๊ณต๋ฉ๋๋ค. ๋ช ๋ น ์์ฒด๋ ์๋ฒ ์๋๋ฅผ ํ์ธํ์ง ์์ต๋๋ค. ์ด๋ฌํ ํ๋๊ฐ ์๋ ์์ถ/์ด์ ์ํ๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์์๋ 0์ ๋๋ค. ๋ ์ ํญ์ Poisoned ํ๋๊ทธ๊ฐ ์๋๋๋ค. ๋ํ ์ฃผ๋ฌธ ์ ํญ ์คํฌ๋ ์๋๋๋ค.
- CharacterStatus๋ ์ด๋ฆ, ์ฒด๋ ฅ, ์์ ์ ํน์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ํ์ํ ์ ์ฒด๋ฅผ ํ์ธํ ๋ค์ ๊ฐ ์ ํญ ๋จ์ด๋ฅผ ์๋ช ๋ Int16์ผ๋ก ๋ณํํฉ๋๋ค. ์๋ฆฐ ํ์ ๋ณธ๋ฌธ์ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ ํ์ ๊ผฌ๋ฆฌ type 6๋ ๋์ผํ ๊ท์น์ ์ ์งํฉ๋๋ค. ์ ํญ ๋ช ๋ น์ ์ต๋ ํ๊ณ๋ฅผ ์ฝ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.FireResist();
UO.Print("FireResist: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค. ๋ ผ์์ ์์ต๋๋ค. ์์ ์ ์ฑ๊ฒฉ์ ์ฝ์ ์ ์์ต๋๋ค.
var value = UO.FireResist();
UO.Print("FireResistance: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ํ ์ฌ์ด์๋ UO.Wait(500) ๋ฐ๋ฆฌ์ด๊ฐ ์์ต๋๋ค. ์ฐจ์ด๋ ์์๊ฐ ๋ ์ ์์ต๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค. ์ผ์ ์ ์ง๋ ์ง์ฐ API์ด ์๋ ์๋ฅผ ๋ํ๋ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.FireResist();
await Delay(500);
var after = UO.FireResist();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=50๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. ResistanceAtLeast๋ ๋๋ฝ๋ ํ๋ ์ด์ด๋ฅผ ๊ฑฐ๋ถํ๊ณ ํ๋์ ๊ฐ์ ์ฝ๊ณ bool๋ฅผ ๋ฐํํฉ๋๋ค: true ๋๋ ๊ฐ >= ์ต์์ธ ๊ฒฝ์ฐ false. ์ ํญ ์์ฒด๋ bool๊ฐ ์๋๋๋ค. ํจ์๋ ์๋์ ์์ ํ ์ ์ธ๋์ด ์์ต๋๋ค.
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(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.FireResist();
return value >= minimum;
}
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.FireResistance:bridge.FireResistance.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "fireresist": return new InjectionValue(bridge.FireResistance);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Flying();
int UO.Flying(object? id);์บ๋ฆญํฐ๊ฐ ํ์ฌ ๋ ๊ณ ์๋์ง ํ์ธํฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก Gargoyle์ ํ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๊ฒฝ๋ก๋ฅผ ์์ํ๊ธฐ ์ ์ด๋ ๋นํ ํ์ฑํ๋ฅผ ์์ฒญํ๊ธฐ ์ ์ ๋๋ค. "๋ด ์บ๋ฆญํฐ๊ฐ ์ง๊ธ ๋ ๊ณ ์๋์?"๋ผ๋ ์ง๋ฌธ์ ๋ตํฉ๋๋ค. ๋ ผ์์์ด. ์ด ๋ช ๋ น์ ์ํ๋ง ์ฝ์ต๋๋ค. ๋นํ, ์ฐฉ๋ฅ ๋๋ ์บ๋ฆญํฐ ์ด๋์ ํ์ฑํํ์ง ์์ต๋๋ค.
-
id- ์ ํ ์ฌํญ serial ๋ฌธ์: ์ซ์, 16์ง์ ๋ฌธ์์ด, self, lasttarget ๋๋ UO.AddObject์ ํตํด ์ ์ฅ๋ ์ด๋ฆ. ์ธ์๊ฐ ์์ผ๋ฉด ๊ทํ์ ์บ๋ฆญํฐ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๊ฒ์ ํน์ mobile์ ID์ด๋ฉฐ, graphic/type๋ ์๋๊ณ Z์ ์ขํ๋ ์๋๋๋ค. ์ ์ ์๋ ์ด๋ฆ, ๋๋ฝ/์ ๊ฑฐ๋ mobile ๋๋ ํญ๋ชฉ์ 0์ด ํ์๋ฉ๋๋ค.
์ซ์ ํ๋๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ๋์ง ์์). ์ด๊ฒ์ ์ซ์ ํ๋๊ทธ์ ๋๋ค: C#์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์!= 0 ๋๋ ๊ฒฐ๊ณผ == 0. int์ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ๋น๊ตํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค. 1 - mobile์๋ IsFlying์ด ์๊ณ , 0์๋ ํ๋๊ทธ๊ฐ ์๊ฑฐ๋ mobile๊ฐ ์์ต๋๋ค. ๊ณ ๋ Z ์์ฒด๊ฐ ๋นํ์ ์๋ฏธํ๋ ๊ฒ์ ์๋๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ์ฃผ์ ๊ฒ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ๊ณ ์ผ์ ๋นํ์ ๋๋ค. ๊ทธ๋ฌ๋ getter๋ ๊ฒฝํฉ์ ํ์ธํ์ง ์์ต๋๋ค. ์ด ํด๋ผ์ด์ธํธ์์๋ ํ๋กํ ์ฝ ๋ฒ์ 7.0.0.0 ์ด์์ ์ฌ์ฉํ์ฌ mobile์์ 0x04 ๋นํธ๋ฅผ ์ฝ์ต๋๋ค. ์ด์ ํ๋กํ ์ฝ์์๋ 0๋ฅผ ๋ฐํํฉ๋๋ค. ์ง๋ถ ์์ ์๊ธฐ, ๋์ Z, ๋ ๊ฐ ์ ๋๋ฉ์ด์ ๋๋ ๊ฐ๊ณ ์ผ ๊ฒฝ์ฃผ ์์ฒด๋ ๋นํ์ด ๊ฐ๋ฅํ๋ค๋ ์ฆ๊ฑฐ๊ฐ ์๋๋๋ค.
- ์ํ ๋ณ๊ฒฝ์ ์ํ ๋ณ๋์ UO.ToggleFly()๊ฐ ์์ต๋๋ค. "์ผ๊ธฐ" ๋ช ๋ น์ด ์๋ ์ค์์น ์์ฒญ์ ๋ณด๋ ๋๋ค. ์ด๋ฏธ ๋นํ ์ค์ด๋ผ๋ฉด ์ฐฉ๋ฅ์ ์์ฒญํ๋ ์ ํ๊ฐ ๋ฐ๋ณต๋ฉ๋๋ค. ์๋ฒ๊ฐ ์คํจํ ์ ์์ต๋๋ค. ๋ฉ์์ง๊ฐ ํ์๋ ํ ์ ํ์ ์ผ๋ก ๊ธฐ๋ค๋ฆฌ๋ฉด์ Flying์ ๋ค์ ์ฝ์ผ์ธ์. false๋ ์บ๋ฆญํฐ/๋ฐ์ดํฐ๊ฐ ์์ด๋ ๊ฐ๋ฅํ๋ฏ๋ก ์ก์ ํ๋ ์ด ์ Connected๋ฅผ ํ์ธํ์ธ์.
- ๋ก์ปฌ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ๋์์ ์ด์ง ์๊ณ , ์ํ๋ฅผ ์์ฒญํ์ง ์์ผ๋ฉฐ, ํ๋๊ทธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค. ์ญ์ ๋ ๊ฐ์ฒด๋ ํด๋น ํญ๋ชฉ์ด ์ฌ์ ์์ ์ญ์ ๋๊ธฐ ์ ์๋ ๋๋ฝ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Flying();
UO.Print("Flying: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self์ ๋ํ๋ ๋๋ค. true๋ 1์ ๊ฐ๊ณ , false๋ 0์ ๊ฐ์ต๋๋ค. UO.Flying() { ... }๊ฐ ํ์ฉ๋๋ ๊ฒฝ์ฐ. ์ด ์์์๋ ์๋ฌด๊ฒ๋ ์ ํํ์ง ์์ต๋๋ค.
var active = UO.Flying();
if (Truth(Truth(active) == true))
{
UO.Print("Flying mode active");
}
else
{
UO.Print("Ground mode or character data unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ReadState(obj)๋ serial/alias๋ฅผ ์ทจํ๊ณ ์ํ๋ฅผ ๋ฐํํฉ๋๋ค. ์ ์ฒด ์ ์๋ ์๋์ ๊ฐ์ต๋๋ค. ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด ์ฝ๊ธฐ ์ ์ ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ์บ๋ฆญํฐ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฏธ ๋ฐ์ ๋ฐ์ดํฐ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var target = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(target != 0) && Truth(UO.Exists(target)))
{
if (Truth(ReadState(target)))
{
UO.AddObject("flying_mobile", target);
}
}
return null;
}
dynamic ReadState(dynamic obj)
{
if (!(Truth(UO.Exists(obj))))
{
return false;
}
return UO.Flying(obj);
}
int Asc(object? value, int fallback = 0)
{
string text = Convert.ToString(value) ?? "";
if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
return int.TryParse(text, out int number) ? number : fallback;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋นํ ์ง์ ์๋ฒ์ ๊ฐ๊ณ ์ผ์ ๋ํ ์์ ๋๋ค. EnsureFlight(timeoutMs)๋ ๋นํ์ด ๊ด์ฐฐ๋๋ฉด 1/true๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 0/false๋ฅผ ๋ฐํํฉ๋๋ค. 2000 โ ๋๊ธฐ ์ ํ(๋ฐ๋ฆฌ์ด); 50 ms๋ง๋ค ํ์ธํฉ๋๋ค. ์ด๋ฏธ ๋นํ ์ค์ด๋ผ๋ฉด ToggleFly๊ฐ ํธ์ถ๋์ง ์์ต๋๋ค. ์ต๋ 1๊ฐ์ ์์ฒญ์ด ์ ์ก๋๋ฉด ์๋ต ์ํ๊ฐ ํ์ธ๋ฉ๋๋ค. ์คํฌ๋ฆฝํธ ์ผ์ ์ค์ง/์ค์ผ์ค๋ฌ ์ง์ฐ์ผ๋ก ์ธํด ์ค์๊ฐ์ด ๋์ด๋ ์ ์์ต๋๋ค.
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()
{
if (Truth(await EnsureFlight(2000)))
{
UO.Print("Flight confirmed; ready for the next stage");
}
else
{
UO.Print("Flight not confirmed; route was not started");
}
return null;
}
async Task<dynamic> EnsureFlight(dynamic timeoutMs)
{
if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
{
return false;
}
if (Truth(UO.Flying()))
{
return true;
}
UO.ToggleFly();
var waited = 0;
while (Truth(waited < timeoutMs))
{
if (!(Truth(UO.Connected())))
{
return false;
}
if (Truth(UO.Flying()))
{
return true;
}
await Delay(50);
waited += 50;
}
return UO.Flying();
}
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.Flying. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Flying:bridge.Flying(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Flying() => bridge.Flying(bridge.Self);๋งค๊ฐ๋ณ์: id (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Flying. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Flying:bridge.Flying(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int Flying(InjectionValue id) => bridge.Flying(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.Frozen();
int UO.Frozen(object? value);ํด๋ผ์ด์ธํธ์ ์๋ ค์ง ์บ๋ฆญํฐ์ ๋ง๋น ํ๋๊ทธ๋ฅผ ํ์ธํฉ๋๋ค.
-
value- ์ ํ ์ฌํญ serial/ID mobile: ์ซ์, 16์ง์ ๋ฌธ์์ด, self, lasttarget ๋๋ ๊ธฐํ ํ์ค ๊ฐ์ฒด ์ด๋ฆ ๋๋ AddObject ์ด๋ฆ. ์ด๊ฒ์ graphic/type์ด ์๋๋๋ค. ์ธ์๊ฐ ์์ผ๋ฉด self๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ ์ ์๋ ์ด๋ฆ์ 0์์ ํด๊ฒฐ๋ฉ๋๋ค. ํ๊ฒ์ด ์ด๋ฆฌ์ง ์์ต๋๋ค.
์ซ์ ํ๋๊ทธ int: 1 (์กฐ๊ฑด ์ถฉ์กฑ) - ๋ก๋๋จ mobile์๋ ํ๋๊ทธ IsParalyzed์ด ์์ต๋๋ค. 0 (์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์์) - ํ๋๊ทธ ์์, mobile ์ ์ ์์, ์ญ์ ๋์๊ฑฐ๋ ๊ฐ์ฒด๊ฐ ํญ๋ชฉ์ ๋๋ค. ์ด๋ ๋ง๋น ์๊ฐ์ด ์๋๋ฉฐ 0 ๊ฒฐ๊ณผ๋ก ์ด๋ ๋ฅ๋ ฅ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
- ๋ง๋น ํ๋๊ทธ๋ฅผ ํ์ธํ๋ ค๋ฉด Paralyzed๋ฅผ ์ฌ์ฉํ์ธ์. Is/Get, GetParalisa, Frozen ๋ฐ GetLocked ์ต์ ์ ๋์ผํ ํ๋๊ทธ๋ฅผ ์ฝ์ต๋๋ค.
- ์ด ๋ช ๋ น์ ๋ก์ปฌ ๋ฐ์ดํฐ๋ง ์ฝ์ต๋๋ค. ๋ง๋น๋ฅผ ์ ์ฉํ๊ฑฐ๋ ์ ๊ฑฐํ์ง ์์ผ๋ฉฐ, ๋ง๋น๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ผ๋ฉฐ, ์๋ฒ์ ์ ๋ฐ์ดํธ ์์ฒญ์ ๋ณด๋ด์ง ์์ต๋๋ค.
- ์ด ๋ช ๋ น์ ๊ฒฐ๊ณผ๋ int ์ ํ์ ๋๋ค. if (value != 0) ๋๋ if (value == 0)๋ฅผ ์ฌ์ฉํ์ธ์. true/false ๋ฐ C#์ if (๊ฐ)๊ณผ์ ์ง์ ๋น๊ต๋ ํ์ฉ๋์ง ์์ต๋๋ค. ๊ฐ์ ์๋์ด๋ ID์ด ์๋ ํ๋๊ทธ์ ์๋ฏธ๋ฅผ ์ ์งํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Frozen();
UO.Print("Frozen: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self๋ฅผ ์ ํํฉ๋๋ค. ์ํ๋ ํ๋๊ทธ์ ํ๋์ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. true์ ์์น์์ 1์ ๋๋ค.
- false ๊ฒฐ๊ณผ๋ ๋ฒฝ, ์ฒด๋ ฅ ๋ถ์กฑ ๋๋ ๊ธฐํ ์ ์ง ์ด์ ๋ฅผ ๋ฐฐ์ ํ์ง ์์ต๋๋ค.
var state = UO.Frozen();
if (Truth(Truth(state) == true))
{
UO.Print("Paralysis flag is set");
}
else
{
UO.Print("Paralysis flag is absent or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- target์ ๋ง์ง๋ง ํ๊ฒ์ 16์ง์ ๋ฌธ์์ด serial์ ์ ์ฅํฉ๋๋ค. IsNpc๋ ํ๋ ์ด์ด๋ฅผ ํฌํจํ์ฌ ๋ก๋๋ mobile์ธ์ง ํ์ธํฉ๋๋ค.
- ์ธ์๊ฐ ํฌํจ๋ ๋ช ๋ น์ ๋์์ ์ฝ์ต๋๋ค. ๊ทธ๋ ๋ ์๋ก์ด ์บ๋ฆญํฐ๋ฅผ ์ ํํ๊ฑฐ๋ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค lasttarget.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsNPC(target)))
{
var state = UO.Frozen(target);
UO.Print("Selected mobile paralysis 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 100ms ๋์ 10 ์ด์ ์ผ์ ์ค์ง๋์ง ์์ต๋๋ค. ์ธ์ ์์ด ํธ์ถํ ๋๋ง๋ค self๋ฅผ ๋ค์ ์ฝ์ต๋๋ค.
- ๋ฃจํ ํ์๋ self ์กด์ฌ ์ฌ๋ถ๋ฅผ ๋ณ๋๋ก ํ์ธํฉ๋๋ค. ์ด๋ ์ฝ 1์ด ๋์์ ๊ด์ฐฐ๊ณผ ๋ช ๋ น ์คํ์ ํฉํ ๊ฒ์ด๋ฉฐ ๋ง๋น๊ฐ ์์ ํ ์ ๊ฑฐ๋๋ค๋ ๋ณด์ฅ์ ์์ต๋๋ค.
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 attempts = 0;
while (Truth(Truth(UO.Frozen()) == true) && Truth(attempts < 10))
{
await Delay(100);
attempts = attempts + 1;
}
if (Truth(UO.IsNPC("self")))
{
if (Truth(Truth(UO.Frozen()) == false))
{
UO.Print("Paralysis flag is clear");
}
else
{
UO.Print("Still paralyzed");
}
}
else
{
UO.Print("Self is unavailable");
}
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 [Frozen]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLocked:bridge.GetLocked(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
serial => bridge.GetLocked(serial)๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => getter(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Frozen]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLocked:bridge.GetLocked(serial). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(value).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
serial => bridge.GetLocked(serial)๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
value => getter(GetObject(value))API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetARStatus();ํ์ฌ ๊ด๋ฆฌ์ ์ธ์ ๋๋ ๊ธ๋ก๋ฒ ํด๋ผ์ด์ธํธ์ ์๋ ์ฌ์ฐ๊ฒฐ์ ์ํ ํ๋๊ทธ๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int 1 โ ์๋ ์ฌ์ฐ๊ฒฐ์ด ํ์ฑํ๋ฉ๋๋ค. 0 โ ๋นํ์ฑํ๋์์ต๋๋ค.
- SessionControl.AutoReconnect์ด ์ฐ์ ์์์ ๋๋ค. SessionControl๊ฐ ๋๋ฝ๋ ๊ฒฝ์ฐ์๋ Settings.GlobalSettings.Reconnect๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ ์ค์ ์ด๋ฉฐ ํ์ฌ ์ฐ๊ฒฐ ์ํ๋ ์๋ ํ์๊ฐ ์๋๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetARStatus();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฝ๊ธฐ๊ฐ ์ฐ๊ฒฐ๋์ง ์์ต๋๋ค.
var enabled = UO.GetARStatus();
UO.Print(Convert.ToString(enabled));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- AR ์ค์ ๊ณผ ์ค์ ์ฐ๊ฒฐ์ ๋ ๊ฐ์ ๋ณ๋ ๊ฐ์ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var enabled = UO.GetARStatus();
var online = UO.Connected();
UO.Print(Convert.ToString(enabled) + " " + Convert.ToString(online));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- Connect ์๋ ์ฌ์ฐ๊ฒฐ์ด ๋นํ์ฑํ๋ ๊ฒฝ์ฐ ์๋์ผ๋ก ํ์ฉ๋ฉ๋๋ค.
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.GetARStatus() == 0) && !(Truth(UO.Connected())))
{
UO.Connect();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetAutoReconnect:bridge.GetAutoReconnect().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getarstatus": return new InjectionValue(bridge.GetAutoReconnect());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetAlive();
int UO.GetAlive(object? value);์ฌ๋ง ํ์ ์ด ์๋ ๋ฌผ์ฒด์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
-
valueโ ํ์๋ ํ์์ ์ ํ์ ๊ฐ์ฒด: serial ์ซ์/16์ง์ ๋ฌธ์์ด, self, lasttarget ๋๋ ๋ฑ๋ก๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type๊ฐ ์๋๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ์ผ๋ถ ํ์์ ์ ์ ์๋ ํ ์คํธ๋ก ์ธํด ๋ณํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ํํ๊ธฐ ์ ์ ์ด๋ฆ์ ํ์ธํ์ธ์.
์ซ์ ํ๋๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ๋์ง ์์). ์ด๊ฒ์ ์ซ์ ํ๋๊ทธ์ ๋๋ค: C#์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์!= 0 ๋๋ ๊ฒฐ๊ณผ == 0. int์ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ๋น๊ตํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค. 1 - ์์ฑ serial์ด ์กด์ฌํ๋ฉฐ ์ฃฝ์ ๊ฒ์ผ๋ก ํ์๋์ง ์์ต๋๋ค. ์ ๋ช ํ ํญ๋ชฉ์ 1๋ ์ ๊ณตํฉ๋๋ค. ์ด๋ mobile ํํฐ๊ฐ ์๋๋๋ค. ์ฃฝ์๊ฑฐ๋ ์์ด์ง ๊ฐ์ฒด๋ 0์ ์ ๊ณตํฉ๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ๋์์ ์ด์ง ์๊ณ , ์ํ๋ฅผ ์์ฒญํ์ง ์์ผ๋ฉฐ, ํ๋๊ทธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค. ์ญ์ ๋ ๊ฐ์ฒด๋ ํด๋น ํญ๋ชฉ์ด ์ฌ์ ์์ ์ญ์ ๋๊ธฐ ์ ์๋ ๋๋ฝ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetAlive();
UO.Print("GetAlive: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self๋ก ์ฝ์ต๋๋ค. active๋ ๊ฒฐ๊ณผ๋ฅผ ํ ๋ฒ ์ ์ฅํฉ๋๋ค. true ๋ฐ false๋ ๋ ๊ฐ์ ๋ถ๊ธฐ๋ฅผ ์ ์ํฉ๋๋ค. Print ์์ ๋ฉ์์ง๋ง ํ์๋ฉ๋๋ค.
var active = UO.GetAlive();
if (Truth(Truth(active) == true))
{
UO.Print("State is active");
}
else
{
UO.Print("State is inactive or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- lasttarget โ ์ด์ ์ ์ ํํ ๊ฐ์ฒด. Exists๋ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. obj๊ฐ ์ ์ผํ ๋งค๊ฐ๋ณ์ ReadState์ ๋๋ค. ์ด ํจ์๋ ์์ ์์ด ๋ช ๋ น ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ํด๋น ์ ์๋ ๋ณต์ฌ๋ ์ฝ๋์ ํฌํจ๋์ด ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
var observed = ReadState("lasttarget");
UO.Print("State 1/0: " + Convert.ToString(observed));
}
return null;
}
dynamic ReadState(dynamic obj)
{
return UO.GetAlive(obj);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ๋ ๋ฒ์ ํธ์ถ์ self, UO.Wait(500)๋ฅผ ์ฝ๊ณ 500 ๋ฐ๋ฆฌ์ด๋ฅผ ์ค์ ํฉ๋๋ค. ๋ ์ด๋ฏธ์ง๊ฐ ๋น๊ต๋ฉ๋๋ค. ์ค๊ฐ ์ ํ์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค. ๋์๋ ๊ธฐ๋ค๋ฆผ์ ์์ต๋๋ค.
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.GetAlive();
await Delay(500);
var after = UO.GetAlive();
if (Truth(before != after))
{
UO.Print("State changed: " + Convert.ToString(before) + " -> " + 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 [GetAlive]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Exists:bridge.Exists(serial). -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases::IsDeadState:IsDeadState(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
serial => serial > 0 && bridge.Exists(serial) != 0 && IsDeadState(serial) == 0 ? 1 : 0๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => getter(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [GetAlive]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Exists:bridge.Exists(serial). -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases::IsDeadState:IsDeadState(serial). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(value).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
serial => serial > 0 && bridge.Exists(serial) != 0 && IsDeadState(serial) == 0 ? 1 : 0๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
value => getter(GetObject(value))API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetArmor();ํ์ฌ ์บ๋ฆญํฐ์ ์ ํญ ํ๋(๋ฌผ๋ฆฌ ๋ฐฉ์ด๊ตฌ/์ ํญ)๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์๋ช ๋ ์ํ ๊ฐ, -32768..32767์ ๋๋ค. ์์ ๊ฐ์ด ์ ์ง๋ฉ๋๋ค. 0๋ ์ค์ ์ ํญ, ๋ฐ์ดํฐ ๋ถ์กฑ ๋๋ ํ๋ ์ด์ด ๋๋ฝ/ํ๊ดด์ผ ์ ์์ต๋๋ค. GetResist๋ ์ ์ ์๋ ์ ํ๊ธฐ์ ๋ํด 0๋ ์ ๊ณตํฉ๋๋ค. bool, ID, ์คํฌ ํ๊ณ๋ ์ ํญ ํ๊ณ๊ฐ ์๋๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋ 1์ ์ ์๋ฏธํฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.PhysicalResistance ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- PhysicalResistance - ์๋ฒ ๊ฐ์ท/์ํ ํ๋: ํด๋์ ์๋ฒ๋ ๊ฐ์ท ๋ฑ๊ธ์ ์ ์กํ ์ ์์ผ๋ฉฐ, ์ ํญ์ด ์๋ ๊ท์น์ ๋ฌผ๋ฆฌ์ ์ ํญ์ ์ ์กํ ์ ์์ต๋๋ค. API๋ ์๋ก ๋ณํ๋์ง ์์ผ๋ฉฐ ํผํด ๊ฐ์์จ์ ๊ณ์ฐํ์ง ์์ต๋๋ค. Armor ๋ฐ ๋ฌผ๋ฆฌ์ ๋ณ์นญ์ ๋์ผํ ํ๋๋ฅผ ์ฝ์ต๋๋ค.
- CharacterStatus๋ ์ด๋ฆ, ์ฒด๋ ฅ, ์์ ์ ํน์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ํ์ํ ์ ์ฒด๋ฅผ ํ์ธํ ๋ค์ ๊ฐ ์ ํญ ๋จ์ด๋ฅผ ์๋ช ๋ Int16์ผ๋ก ๋ณํํฉ๋๋ค. ์๋ฆฐ ํ์ ๋ณธ๋ฌธ์ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ ํ์ ๊ผฌ๋ฆฌ type 6๋ ๋์ผํ ๊ท์น์ ์ ์งํฉ๋๋ค. ์ ํญ ๋ช ๋ น์ ์ต๋ ํ๊ณ๋ฅผ ์ฝ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetArmor();
UO.Print("GetArmor: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค. ๋ ผ์์ ์์ต๋๋ค. ์์ ์ ์ฑ๊ฒฉ์ ์ฝ์ ์ ์์ต๋๋ค.
var value = UO.GetArmor();
UO.Print("PhysicalResistance: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ํ ์ฌ์ด์๋ UO.Wait(500) ๋ฐ๋ฆฌ์ด๊ฐ ์์ต๋๋ค. ์ฐจ์ด๋ ์์๊ฐ ๋ ์ ์์ต๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค. ์ผ์ ์ ์ง๋ ์ง์ฐ API์ด ์๋ ์๋ฅผ ๋ํ๋ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.GetArmor();
await Delay(500);
var after = UO.GetArmor();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=50๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. ResistanceAtLeast๋ ๋๋ฝ๋ ํ๋ ์ด์ด๋ฅผ ๊ฑฐ๋ถํ๊ณ ํ๋์ ๊ฐ์ ์ฝ๊ณ bool๋ฅผ ๋ฐํํฉ๋๋ค: true ๋๋ ๊ฐ >= ์ต์์ธ ๊ฒฝ์ฐ false. ์ ํญ ์์ฒด๋ bool๊ฐ ์๋๋๋ค. ํจ์๋ ์๋์ ์์ ํ ์ ์ธ๋์ด ์์ต๋๋ค.
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(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.GetArmor();
return value >= minimum;
}
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 [GetArmor]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Armor:bridge.Armor.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.ArmorAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetColdResist();ํ์ฌ ์บ๋ฆญํฐ์ ์ ํญ ํ๋: ์ฝ๋๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์๋ช ๋ ์ํ ๊ฐ, -32768..32767์ ๋๋ค. ์์ ๊ฐ์ด ์ ์ง๋ฉ๋๋ค. 0๋ ์ค์ ์ ํญ, ๋ฐ์ดํฐ ๋ถ์กฑ ๋๋ ํ๋ ์ด์ด ๋๋ฝ/ํ๊ดด์ผ ์ ์์ต๋๋ค. GetResist๋ ์ ์ ์๋ ์ ํ๊ธฐ์ ๋ํด 0๋ ์ ๊ณตํฉ๋๋ค. bool, ID, ์คํฌ ํ๊ณ๋ ์ ํญ ํ๊ณ๊ฐ ์๋๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋ 1์ ์ ์๋ฏธํฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.ColdResistance ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- ์์ ํ๋๋ ํ์ฅ๋ CharacterStatus (0x11), type >= 4๋ก ์ ๊ณต๋ฉ๋๋ค. ๋ช ๋ น ์์ฒด๋ ์๋ฒ ์๋๋ฅผ ํ์ธํ์ง ์์ต๋๋ค. ์ด๋ฌํ ํ๋๊ฐ ์๋ ์์ถ/์ด์ ์ํ๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์์๋ 0์ ๋๋ค. ๋ ์ ํญ์ Poisoned ํ๋๊ทธ๊ฐ ์๋๋๋ค. ๋ํ ์ฃผ๋ฌธ ์ ํญ ์คํฌ๋ ์๋๋๋ค.
- CharacterStatus๋ ์ด๋ฆ, ์ฒด๋ ฅ, ์์ ์ ํน์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ํ์ํ ์ ์ฒด๋ฅผ ํ์ธํ ๋ค์ ๊ฐ ์ ํญ ๋จ์ด๋ฅผ ์๋ช ๋ Int16์ผ๋ก ๋ณํํฉ๋๋ค. ์๋ฆฐ ํ์ ๋ณธ๋ฌธ์ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ ํ์ ๊ผฌ๋ฆฌ type 6๋ ๋์ผํ ๊ท์น์ ์ ์งํฉ๋๋ค. ์ ํญ ๋ช ๋ น์ ์ต๋ ํ๊ณ๋ฅผ ์ฝ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetColdResist();
UO.Print("GetColdResist: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค. ๋ ผ์์ ์์ต๋๋ค. ์์ ์ ์ฑ๊ฒฉ์ ์ฝ์ ์ ์์ต๋๋ค.
var value = UO.GetColdResist();
UO.Print("ColdResistance: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ํ ์ฌ์ด์๋ UO.Wait(500) ๋ฐ๋ฆฌ์ด๊ฐ ์์ต๋๋ค. ์ฐจ์ด๋ ์์๊ฐ ๋ ์ ์์ต๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค. ์ผ์ ์ ์ง๋ ์ง์ฐ API์ด ์๋ ์๋ฅผ ๋ํ๋ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.GetColdResist();
await Delay(500);
var after = UO.GetColdResist();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=50๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. ResistanceAtLeast๋ ๋๋ฝ๋ ํ๋ ์ด์ด๋ฅผ ๊ฑฐ๋ถํ๊ณ ํ๋์ ๊ฐ์ ์ฝ๊ณ bool๋ฅผ ๋ฐํํฉ๋๋ค: true ๋๋ ๊ฐ >= ์ต์์ธ ๊ฒฝ์ฐ false. ์ ํญ ์์ฒด๋ bool๊ฐ ์๋๋๋ค. ํจ์๋ ์๋์ ์์ ํ ์ ์ธ๋์ด ์์ต๋๋ค.
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(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.GetColdResist();
return value >= minimum;
}
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 [GetColdResist]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ColdResistance:bridge.ColdResistance.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.ColdResistanceAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetDead();
int UO.GetDead(object? value);์บ๋ฆญํฐ ์ฌ๋ง์ ํ์ธํฉ๋๋ค.
-
valueโ ํ์๋ ํ์์ ์ ํ์ ๊ฐ์ฒด: serial ์ซ์/16์ง์ ๋ฌธ์์ด, self, lasttarget ๋๋ ๋ฑ๋ก๋ ์ด๋ฆ AddObject. ์ด๊ฒ์ type๊ฐ ์๋๋๋ค. ๋ ผ์ ์์ด self์ ์ฝ์ผ์ธ์. ์ผ๋ถ ํ์์ ์ ์ ์๋ ํ ์คํธ๋ก ์ธํด ๋ณํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ํํ๊ธฐ ์ ์ ์ด๋ฆ์ ํ์ธํ์ธ์.
์ซ์ ํ๋๊ทธ int: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ ์ ๋จ). ์ด๊ฒ์ ์ซ์ ํ๋๊ทธ์ ๋๋ค: C#์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์ธ์!= 0 ๋๋ ๊ฒฐ๊ณผ == 0. int์ true/false ๋ฐ if(๊ฒฐ๊ณผ)๋ฅผ ์ง์ ๋น๊ตํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค. 1 - mobile์๋ IsDead์ด ์๊ณ , 0์๋ ๋ถํธ๊ฐ ์๊ฑฐ๋ mobile๊ฐ ์์ต๋๋ค. HP=0 ๊ทธ ์์ฒด๊ฐ ์ฃฝ์์ ์๋ฏธํ๋ ๊ฒ์ ์๋๋๋ค.
๋ช ๋ น์ ๊ฒฐ๊ณผ๋ ์ซ์ ํ๋๊ทธ์ ๋๋ค. 1๋ ์ถฉ์กฑ๋ ์กฐ๊ฑด์ ์๋ฏธํ๊ณ , 0๋ ์ถฉ์กฑ๋์ง ์์ ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค. var result = command(...) ํ์ (๊ฒฐ๊ณผ != 0) ๋๋ (๊ฒฐ๊ณผ == 0)์ธ์ง ํ์ธํ์ธ์. ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฐ๋ณต๋ ํธ์ถ์ ํตํด ํด๋น ์์ ์ ๋ค์ ์ํํ๊ฑฐ๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
- ๋ก์ปฌ ๋ชจ๋ธ์ ์ฝ์ต๋๋ค. ๋์์ ์ด์ง ์๊ณ , ์ํ๋ฅผ ์์ฒญํ์ง ์์ผ๋ฉฐ, ํ๋๊ทธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ต๋๋ค. ์ญ์ ๋ ๊ฐ์ฒด๋ ํด๋น ํญ๋ชฉ์ด ์ฌ์ ์์ ์ญ์ ๋๊ธฐ ์ ์๋ ๋๋ฝ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ ๋ณ๋์ ๋ ์์ ๋๋ค. Exists์ ๋ค์ ๋์ ์ฌ์ด์ ์ธ์์ด ๋ฐ๋ ์๋ ์์ต๋๋ค. ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ ์์์ฑ ์ค๋ ์ท์ ํ์ฑํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetDead();
UO.Print("GetDead: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ๊ดํธ๋ self๋ก ์ฝ์ต๋๋ค. active๋ ๊ฒฐ๊ณผ๋ฅผ ํ ๋ฒ ์ ์ฅํฉ๋๋ค. true ๋ฐ false๋ ๋ ๊ฐ์ ๋ถ๊ธฐ๋ฅผ ์ ์ํฉ๋๋ค. Print ์์ ๋ฉ์์ง๋ง ํ์๋ฉ๋๋ค.
var active = UO.GetDead();
if (Truth(Truth(active) == true))
{
UO.Print("State is active");
}
else
{
UO.Print("State is inactive or unavailable");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- lasttarget โ ์ด์ ์ ์ ํํ ๊ฐ์ฒด. Exists๋ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. obj๊ฐ ์ ์ผํ ๋งค๊ฐ๋ณ์ ReadState์ ๋๋ค. ์ด ํจ์๋ ์์ ์์ด ๋ช ๋ น ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ํด๋น ์ ์๋ ๋ณต์ฌ๋ ์ฝ๋์ ํฌํจ๋์ด ์์ต๋๋ค.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Exists("lasttarget")))
{
var observed = ReadState("lasttarget");
UO.Print("State 1/0: " + Convert.ToString(observed));
}
return null;
}
dynamic ReadState(dynamic obj)
{
return UO.GetDead(obj);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ๋ ๋ฒ์ ํธ์ถ์ self, UO.Wait(500)๋ฅผ ์ฝ๊ณ 500 ๋ฐ๋ฆฌ์ด๋ฅผ ์ค์ ํฉ๋๋ค. ๋ ์ด๋ฏธ์ง๊ฐ ๋น๊ต๋ฉ๋๋ค. ์ค๊ฐ ์ ํ์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค. ๋์๋ ๊ธฐ๋ค๋ฆผ์ ์์ต๋๋ค.
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.GetDead();
await Delay(500);
var after = UO.GetDead();
if (Truth(before != after))
{
UO.Print("State changed: " + Convert.ToString(before) + " -> " + 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 [GetDead]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
IsDeadState๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => getter(bridge.Self)API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [GetDead]. -
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(value).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
IsDeadState๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
value => getter(GetObject(value))API ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetDex();
int UO.GetDex(object? objID);์บ๋ฆญํฐ์ ํ์ฌ ๋ฏผ์ฒฉ์ฑ(Dexterity, DEX)์ ์ฝ์ด์ต๋๋ค.
-
objIDโ ํ๋์ ์ธ์(serial ๋ฌธ์ ๋ฒํธ, 10์ง์/0x 16์ง์ ๋ฌธ์์ด, "self", "lasttarget" ๋๋ ์ด๋ฆ AddObject)๊ฐ ํฌํจ๋ ํ์๋ ํ์์ ObjID์ ๋๋ค. graphic/type ์ด์ธ์ ๊ฐ์ฒด๋ฅผ ์ ํํฉ๋๋ค. ์ธ์๊ฐ ์์ผ๋ฉด ํ์ฌ ๋ฌธ์๋ฅผ ์ฝ์ต๋๋ค.
int โ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ํ์ฌ ํต๊ณ ํฌ์ธํธ, 0..65535; ๋ฐฑ๋ถ์จ, ID, ์คํฌ, ์ ๊ธ ๋ชจ๋ ๋๋ bool๊ฐ ์๋๋๋ค. 0๋ ๋๋ฝ/์ญ์ ๋ ๋ฌธ์ ๋๋ ์ ๊ทผํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๊ธฐ๋ ํฉ๋๋ค. == true๊ฐ ์๋ ์์น ์๊ตฌ ์ฌํญ๊ณผ ๋น๊ตํ์ญ์์ค. ์ด๋ ์คํ ํ๋๋ ์์ ์์ด ๋ณด์ฅ๋ ๊ธฐ๋ณธ ๊ฐ์ด ์๋๋๋ค.
- self์ ๊ฒฝ์ฐ (), ๋ช ์์ ๊ฐ์ฒด์ ๊ฒฝ์ฐ (ObjID)๊ฐ ์ง์๋ฉ๋๋ค. ๋ค๋ฅธ ์ ํ์ ์ธ์๋ ์์ต๋๋ค.
- Player๋ฅผ ์ฝ์ต๋๋ค.Dexterity Player๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์กด์ฌํ๋ ์ฃฝ์ ์บ๋ฆญํฐ๋ ์ ๊ฑฐ๋ ๊ฐ์ฒด๊ฐ ์๋๋๋ค. ์คํ ์ HP, ๋ง๋, ์ฒด๋ ฅ์ผ๋ก ๊ณ์ฐ๋์ง ์์ต๋๋ค.
- GetStr/GetInt/GetDex ObjID๋ฅผ ์๋ฝํฉ๋๋ค. PlayerMobile ๋ฐ์ดํฐ๋ self์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ serial - 0์ ๊ฒฝ์ฐ, ๋ก๋๋ mobile์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ํน์ฑ์ ๋์ฒด๋๊ฑฐ๋ ์ถ์ธก๋์ง ์์ต๋๋ค.
- Invoke๋ ์คํฌ๋ฆฝํธ๋ก ๋๊ธฐ๋ฅผ ์ทจ์ํ๋ ๊ธฐ๋ฅ์ ํตํด ๊ฒ์ ์คํธ๋ฆผ์์ ์ฝ๊ธฐ๋ฅผ ์ํํฉ๋๋ค. ์ํ๋ฅผ ์ฟผ๋ฆฌํ์ง ์์ผ๋ฉฐ, ๋์์ ์ด์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ, ํน์ฑ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ์ง์ฐ์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
UO.Dex(),UO.Dexterity(),UO.GetDex(),UO.GetDexterity(). - ExecuteClientApiCompatibility.Arg๋ ๋จผ์ ๊ฐ์ฒด ์ด๋ฆ์ ํ์ธํ ๋ค์ ์ซ์๋ฅผ ๋ณํํฉ๋๋ค. ์ ์ ์๋ ์ซ์๊ฐ ์๋ ๋ฌธ์์ด๋ก ์ธํด ๋์์ด ์๋ ๋ณํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. double์ int๋ก ์ค์ด๋ค๊ณ , Array/void๋ 0๋ก ์ค์ด๋ญ๋๋ค. ๋ฌธ์๋ฅผ ์ ํํ๋ ค๋ฉด ์ด๋ฌํ ๋ณํ์ด ์๋ ์ฌ๋ฐ๋ฅธ serial๋ฅผ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetDex();
UO.Print("GetDex: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- value๋ ์ซ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ณํํฉ๋๋ค.ToString ์ก์ง์ฉ์ผ๋ก ํฌ๋งทํฉ๋๋ค. ๋ ผ์์ด๋ ์บ๋ฆญํฐ ํ๋์ด ์์ต๋๋ค.
var value = UO.GetDex();
UO.Print("Dexterity: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ณ๋์ 1000 ms ์ ํ; UO.Wait ์์์ ์ถ๊ฐ๋์์ต๋๋ค. Change=after-before๋ ์์, 0 ๋๋ ์์์ผ ์ ์์ต๋๋ค. ๊ทธ ์์ฒด๋ก๋ ๋ชจ๋ ์ค๊ฐ ์ ๋ฐ์ดํธ์ ์๋ ์ข ๋ฃ๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.GetDex();
await Delay(1000);
var after = UO.GetDex();
var change = after - before;
UO.Print("Change: " + Convert.ToString(change));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=80๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. AttributeAtLeast(์ต์)๋ ๋๋ฝ๋ ๋ฌธ์๋ฅผ ๊ฑฐ๋ถํ๊ณ ํน์ฑ์ ํ ๋ฒ ์ฝ๊ณ bool๋ฅผ ๋ฐํํฉ๋๋ค: true ๋๋ >= ์ต์์ธ ๊ฒฝ์ฐ false. ๋ ผ๋ฆฌ์ ์๋ฏธ๋ ํน์ฑ ์์ฒด๊ฐ ์๋ ๋น๊ต์ ์ํด ๋ถ์ฌ๋ฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (Truth(Truth(AttributeAtLeast(80)) == true))
{
UO.Print("Requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic AttributeAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.GetDex();
return value >= minimum;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- id๋ type๊ฐ ์๋๋ผ UO.Self()์ ๊ฒฐ๊ณผ์ ๋๋ค. AddObject๋ ๋ ๋ฒ์งธ ์ธ์๊ฐ ์ง์ ๋์๊ธฐ ๋๋ฌธ์ ID๋ฅผ ๋ฒ์ ์์ด statSubject๋ก ์ ์ฅํฉ๋๋ค. ๋ ํธ์ถ ๋ชจ๋ ๋์ผํ ๋ฌธ์๋ฅผ ์ ํํ์ง๋ง ํ๋ ๊ฐ์ ์์์ ์ด์ง ์์ต๋๋ค.
var id = UO.Self();
if (Truth(id != 0))
{
UO.AddObject("statSubject", id);
var direct = UO.GetDex(id);
var byName = UO.GetDex("statSubject");
UO.Print("Direct: " + Convert.ToString(direct) + "; alias: " + Convert.ToString(byName));
}
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 [GetDex]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Dexterity:bridge.Dexterity.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.DexterityAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
๋งค๊ฐ๋ณ์: objID (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDexterity:bridge.GetDexterity(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Dexterity:bridge.Dexterity.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getdex": return new InjectionValue(arguments.Length > 0 ? bridge.GetDexterity(Arg(0)) : bridge.Dexterity);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetDexterity();์บ๋ฆญํฐ์ ํ์ฌ ๋ฏผ์ฒฉ์ฑ(Dexterity, DEX)์ ์ฝ์ด์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ํ์ฌ ํต๊ณ ํฌ์ธํธ, 0..65535; ๋ฐฑ๋ถ์จ, ID, ์คํฌ, ์ ๊ธ ๋ชจ๋ ๋๋ bool๊ฐ ์๋๋๋ค. 0๋ ๋๋ฝ/์ญ์ ๋ ๋ฌธ์ ๋๋ ์ ๊ทผํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๊ธฐ๋ ํฉ๋๋ค. == true๊ฐ ์๋ ์์น ์๊ตฌ ์ฌํญ๊ณผ ๋น๊ตํ์ญ์์ค. ์ด๋ ์คํ ํ๋๋ ์์ ์์ด ๋ณด์ฅ๋ ๊ธฐ๋ณธ ๊ฐ์ด ์๋๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- Player๋ฅผ ์ฝ์ต๋๋ค.Dexterity Player๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์กด์ฌํ๋ ์ฃฝ์ ์บ๋ฆญํฐ๋ ์ ๊ฑฐ๋ ๊ฐ์ฒด๊ฐ ์๋๋๋ค. ์คํ ์ HP, ๋ง๋, ์ฒด๋ ฅ์ผ๋ก ๊ณ์ฐ๋์ง ์์ต๋๋ค.
- GetStr/GetInt/GetDex ObjID๋ฅผ ์๋ฝํฉ๋๋ค. PlayerMobile ๋ฐ์ดํฐ๋ self์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ serial - 0์ ๊ฒฝ์ฐ, ๋ก๋๋ mobile์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ํน์ฑ์ ๋์ฒด๋๊ฑฐ๋ ์ถ์ธก๋์ง ์์ต๋๋ค.
- Invoke๋ ์คํฌ๋ฆฝํธ๋ก ๋๊ธฐ๋ฅผ ์ทจ์ํ๋ ๊ธฐ๋ฅ์ ํตํด ๊ฒ์ ์คํธ๋ฆผ์์ ์ฝ๊ธฐ๋ฅผ ์ํํฉ๋๋ค. ์ํ๋ฅผ ์ฟผ๋ฆฌํ์ง ์์ผ๋ฉฐ, ๋์์ ์ด์ง ์์ผ๋ฉฐ, ํจํท์ ๋ณด๋ด์ง ์์ผ๋ฉฐ, ํน์ฑ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ์ง์ฐ์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
UO.Dex(),UO.Dexterity(),UO.GetDex(),UO.GetDexterity().
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetDexterity();
UO.Print("GetDexterity: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- value๋ ์ซ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ณํํฉ๋๋ค.ToString ์ก์ง์ฉ์ผ๋ก ํฌ๋งทํฉ๋๋ค. ๋ ผ์์ด๋ ์บ๋ฆญํฐ ํ๋์ด ์์ต๋๋ค.
var value = UO.GetDexterity();
UO.Print("Dexterity: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ณ๋์ 1000 ms ์ ํ; UO.Wait ์์์ ์ถ๊ฐ๋์์ต๋๋ค. Change=after-before๋ ์์, 0 ๋๋ ์์์ผ ์ ์์ต๋๋ค. ๊ทธ ์์ฒด๋ก๋ ๋ชจ๋ ์ค๊ฐ ์ ๋ฐ์ดํธ์ ์๋ ์ข ๋ฃ๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.GetDexterity();
await Delay(1000);
var after = UO.GetDexterity();
var change = after - before;
UO.Print("Change: " + Convert.ToString(change));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=80๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. AttributeAtLeast(์ต์)๋ ๋๋ฝ๋ ๋ฌธ์๋ฅผ ๊ฑฐ๋ถํ๊ณ ํน์ฑ์ ํ ๋ฒ ์ฝ๊ณ bool๋ฅผ ๋ฐํํฉ๋๋ค: true ๋๋ >= ์ต์์ธ ๊ฒฝ์ฐ false. ๋ ผ๋ฆฌ์ ์๋ฏธ๋ ํน์ฑ ์์ฒด๊ฐ ์๋ ๋น๊ต์ ์ํด ๋ถ์ฌ๋ฉ๋๋ค.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
if (Truth(Truth(AttributeAtLeast(80)) == true))
{
UO.Print("Requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic AttributeAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.GetDexterity();
return value >= minimum;
}
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 [GetDexterity]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Dexterity:bridge.Dexterity.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.DexterityAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetEnergyResist();ํ์ฌ ์บ๋ฆญํฐ์ ์ ํญ์ฅ์ธ ์๋์ง๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int๋ ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์ ์๋ช ๋ ์ํ ๊ฐ, -32768..32767์ ๋๋ค. ์์ ๊ฐ์ด ์ ์ง๋ฉ๋๋ค. 0๋ ์ค์ ์ ํญ, ๋ฐ์ดํฐ ๋ถ์กฑ ๋๋ ํ๋ ์ด์ด ๋๋ฝ/ํ๊ดด์ผ ์ ์์ต๋๋ค. GetResist๋ ์ ์ ์๋ ์ ํ๊ธฐ์ ๋ํด 0๋ ์ ๊ณตํฉ๋๋ค. bool, ID, ์คํฌ ํ๊ณ๋ ์ ํญ ํ๊ณ๊ฐ ์๋๋๋ค. 1๋ ์ฑ๊ณต์ด ์๋ 1์ ์ ์๋ฏธํฉ๋๋ค.
- ์ด ๋ช ๋ น์ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ ํํ ์๋ช ์ ์ฌ์ฉํ์ธ์.
- ๊ฒ์ ์ค๋ ๋์์ ์ฝ์ผ๋ฉด Player๊ฐ ํ์ํฉ๋๋ค.EnergyResistance ํ์ฌ ํ๋ ์ด์ด๊ฐ ์กด์ฌํ๊ณ ํ๊ดด๋์ง ์์ ๊ฒฝ์ฐ; ๊ทธ๋ ์ง ์์ผ๋ฉด 0. ์ฅ๋น๊ฐ ์ ๋ ฌ๋์ง ์๊ณ , ๋ณด๋์ค๊ฐ ๋ค์ ๊ณ์ฐ๋์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ฒญ๋์ง ์์ผ๋ฉฐ, ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ํ์ฌ ์ ๋ น์ ํ๊ดด๋ ํ๋ ์ด์ด์ ๋์ผํ์ง ์์ต๋๋ค.
- ์์ ํ๋๋ ํ์ฅ๋ CharacterStatus (0x11), type >= 4๋ก ์ ๊ณต๋ฉ๋๋ค. ๋ช ๋ น ์์ฒด๋ ์๋ฒ ์๋๋ฅผ ํ์ธํ์ง ์์ต๋๋ค. ์ด๋ฌํ ํ๋๊ฐ ์๋ ์์ถ/์ด์ ์ํ๋ ์ด์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค. ์ ํ๋ ์ด์ด๋ ์ฒ์์๋ 0์ ๋๋ค. ๋ ์ ํญ์ Poisoned ํ๋๊ทธ๊ฐ ์๋๋๋ค. ๋ํ ์ฃผ๋ฌธ ์ ํญ ์คํฌ๋ ์๋๋๋ค.
- CharacterStatus๋ ์ด๋ฆ, ์ฒด๋ ฅ, ์์ ์ ํน์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ํ์ํ ์ ์ฒด๋ฅผ ํ์ธํ ๋ค์ ๊ฐ ์ ํญ ๋จ์ด๋ฅผ ์๋ช ๋ Int16์ผ๋ก ๋ณํํฉ๋๋ค. ์๋ฆฐ ํ์ ๋ณธ๋ฌธ์ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ ํ์ ๊ผฌ๋ฆฌ type 6๋ ๋์ผํ ๊ท์น์ ์ ์งํฉ๋๋ค. ์ ํญ ๋ช ๋ น์ ์ต๋ ํ๊ณ๋ฅผ ์ฝ์ง ์์ต๋๋ค.
- ํธ์ถํ ๋๋ง๋ค ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฝ์ต๋๋ค. ๋ณ์๋ ์ค๋ ์ท์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ๋ ๋ค๋ฅธ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. 0์ด ์๋ ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ์ ํ ์คํธํ์ง ์์ต๋๋ค. 0์ ๊ฐ์ผ ์๋ ์๊ณ ๋ฐ์ดํฐ๊ฐ ์์ ์๋ ์์ต๋๋ค.
- ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค. C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetEnergyResist();
UO.Print("GetEnergyResist: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค. ๋ ผ์์ ์์ต๋๋ค. ์์ ์ ์ฑ๊ฒฉ์ ์ฝ์ ์ ์์ต๋๋ค.
var value = UO.GetEnergyResist();
UO.Print("EnergyResistance: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ํ ์ฌ์ด์๋ UO.Wait(500) ๋ฐ๋ฆฌ์ด๊ฐ ์์ต๋๋ค. ์ฐจ์ด๋ ์์๊ฐ ๋ ์ ์์ต๋๋ค. ์ค๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค. ์ผ์ ์ ์ง๋ ์ง์ฐ API์ด ์๋ ์๋ฅผ ๋ํ๋ ๋๋ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
var before = UO.GetEnergyResist();
await Delay(500);
var after = UO.GetEnergyResist();
var difference = after - before;
UO.Print("Resistance change: " + Convert.ToString(difference));
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ต์=50๋ ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋ ์๊ตฌ ์ฌํญ์ ์์ ๋๋ค. ResistanceAtLeast๋ ๋๋ฝ๋ ํ๋ ์ด์ด๋ฅผ ๊ฑฐ๋ถํ๊ณ ํ๋์ ๊ฐ์ ์ฝ๊ณ bool๋ฅผ ๋ฐํํฉ๋๋ค: true ๋๋ ๊ฐ >= ์ต์์ธ ๊ฒฝ์ฐ false. ์ ํญ ์์ฒด๋ bool๊ฐ ์๋๋๋ค. ํจ์๋ ์๋์ ์์ ํ ์ ์ธ๋์ด ์์ต๋๋ค.
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(Truth(ResistanceAtLeast(50)) == true))
{
UO.Print("Local resistance requirement met");
}
else
{
UO.Print("Requirement not met or no player");
}
return null;
}
dynamic ResistanceAtLeast(dynamic minimum)
{
if (Truth(UO.Self() == 0))
{
return false;
}
var value = UO.GetEnergyResist();
return value >= minimum;
}
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 [GetEnergyResist]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.EnergyResistance:bridge.EnergyResistance.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.EnergyResistanceAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.