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๊ฐ€ ํฌํ•จ๋œ ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

์„น์…˜

์ฃผ์ œ ๋ช…๋ น ๋ฐ ์„ค๋ช…
Identity UO.Self ยท UO.GetSerial ยท UO.GetName ยท UO.GetTitle ยท UO.GetSex ยท UO.GetRace
Stats UO.HP ยท UO.MaxHP ยท UO.Mana ยท UO.MaxMana ยท UO.Stamina ยท UO.MaxStamina ยท UO.Str ยท UO.Dex ยท UO.Int ยท UO.Weight ยท UO.MaxWeight ยท UO.Luck ยท UO.GetStatLockState ยท UO.SetStatLockState
Status UO.Alive ยท UO.Dead ยท UO.Hidden ยท UO.Poisoned ยท UO.Frozen ยท UO.Paralyzed ยท UO.Flying ยท UO.WarMode ยท UO.IsYellowHits
Resists 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.ObjAtLayer ยท UO.ObjAtLayerEx ยท UO.GetLayer ยท UO.GetEquipment
Equipment UO.GetEquipment ยท UO.EquipItems ยท UO.UnequipItems ยท UO.WearItem
Dress / Undress UO.SetDress ยท UO.Dress ยท UO.Undress ยท UO.DressSavedSet
Arm / Disarm UO.SetArm ยท UO.Arm ยท UO.Disarm
Mount / Dismount UO.Mount ยท UO.Dismount
Paperdoll UO.UseSelfPaperdollScroll ยท UO.UseOtherPaperdollScroll

๋ชจ๋“  ํ…Œ๋งˆ ๋ช…๋ น

์‹ ์›

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

Dress / Undress

UO.Dress ยท UO.Undress ยท UO.SetDress ยท UO.UnsetDress ยท UO.DressSavedSet ยท UO.EquipDressSet ยท UO.DressSpeed ยท UO.SetDressSpeed

Arm / Disarm

UO.Arm ยท UO.Disarm ยท UO.SetArm ยท UO.UnsetArm

Mount / Dismount

UO.Mount ยท UO.Dismount

์ข…์ด์ธํ˜•

UO.UseSelfPaperdollScroll ยท UO.UseOtherPaperdollScroll

์บ๋ฆญํ„ฐ ๋ ˆ์ด์–ด

๋ชจ๋“  ๋ ˆ์ด์–ด: ๋ชฉ์ , ์˜๋ฏธ ๋ฐ ์˜ˆ์‹œ. ์žฅ์ฐฉํ•œ ์•„์ดํ…œ์˜ ๋ ˆ์ด์–ด ๋ฒˆํ˜ธ serial์™€ graphic๋Š” ๋‹ค๋ฅธ ๊ฐ’์ž…๋‹ˆ๋‹ค.

์ฃผ์ œ์— ๋Œ€ํ•œ ์˜ˆ

๊ฐ ๋ช…๋ น ์นด๋“œ์—๋Š” ์ง์ ‘ ์ฝ”๋“œ, ํ•จ์ˆ˜ ๋ฐ ํด๋ž˜์Šค ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋…๋ฆฝ์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์„ ํƒ๋œ ์งง์€ ์‹œ๋‚˜๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค. ์ œํ•œ์‚ฌํ•ญ๊ณผ ์ „์ฒด ๋ถ„์„์ด ์นด๋“œ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

UO.HP

๋งค๊ฐœ๋ณ€์ˆ˜, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค

var value = UO.HP();
UO.Print("HP: " + Convert.ToString(value));

UO.ObjAtLayer

๋งค๊ฐœ๋ณ€์ˆ˜, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค

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;

์ฐธ์กฐ ๊ตฌ์„ฑ

1 ยท 2 ยท 3 ยท 4 ยท 5

์ „์ฒด ๋ช…๋ น ์ฐธ์กฐ


UO.Alive

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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์™€ ๋‹ค์Œ ๋„์ „ ์‚ฌ์ด์— ์„ธ์ƒ์ด ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋Š” ์›์ž์„ฑ ์Šค๋ƒ…์ƒท์„ ํ˜•์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.Alive();
UO.Print("Alive: " + Convert.ToString(result));

1. ์ž์‹ ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋นˆ ๊ด„ํ˜ธ๋Š” 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;

2. ์„ ํƒํ•œ ๊ฐœ์ฒด ๋ฐ ์ „์ฒด ๊ธฐ๋Šฅ ReadState - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;

3. 0.5์ดˆ ๋งŒ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๋‘ ๋ฒˆ์˜ ํ˜ธ์ถœ์€ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Alive() โ€” UO.Alive()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

serial => serial > 0 && bridge.Exists(serial) != 0 && IsDeadState(serial) == 0 ? 1 : 0

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

() => getter(bridge.Self)

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.Alive(value) โ€” UO.Alive(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: value (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

serial => serial > 0 && bridge.Exists(serial) != 0 && IsDeadState(serial) == 0 ? 1 : 0

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

value => getter(GetObject(value))

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


UO.Arm

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.Print("Calling UO.Arm");
UO.Arm("battle");

1. ์ง์ ‘ ์‚ฌ์šฉ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ•„์ˆ˜ ์„ธํŠธ๋Š” ๋™์ผํ•œ ๋Ÿฐํƒ€์ž„ ์ƒํƒœ์—์„œ ์ด์ „์— ์ €์žฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ณต์› ์ง์ „์— SetDress/SetArm๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ˜„์žฌ ํ•ญ๋ชฉ์œผ๋กœ ๋Œ€์ƒ์„ ๋ฎ์–ด์“ฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
UO.Arm("battle");

2. ์ด๋ฆ„ ๋ฐ ์ฟผ๋ฆฌ ๋ชจ๋“œ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 0์ด ์•„๋‹Œ ์žฅ๋น„๋Š” ํ”ฝ์—…/์žฅ๋น„๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. 350 โ€” ๋ฐ€๋ฆฌ์ดˆ DressSpeed. ์ด๋Ÿฌํ•œ ์„ค์ •์€ ์˜ˆ์ œ ์ดํ›„ ๋Ÿฐํƒ€์ž„์—๋„ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ œ๊ฑฐ ๋ฐ ์ฐฉ์šฉ์€ ์„œ๋ฒ„์—์„œ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Set("equipfordress", 1);
    UO.DressSpeed(350);
    UO.Arm("battle");
    return null;
}

3. ์™„์ „ํ•œ ๋„์šฐ๋ฏธ ์Šคํฌ๋ฆฝํŠธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Arm(name) โ€” UO.Arm(String)

๋งค๊ฐœ๋ณ€์ˆ˜: name (String)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public void Arm(string name)

            => Equip(name, armSets, weaponLayers, "Weapon set requests processed.", "No weapons set with setarm.");

UO.Armor

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.Armor();
UO.Print("Armor: " + Convert.ToString(result));

1. ์ €์žฅ๋œ ๊ฐ’ ์ธ์‡„ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๊ฐ’์€ ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Convert.ToString๋Š” ๋กœ๊ทธ ๋ฒˆํ˜ธ์˜ ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์„ฑ๊ฒฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
var value = UO.Armor();
UO.Print("PhysicalResistance: " + Convert.ToString(value));

2. ๋‘ ์ด๋ฏธ์ง€ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ „ํ›„ ์‚ฌ์ด์—๋Š” 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)));

3. ์ตœ์†Œ ์ €ํ•ญ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ์™„๋ฃŒ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ตœ์†Œ=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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Armor() โ€” UO.Armor()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "armor": return new InjectionValue(bridge.Armor);

UO.CharName

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

dynamic UO.CharName();

์บ๋ฆญํ„ฐ์˜ ์ด๋ฆ„์„ ์ฝ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string์€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์•Œ๋ ค์ง„ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋นˆ ๋ฌธ์ž์—ด์€ ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’ ๋˜๋Š” ๊ฐ์ฒด๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. serial ๋˜๋Š” ํ”„๋กœํ•„ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ด๋ฆ„/์ œ๋ชฉ์€ ์–ธ์–ด IDE๋กœ ๋ฒˆ์—ญ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด๋ฏธ ์ˆ˜์‹ ๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์€ ๊ณต๊ฐœ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์„œ๋ฒ„๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ณด๋‚ด๋„๋ก ๊ฐ•์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ๋ง, ๋งต ์ „ํ™˜ ๋˜๋Š” ๊ฐ์ฒด ์‚ญ์ œ ํ›„ ๋‘ ํ˜ธ์ถœ ์‚ฌ์ด์— ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

object? result = UO.CharName();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ๋กœ๊ทธ์ธ ํ›„ ํ…์ŠคํŠธ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์Œ: 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;

2. ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์— ํ…์ŠคํŠธ ์ถ”๊ฐ€ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋‹น์‹ ์˜ ์บ๋ฆญํ„ฐ๊ฐ€ ์ฝํ˜€์ง€๊ณ , ๊ทธ ๊ฐ’์€ ๋ผ์ธ์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
    • ์—ฐ์‚ฐ์ž๋Š” ๋ฌธ์ž์—ด์„ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฐ๊ณผ์—๋Š” Convert.ToString๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var text = UO.CharName();
    UO.Print("Player ะธะผั: " + text);
    return null;
}

3. ๋‘ ์Šค๋ƒ…์ƒท ๋น„๊ต - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋‘ ํ˜ธ์ถœ ๋ชจ๋‘ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.CharName() โ€” UO.CharName()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "getname":

                case "charname": return new InjectionValue(bridge.GetName(Arg(0, bridge.Self)));

UO.CharTitle

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

dynamic UO.CharTitle();

์บ๋ฆญํ„ฐ์˜ ์ œ๋ชฉ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string์€ ๊ณ ๊ฐ์—๊ฒŒ ์•Œ๋ ค์ง„ ์ œ๋ชฉ์ž…๋‹ˆ๋‹ค. ๋นˆ ๋ฌธ์ž์—ด์€ ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’ ๋˜๋Š” ๊ฐ์ฒด๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. serial ๋˜๋Š” ํ”„๋กœํ•„ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ด๋ฆ„/์ œ๋ชฉ์€ ์–ธ์–ด IDE๋กœ ๋ฒˆ์—ญ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด๋ฏธ ์ˆ˜์‹ ๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์€ ๊ณต๊ฐœ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์„œ๋ฒ„๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ณด๋‚ด๋„๋ก ๊ฐ•์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ๋ง, ๋งต ์ „ํ™˜ ๋˜๋Š” ๊ฐ์ฒด ์‚ญ์ œ ํ›„ ๋‘ ํ˜ธ์ถœ ์‚ฌ์ด์— ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

object? result = UO.CharTitle();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ๋กœ๊ทธ์ธ ํ›„ ํ…์ŠคํŠธ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์Œ: 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;

2. ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์— ํ…์ŠคํŠธ ์ถ”๊ฐ€ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋‹น์‹ ์˜ ์บ๋ฆญํ„ฐ๊ฐ€ ์ฝํ˜€์ง€๊ณ , ๊ทธ ๊ฐ’์€ ๋ผ์ธ์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
    • ์—ฐ์‚ฐ์ž๋Š” ๋ฌธ์ž์—ด์„ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฐ๊ณผ์—๋Š” Convert.ToString๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var text = UO.CharTitle();
    UO.Print("Player ั‚ะธั‚ัƒะป: " + text);
    return null;
}

3. ๋‘ ์Šค๋ƒ…์ƒท ๋น„๊ต - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋‘ ํ˜ธ์ถœ ๋ชจ๋‘ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.CharTitle() โ€” UO.CharTitle()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "chartitle": return new InjectionValue(bridge.CharacterTitle);

UO.CharacterTitle

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

string UO.CharacterTitle();

์บ๋ฆญํ„ฐ์˜ ์ œ๋ชฉ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string์€ ๊ณ ๊ฐ์—๊ฒŒ ์•Œ๋ ค์ง„ ์ œ๋ชฉ์ž…๋‹ˆ๋‹ค. ๋นˆ ๋ฌธ์ž์—ด์€ ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’ ๋˜๋Š” ๊ฐ์ฒด๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. serial ๋˜๋Š” ํ”„๋กœํ•„ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ด๋ฆ„/์ œ๋ชฉ์€ ์–ธ์–ด IDE๋กœ ๋ฒˆ์—ญ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด๋ฏธ ์ˆ˜์‹ ๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์€ ๊ณต๊ฐœ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์„œ๋ฒ„๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ณด๋‚ด๋„๋ก ๊ฐ•์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ๋ง, ๋งต ์ „ํ™˜ ๋˜๋Š” ๊ฐ์ฒด ์‚ญ์ œ ํ›„ ๋‘ ํ˜ธ์ถœ ์‚ฌ์ด์— ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.CharacterTitle();
UO.Print("CharacterTitle: " + Convert.ToString(result));

1. ๋กœ๊ทธ์ธ ํ›„ ํ…์ŠคํŠธ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์Œ: 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;

2. ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์— ํ…์ŠคํŠธ ์ถ”๊ฐ€ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋‹น์‹ ์˜ ์บ๋ฆญํ„ฐ๊ฐ€ ์ฝํ˜€์ง€๊ณ , ๊ทธ ๊ฐ’์€ ๋ผ์ธ์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
    • ์—ฐ์‚ฐ์ž๋Š” ๋ฌธ์ž์—ด์„ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฐ๊ณผ์—๋Š” Convert.ToString๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var text = UO.CharacterTitle();
    UO.Print("Player ั‚ะธั‚ัƒะป: " + text);
    return null;
}

3. ๋‘ ์Šค๋ƒ…์ƒท ๋น„๊ต - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋‘ ํ˜ธ์ถœ ๋ชจ๋‘ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.CharacterTitle() โ€” UO.CharacterTitle()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

() => bridge.CharacterTitle

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


UO.ColdResist

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.ColdResist();
UO.Print("ColdResist: " + Convert.ToString(result));

1. ์ €์žฅ๋œ ๊ฐ’ ์ธ์‡„ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๊ฐ’์€ ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Convert.ToString๋Š” ๋กœ๊ทธ ๋ฒˆํ˜ธ์˜ ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์„ฑ๊ฒฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
var value = UO.ColdResist();
UO.Print("ColdResistance: " + Convert.ToString(value));

2. ๋‘ ์ด๋ฏธ์ง€ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ „ํ›„ ์‚ฌ์ด์—๋Š” 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)));

3. ์ตœ์†Œ ์ €ํ•ญ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ์™„๋ฃŒ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ตœ์†Œ=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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.ColdResist() โ€” UO.ColdResist()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "coldresist": return new InjectionValue(bridge.ColdResistance);

UO.Dead

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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์™€ ๋‹ค์Œ ๋„์ „ ์‚ฌ์ด์— ์„ธ์ƒ์ด ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋Š” ์›์ž์„ฑ ์Šค๋ƒ…์ƒท์„ ํ˜•์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.Dead();
UO.Print("Dead: " + Convert.ToString(result));

1. ์ž์‹ ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋นˆ ๊ด„ํ˜ธ๋Š” 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;

2. ์„ ํƒํ•œ ๊ฐœ์ฒด ๋ฐ ์ „์ฒด ๊ธฐ๋Šฅ ReadState - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;

3. 0.5์ดˆ ๋งŒ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๋‘ ๋ฒˆ์˜ ํ˜ธ์ถœ์€ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Dead() โ€” UO.Dead()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int Dead() => bridge.Dead();

UO.Dead(id) โ€” UO.Dead(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: id (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int Dead(InjectionValue id)

        {

            int serial = GetObject(id);

            if (serial == bridge.Self)

                return Dead();

            return serial > 0 ? bridge.IsDead(serial) : 0;

        }

UO.Dex

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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().

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.Dex();
UO.Print("Dex: " + Convert.ToString(result));

1. ํฌ์ธํŠธ ์ฝ๊ธฐ ๋ฐ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • value๋Š” ์ˆซ์ž ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString ์žก์ง€์šฉ์œผ๋กœ ํฌ๋งทํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์ด๋‚˜ ์บ๋ฆญํ„ฐ ํ–‰๋™์ด ์—†์Šต๋‹ˆ๋‹ค.
var value = UO.Dex();
UO.Print("Dexterity: " + Convert.ToString(value));

2. ๋‘ ์ด๋ฏธ์ง€ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋ณ„๋„์˜ 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)));

3. ์™„์ „ํ•œ ์š”๊ตฌ์‚ฌํ•ญ ๊ฒ€์ฆ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ตœ์†Œ=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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Dex() โ€” UO.Dex()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "dex": return new InjectionValue(bridge.Dexterity);

UO.Dexterity

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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().

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.Dexterity();
UO.Print("Dexterity: " + Convert.ToString(result));

1. ํฌ์ธํŠธ ์ฝ๊ธฐ ๋ฐ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • value๋Š” ์ˆซ์ž ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString ์žก์ง€์šฉ์œผ๋กœ ํฌ๋งทํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์ด๋‚˜ ์บ๋ฆญํ„ฐ ํ–‰๋™์ด ์—†์Šต๋‹ˆ๋‹ค.
var value = UO.Dexterity();
UO.Print("Dexterity: " + Convert.ToString(value));

2. ๋‘ ์ด๋ฏธ์ง€ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋ณ„๋„์˜ 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)));

3. ์™„์ „ํ•œ ์š”๊ตฌ์‚ฌํ•ญ ๊ฒ€์ฆ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ตœ์†Œ=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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Dexterity() โ€” UO.Dexterity()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

() => bridge.Dexterity

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


UO.Disarm

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.Disarm();
UO.Print("Disarm: " + Convert.ToString(result));

1. Disarm - ํ•˜๋‚˜์˜ ์„ ํƒ๋œ ํ•ญ๋ชฉ ๋˜๋Š” ๋ ˆ์ด์–ด - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋จผ์ €, ๊ฒŒ์ž„์—์„œ ์ ์ ˆํ•œ ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜์„ธ์š”: lasttarget - ID. Equip/WearItem ์˜ˆ์—์„œ 1 ๋ ˆ์ด์–ด์—๋Š” ๋ณด์กฐ ๋ฌด๊ธฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Unequip(1)๋Š” ์˜ค๋ฅธ์†์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. Disarm/Undress ์ž์ฒด ๊ณ ์ • ๋ ˆ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ์ ˆ ํ›„์—๋Š” ์ž๋™ ์žฌ์ƒ์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return UO.Disarm();

2. Disarm - ๋‘ ๊ฐœ์˜ ํ•ญ๋ชฉ์„ ์ €์žฅํ•˜๊ณ  ID - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์žฅ์ฐฉ ๋ฐฉ๋ฒ•์— ์žˆ์–ด์„œ 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;

3. Disarm - ๋Œ€๊ธฐ๊ฐ€ ์ œํ•œ๋œ ์ „์ฒด ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Disarm() โ€” UO.Disarm()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int Disarm()

            => Unequip(weaponLayers, "Weapons disarmed.");

UO.Dismount

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

int UO.Dismount();

๋™์ž‘ ๋ฐ ๋ฐ˜ํ™˜๊ฐ’

Mount์™€ Dismount๋Š” ์ˆ˜๋™ ๋”๋ธ” ํด๋ฆญ์ด๋‚˜ ์ „ํˆฌ ๋ชจ๋“œ ๊ณต๊ฒฉ ์ฒ˜๋ฆฌ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๊ฐœ์ฒด ์‚ฌ์šฉ ์š”์ฒญ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. int๋Š” Mount ๋ ˆ์ด์–ด์˜ ํ˜„์žฌ ์•„์ดํ…œ serial์ด๋ฉฐ ์„ฑ๊ณต ์—ฌ๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์‘๋‹ต์€ ๋น„๋™๊ธฐ์ด๋ฏ€๋กœ Mount๊ฐ€ ์•„์ง 0, Dismount๊ฐ€ ์ œ๊ฑฐ ์ „ serial์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‘๋‹ต ํ›„ ObjAtLayer("Mount")๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์Œ.

๊ฐ ์ฝ”๋“œ ๋ธ”๋ก์€ ์™„์ „ํ•œ ๋…๋ฆฝ .csx์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ serial, type๊ณผ ์ขŒํ‘œ๋ฅผ ๋ฐ”๊พธ์„ธ์š”. ์ธ์ˆ˜ ์ˆœ์„œ์™€ C# ๋ช…๋ช…๋œ ์ธ์ˆ˜๋Š” ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

์ฑ„ํŒ… ๋ช…๋ น

#dismount

์™„์ „ํ•œ C# ์˜ˆ์ œ

๊ฐ ์ฝ”๋“œ ๋ธ”๋ก์€ ์™„์ „ํ•œ ๋…๋ฆฝ .csx์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ serial, type๊ณผ ์ขŒํ‘œ๋ฅผ ๋ฐ”๊พธ์„ธ์š”. ์ธ์ˆ˜ ์ˆœ์„œ์™€ C# ๋ช…๋ช…๋œ ์ธ์ˆ˜๋Š” ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

1

int mountLayerSerial = UO.Dismount();
UO.Print(UO.Int2Hex(mountLayerSerial));

2

var before = UO.ObjAtLayer("Mount");
int currentSerial = UO.Dismount();
UO.Print($"{before} -> {UO.Int2Hex(currentSerial)}");

3

UO.Dismount();
await WaitAsync(250);
UO.Print(Convert.ToString(UO.ObjAtLayer("Mount")));

4

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)

์ถœ์ฒ˜

ClassicUO ยท ServUO BaseMount


UO.Dress

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.Print("Calling UO.Dress");
UO.Dress("travel");

1. ์ง์ ‘ ์‚ฌ์šฉ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ•„์ˆ˜ ์„ธํŠธ๋Š” ๋™์ผํ•œ ๋Ÿฐํƒ€์ž„ ์ƒํƒœ์—์„œ ์ด์ „์— ์ €์žฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ณต์› ์ง์ „์— SetDress/SetArm๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ˜„์žฌ ํ•ญ๋ชฉ์œผ๋กœ ๋Œ€์ƒ์„ ๋ฎ์–ด์“ฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
UO.Dress("travel");

2. ์ด๋ฆ„ ๋ฐ ์ฟผ๋ฆฌ ๋ชจ๋“œ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 0์ด ์•„๋‹Œ ์žฅ๋น„๋Š” ํ”ฝ์—…/์žฅ๋น„๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. 350 โ€” ๋ฐ€๋ฆฌ์ดˆ DressSpeed. ์ด๋Ÿฌํ•œ ์„ค์ •์€ ์˜ˆ์ œ ์ดํ›„ ๋Ÿฐํƒ€์ž„์—๋„ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ œ๊ฑฐ ๋ฐ ์ฐฉ์šฉ์€ ์„œ๋ฒ„์—์„œ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Set("equipfordress", 1);
    UO.DressSpeed(350);
    UO.Dress("travel");
    return null;
}

3. ์™„์ „ํ•œ ๋„์šฐ๋ฏธ ์Šคํฌ๋ฆฝํŠธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Dress(name) โ€” UO.Dress(String)

๋งค๊ฐœ๋ณ€์ˆ˜: name (String)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public void Dress(string name)

            => Equip(name, dressSets, dressLayers, "Clothing set requests processed.", "No clothing set with setdress.");

UO.DressSavedSet

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

object? result = UO.DressSavedSet();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ์ง์ ‘ ์‚ฌ์šฉ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ•„์ˆ˜ ์„ธํŠธ๋Š” ๋™์ผํ•œ ๋Ÿฐํƒ€์ž„ ์ƒํƒœ์—์„œ ์ด์ „์— ์ €์žฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ณต์› ์ง์ „์— SetDress/SetArm๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ˜„์žฌ ํ•ญ๋ชฉ์œผ๋กœ ๋Œ€์ƒ์„ ๋ฎ์–ด์“ฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
return UO.DressSavedSet();

2. ์ด๋ฆ„ ๋ฐ ์ฟผ๋ฆฌ ๋ชจ๋“œ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 0์ด ์•„๋‹Œ ์žฅ๋น„๋Š” ํ”ฝ์—…/์žฅ๋น„๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. 350 โ€” ๋ฐ€๋ฆฌ์ดˆ DressSpeed. ์ด๋Ÿฌํ•œ ์„ค์ •์€ ์˜ˆ์ œ ์ดํ›„ ๋Ÿฐํƒ€์ž„์—๋„ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ œ๊ฑฐ ๋ฐ ์ฐฉ์šฉ์€ ์„œ๋ฒ„์—์„œ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Set("equipfordress", 1);
    UO.DressSpeed(350);
    return UO.DressSavedSet();
    return null;
}

3. ์™„์ „ํ•œ ๋„์šฐ๋ฏธ ์Šคํฌ๋ฆฝํŠธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.DressSavedSet() โ€” UO.DressSavedSet()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "dresssavedset":

                case "equipdressset": return new InjectionValue(Equip("__stealth_saved_set__", dressSets, dressLayers, "Clothing set requests processed.", "No clothing set with setdress."));

UO.DressSpeed

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

object? result = UO.DressSpeed();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. DressSpeed - 1 - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ˜„์žฌ ์ผ์‹œ ์ •์ง€๋ฅผ ์ฝ๊ณ  ๋‹ค์Œ ์„ธํŠธ์˜ ์ตœ์†Œ๊ฐ’์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค. 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;

2. DressSpeed โ€” 2 โ€” ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 350 ms ๋กœ ์„ค์ •ํ•˜๊ณ  ์ €์žฅ๋œ ๊ฐ’์„ ๋ณ„๋„๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. setter์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. setter๋Š” ๋‹จ์œ„๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.DressSpeed(350);
    return UO.DressSpeed();
    return null;
}

3. DressSpeed - 3 - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.DressSpeed() โ€” UO.DressSpeed()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "dressspeed":

                    if (arguments.Length > 0) { SetDressSpeed(Arg(0)); return InjectionValue.Unit; }

                    return new InjectionValue(state.DressSpeed);

UO.DressSpeed(value) โ€” UO.DressSpeed(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: value (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "dressspeed":

                    if (arguments.Length > 0) { SetDressSpeed(Arg(0)); return InjectionValue.Unit; }

                    return new InjectionValue(state.DressSpeed);

UO.EnergyResist

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.EnergyResist();
UO.Print("EnergyResist: " + Convert.ToString(result));

1. ์ €์žฅ๋œ ๊ฐ’ ์ธ์‡„ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๊ฐ’์€ ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Convert.ToString๋Š” ๋กœ๊ทธ ๋ฒˆํ˜ธ์˜ ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์„ฑ๊ฒฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
var value = UO.EnergyResist();
UO.Print("EnergyResistance: " + Convert.ToString(value));

2. ๋‘ ์ด๋ฏธ์ง€ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ „ํ›„ ์‚ฌ์ด์—๋Š” 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)));

3. ์ตœ์†Œ ์ €ํ•ญ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ์™„๋ฃŒ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ตœ์†Œ=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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.EnergyResist() โ€” UO.EnergyResist()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "energyresist": return new InjectionValue(bridge.EnergyResistance);

UO.Equip

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

int item = UO.LastTarget();
if (item != 0)
    UO.Print("Accepted flag: " + UO.Equip(1, item));

1. Equip - ํ•˜๋‚˜์˜ ์„ ํƒ๋œ ํ•ญ๋ชฉ ๋˜๋Š” ๋ ˆ์ด์–ด - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋จผ์ €, ๊ฒŒ์ž„์—์„œ ์ ์ ˆํ•œ ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜์„ธ์š”: 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;

2. Equip - ๋‘ ๊ฐœ์˜ ํ•ญ๋ชฉ์„ ์ €์žฅํ•˜๊ณ  ID - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์žฅ์ฐฉ ๋ฐฉ๋ฒ•์— ์žˆ์–ด์„œ 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;

3. Equip - ๋Œ€๊ธฐ๊ฐ€ ์ œํ•œ๋œ ์ „์ฒด ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Equip(layer, id) โ€” UO.Equip(Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: layer (Any/String), id (Any/Integer/String)

๊ฒฐ๊ณผ: int / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "equip":

                    return new InjectionValue(arguments[0].Kind == InjectionValueKind.String ? Equip(Text(0), Arg(1)) : bridge.Equip(Arg(0), Arg(1)));

UO.Equip(layer, id) โ€” UO.Equip(String,Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: layer (Any/String), id (Any/Integer/String)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int Equip(string layer, int id) => bridge.Equip(ConvertLayer(layer), id);

UO.Equip(layer, id) โ€” UO.Equip(String,String)

๋งค๊ฐœ๋ณ€์ˆ˜: layer (Any/String), id (Any/Integer/String)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int Equip(string layer, string id) => Equip(layer, GetObject(id));

UO.EquipDressSet

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

object? result = UO.EquipDressSet();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ์ง์ ‘ ์‚ฌ์šฉ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ํ•„์ˆ˜ ์„ธํŠธ๋Š” ๋™์ผํ•œ ๋Ÿฐํƒ€์ž„ ์ƒํƒœ์—์„œ ์ด์ „์— ์ €์žฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ณต์› ์ง์ „์— SetDress/SetArm๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ˜„์žฌ ํ•ญ๋ชฉ์œผ๋กœ ๋Œ€์ƒ์„ ๋ฎ์–ด์“ฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
return UO.EquipDressSet();

2. ์ด๋ฆ„ ๋ฐ ์ฟผ๋ฆฌ ๋ชจ๋“œ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 0์ด ์•„๋‹Œ ์žฅ๋น„๋Š” ํ”ฝ์—…/์žฅ๋น„๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. 350 โ€” ๋ฐ€๋ฆฌ์ดˆ DressSpeed. ์ด๋Ÿฌํ•œ ์„ค์ •์€ ์˜ˆ์ œ ์ดํ›„ ๋Ÿฐํƒ€์ž„์—๋„ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ œ๊ฑฐ ๋ฐ ์ฐฉ์šฉ์€ ์„œ๋ฒ„์—์„œ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Set("equipfordress", 1);
    UO.DressSpeed(350);
    return UO.EquipDressSet();
    return null;
}

3. ์™„์ „ํ•œ ๋„์šฐ๋ฏธ ์Šคํฌ๋ฆฝํŠธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.EquipDressSet() โ€” UO.EquipDressSet()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "dresssavedset":

                case "equipdressset": return new InjectionValue(Equip("__stealth_saved_set__", dressSets, dressLayers, "Clothing set requests processed.", "No clothing set with setdress."));

UO.EquipItems

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .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));

1. EquipItems - ํ•˜๋‚˜์˜ ์„ ํƒ๋œ ํ•ญ๋ชฉ ๋˜๋Š” ๋ ˆ์ด์–ด - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋จผ์ €, ๊ฒŒ์ž„์—์„œ ์ ์ ˆํ•œ ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜์„ธ์š”: 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;

2. EquipItems - ๋‘ ๊ฐœ์˜ ํ•ญ๋ชฉ ๋ฐ ์ €์žฅ๋จ ID - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์žฅ์ฐฉ ๋ฐฉ๋ฒ•์— ์žˆ์–ด์„œ 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;

3. EquipItems - ๋Œ€๊ธฐ๊ฐ€ ์ œํ•œ๋œ ์ „์ฒด ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.EquipItems(items) โ€” UO.EquipItems(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: items (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "equipitems":

                    return new InjectionValue(ChangeEquipmentItems(ArrayArg(0), true));

UO.EquipLastWeapon

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

void UO.EquipLastWeapon();

๋งˆ์ง€๋ง‰์œผ๋กœ ์ €์žฅ๋œ ์˜ค๋ฅธ์†, ์™ผ์† ์•„์ดํ…œ์˜ ์žฌ์žฅ์ฐฉ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • Bridge๋Š” _lastRightHand ๋ฐ _lastLeftHand๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ์˜ค๋ฅธ์ชฝ serial๋Š” Equip(OneHanded), 0์ด ์•„๋‹Œ ์™ผ์ชฝ์€ Equip(TwoHanded)๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๋นˆ ํ•ญ๋ชฉ์€ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ์ด๋Š” ์„œ๋ฒ„์— ์˜ํ•œ ์›์ž ํ™•์ธ ๋ณต๊ตฌ๊ฐ€ ์•„๋‹Œ ๋‘ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ์š”์ฒญ์ž…๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.Print("Calling UO.EquipLastWeapon");
UO.EquipLastWeapon();

1. ๋ฌด๊ธฐ ๋ณต์› - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ €์žฅ๋œ ๋ธŒ๋ฆฟ์ง€ serial ์†๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
UO.EquipLastWeapon();

2. ์—ฐ๊ฒฐ์ด ์žˆ๋Š” ๊ฒฝ์šฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์š”์ฒญ์ด ์ „์†ก๋˜๊ธฐ ์ „์— ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
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;

3. ๋ณต๊ตฌ ์ ˆ์ฐจ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์™„์ „ํžˆ ์„ ์–ธ๋œ ๋„์šฐ๋ฏธ๋Š” ํ•œ ์„ธํŠธ์˜ ์†์ด ๋ณต์›๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.EquipLastWeapon() โ€” UO.EquipLastWeapon()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "equiplastweapon": bridge.EquipLastWeapon(); return InjectionValue.Unit;

UO.EquipT

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋™์‹œ์— ๋‹ค๋ฅธ ํ•ญ๋ชฉ ์ „์†ก์„ ์‹œ์ž‘ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋™์ž‘์„ ๋์—†์ด ๋ฐ˜๋ณตํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋ ˆ์ด์–ด์˜ ๋ณ€ํ™”๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๋ช…๋ น์€ ๋…๋ฆฝ๋œ ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ž์˜ ๋ฉ”์‹œ์ง€๋Š” ํ˜ธ์ถœ ์‹œ์ž‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.Print("Calling UO.EquipT");
UO.EquipT("Rhand", 0x0F51);

1. ๋ฌธ์ž์—ด ๋ ˆ์ด์–ด ์ด๋ฆ„์œผ๋กœ ๋‹จ๊ฒ€ ์žฅ์ฐฉ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;

2. ๋ฒˆํ˜ธ ์–‘์‹ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;

3. ์ „์ฒด ๊ธฐ๋Šฅ: ์›ํ•˜๋Š” type๋ฅผ ์ฐฉ์šฉํ•˜๊ณ  ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.EquipT(layer, type) โ€” UO.EquipT(Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: layer (Any), type (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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);

        }

UO.Equipt

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋™์‹œ์— ๋‹ค๋ฅธ ํ•ญ๋ชฉ ์ „์†ก์„ ์‹œ์ž‘ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋™์ž‘์„ ๋์—†์ด ๋ฐ˜๋ณตํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋ ˆ์ด์–ด์˜ ๋ณ€ํ™”๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.Equipt(1, 0x0F51);
UO.Print("Equipt: " + Convert.ToString(result));

1. graphic๋กœ ๋‹จ๊ฒ€ ์žฅ๋น„ ์š”์ฒญ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋‘ ์ธ์ˆ˜๋Š” ๋ชจ๋‘ ์ •์ˆ˜์ž…๋‹ˆ๋‹ค(๋‹จ๊ฒ€์˜ ๋ ˆ์ด์–ด 1 ๋ฐ graphic). 1 ๊ฐ’์€ ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ์ˆ˜๋ฝํ–ˆ์Œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
int accepted = UO.Equipt(1, 0x0F51);
UO.Print(accepted != 0 ? "Equip request accepted locally" : "Equip request not accepted");

2. ์š”์ฒญ ํ›„ ์Šฌ๋กฏ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์€ ํ™•์ธ์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด์˜ ์‹ค์ œ ๋‚ด์šฉ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋Š” ์ „์†ก์„ ๋์—†์ด ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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;
}

3. ํ•„์ˆ˜์•„์ดํ…œ์ด ์—†์„ ๋•Œ๋งŒ ์ฐฉ์šฉ - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋จผ์ € ํ˜„์žฌ ์žฅ๋น„๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์˜ ์š”์ฒญ ์ดํ›„์—๋Š” ํ™•์ธ ์‹œ๋„๊ฐ€ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Equipt(layer, type) โ€” UO.Equipt(Integer,Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: layer (Integer), type (Integer)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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);

        }

UO.FireResist

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.FireResist();
UO.Print("FireResist: " + Convert.ToString(result));

1. ์ €์žฅ๋œ ๊ฐ’ ์ธ์‡„ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๊ฐ’์€ ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Convert.ToString๋Š” ๋กœ๊ทธ ๋ฒˆํ˜ธ์˜ ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์„ฑ๊ฒฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
var value = UO.FireResist();
UO.Print("FireResistance: " + Convert.ToString(value));

2. ๋‘ ์ด๋ฏธ์ง€ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ „ํ›„ ์‚ฌ์ด์—๋Š” 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)));

3. ์ตœ์†Œ ์ €ํ•ญ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ์™„๋ฃŒ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ตœ์†Œ=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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.FireResist() โ€” UO.FireResist()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "fireresist": return new InjectionValue(bridge.FireResistance);

UO.Flying

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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์™€ ๋‹ค์Œ ๋„์ „ ์‚ฌ์ด์— ์„ธ์ƒ์ด ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋Š” ์›์ž์„ฑ ์Šค๋ƒ…์ƒท์„ ํ˜•์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.Flying();
UO.Print("Flying: " + Convert.ToString(result));

1. ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ ๋‹จ๊ณ„ ์ „ ๋ชจ๋“œ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋นˆ ๊ด„ํ˜ธ๋Š” 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;

2. ์ด์ „์— ์„ ํƒํ•œ ์บ๋ฆญํ„ฐ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;

3. ํ•œ ๋ฒˆ ๋น„ํ–‰์„ ์š”์ฒญํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์„ธ์š” - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋น„ํ–‰ ์ง€์› ์„œ๋ฒ„์˜ ๊ฐ€๊ณ ์ผ์— ๋Œ€ํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Flying() โ€” UO.Flying()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int Flying() => bridge.Flying(bridge.Self);

UO.Flying(id) โ€” UO.Flying(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: id (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

public int Flying(InjectionValue id) => bridge.Flying(GetObject(id));

UO.Frozen

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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์ด ์•„๋‹Œ ํ”Œ๋ž˜๊ทธ์˜ ์˜๋ฏธ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.Frozen();
UO.Print("Frozen: " + Convert.ToString(result));

1. true - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์ž์‹ ์„ ํ…Œ์ŠคํŠธํ•ด ๋ณด์„ธ์š”.

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋นˆ ๊ด„ํ˜ธ๋Š” 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;

2. ์„ ํƒ๋จ ํ™•์ธ mobile - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;

3. ๋งˆ๋น„๊ฐ€ ์ œ๊ฑฐ๋  ๋•Œ๊นŒ์ง€ ์ œํ•œ๋œ ๋Œ€๊ธฐ - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.Frozen() โ€” UO.Frozen()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

serial => bridge.GetLocked(serial)

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

() => getter(bridge.Self)

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.Frozen(value) โ€” UO.Frozen(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: value (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

serial => bridge.GetLocked(serial)

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

value => getter(GetObject(value))

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


UO.GetARStatus

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

dynamic UO.GetARStatus();

ํ˜„์žฌ ๊ด€๋ฆฌ์ž ์„ธ์…˜ ๋˜๋Š” ๊ธ€๋กœ๋ฒŒ ํด๋ผ์ด์–ธํŠธ์˜ ์ž๋™ ์žฌ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int 1 โ€” ์ž๋™ ์žฌ์—ฐ๊ฒฐ์ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. 0 โ€” ๋น„ํ™œ์„ฑํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • SessionControl.AutoReconnect์ด ์šฐ์„ ์ˆœ์œ„์ž…๋‹ˆ๋‹ค. SessionControl๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ์—๋Š” Settings.GlobalSettings.Reconnect๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„ค์ •์ด๋ฉฐ ํ˜„์žฌ ์—ฐ๊ฒฐ ์ƒํƒœ๋‚˜ ์‹œ๋„ ํšŸ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

object? result = UO.GetARStatus();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ์ฝ๊ธฐ ์„ค์ • - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ฝ๊ธฐ๊ฐ€ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var enabled = UO.GetARStatus();
UO.Print(Convert.ToString(enabled));

2. ์—ฐ๊ฒฐ์— ๋งคํ•‘ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • AR ์„ค์ •๊ณผ ์‹ค์ œ ์—ฐ๊ฒฐ์€ ๋‘ ๊ฐœ์˜ ๋ณ„๋„ ๊ฐ’์ž…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var enabled = UO.GetARStatus();
    var online = UO.Connected();
    UO.Print(Convert.ToString(enabled) + " " + Convert.ToString(online));
    return null;
}

3. AR ๊บผ์ง„ ๊ฒฝ์šฐ ์ˆ˜๋™ ์—ฐ๊ฒฐ - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetARStatus() โ€” UO.GetARStatus()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "getarstatus": return new InjectionValue(bridge.GetAutoReconnect());

UO.GetAlive

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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์™€ ๋‹ค์Œ ๋„์ „ ์‚ฌ์ด์— ์„ธ์ƒ์ด ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋Š” ์›์ž์„ฑ ์Šค๋ƒ…์ƒท์„ ํ˜•์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.GetAlive();
UO.Print("GetAlive: " + Convert.ToString(result));

1. ์ž์‹ ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋นˆ ๊ด„ํ˜ธ๋Š” 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;

2. ์„ ํƒํ•œ ๊ฐœ์ฒด ๋ฐ ์ „์ฒด ๊ธฐ๋Šฅ ReadState - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;

3. 0.5์ดˆ ๋งŒ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๋‘ ๋ฒˆ์˜ ํ˜ธ์ถœ์€ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetAlive() โ€” UO.GetAlive()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

serial => serial > 0 && bridge.Exists(serial) != 0 && IsDeadState(serial) == 0 ? 1 : 0

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

() => getter(bridge.Self)

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.GetAlive(value) โ€” UO.GetAlive(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: value (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

serial => serial > 0 && bridge.Exists(serial) != 0 && IsDeadState(serial) == 0 ? 1 : 0

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

value => getter(GetObject(value))

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


UO.GetArmor

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.GetArmor();
UO.Print("GetArmor: " + Convert.ToString(result));

1. ์ €์žฅ๋œ ๊ฐ’ ์ธ์‡„ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๊ฐ’์€ ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Convert.ToString๋Š” ๋กœ๊ทธ ๋ฒˆํ˜ธ์˜ ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์„ฑ๊ฒฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
var value = UO.GetArmor();
UO.Print("PhysicalResistance: " + Convert.ToString(value));

2. ๋‘ ์ด๋ฏธ์ง€ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ „ํ›„ ์‚ฌ์ด์—๋Š” 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)));

3. ์ตœ์†Œ ์ €ํ•ญ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ์™„๋ฃŒ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ตœ์†Œ=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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetArmor() โ€” UO.GetArmor()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

() => bridge.Armor

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


UO.GetColdResist

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.GetColdResist();
UO.Print("GetColdResist: " + Convert.ToString(result));

1. ์ €์žฅ๋œ ๊ฐ’ ์ธ์‡„ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๊ฐ’์€ ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Convert.ToString๋Š” ๋กœ๊ทธ ๋ฒˆํ˜ธ์˜ ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์„ฑ๊ฒฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
var value = UO.GetColdResist();
UO.Print("ColdResistance: " + Convert.ToString(value));

2. ๋‘ ์ด๋ฏธ์ง€ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ „ํ›„ ์‚ฌ์ด์—๋Š” 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)));

3. ์ตœ์†Œ ์ €ํ•ญ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ์™„๋ฃŒ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ตœ์†Œ=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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetColdResist() โ€” UO.GetColdResist()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

() => bridge.ColdResistance

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


UO.GetDead

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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์™€ ๋‹ค์Œ ๋„์ „ ์‚ฌ์ด์— ์„ธ์ƒ์ด ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋Š” ์›์ž์„ฑ ์Šค๋ƒ…์ƒท์„ ํ˜•์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.GetDead();
UO.Print("GetDead: " + Convert.ToString(result));

1. ์ž์‹ ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋นˆ ๊ด„ํ˜ธ๋Š” 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;

2. ์„ ํƒํ•œ ๊ฐœ์ฒด ๋ฐ ์ „์ฒด ๊ธฐ๋Šฅ ReadState - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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;

3. 0.5์ดˆ ๋งŒ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๋‘ ๋ฒˆ์˜ ํ˜ธ์ถœ์€ 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetDead() โ€” UO.GetDead()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

IsDeadState

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

() => getter(bridge.Self)

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.GetDead(value) โ€” UO.GetDead(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: value (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

IsDeadState

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

value => getter(GetObject(value))

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


UO.GetDex

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.GetDex();
UO.Print("GetDex: " + Convert.ToString(result));

1. ํฌ์ธํŠธ ์ฝ๊ธฐ ๋ฐ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • value๋Š” ์ˆซ์ž ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString ์žก์ง€์šฉ์œผ๋กœ ํฌ๋งทํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์ด๋‚˜ ์บ๋ฆญํ„ฐ ํ–‰๋™์ด ์—†์Šต๋‹ˆ๋‹ค.
var value = UO.GetDex();
UO.Print("Dexterity: " + Convert.ToString(value));

2. ๋‘ ์ด๋ฏธ์ง€ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋ณ„๋„์˜ 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)));

3. ์™„์ „ํ•œ ์š”๊ตฌ์‚ฌํ•ญ ๊ฒ€์ฆ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ตœ์†Œ=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;
}

4. serial ๋ฐ ๊ฐœ์ฒด ์ด๋ฆ„์œผ๋กœ ๋ฌธ์ž ์„ ํƒ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • 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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetDex() โ€” UO.GetDex()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

() => bridge.Dexterity

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UO.GetDex(objID) โ€” UO.GetDex(Any)

๋งค๊ฐœ๋ณ€์ˆ˜: objID (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

case "getdex": return new InjectionValue(arguments.Length > 0 ? bridge.GetDexterity(Arg(0)) : bridge.Dexterity);

UO.GetDexterity

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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().

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.GetDexterity();
UO.Print("GetDexterity: " + Convert.ToString(result));

1. ํฌ์ธํŠธ ์ฝ๊ธฐ ๋ฐ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • value๋Š” ์ˆซ์ž ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ToString ์žก์ง€์šฉ์œผ๋กœ ํฌ๋งทํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์ด๋‚˜ ์บ๋ฆญํ„ฐ ํ–‰๋™์ด ์—†์Šต๋‹ˆ๋‹ค.
var value = UO.GetDexterity();
UO.Print("Dexterity: " + Convert.ToString(value));

2. ๋‘ ์ด๋ฏธ์ง€ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๋ณ„๋„์˜ 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)));

3. ์™„์ „ํ•œ ์š”๊ตฌ์‚ฌํ•ญ ๊ฒ€์ฆ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ตœ์†Œ=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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetDexterity() โ€” UO.GetDexterity()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

() => bridge.Dexterity

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


UO.GetEnergyResist

ะฃะบั€ะฐั—ะฝััŒะบะฐ ยท ะ ัƒััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซ”ไธญๆ–‡ ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด

C# ์‹œ๊ทธ๋‹ˆ์ฒ˜

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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋…๋ฆฝ ์‹คํ–‰ C# ์Šคํฌ๋ฆฝํŠธ

๊ฐ ์˜ˆ์ œ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ .csx๋กœ ์ €์žฅํ•˜๊ณ  IDE์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UO ๊ฐœ์ฒด์™€ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ๊ฒŒ์ž„ ์„ธ์…˜์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชจ serial ์ด๋ฆ„, ์ขŒํ‘œ, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

์ด ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ .csx ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”. ์ธ์ˆ˜๋Š” ํ˜ธ์ถœ์— ์ง์ ‘ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ด๋ฆ„, serial, ์ฃผ์†Œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์„ธ์š”.

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ bool๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฐ์—ด์ด๋ฉด ์š”์†Œ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

var result = UO.GetEnergyResist();
UO.Print("GetEnergyResist: " + Convert.ToString(result));

1. ์ €์žฅ๋œ ๊ฐ’ ์ธ์‡„ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ๊ฐ’์€ ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Convert.ToString๋Š” ๋กœ๊ทธ ๋ฒˆํ˜ธ์˜ ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋…ผ์Ÿ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์„ฑ๊ฒฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
var value = UO.GetEnergyResist();
UO.Print("EnergyResistance: " + Convert.ToString(value));

2. ๋‘ ์ด๋ฏธ์ง€ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ „ํ›„ ์‚ฌ์ด์—๋Š” 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)));

3. ์ตœ์†Œ ์ €ํ•ญ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ์™„๋ฃŒ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์‹คํ–‰ ํ๋ฆ„:

  • ์ตœ์†Œ=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์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetEnergyResist() โ€” UO.GetEnergyResist()

๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฒ˜๋ฆฌ๊ธฐ delegate๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ๋ฉ”์„œ๋“œ๋Š” API๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ด delegate๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๊ตฌํ˜„ ์ฝ”๋“œ์ด๋ฉฐ ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

() => bridge.EnergyResistance

API ์ƒ์„ฑ: ์ด ํ•จ์ˆ˜๋“ค์€ API๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ