KO UO Topic search Part 2 - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

์ฐพ๋‹ค โ€” 2

ํ™ˆ ยท C# ยท IDE ยท UO API ยท Aโ€“Z ยท ์˜ˆ ยท ์–ธ์–ด

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

1 ยท 2

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


UO.FindMan

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

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

void UO.FindMan();
dynamic UO.FindMan(object? notoriety);
dynamic UO.FindMan(object? notoriety, object? distance);
dynamic UO.FindMan(object? notoriety, object? distance, object? nearest);
dynamic UO.FindMan(object? notoriety, object? distance, object? nearest, object? maxZ);
dynamic UO.FindMan(object? notoriety, object? distance, object? nearest, object? maxZ, object? body);
dynamic UO.FindMan(object? notoriety, object? distance, object? nearest, object? maxZ, object? body, object? color);
dynamic UO.FindMan(object? notoriety, object? distance, object? nearest, object? maxZ, object? body, object? color, object? includeSelf);

์•…๋ช…, ๊ฑฐ๋ฆฌ, ํ‚ค, ์‹ ์ฒด ๋ฐ hue๋ฅผ ๊ธฐ์ค€์œผ๋กœ serial๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ž๋™ ๊ณต๊ฒฉ ์—†์ด ๋Œ€์ƒ์„ ๋ฏธ๋ฆฌ ์„ ํƒํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

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

  • notoriety โ€” ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ์บ๋ฆญํ„ฐ์™€์˜ ๊ด€๊ณ„ ์ƒํƒœ: 0 โ€” ์•Œ ์ˆ˜ ์—†์Œ, 1 โ€” ๋ฌด์ฃ„, 2 โ€” ๋™๋งน, 3 โ€” ํšŒ์ƒ‰, 4 โ€” ๋ฒ”์ฃ„, 5 โ€” ์ , 6 โ€” ์‚ด์ธ์ž, 7 - ๋ฌด์ ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๋Š” ํ•˜๋‚˜์˜ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. "5|6" ๋˜๋Š” ์ˆซ์ž ๋ฐฐ์—ด - ์œ„ ํ•ญ๋ชฉ ์ค‘ ํ•˜๋‚˜. ์˜ท์˜ ์ƒ‰๊น”์ด๋‚˜ ์ˆ˜์—…์˜ ์ƒ‰๊น”์ด ์•„๋‹™๋‹ˆ๋‹ค. ์Œ์ˆ˜(๋ณดํ†ต -1), 0xFFFF, "any", ๋นˆ ๋ฌธ์ž์—ด ๋˜๋Š” ๋นˆ ๋ฐฐ์—ด์€ ์ด ํ•„ํ„ฐ๋ฅผ ๋ณ„๋„๋กœ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์œ ํšจํ•œ ์ˆซ์ž๊ฐ€ ์—†๋Š” ์ž˜๋ชป๋œ ๋ฌธ์ž์—ด์€ ๋ˆ„๊ตฌ๋„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ƒํƒœ ์ˆœ์„œ์— ๋”ฐ๋ผ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 5 ํ•„ํ„ฐ๋Š” NPC/๋ชฌ์Šคํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ์„ ํƒํ•˜๋Š” ๋Œ€์‹  ์ ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฐ’์€ ์„œ๋ฒ„์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  • distance โ€” ์…€์„ ํฌํ•จํ•œ ์ˆ˜ํ‰ ๋ฐ˜๊ฒฝ: 5๋Š” ๊ฑฐ๋ฆฌ 0..5๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ๋Š” max(abs(dx),abs(dy))์ด๋ฏ€๋กœ ์ธ์ ‘ํ•œ ๋Œ€๊ฐ์„ ๋„ 1์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆซ์ž๊ฐ€ ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ์—๋Š” ๋ฌด์ œํ•œ ๊ฒ€์ƒ‰์ด ์•„๋‹Œ UO.FindDistance()์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. 0๋Š” ๋™์ผํ•œ X/Y ์…€์„ ๋‚จ๊น๋‹ˆ๋‹ค. ๊ฒฝ๋กœ์˜ ๊ธธ์ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์žฅ์• ๋ฌผ๊ณผ ๋ฐ”๋‹ฅ์€ ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • nearest - true/1 ๊ธฐ๋ณธ์ ์œผ๋กœ - ๊ฐ€์žฅ ๊ฐ€๊น๊ณ  ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ™์„์ˆ˜๋ก ๋” ์ž‘์Šต๋‹ˆ๋‹ค serial; false/0 - ํด๋ผ์ด์–ธํŠธ ๋ชฉ๋ก์—์„œ ๊ฐ€์žฅ ๋จผ ๊ฒƒ์ด ์•„๋‹Œ ์ฒซ ๋ฒˆ์งธ์ž…๋‹ˆ๋‹ค.
  • maxZ โ€” ์ตœ๋Œ€ ๋ณต๊ทผ(Z ๋Œ€์ƒ - ์บ๋ฆญํ„ฐ์˜ Z)์„ ํฌํ•จํ•˜๋ฉฐ, Z ์„ธ๊ณ„ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ธต์ˆ˜๋‚˜ ์…€์ˆ˜ X/Y๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. maxZ=4 Z ํ”Œ๋ ˆ์ด์–ด 10๋Š” Z ๋Œ€์ƒ 6..14๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. 0์—๋Š” ์ •ํ™•ํžˆ ๋™์ผํ•œ ๋†’์ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ/์Œ์ˆ˜์˜ ๊ฒฝ์šฐ UO.FindVertical()๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ณ„๋‹จ์—์„œ๋Š” Z๋กœ ์›ํ•˜๋Š” ๋Œ€์ƒ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์€ ์ฐจ์ด Z๋„ ๋ฐ”๋‹ฅ์˜ ์ ‘๊ทผ์„ฑ์„ ์ž…์ฆํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  • body - ํŠน์ • ์บ๋ฆญํ„ฐ์˜ ID๋‚˜ ์ฐฉ์šฉํ•œ ๊ฐ‘์˜ท์˜ type๊ฐ€ ์•„๋‹Œ ์บ๋ฆญํ„ฐ์˜ ์‹ ์ฒด/NPC ๊ทธ๋ž˜ํ”ฝ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž, 16์ง„์ˆ˜ ๋ฌธ์ž์—ด, ๋ฌธ์ž์—ด "0x0190|0x0191" ๋˜๋Š” ์ˆซ์ž ๋ฐฐ์—ด. 0x0190 (400) - ์ธ๊ฐ„ ๋‚จ์„ฑ; 0x0191 (401) - ์—ฌ์„ฑ ์ธ๊ฐ„. ๋งˆ์Šคํฌ๋Š” ๋‘ ๋ชธ์„ ํ•˜๋‚˜๋กœ ๋ฌถ์Šต๋‹ˆ๋‹ค. ๋ชฉ๋ก์—๋Š” ๋‹ค๋ฅธ ์ข…์กฑ, ์œ ๋ น ๋˜๋Š” ๋ณ€์‹ ์ด ์ž๋™์œผ๋กœ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ ๊ทธ๋ž˜ํ”ฝ ์‹ ์ฒด ์œ ํ˜• ํ‘œ. ์Œ์ˆ˜(๊ธฐ๋ณธ์ ์œผ๋กœ -1), 0xFFFF, "any", ๋นˆ ๋ฌธ์ž์—ด ๋˜๋Š” ๋นˆ ๋ฐฐ์—ด๋งŒ - ๋ชจ๋“  ๋ณธ๋ฌธ. ์œ ํšจํ•œ ์ˆซ์ž๊ฐ€ ์—†๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ํ…์ŠคํŠธ๋Š” ๋นˆ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • color โ€” mobile ์ž์ฒด์˜ ์ƒ‰์ƒ: int ๋˜๋Š” ์ˆซ์ž/16์ง„์ˆ˜ ๋ฌธ์ž์—ด. ์Œ์ˆ˜(๊ธฐ๋ณธ์ ์œผ๋กœ -1) ๋ฐ 0xFFFF - ๋ชจ๋“  hue; 0์€ ์ •ํ™•ํžˆ hue 0์ด๋ฉฐ ์–ด๋–ค ๊ฐ’๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์•…๋ช… ๋†’์€ ์ŠคํŠธ๋ฆฝ์˜ ์ƒ‰์ƒ์ด๋‚˜ ์˜ท์˜ ์ƒ‰์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ฐฉ์šฉ ์ค‘์ธ ์•„์ดํ…œ์˜ ์ƒ‰์ƒ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • includeSelf - true/1๋Š” self์— ๋‹ค๋ฅธ ํ•„ํ„ฐ๊ฐ€ ์ ์šฉ๋˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. false/0๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. Ignore๋Š” self์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int serial ๋˜๋Š” 0 ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์•„์ด๋”” ํ™•์ธ != 0; bool๋„ ์•„๋‹ˆ๊ณ  ์ˆ˜๋Ÿ‰๋„ ์•„๋‹™๋‹ˆ๋‹ค. FindItem/FindCount/GetFoundItems๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ณต๊ฒฉ์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ง€์—ญ ๊ฒ€์ƒ‰: ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œํ•œ ๋ชจ๋ฐ”์ผ์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. Ignore์ด ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค. self๋Š” ์ง€์›ํ•˜๋Š” ๋ช…๋ น์—์„œ ๋ช…์‹œ์ ์œผ๋กœ includeSelf=true๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์™€ ์•„์ดํ…œ์€ ๋ชจ๋ฐ”์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • ์กฐ๊ฑด์ด ํ•จ๊ป˜ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค(AND). body/notoriety ๋‚ด์˜ ์œ ํšจํ•œ ๋Œ€์•ˆ์€ OR๋ฅผ ํ†ตํ•ด ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. FindItem, FindCount ๋ฐ GetFoundItems์—์„œ๋Š” ๊ฒ€์ƒ‰์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • body/notoriety์—์„œ ์œ ํšจํ•œ ์ˆซ์ž๊ฐ€ ์žˆ๋Š” ๋งˆ์Šคํฌ๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. "any|5"๋Š” ์—ฌ์ „ํžˆ 5๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ์œ ํšจํ•œ ์ˆซ์ž ์˜†์— ์žˆ๋Š” ๊ณต๋ฐฑ/์ž˜๋ชป๋œ ์š”์†Œ๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ์ œํ•œ์ด ์—†์œผ๋ฉด -1๋ฅผ ๋ณ„๋„๋กœ ์ „๋‹ฌํ•˜์„ธ์š”. ์ด ๊ทœ์น™์„ classMask์— ์ ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ์•Œ ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์€ ์ „์ฒด ๋ชฉ๋ก์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.
  • ํŒ€์€ ์„ธ๊ณ„์˜ ์˜์—ญ์„ ์—ด์ง€ ์•Š์œผ๋ฉฐ ๋ชฉํ‘œ๋ฅผ ํ–ฅํ•ด ๋‹ฌ๋ฆฌ์ง€ ์•Š์œผ๋ฉฐ ๊ฒฝ๋กœ์˜ ํ†ต๊ณผ ๊ฐ€๋Šฅ์„ฑ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ ํƒ๊ณผ ์„œ๋ฒ„ ์ฒ˜๋ฆฌ ์‚ฌ์ด์— ์„ธ์ƒ์˜ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • true ๋ฐ 1์˜ ์ „์†ก์€ ํ”Œ๋ž˜๊ทธ false ๋ฐ 0์—๋„ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ˆซ์ž๋„ true๋กœ ๋ณ€ํ™˜๋˜์ง€๋งŒ 8/9๋Š” ๋ณ„๋„์˜ ๋ชจ๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํด๋ฆฌ์–ด true/false๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ์ •ํ™•ํ•œ ์ˆœ์„œ: ์•…๋ช…, ๊ฑฐ๋ฆฌ, ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด, maxZ, body, ์ƒ‰์ƒ, includeSelf. AttackNearest ๋ฐ GetMobiles์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  • ๋งค๊ฐœ๋ณ€์ˆ˜ classMask, aliveOnly ๋˜๋Š” visibleOnly๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฐœ๊ฒฌ๋œ ID๋ฅผ ๋ณ„๋„๋กœ ํ™•์ธํ•˜์„ธ์š”. ๋ชจ๋“  ์‚ด์•„์žˆ๋Š”/๋ˆˆ์— ๋ณด์ด๋Š” ๊ฒƒ ์ค‘์—์„œ ์„ ํƒํ•˜๋ ค๋ฉด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ฃฝ์€ ๊ฒƒ์ด ๋‹ค๋ฅธ ๊ฒƒ์„ ๊ฐ€๋ฆฌ์ง€ ์•Š๋„๋ก GetMobiles๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

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

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

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

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

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

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

1. ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋™๋งน๊ตญ ์ฐพ๊ธฐ ๋ฐ ์ €์žฅ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 2 - ์•„๊ตฐ, 12 - ๋ฐ˜๊ฒฝ. ๋‚˜๋จธ์ง€: ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด=true, maxZ=FindVertical(), ๋ชจ๋“  body/hue, self ์ œ์™ธ. ํŒ€์€ ๋ชฉํ‘œ๋ฌผ์„ ์ €์žฅํ•˜๊ธฐ๋งŒ ํ•˜๊ณ  ๊ณต๊ฒฉํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
var ally = UO.FindMan(2, 12);
if (Truth(ally == 0))
{
    return null;
}
UO.AddObject("ally_nearby", ally);

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. ์ถ”๊ฐ€ ์ž‘์—… ์ „์— ๊ฐ ์กฐ๊ฑด ์ง€์ • - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • IsDead ํ™•์ธ์€ ๋ณ„๋„๋กœ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. body๋Š” ๋ณธ๋ฌธ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. bodyHue=-1๋Š” hue๋กœ ์ œํ•œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ํŒ€์€ ์˜๋ฅ˜๋กœ ๋ถ„๋ฅ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var status = 5;
    var radius = 8;
    dynamic nearest = true;
    var height = 4;
    var bodies = "0x0190|0x0191";
    var bodyHue = -1;
    dynamic includeMe = false;
    var enemy = UO.FindMan(status, radius, nearest, height, bodies, bodyHue, includeMe);
    if (Truth(enemy != 0))
    {
        if (Truth(UO.IsDead(enemy) == 0))
        {
            UO.Attack(enemy);
        }
    }

    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. ํŠน์ • hue๋กœ ๋จผ์ € mobile ์ฐพ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ฒซ ๋ฒˆ์งธ -1๋Š” ์•…๋ช…์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ -1๋Š” body๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. false ์„ธ ๋ฒˆ์งธ ์œ„์น˜์—์„œ๋Š” ์ •๋ ฌ ๊ธฐ๋Šฅ์ด ๊บผ์ง‘๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ false๋Š” self๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์˜๋ฅ˜์˜ ์ƒ‰์ƒ์€ ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 chosenHue = 0x0455;
        var mobile = UO.FindMan(-1, 10, false, 8, -1, chosenHue, false);
        if (Truth(mobile == 0))
        {
            return null;
        }

        UO.AddObject("body_hue_match", mobile);
        return null;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.FindMan() โ€” UO.FindMan()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "findman":

                {

                    int mobile = bridge.GetMobiles().FirstOrDefault();

                    if (mobile != 0) state.Objects.Set(arguments.Length > 0 ? Text(0) : "findman", mobile);

                    break;

                }

UO.FindMan(notoriety) โ€” UO.FindMan(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactFindMan(values))

UO.FindMan(notoriety, distance) โ€” UO.FindMan(Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactFindMan(values))

UO.FindMan(notoriety, distance, nearest) โ€” UO.FindMan(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: notoriety (Any), distance (Any), nearest (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactFindMan(values))

UO.FindMan(notoriety, distance, nearest, maxZ) โ€” UO.FindMan(Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: notoriety (Any), distance (Any), nearest (Any), maxZ (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactFindMan(values))

UO.FindMan(notoriety, distance, nearest, maxZ, body) โ€” UO.FindMan(Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: notoriety (Any), distance (Any), nearest (Any), maxZ (Any), body (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactFindMan(values))

UO.FindMan(notoriety, distance, nearest, maxZ, body, color) โ€” UO.FindMan(Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: notoriety (Any), distance (Any), nearest (Any), maxZ (Any), body (Any), color (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactFindMan(values))

UO.FindMan(notoriety, distance, nearest, maxZ, body, color, includeSelf) โ€” UO.FindMan(Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: notoriety (Any), distance (Any), nearest (Any), maxZ (Any), body (Any), color (Any), includeSelf (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactFindMan(values))

UO.FindMobile

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

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

int UO.FindMobile();
int UO.FindMobile(object? stateFilter);
int UO.FindMobile(object? stateFilter, object? rangeFilter);
int UO.FindMobile(object? stateFilter, object? rangeFilter, object? verticalFilter);
int UO.FindMobile(object? stateFilter, object? rangeFilter, object? verticalFilter, object? directionOrKind);
int UO.FindMobile(object? stateFilter, object? rangeFilter, object? verticalFilter, object? directionFilter, object? kindFilter);

๊ฒฐํ•ฉ ๋ฌธ์ž์—ด ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋กœ๋“œ๋œ ์บ๋ฆญํ„ฐ/์ƒ๋ฌผ์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด ์ž์‹ ์€ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.

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

  • stateFilter - ๋ณดํ†ต ๋ชจ๋‘/์‚ด์•„์žˆ์Œ/์ฃฝ์Œ; ์„ ํƒ ๊ณผ๋ชฉ. ๊ตฌํ˜„์˜ ๋ชจ๋“  ์ธ์ˆ˜๋Š” ํ•„ํ„ฐ ๋ฌธ์ž์—ด์ด๋ฏ€๋กœ ํ•˜๋‚˜์˜ ์ธ์ˆ˜์— ์—ฌ๋Ÿฌ ๋‹จ์–ด๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • rangeFilter - ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋‘ / ๊ทผ๊ฑฐ๋ฆฌ(0..4) / ์ค‘๊ฐ„(5..9) / ์›๊ฑฐ๋ฆฌ(10์—์„œ ์ „์ฒด ๋ฐ˜๊ฒฝ๊นŒ์ง€). ์ด ์œ„์น˜์—์„œ๋Š” ์ˆซ์ž ๋ฐ˜๊ฒฝ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „์ฒด ํ•œ๋„๋Š” UO.FindDistance(value)์„ ํ†ตํ•ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
  • verticalFilter - ๋ชจ๋‘/์œ„/์•„๋ž˜. ์œ„: Candidate.Z > self.Z, ์•„๋ž˜: Candidate.Z < self.Z. ์ด๊ฒƒ์€ ๋ฐ”๋‹ฅ์ด๋‚˜ Z ์ˆ˜์น˜ ๊ณต์ฐจ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • directionOrKind โ€” 4๊ฐœ์˜ ์ธ์ˆ˜(๋ชจ๋‘, ๋ถ์ชฝ/๋‚จ์ชฝ/๋™์ชฝ/์„œ์ชฝ ๋˜๋Š” ์ธ๊ฐ„/npc/๋ชน)๊ฐ€ ์žˆ๋Š” ์–‘์‹์˜ ๋„ค ๋ฒˆ์งธ ์œ„์น˜์ž…๋‹ˆ๋‹ค. ๋ณตํ•ฉ ๋ฌธ์ž์—ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • directionFilter โ€” 5๊ฐœ์˜ ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” ์–‘์‹์˜ ๋„ค ๋ฒˆ์งธ ์œ„์น˜: ๋ชจ๋‘ ๋˜๋Š” ๋น„๊ต X/Y ๋ถ์ชฝ/๋‚จ์ชฝ/๋™์ชฝ/์„œ์ชฝ. ์ด๋Š” ๋ณด๋Š” ๋ฐฉํ–ฅ์ด ์•„๋‹Œ self๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•œ ์œ„์น˜์ž…๋‹ˆ๋‹ค.
  • kindFilter - ๋‹ค์„ฏ ๋ฒˆ์งธ ์œ„์น˜: all/human/npc/mob. ์ธ๊ฐ„์—๋Š” ๋‚จ์„ฑ๊ณผ ์—ฌ์„ฑ์˜ ์‹ ์ฒด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. 0x0190 - ๋‚จ์„ฑ ์ธ๊ฐ„, 0x0191 - ์—ฌ์„ฑ ์ธ๊ฐ„, ๊ทธ๋ฆฌ๊ณ  ํ‘œ์ค€ ์—˜ํ”„/๊ฐ€๊ณ ์ผ ๋ฐ ์œ ๋ น ์‹ ์ฒด๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋ชฉ๋ก: ์ธ๊ฐ„. npc - IsNpc ๋ฐ ์ธ๊ฐ„; ํญ๋„ - IsNpc ์ธ๊ฐ„์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ดด๋ฌผ, ์—ฌ์„ฑ์ด๋ผ๋Š” ๋‹จ์–ด๋Š” ์šฉ๋‚ฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int: ํ•˜๋‚˜์˜ serial mobile ๋˜๋Š” ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†๋Š” ๊ฒฝ์šฐ 0. ์ˆ˜๋Ÿ‰๋„ ์•„๋‹ˆ๊ณ  ๋ฐฐ์—ด๋„ ์•„๋‹ˆ๊ณ  type๋„ ์•„๋‹ˆ๊ณ  bool๋„ ์•„๋‹™๋‹ˆ๋‹ค. ํ™•์ธ ๊ฒฐ๊ณผ != 0๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋น„๊ต ๋ฐœ๊ฒฌ == true๋Š” C#์—์„œ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. int๋Š” bool์™€ ๋น„๊ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • UO.FindMobile: 0 ~ 5 ์ธ์ˆ˜์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ๊ผฌ๋ฆฌ ์ธ์ˆ˜๊ฐ€ ๋ชจ๋‘ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ธ์ˆ˜์—๋Š” ๊ณต๋ฐฑ, ํƒญ, ์‰ผํ‘œ, ์„ธ๋ฏธ์ฝœ๋ก , |๋กœ ๊ตฌ๋ถ„๋œ ํ•œ ๋‹จ์–ด ๋˜๋Š” ์—ฌ๋Ÿฌ ๋‹จ์–ด๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. or +. ๋ชจ๋“  ์กฐ๊ฑด์€ AND์„ ํ†ตํ•ด ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐํ˜ธ | ์—ฌ๊ธฐ์„œ๋Š” OR๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒ€์ƒ‰์€ ๋‹ค์šด๋กœ๋“œ๋œ ๋ชจ๋ฐ”์ผ๋งŒ ์‚ดํŽด๋ณด๊ณ  self์„ ์ œ์™ธํ•˜๊ณ  ๊ฑฐ๋ฆฌ๋ฅผ ์ตœ๋Œ€(1, UO.FindDistance())๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ๋Š” max(abs(dx), abs(dy)) ๊ทœ์น™์— ๋”ฐ๋ผ ์ธก์ •๋ฉ๋‹ˆ๋‹ค. ๋Œ€๊ฐ์„  ์ •์‚ฌ๊ฐํ˜•์€ 1๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์›€์ง์ด๋Š” ๋ฌผ์ฒด์˜ ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋Š” ๊ณ„๋‹จ์˜ ๋Œ€๊ธฐ์—ด์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ X/Y/Z ๋น„๊ต๋Š” ํ˜„์žฌ ์ขŒํ‘œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ์ ํ•ฉํ•œ ๊ฒƒ ์ค‘์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒƒ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ๊ฑฐ๋ฆฌ์—์„œ - ๋” ์ž‘์Œ serial. true/false, ๊ฐœ์ˆ˜ ๋˜๋Š” ๋ฐฐ์—ด ๋Œ€์‹  int serial ๋˜๋Š” 0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • UO.FindMobile๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉฐ FindItem/FindCount/GetFoundItems๋Š” Ignore ๋ฐ UO.FindVertical์— ์ ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ๊ฐ€์‹œ์„ฑ, ํ†ตํ–‰์„ฑ ๋˜๋Š” ์‹œ์„ ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›๊ฒฉ ๊ฐœ์ฒด๋ฅผ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ˆซ์ž ๋ฐ˜๊ฒฝ/Z/๋ฐฉํ–ฅ, ๋‹จ์–ด ๋ชฌ์Šคํ„ฐ, ๋ถ๋™์ชฝ, ๋ถ์„œ์ชฝ, ๋‚จ๋™์ชฝ, ๋‚จ์„œ์ชฝ์€ ํ•„ํ„ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ›„๋ณด์ž ํ™•์ธ ์‹œ ์•Œ ์ˆ˜ ์—†๋Š” ๋‹จ์–ด๋กœ ์ธํ•ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ›„๋ณด์ž๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ์ด ์„น์…˜์€ ์‹คํ–‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๊ฐ์„  ์ง€์—ญ์˜ ๊ฒฝ์šฐ ๋ถ๋™์ชฝ ๋“ฑ์„ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์น˜ ํ™•์ธ์„ ์œ„ํ•ด์„œ๋Š” ๋ฐœ๊ฒฌ๋œ ๊ฐ์ฒด์˜ ์†์„ฑ ๋˜๋Š” UO.GetMobiles()๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

var result = UO.FindMobile("all", "all", "above");
UO.Print("FindMobile: " + Convert.ToString(result));

1. ๊ฒ€์ƒ‰ ๋ฐ ๊ฒฐ๊ณผ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋ชจ๋‘, ๋ชจ๋‘, ์œ„๋ฅผ ํ†ต๊ณผํ•จ: ๊ฐœ์ฒด์˜ ๋†’์ด๊ฐ€ ๋ฌธ์ž์˜ Z๋ณด๋‹ค ์—„๊ฒฉํ•˜๊ฒŒ ํฝ๋‹ˆ๋‹ค. Z๊ณผ ๊ฐ™์œผ๋ฉด ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • 0๋Š” ์†์„ฑ์„ ์ฝ๊ธฐ ์ „์— ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. Print๋Š” ID, ์ด๋ฆ„ ๋ฐ ๋†’์ด๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ž‘์—…์ด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var found = UO.FindMobile("all", "all", "above");
if (Truth(found == 0))
{
    UO.Print("No matching mobile");
    return null;
}
UO.Print("ID: " + Convert.ToString(found) + " | Name: " + UO.GetName(found));
UO.Print("Z: " + Convert.ToString(UO.GetZ(found)) + " | Self Z: " + Convert.ToString(UO.GetZ("self")));

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. ์กฐ๊ฑด๊ณผ ์‹œ๊ฐ„ ๋ฐ˜๊ฒฝ์˜ ์กฐํ•ฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 18โ€”์™ธ๋ถ€ ํ•œ๊ณ„; ์‚ด์•„์žˆ๋Š”, ๊ฐ€๊นŒ์šด, ๋ชจ๋“ , ๋ชจ๋“ , ๊ตฐ์ค‘์€ ํ˜‘๋ ฅ ์กฐ๊ฑด์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทผ์ฒ˜๋Š” ์ตœ๋Œ€ 4, ์ค‘๊ฐ„ - 5..9, ๋ฉ€๋ฆฌ๋Š” 10๊นŒ์ง€์˜ ๋ฒ”์œ„๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ์ •์ƒ ์™„๋ฃŒ ๋˜๋Š” ์ฒ˜๋ฆฌ๋œ ์˜ค๋ฅ˜ ์‹œ ์ด์ „ ๋ฐ˜๊ฒฝ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋Š” ์›”๋“œ ๋กœ๋”ฉ์„ โ€‹โ€‹ํ™•์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var previous = UO.FindDistance();
    try
    {
        UO.FindDistance(18);
        var found = UO.FindMobile("alive", "near", "all", "all", "mob");
        if (Truth(found != 0))
        {
            UO.Print("Match: " + Convert.ToString(found));
            UO.Print("Distance: " + Convert.ToString(UO.GetDistance(found)));
        }
        else
        {
            UO.Print("No match in the loaded area");
        }
    }
    finally
    {
        UO.FindDistance(previous);
    }

    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. ๋ณตํ•ฉ ํ•„ํ„ฐ๋ฅผ ์œ„ํ•œ ์™„์ „ํ•œ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋ฌธ์ž์—ด "north east"๊ฐ€ ๋„์šฐ๋ฏธ์—๊ฒŒ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•˜๋‚˜์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์กฐ๊ฑด์ด๋ฉฐ ์„œ๋กœ ๋‹ค๋ฅธ ๋ชฉํ‘œ์— ๋Œ€ํ•œ ์ˆœ์ฐจ์  ๊ฒ€์ƒ‰์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • FindAndDescribe ์ „์ฒด๊ฐ€ ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์ด๋‚˜ ์บ๋ฆญํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ID/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 id = FindAndDescribe("north east");
        UO.Print("Returned ID: " + Convert.ToString(id));
        return null;
    }

    dynamic FindAndDescribe(dynamic filters)
    {
        var id = UO.FindMobile(filters);
        if (Truth(id == 0))
        {
            UO.Print("Nothing matched: " + filters);
            return 0;
        }

        UO.Print(UO.GetName(id) + " | " + Convert.ToString(id));
        return id;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

4. ์ƒ๋ฌผ์„ ์ฐพ์•„์„œ ์ •ํ™•ํ•œ ๊ฑฐ๋ฆฌ๋ฅผ ๋”ฐ๋กœ ํ™•์ธํ•˜์„ธ์š” - ๋‹ค์ด๋ ‰ํŠธ ์Šคํฌ๋ฆฝํŠธ

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

  • Alive/all/all/all/mob - 5๊ฐœ์˜ ์ง€์› ์œ„์น˜. ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒฐ๊ณผ๋ฅผ ์–ป์€ ํ›„ ๊ฑฐ๋ฆฌ 2๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์Šคํฌ๋ฆฝํŠธ๋Š” ์ƒ๋ฌผ์˜ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์œผ๋ฉฐ ์›€์ง์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var found = UO.FindMobile("alive", "all", "all", "all", "mob");
if (Truth(found == 0))
{
    UO.Print("No loaded creature");
    return null;
}
if (Truth(UO.GetDistance(found) <= 2))
{
    UO.Print("Creature within two tiles: " + Convert.ToString(found));
}
else
{
    UO.Print("Nearest creature is farther away");
}

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.FindMobile() โ€” UO.FindMobile()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int FindMobile() => FindMobile(new InjectionValue("all"), new InjectionValue("all"),

            new InjectionValue("all"), new InjectionValue("all"));

UO.FindMobile(stateFilter) โ€” UO.FindMobile(Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int FindMobile(InjectionValue stateFilter) => FindMobile(stateFilter, new InjectionValue("all"),

            new InjectionValue("all"), new InjectionValue("all"));

UO.FindMobile(stateFilter, rangeFilter) โ€” UO.FindMobile(Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int FindMobile(InjectionValue stateFilter, InjectionValue rangeFilter) => FindMobile(stateFilter,

            rangeFilter, new InjectionValue("all"), new InjectionValue("all"));

UO.FindMobile(stateFilter, rangeFilter, verticalFilter) โ€” UO.FindMobile(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: stateFilter (Any), rangeFilter (Any), verticalFilter (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int FindMobile(InjectionValue stateFilter, InjectionValue rangeFilter, InjectionValue verticalFilter) =>

            FindMobile(stateFilter, rangeFilter, verticalFilter, new InjectionValue("all"));

UO.FindMobile(stateFilter, rangeFilter, verticalFilter, directionOrKind) โ€” UO.FindMobile(Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: stateFilter (Any), rangeFilter (Any), verticalFilter (Any), directionOrKind (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(

                    FindMobile(values[0], values[1], values[2], values[3]))

UO.FindMobile(stateFilter, rangeFilter, verticalFilter, directionFilter, kindFilter) โ€” UO.FindMobile(Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: stateFilter (Any), rangeFilter (Any), verticalFilter (Any), directionFilter (Any), kindFilter (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(

                    FindMobile(values[0], values[1], values[2], values[3], values[4]))

UO.FindNotoriety

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

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

dynamic UO.FindNotoriety(object? @type, object? notoriety);
dynamic UO.FindNotoriety(object? @type, object? notoriety, object? distance);
dynamic UO.FindNotoriety(object? @type, object? notoriety, object? distance, object? nearest);
dynamic UO.FindNotoriety(object? @type, object? notoriety, object? distance, object? nearest, object? maxZ);
dynamic UO.FindNotoriety(object? @type, object? notoriety, object? distance, object? nearest, object? maxZ, object? color);
dynamic UO.FindNotoriety(object? @type, object? notoriety, object? distance, object? nearest, object? maxZ, object? color, object? container);

๋˜ ๋‹ค๋ฅธ mobile๋ฅผ ํ•˜๋‚˜์”ฉ body/type ์ฐพ์•„ ์•…๋ช…์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ํƒœ๋„๋ฅผ ์ง€๋‹Œ ํŠน์ • ์„ฑ๊ฒฉ์ด ํ•„์š”ํ•  ๋•Œ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๊ธ‰ ๋ชจ์–‘์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๊ฒฝ, ๋†’์ด ๋ฐ hue๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ณต๊ฒฉ์ด ์•„๋‹Œ ๊ฐœ์ฒด ์„ ํƒ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

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

  • type โ€” ํ•˜๋‚˜์˜ ๋ณธ๋ฌธ ์ˆซ์ž graphic ๋˜๋Š” 16์ง„์ˆ˜ ๋ฌธ์ž์—ด; ์ฐฉ์šฉํ•œ ์•„์ดํ…œ์˜ serial๋„, type๋„ ์•„๋‹ˆ๊ณ  ๋ฐฐ์—ด๋„ ์•„๋‹™๋‹ˆ๋‹ค. 0x0190 (400) - ๋‚จ์„ฑ ์ธ๊ฐ„, 0x0191 (401) - ์—ฌ์„ฑ ์ธ๊ฐ„; ์ด๋“ค์€ ๋‹ค๋ฅธ ์ •๋ฐ€ ํ•„ํ„ฐ์ž…๋‹ˆ๋‹ค. ๋‘ body๋Š” ๋ณ„๋„์˜ ํ˜ธ์ถœ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋งˆ์Šคํฌ๋ฅผ ์ฐฉ์šฉํ•œ GetMobiles์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. -1 ๋˜๋Š” 0xFFFF - ๋ชจ๋“  ์‹ ์ฒด.
  • notoriety โ€” ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ์บ๋ฆญํ„ฐ์™€์˜ ๊ด€๊ณ„ ์ƒํƒœ: 0 โ€” ์•Œ ์ˆ˜ ์—†์Œ, 1 โ€” ๋ฌด์ฃ„, 2 โ€” ๋™๋งน, 3 โ€” ํšŒ์ƒ‰, 4 โ€” ๋ฒ”์ฃ„, 5 โ€” ์ , 6 โ€” ์‚ด์ธ์ž, 7 - ๋ฌด์ ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๋Š” ํ•˜๋‚˜์˜ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. "5|6" ๋˜๋Š” ์ˆซ์ž ๋ฐฐ์—ด - ์œ„ ํ•ญ๋ชฉ ์ค‘ ํ•˜๋‚˜. ์˜ท์˜ ์ƒ‰๊น”์ด๋‚˜ ์ˆ˜์—…์˜ ์ƒ‰๊น”์ด ์•„๋‹™๋‹ˆ๋‹ค. ์Œ์ˆ˜(๋ณดํ†ต -1), 0xFFFF, "any", ๋นˆ ๋ฌธ์ž์—ด ๋˜๋Š” ๋นˆ ๋ฐฐ์—ด์€ ์ด ํ•„ํ„ฐ๋ฅผ ๋ณ„๋„๋กœ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์œ ํšจํ•œ ์ˆซ์ž๊ฐ€ ์—†๋Š” ์ž˜๋ชป๋œ ๋ฌธ์ž์—ด์€ ๋ˆ„๊ตฌ๋„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ƒํƒœ ์ˆœ์„œ์— ๋”ฐ๋ผ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 5 ํ•„ํ„ฐ๋Š” NPC/๋ชฌ์Šคํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ์„ ํƒํ•˜๋Š” ๋Œ€์‹  ์ ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฐ’์€ ์„œ๋ฒ„์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐ’์€ OR(์ˆซ์ž 5, ๋ฌธ์ž์—ด "5|6") ๋˜๋Š” ์ˆซ์ž/์ˆซ์ž ๋ฌธ์ž์—ด์˜ ๋‹จ์ˆœ ๋ฐฐ์—ด๋กœ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. ํ‰๋ฉด ๋ฐฐ์—ด๊ณผ ๊ฐœ๋ณ„ ์ธ์ˆ˜๋ฅผ ํ˜ผํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ’์˜ ์ˆœ์„œ๋Š” ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ํ† ํฐ์€ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. ์™„์ „ํžˆ ์ž˜๋ชป๋œ ๋งˆ์Šคํฌ๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ฐพ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ค‘์ฒฉ ๋ฐฐ์—ด์€ ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์ž˜๋ชป๋œ ์š”์†Œ๋กœ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์ฐจ์› ๋งˆ์Šคํฌ๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ ์ˆซ์ž ํ˜•์‹์˜ ํŠน์ง•: ์Œ์ˆ˜ ์ฝ”๋“œ๋งŒ ํ•„ํ„ฐ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ˆซ์ž 0xFFFF๋Š” ๋ฆฌํ„ฐ๋Ÿด ์ฝ”๋“œ๋กœ ๊ฐ„์ฃผ๋˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ˆ„๊ตฌ๋„ ์ฐพ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • distance โ€” ์…€์„ ํฌํ•จํ•œ ์ˆ˜ํ‰ ๋ฐ˜๊ฒฝ: 5๋Š” ๊ฑฐ๋ฆฌ 0..5๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ๋Š” max(abs(dx),abs(dy))์ด๋ฏ€๋กœ ์ธ์ ‘ํ•œ ๋Œ€๊ฐ์„ ๋„ 1์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆซ์ž๊ฐ€ ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ์—๋Š” ๋ฌด์ œํ•œ ๊ฒ€์ƒ‰์ด ์•„๋‹Œ UO.FindDistance()์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. 0๋Š” ๋™์ผํ•œ X/Y ์…€์„ ๋‚จ๊น๋‹ˆ๋‹ค. ๊ฒฝ๋กœ์˜ ๊ธธ์ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์žฅ์• ๋ฌผ๊ณผ ๋ฐ”๋‹ฅ์€ ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • nearest - false/0 ๊ธฐ๋ณธ๊ฐ’: ์„ธ๊ณ„ ์—ด๊ฑฐ ์ˆœ์„œ์—์„œ ์ฒซ ๋ฒˆ์งธ ์ผ์น˜, ๊ฐ€์žฅ ๊ฐ€๊น๊ฑฐ๋‚˜ ์ž‘์€ ID๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. true/1: ๊ฐ€์žฅ ๊ฐ€๊น๊ณ  ๊ฐ™์œผ๋ฉด ๋” ์ž‘์Œ serial.
  • maxZ โ€” ์ตœ๋Œ€ ๋ณต๊ทผ(Z ๋Œ€์ƒ - ์บ๋ฆญํ„ฐ์˜ Z)์„ ํฌํ•จํ•˜๋ฉฐ, Z ์„ธ๊ณ„ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ธต์ˆ˜๋‚˜ ์…€์ˆ˜ X/Y๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. maxZ=4 Z ํ”Œ๋ ˆ์ด์–ด 10๋Š” Z ๋Œ€์ƒ 6..14๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. 0์—๋Š” ์ •ํ™•ํžˆ ๋™์ผํ•œ ๋†’์ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ/์Œ์ˆ˜์˜ ๊ฒฝ์šฐ UO.FindVertical()๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ณ„๋‹จ์—์„œ๋Š” Z๋กœ ์›ํ•˜๋Š” ๋Œ€์ƒ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์€ ์ฐจ์ด Z๋„ ๋ฐ”๋‹ฅ์˜ ์ ‘๊ทผ์„ฑ์„ ์ž…์ฆํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  • color โ€” mobile ์ž์ฒด์˜ ์ƒ‰์ƒ: int ๋˜๋Š” ์ˆซ์ž/16์ง„์ˆ˜ ๋ฌธ์ž์—ด. ์Œ์ˆ˜(๊ธฐ๋ณธ์ ์œผ๋กœ -1) ๋ฐ 0xFFFF - ๋ชจ๋“  hue; 0์€ ์ •ํ™•ํžˆ hue 0์ด๋ฉฐ ์–ด๋–ค ๊ฐ’๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์•…๋ช… ๋†’์€ ์ŠคํŠธ๋ฆฝ์˜ ์ƒ‰์ƒ์ด๋‚˜ ์˜ท์˜ ์ƒ‰์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ฐฉ์šฉ ์ค‘์ธ ์•„์ดํ…œ์˜ ์ƒ‰์ƒ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • container - ๊ธฐ๋ณธ์ ์œผ๋กœ ์—†์Œ: ์„ธ๊ณ„. ์ง€์ •๋œ ๊ฒฝ์šฐ ground/"ground"/UO.Ground(), ์ˆซ์ž 0/1 ๋ฐ -1/"my"๊ฐ€ ์ด ํŠน์ • ๋ช…๋ น์—์„œ ํ˜ธํ™˜๋˜๋Š” ์„ธ๊ณ„ ์ง€์ •์œผ๋กœ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ serial ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” "backpack"๋Š” 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—๋Š” ๋ชจ๋ฐ”์ผ์ด ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ๋ฌผ ๊ฒ€์ƒ‰์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int - ์„ ํƒํ•œ mobile์˜ serial ๋˜๋Š” ์ ํ•ฉํ•œ ํ•ญ๋ชฉ์ด ์—†๋Š” ๊ฒฝ์šฐ 0. ์ด๋Š” graphic/type, ๋ฐœ๊ฒฌ๋œ ๊ฐœ์ฒด ์ˆ˜ ๋˜๋Š” true/false๊ฐ€ ์•„๋‹Œ ID์ž…๋‹ˆ๋‹ค. if (found != 0) { ... }, notfound == true๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋ฐœ๊ฒฌ๋œ ID๋Š” UO.AddObject, UO.Attack ๋˜๋Š” UO.Follow๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ ๊ฒŒ์ž„ ์ž‘์—…์€ ๋ณ„๋„๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ฒ€์ƒ‰์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œํ•œ ๋ชจ๋ฐ”์ผ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ํŒŒ๊ธฐ๋œ ๊ธฐ๋ก๊ณผ Ignore๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์ž์ฒด๋Š” ๋Œ€์ƒ์„ ์—ด์ง€ ์•Š๊ณ , ๊ณต๊ฒฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋Œ€์ƒ์œผ๋กœ ์ด๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์„œ๋ฒ„์— ์›๊ฒฉ ๊ฐœ์ฒด๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฑฐ๋ฆฌ๋Š” ๊ฒฝ๋กœ ๊ธธ์ด๊ฐ€ ์•„๋‹Œ ๊ธฐํ•˜ํ•™์  max(abs(dx),abs(dy))์ž…๋‹ˆ๋‹ค. ๊ทผ์ ‘์„ฑ์ด ์žˆ๋‹ค๊ณ  ํ•ด์„œ ๋ฒฝ์ด ์—†๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ธต์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ฑ์ด ๋ณด์žฅ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ฐ˜ํ’ˆ ์‹œ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒ๋ช…, ์Šคํ…”์Šค, ์‹œ์•ผ๋Š” ์ž๋™์œผ๋กœ ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•˜๋‹ค๋ฉด GetMobiles๋ฅผ aliveOnly/visibleOnly์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ ํ™•์ธํ•˜์„ธ์š”. ์  ์ƒํƒœ์˜ ์„œ๋ฒ„๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด์„œ NPC๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
  • 2์—์„œ 7 ์ธ์ˆ˜. maxZ๋ฅผ ์ „์†กํ•˜๋ ค๋ฉด ์ด์ „ ๊ฑฐ๋ฆฌ์™€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฑฐ๋ฆฌ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์˜ ์—ฌ๋Ÿฌ ์•…๋ช…์„ ์–ป์œผ๋ ค๋ฉด ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜์— ๋‹จ์ผ ๋งˆ์Šคํฌ "5|6" ๋˜๋Š” ํ‰๋ฉด ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ๋‘ ๋ฒˆ์งธ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฑฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • ํ˜•์‹์˜ ์ค‘์š”ํ•œ ์ฐจ์ด์ : NUMERIC ์•…๋ช… ํ˜ธ์ถœ ๋ธŒ๋ฆฌ์ง€.FindNotoriety๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ์ธ์ˆ˜, ์ด์ „ FindItem/FindCount/GetFoundItems๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋ชจ๋“  ์ผ์น˜ ํ•ญ๋ชฉ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ STRING/ARARY ์ธ์ˆ˜์™€ 3..7 ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ์–‘์‹์€ ๋™์ผํ•œ Find* ํ•„๋“œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ID๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅ๋œ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋กœ FindCount๋ฅผ ์ฝ์ง€ ๋งˆ์„ธ์š”.
  • ๋ชจ๋“  ์–‘์‹์—์„œ๋Š” self ๋ฐ Ignore๋ฅผ ์ œ์™ธํ•˜๊ณ  Z ์ œํ•œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„/๊ฐ€์‹œ์  ํ•„ํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉฐ ์‹œ์•ผ๊ฐ€ ํ™•๋ณด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค 0. ์ฝ์„ ์ˆ˜ ์—†๋Š” type/distance/maxZ/color๋กœ ์ธํ•ด ๋ณ€ํ™˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.FindNotoriety(0x0190, 5);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ์  ํ‰ํŒ์„ ๊ฐ€์ง„ ๋‚จ์„ฑ๊ณผ ์—ฌ์„ฑ์„ ๊ณ„์‚ฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 0x0190(400)๋Š” ๋‚จ์„ฑ ์ธ์ฒด, 0x0191(401)๋Š” ์—ฌ์„ฑ ์ธ์ฒด์ž…๋‹ˆ๋‹ค. 5 - ์ . ๊ฐ ํ†ตํ™”๋Š” 1๊ฐœ์˜ body๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด 0x0190|0x0191๋Š” ์ด ์œ„์น˜์—์„œ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ FindDistance/FindVertical๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ ์ดํ›„ FindItem/FindCount/GetFoundItems๋Š” ์—ฌ์„ฑ์˜ ์‹ ์ฒด๋งŒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ˆ˜๋Ÿ‰์€ menCount์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ๋‚จ์ž/์—ฌ์ž๋Š” ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹Œ ์ฒซ ๋ฒˆ์งธ serial ๋˜๋Š” 0์ž…๋‹ˆ๋‹ค. NPC ์ด๋Ÿฌํ•œ ์‹ ์ฒด๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ๋„ ๊ฒฐ๊ณผ์— ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ๋ น๊ณผ ๋‹ค๋ฅธ ์ข…์กฑ์€ ์ด ๋‘ body์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var man = UO.FindNotoriety(0x0190, 5);
var menCount = UO.FindCount();
var woman = UO.FindNotoriety(0x0191, 5);
var womenCount = UO.FindCount();
UO.Print("Male humans: " + Convert.ToString(menCount));
UO.Print("Female humans: " + Convert.ToString(womenCount));
UO.Print("Total humans: " + Convert.ToString(menCount + womenCount));

2. ๋‘ ๊ฐ€์ง€ ๋†’์ด ์ œํ•œ ์ƒํƒœ ์ค‘ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ƒํƒœ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • -1 ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ โ€” ๋ชจ๋“  ๋ชธ์ฒด; -6๋ฒˆ์งธ 1 - ๋ชจ๋“  hue. ground - ํ‰ํ™”. FindCount ์ด ์–‘์‹ ์ดํ›„ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ด ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var found = UO.FindNotoriety(-1, "5|6", 12, true, 4, -1, "ground");
    if (Truth(found != 0))
    {
        UO.AddObject("near_enemy", found);
    }

    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. ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ƒํƒœ ๋ฐฐ์—ด - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • ๋ฐฐ์—ด์—๋Š” ๋‘ ๊ฐœ์˜ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ๊ผฌ๋ฆฌ ์ธ์ˆ˜๋Š” ํ˜„์žฌ ๋ฐ˜๊ฒฝ/Z, ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด=false ๋ฐ ๋ชจ๋“  hue์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ UO.FindNotoriety(type,5,6) ํ•ญ๋ชฉ์ด ์•„๋‹™๋‹ˆ๋‹ค. 6๊ฐ€ ๋ฐ˜๊ฒฝ์ด ๋ฉ๋‹ˆ๋‹ค.
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()
    {
        dynamic[] allowed = new dynamic[checked((int)(1) + 1)];
        allowed[0] = 5;
        allowed[1] = 6;
        var found = UO.FindNotoriety(0x0191, allowed);
        if (Truth(found != 0))
        {
            UO.AddObject("allowed_mobile", found);
            UO.Print("Selected ID: " + Convert.ToString(found));
        }

        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.FindNotoriety(type, notoriety) โ€” UO.FindNotoriety(Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindNotoriety(type, notoriety, distance) โ€” UO.FindNotoriety(Any,Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindNotoriety(type, notoriety, distance, nearest) โ€” UO.FindNotoriety(Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindNotoriety(type, notoriety, distance, nearest, maxZ) โ€” UO.FindNotoriety(Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), notoriety (Any), distance (Any), nearest (Any), maxZ (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindNotoriety(type, notoriety, distance, nearest, maxZ, color) โ€” UO.FindNotoriety(Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), notoriety (Any), distance (Any), nearest (Any), maxZ (Any), color (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindNotoriety(type, notoriety, distance, nearest, maxZ, color, container) โ€” UO.FindNotoriety(Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), notoriety (Any), distance (Any), nearest (Any), maxZ (Any), color (Any), container (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactFindNotoriety(values))

UO.FindQuantity

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

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

dynamic UO.FindQuantity();

์ฒซ ๋ฒˆ์งธ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—์„œ ํ˜„์žฌ ์ˆ˜๋Ÿ‰์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int - ๊ธฐ์กด ์บ๋ฆญํ„ฐ์˜ ๊ฒฝ์šฐ serial FindItem, 1, ๋ˆ„๋ฝ/์‚ญ์ œ๋œ ๊ฐœ์ฒด์˜ ๊ฒฝ์šฐ 0์ธ ํ•ญ๋ชฉ์˜ ํ˜„์žฌ ๊ธˆ์•ก์ž…๋‹ˆ๋‹ค. ๋ฐœ๊ฒฌ๋œ ๋‹ค๋ฅธ ์Šคํƒ์€ ๋ˆ„์ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. FindFullQuantity๊ณผ ๋‹ฌ๋ฆฌ ํ˜ธ์ถœ ์‹œ ํ˜„์žฌ ๊ฐ์ฒด์—์„œ ์ˆ˜๋Ÿ‰์„ ์ฝ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋ฐ์ดํ„ฐ๋Š” ์ด ์Šคํฌ๋ฆฝํŠธ์˜ ๋งˆ์ง€๋ง‰ ์ผ๋ฐ˜ ๊ฒ€์ƒ‰์— ์†ํ•ฉ๋‹ˆ๋‹ค. FindType๋Š” 1โ€“5 ์ธ์ˆ˜, FindTypeEx, Count/CountEx/CountGround๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์ด ์Šค๋ƒ…์ƒท์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ๋Š” ๊ณ ๊ธ‰ ํ•„ํ„ฐ๋ง๋œ ๋ฌธ์ž ๋ช…๋ น์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†๋Š” ์ƒˆ ๊ฒ€์ƒ‰์—์„œ๋Š” FindItem, FindCount ๋ฐ FindFullQuantity๊ฐ€ ์ง€์›Œ์ง€๊ณ  GetFoundItems๊ฐ€ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ์ฝ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ƒˆ๋กœ์šด ๊ฒ€์ƒ‰์ด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.FindType(0x0EED, -1, "backpack");
object? result = UO.FindQuantity();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ๊ธˆ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ธก์ • - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • type=0x0EED โ€“ ๊ธˆ; color=-1 โ€” ๋ชจ๋“  hue; backpack - ์ด ํ˜•์‹์—๋Š” ๋ฐฐ๋‚ญ์˜ ์ง์ ‘์ ์ธ ๋‚ด์šฉ๋งŒ FindType๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • int - ๊ธฐ์กด ์บ๋ฆญํ„ฐ์˜ ๊ฒฝ์šฐ serial FindItem, 1, ๋ˆ„๋ฝ/์‚ญ์ œ๋œ ๊ฐœ์ฒด์˜ ๊ฒฝ์šฐ 0์ธ ํ•ญ๋ชฉ์˜ ํ˜„์žฌ ๊ธˆ์•ก์ž…๋‹ˆ๋‹ค. ๋ฐœ๊ฒฌ๋œ ๋‹ค๋ฅธ ์Šคํƒ์€ ๋ˆ„์ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. FindFullQuantity๊ณผ ๋‹ฌ๋ฆฌ ํ˜ธ์ถœ ์‹œ ํ˜„์žฌ ๊ฐ์ฒด์—์„œ ์ˆ˜๋Ÿ‰์„ ์ฝ์Šต๋‹ˆ๋‹ค.
var found = UO.FindType(0x0EED, -1, "backpack");
var value = UO.FindQuantity();
UO.Print(Convert.ToString(value));

2. ํ’ˆ๋ชฉ ๋ฐ ๋‹จ์œ„ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 4๊ฐœ์˜ ์ฝ๊ธฐ๋Š” ๋ชจ๋‘ ๋‹ค๋ฅธ ๊ฒ€์ƒ‰์ด ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ ํ•˜๋‚˜์˜ ๊ฒ€์ƒ‰์— ์†ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, 50 ๋‘ ๊ฐœ์˜ ์Šคํƒ: Items=2, ์ฒซ ๋ฒˆ์งธ ์Šคํƒ=50, ๋ชจ๋“  ์œ ๋‹›=100; ์ฒซ ๋ฒˆ์งธ ID์—๋Š” ํ•œ ์Šคํƒ์˜ ๊ณ ์œ ํ•œ ID์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var found = UO.FindType(0x0EED, -1, "backpack");
    UO.Print("Items: " + Convert.ToString(UO.FindCount()));
    UO.Print("First stack: " + Convert.ToString(UO.FindQuantity()));
    UO.Print("All units: " + Convert.ToString(UO.FindFullQuantity()));
    UO.Print("First ID: 0x" + Hex(UO.FindItem()));
    return null;
}

string Hex(object? value) => Convert.ToInt64(value).ToString("X");

3. ๋‹ค์Œ ๊ฒ€์ƒ‰๊นŒ์ง€ ๊ฒฐ๊ณผ ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ฒซ ๋ฒˆ์งธ type๋Š” ๊ธˆ์ด๊ณ , ๋‘ ๋ฒˆ์งธ 0x0F7A๋Š” ๋ณ„๋„์˜ ์‹œ์•ฝ์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํŒ€์€ ์ „์ฒด์ ์ธ ์ƒท์„ ๋ฐ”๊พผ๋‹ค.
  • ์ €์žฅ๋œ ๋ฒˆํ˜ธ๋Š” ์ฒซ ๋ฒˆ์งธ ๊ฒ€์ƒ‰์˜ ๋ฒˆํ˜ธ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ํŒ๋…๊ฐ’์€ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์ด ์—†๋”๋ผ๋„ ์‹œ์•ฝ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
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 found = UO.FindType(0x0EED, -1, "backpack");
        var saved = UO.FindQuantity();
        found = UO.FindType(0x0F7A, -1, "backpack");
        UO.Print("Saved: " + Convert.ToString(saved));
        UO.Print("Current: " + Convert.ToString(UO.FindQuantity()));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.FindQuantity() โ€” UO.FindQuantity()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "findquantity": return new InjectionValue(bridge.FindQuantity());

UO.FindType

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

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

string UO.FindType(object? @type);
string UO.FindType(object? @type, object? color);
string UO.FindType(object? @type, object? color, object? container);
string UO.FindType(object? @type, object? color, object? container, object? range);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? recursive);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly, object? itemOnly);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly, object? itemOnly, object? includeIgnored);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly, object? itemOnly, object? includeIgnored, object? includeSelf);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly, object? itemOnly, object? includeIgnored, object? includeSelf, object? aliveOnly);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly, object? itemOnly, object? includeIgnored, object? includeSelf, object? aliveOnly, object? visibleOnly);
string UO.FindType(object? @type, object? color, object? container, object? distance, object? notoriety, object? nearest, object? maxZ, object? mobileOnly, object? itemOnly, object? includeIgnored, object? includeSelf, object? aliveOnly, object? visibleOnly, object? nameMask);

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œํ•œ ์•„์ดํ…œ๊ณผ ์บ๋ฆญํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ข…๋ฅ˜, ์ƒ‰์ƒ, ์šฉ๊ธฐ, ๊ฑฐ๋ฆฌ, ์ถ”๊ฐ€ ํ•„ํ„ฐ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์„ ํƒํ•œ ๊ฐœ์ฒด์˜ 16์ง„์ˆ˜ ๋ฌธ์ž์—ด serial์ž…๋‹ˆ๋‹ค. ๋นˆ ๋ฌธ์ž์—ด์€ ์ผ์น˜ ํ•ญ๋ชฉ์ด ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น ์ž์ฒด๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์—ด์ง€ ์•Š๊ณ , ์•„์ดํ…œ์„ ์ง‘์ง€ ์•Š์œผ๋ฉฐ, ๋ฐœ๊ฒฌ๋œ ๋Œ€์ƒ์„ ๊ณต๊ฒฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

  • type - ํ•˜๋‚˜์˜ graphic ํ•ญ๋ชฉ ๋˜๋Š” body ๋ฌธ์ž: ์ •์ˆ˜ ๋˜๋Š” ์ˆซ์ž ๋ฌธ์ž์—ด. 0x0EED - ๊ธˆ; 0x0190 (400) - ์ธ๊ฐ„ ๋‚จ์„ฑ; 0x0191 (401) - ์—ฌ์„ฑ ์ธ๊ฐ„. ํ•˜๋‚˜์˜ type 0x0190์—๋Š” 0x0191์ด ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ ์„ฑ๋ณ„์˜ ๋ฌธ์ž๋ฅผ ๋ชจ๋‘ ๋‚˜์—ดํ•˜๋ ค๋ฉด body="0x0190|0x0191"์™€ ํ•จ๊ป˜ GetMobiles๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋งˆ์Šคํฌ๋Š” ์ด ๋‹จ์ผ ์ธ์ˆ˜ FindType๋กœ ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Œ์ˆ˜ ๊ฐ’ ๋˜๋Š” 0xFFFF๋Š” ์œ ํ˜• ํ•„ํ„ฐ๋ฅผ ์ง€์›๋‹ˆ๋‹ค.
  • color - ์ƒ‰์กฐ/์ƒ‰์ƒ: ์ •์ˆ˜ ๋˜๋Š” ์ˆซ์ž ๋ฌธ์ž์—ด. -1 ๋˜๋Š” 0xFFFF๋Š” ๋ชจ๋“  ์ƒ‰์ƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 0 - ๊ตฌ์ฒด์ ์œผ๋กœ hue 0. ๋‘ ์ธ์ˆ˜ ํ˜•์‹์˜ ํŠน์ง•: ๋‘ ๋ฒˆ์งธ ์œ„์น˜์˜ "ground", "backpack", "my" ์ค„์€ ์ƒ‰์ƒ ๋Œ€์‹  ๊ฒ€์ƒ‰ ์˜์—ญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. "my"๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ๋“œ๋œ ํ•˜์œ„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • container - ๊ฒ€์ƒ‰ ์˜์—ญ: "ground" - ์„ธ๊ณ„, "backpack" - ๋ฐฐ๋‚ญ์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ, "my" - ์งง์€ ํ˜•์‹์˜ ํ•˜์œ„ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋กœ๋“œ๋œ ๋ฐฐ๋‚ญ. ์ปจํ…Œ์ด๋„ˆ์˜ serial ๋˜๋Š” ๊ฐ์ฒด์˜ ์ €์žฅ๋œ ์ด๋ฆ„์„ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋Š” ์ž๋™์œผ๋กœ ์—ด๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜์˜ ํ™•์žฅ๋œ ํ˜•์‹ 7~14์€ ์ง€์ •๋œ ์ปจํ…Œ์ด๋„ˆ์˜ ์ง์ ‘ ์ฝ˜ํ…์ธ ๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์žฌ๊ท€ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • range โ€” 4๊ฐœ ์ธ์ˆ˜ ํ˜•์‹์˜ ๋„ค ๋ฒˆ์งธ ์ธ์ˆ˜: ์…€ ๋‚ด ๊ฑฐ๋ฆฌ. ์Œ์ˆ˜ ๊ฐ’์€ ์ผ๋ฐ˜ ์„ค์ • FindDistance์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 0๋Š” ๋™์ผํ•œ ์…€์— ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ๋งŒ ๋‚จ๊น๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ํ•ญ๋ชฉ์˜ ๊ฒฝ์šฐ ์„ธ๊ณ„์—์„œ ์ปจํ…Œ์ด๋„ˆ์˜ ์œ„์น˜๊ฐ€ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.
  • distance โ€” 5๊ฐœ ์ธ์ˆ˜ ํ˜•์‹์˜ 4 ์œ„์น˜์— ์žˆ๋Š” ์…€์˜ ๊ฑฐ๋ฆฌ์ž…๋‹ˆ๋‹ค. -1๋Š” FindDistance์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 0 ์ด์ƒ์˜ ์ˆซ์ž๋Š” ๋ช…์‹œ์ ์ธ ์ œํ•œ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฒฝ๋กœ์˜ ๊ธธ์ด๊ฐ€ ์•„๋‹Œ ๊ฒ€์ƒ‰ ๋ฐ˜๊ฒฝ์ž…๋‹ˆ๋‹ค.
  • recursive - 5๊ฐœ ์ธ์ˆ˜ ํ˜•์‹์˜ ๋‹ค์„ฏ ๋ฒˆ์งธ ์ธ์ˆ˜๋งŒ: 1/true - ๋กœ๋“œ๋œ ํ•˜์œ„ ์ปจํ…Œ์ด๋„ˆ์—์„œ๋„ ๊ฒ€์ƒ‰, 0/false - ์ตœ์ƒ์œ„ ์ˆ˜์ค€๋งŒ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•…๋ช…์ด ์•„๋‹™๋‹ˆ๋‹ค. 6์ธ์ˆ˜ ํ˜•์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์œ„์น˜ 5์˜ ์˜๋ฏธ๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
  • notoriety โ€” ์ธ์ˆ˜ ํ˜•์‹ 6โ€“14์—์„œ 5์˜ ์œ„์น˜์ž…๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ ํ‰ํŒ: 0 ์•Œ ์ˆ˜ ์—†์Œ, 1 ๋ฌด๊ณ ํ•จ, 2 ์•„๊ตฐ, 3 ๊ณต๊ฒฉ ๊ฐ€๋Šฅ, 4 ๋ฒ”์ฃ„์ž, 5 ์ , 6 ์‚ด์ธ์ž, 7 ๋ฌด์ . ์ˆซ์ž, ๋ฌธ์ž์—ด "3|6" ๋˜๋Š” ๊ฐ’ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -1, 0xFFFF ๋˜๋Š” "any"๋Š” ํ•„ํ„ฐ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ํ•„ํ„ฐ๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด ํ•ญ๋ชฉ์ด ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ•ญ๋ชฉ์—๋Š” ์•…๋ช…์ด ์—†์Šต๋‹ˆ๋‹ค.
  • nearest - ์œ„์น˜ 6: 1/true - ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ ํ•ฉํ•œ ๋ฌธ์ž๋ฅผ ์„ ํƒํ•˜๊ณ  ํ™•์žฅ ํ˜•์‹์œผ๋กœ 7โ€“14 - ํ—ˆ์šฉ๋˜๋Š” ์œ ํ˜• ์ค‘ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ›„๋ณด; ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ™์œผ๋ฉด serial๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 0/false๋Š” ๊ฒ€์ƒ‰ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. 6์ธ์ˆ˜ ํ˜•์‹์—์„œ๋Š” ํ•ญ๋ชฉ ์ฐพ๊ธฐ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ์ผ๋ฐ˜ ํ•ญ๋ชฉ ๊ฒ€์ƒ‰ ์ˆœ์„œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • maxZ - ์œ„์น˜ 7: ์ž์‹ ์˜ ์บ๋ฆญํ„ฐ์™€์˜ ์ตœ๋Œ€ ์ ˆ๋Œ€ Z ๋†’์ด ์ฐจ์ด. 0 - ๊ฐ™์€ ๋†’์ด; -1๋Š” FindVertical์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ์žˆ๋Š” ํ’ˆ๋ชฉ์˜ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ ๋†’์ด๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ธต ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • mobileOnly โ€” ์œ„์น˜ 8: 1/true โ€” ์บ๋ฆญํ„ฐ์™€ ๋ชน๋งŒ ๋‚จ๊น๋‹ˆ๋‹ค. 0/false - ์•„์ดํ…œ๋„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด false.
  • itemOnly โ€” ์œ„์น˜ 9: 1/true โ€” ๊ฐœ์ฒด๋งŒ ๋‚จ๊ฒจ๋‘ก๋‹ˆ๋‹ค. 0/false - ๋ฌธ์ž๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ false. ๋™์‹œ์— mobileOnly=true ๋ฐ itemOnly=true๋Š” ๋นˆ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • includeIgnored โ€” ์œ„์น˜ 10: 1/true โ€” IgnoreList์˜ ๊ฐœ์ฒด ํ—ˆ์šฉ; 0/false - ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค. IgnoreList ๋ช…๋ น ์ž์ฒด๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • includeSelf โ€” ์œ„์น˜ 11: 1/true โ€” ํ›„๋ณด ์ค‘์—์„œ ์ž์‹ ๋งŒ์˜ ์บ๋ฆญํ„ฐ๋ฅผ ํ—ˆ์šฉ mobile; 0/false - ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค. ์•„์ดํ…œ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • aliveOnly - ์œ„์น˜ 12: 1/true - ์ฃฝ์€ ๋ฌธ์ž๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. 0/false - ๋‘ ์ƒํƒœ๋ฅผ ๋ชจ๋‘ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค. ์ด ํ•„ํ„ฐ๋Š” ํ•ญ๋ชฉ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • visibleOnly - ์œ„์น˜ 13: 1/true - ๊ธ์ •์ ์ธ ํ™•์ธ ํ•„์š” IsVisible; 0/false - ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ ค์ง„ ๊ฐœ์ฒด์—๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • nameMask โ€” ์œ„์น˜ 14: ์ด๋ฆ„์˜ ํ…์ŠคํŠธ ๋ถ€๋ถ„์ด๋ฉฐ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด "orc|troll"์€ ๋‘ ๊ฐ€์ง€ ์ผ์น˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋Š” ์‰ผํ‘œ๋‚˜ ์„ธ๋ฏธ์ฝœ๋ก ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นˆ ๋ฌธ์ž์—ด("any" ๋˜๋Š” "-1")์€ ํ•„ํ„ฐ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ •๊ทœ์‹์ด๋‚˜ *๊ฐ€ ํฌํ•จ๋œ ๋งˆ์Šคํฌ๊ฐ€ ์•„๋‹Œ ํ•˜์œ„ ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ๋ˆ„๋ฝ๋˜๋ฉด ํ•„ํ„ฐ๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string: ์˜ˆ๋ฅผ ๋“ค์–ด "0x40001234"์ž…๋‹ˆ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ - "". ๋นˆ ๋ฌธ์ž์—ด๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ฐœ๊ฒฌ๋œ ๊ฐœ์ฒด ์ˆ˜ ๋˜๋Š” ํ•ด๋‹น ๊ฐœ์ฒด์— ๋Œ€ํ•œ ๋‹จ๊ณ„ ์ˆ˜์™€ ํ˜ผ๋™ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋™์ž‘

  • 1~14 ์ธ์ˆ˜๋ฅผ ๊ฐ–๋Š” ํ˜•์‹์ด ์žˆ์ง€๋งŒ ์ด๋Š” ์ž„์˜๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ƒ๋žตํ•œ ํ•˜๋‚˜์˜ ๊ธด ์„œ๋ช…์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ๊ตฌ๋ฌธ ํ–‰์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค. ์ธ์ˆ˜๋Š” ์œ„์น˜์ ์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  • ์–‘์‹ 1โ€“5๋Š” ์ผ๋ฐ˜ ๊ฒ€์ƒ‰์„ ์‚ฌ์šฉํ•˜๊ณ  FindItem/FindCount/ ๊ฒฐ๊ณผ ๋ชฉ๋ก์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. 6~14 ํ˜•์‹์˜ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜๋œ ๋ฌธ์ž์—ด์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋ฌธ์ž ํ•„ํ„ฐ๋ง์€ ๋ณ„๋„์˜ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฉฐ ์ด๋Ÿฌํ•œ ๊ณต์œ  ๊ฐ’ ์—…๋ฐ์ดํŠธ๋ฅผ ์•ฝ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์งง์€ ํ˜•์‹์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฒ€์ƒ‰์€ ์žฌ๊ท€ ์—†์ด ์ „ ์„ธ๊ณ„, ๋ชจ๋“  ์ƒ‰์ƒ, ๊ฑฐ๋ฆฌ FindDistance์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด "my"๋Š” ํ•˜์œ„ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํฌํ•จ๋œ ๋ฐฐ๋‚ญ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํŠน๋ณ„ํ•œ ์•ฝ์นญ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.
  • 6๊ฐœ์˜ ์ธ์ˆ˜ ํ˜•์‹์€ ๋จผ์ € ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์•…๋ช… ํ•„ํ„ฐ์™€ ์ ํ•ฉํ•œ ์บ๋ฆญํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ๊ฐœ์ฒด ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 7~14 ํ˜•์‹์€ ํ•ด๊ฒฐ๋œ ํ›„๋ณด๋ฅผ ๊ฒฐํ•ฉํ•˜๊ณ  ์ถ”๊ฐ€ ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ์ˆ˜ ์ˆ˜๋ฅผ 5๊ฐœ์—์„œ 6๊ฐœ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์žฌ๊ท€๋Š” ์•…๋ช…์œผ๋กœ ๋Œ€์ฒด๋˜๊ณ  ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ธ์ˆ˜๋Š” ์—ฌ์„ฏ ๋ฒˆ์งธ ์ธ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 5 ์œ„์น˜์˜ 1 ๊ฐ’์€ ์žฌ๊ท€ ์ˆœํšŒ๊ฐ€ ์•„๋‹Œ ์ˆœํšŒ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

var result = UO.FindType(0x0EED, -1, "backpack");
UO.Print("FindType: " + Convert.ToString(result));

1. ๋ฐฐ๋‚ญ ์ตœ์ƒ์ธต์—์„œ ๊ณจ๋“œ๋ฅผ ์ฐพ์•„ ๋ถ€์กฑํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 1: type=0x0EED - ๊ธˆ์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • 2: ์ƒ‰์ƒ=-1 โ€” ๋ชจ๋“  hue.
  • 3: ์ปจํ…Œ์ด๋„ˆ="backpack" - ๋ฐฐ๋‚ญ์— ์ง์ ‘ ๋‹ด๊ธด ๋‚ด์šฉ๋ฌผ๋งŒ.
  • gold๋Š” ๋ฌธ์ž์—ด serial์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. gold="" ํ™•์ธ์€ ๋ˆ„๋ฝ๋œ ํ•ญ๋ชฉ๊ณผ ์ฐพ์€ ํ•ญ๋ชฉ์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. Info(๊ธˆ์ƒ‰)์€ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ธˆ์€ ์›€์ง์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var gold = UO.FindType(0x0EED, -1, "backpack");
if (Truth(gold == ""))
{
    UO.Print("Gold was not found in the loaded backpack");
}
else
{
    UO.Print("Gold serial: " + gold);
    UO.Info(gold);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. ๋ฐฐ๋‚ญ์— ๋‹ด๊ธด ๊ฐ€๋ฐฉ์—์„œ ํ•ญ๋ชฉ์„ ์žฌ๊ท€์ ์œผ๋กœ ๊ฒ€์ƒ‰ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 1: wantedType์—๋Š” graphic 0x0EED์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • 2: -1 ์ปฌ๋Ÿฌ ํ•„ํ„ฐ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • 3: "backpack"์€ ๋ฃจํŠธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • 4: -1๋Š” ํ˜„์žฌ FindDistance๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • 5: recursive=1๋Š” ํ•˜์œ„ ์ปจํ…Œ์ด๋„ˆ ์ˆœํšŒ๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ 5๊ฐœ์˜ ์ธ์ˆ˜ ํ˜•์‹์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์•„์ง ๋ณด๋‚ด์ง€ ์•Š์€ ๋‹ซํžŒ ๊ฐ€๋ฐฉ์˜ ๋‚ด์šฉ๋ฌผ์€ ์ด ๋ฐฉ์‹์œผ๋กœ ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • AddObject๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•œ ํ›„์—๋งŒ ๋ฐœ๊ฒฌ๋œ serial๋ฅผfound_gold๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var wantedType = 0x0EED;
    var recursive = 1;
    var found = UO.FindType(wantedType, -1, "backpack", -1, recursive);
    if (Truth(found != ""))
    {
        UO.AddObject("found_gold", found);
        UO.Print("Saved object: " + found);
    }
    else
    {
        UO.Print("No matching item in loaded containers");
    }

    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. ๋‘ ๊ฐ€์ง€ ํ‰ํŒ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฐ€์ง„ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์บ๋ฆญํ„ฐ ์ฐพ๊ธฐ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • 1: body=-1๋Š” ๋ชจ๋“  body์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • 2: color=-1๋Š” ๋ชจ๋“  ์ƒ‰์ƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • 3: "ground"๋Š” ๋กœ๋“œ๋œ ์›”๋“œ ๊ฐœ์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • 4: radius=10๋Š” ๊ฑฐ๋ฆฌ๋ฅผ 10๊ฐœ ์…€๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
  • 5: ํ‰ํŒ="3|6" - ๊ณต๊ฒฉ ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ์‚ด์ธ์ž. ์žฌ๊ท€์ ์ธ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์•…๋ช… ๋†’์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • 6: Nearest=1 ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒƒ์„ ์„ ํƒํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ‰ํŒ ํ•„ํ„ฐ๋Š” ํ•ญ๋ชฉ์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ์—์„œ๋Š” ์ •๋ณด๋งŒ ํ‘œ์‹œํ•  ๋ฟ ๋Œ€์ƒ์„ ๊ณต๊ฒฉํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var body = -1;
        var radius = 10;
        var reputation = "3|6";
        var nearest = 1;
        var found = UO.FindType(body, -1, "ground", radius, reputation, nearest);
        if (Truth(found != ""))
        {
            UO.Print("Matching mobile: " + found);
            UO.Info(found);
        }
        else
        {
            UO.Print("No matching mobile within the radius");
        }

        return null;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

4. 14๊ฐœ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชจ๋‘: ์ ์ ˆํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ๋ชน - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 1 body=-1 ๋ฐ 2hue=-1๋Š” ์ข…๋ฅ˜์™€ ์ƒ‰์ƒ์„ ์ œํ•œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • 3scope="ground" - ์ „ ์„ธ๊ณ„์—์„œ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. 4 ๋ฐ˜๊ฒฝ=5 - 5๊ฐœ ์…€์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • 5 ํ‰ํŒ=-1์€ ๋ชจ๋“  ์•…๋ช…์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. 6 ์ตœ๊ทผ์ ‘=1 ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒƒ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • 7 maxZ=16๋Š” ์ตœ๋Œ€ 16 ๋‹จ์œ„์˜ ์ ˆ๋Œ€ ๋†’์ด ์ฐจ์ด๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • 8 mobileOnly=1 ํ•ญ๋ชฉ์€ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. 9 itemOnly=0๋Š” ๋ชน์„ ๊ธˆ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • 10 includeIgnored=0๋Š” IgnoreList์˜ ํšจ๊ณผ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • 11 includeSelf=0๋Š” ํ•ด๋‹น ์บ๋ฆญํ„ฐ๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.
  • 12 aliveOnly=1 ๋ฐ 13 visibleOnly=1 ๋ˆˆ์— ๋ณด์ด๋Š” ํ›„๋ณด์ž๋ฅผ ์‚ด๋ ค๋‘ก๋‹ˆ๋‹ค.
  • 14 names="orc|troll"์—๋Š” ํด๋ผ์ด์–ธํŠธ์— ์ด๋ฏธ ์•Œ๋ ค์ง„ ์ด๋ฆ„์— orc ๋˜๋Š” troll ํ•˜์œ„ ๋ฌธ์ž์—ด์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ•„ํ„ฐ๋Š” ๋™์‹œ์— ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
var body = -1;
var hue = -1;
var scope = "ground";
var radius = 5;
var reputation = -1;
var nearest = 1;
var maxZ = 16;
var mobileOnly = 1;
var itemOnly = 0;
var includeIgnored = 0;
var includeSelf = 0;
var aliveOnly = 1;
var visibleOnly = 1;
var names = "orc|troll";
var found = UO.FindType(body, hue, scope, radius, reputation, nearest, maxZ, mobileOnly, itemOnly, includeIgnored, includeSelf, aliveOnly, visibleOnly, names);
if (Truth(found == ""))
{
    UO.Print("No loaded mobile satisfies every filter");
}
else
{
    UO.Print("Selected serial: " + found);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

5. ๋ฐฐ๋‚ญ ๊ฒ€์ƒ‰์˜ ์•ฝ์‹ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 1 wantedType=0x0EED๋Š” ๊ธˆ์ž…๋‹ˆ๋‹ค.
  • 2 "my"๋Š” ๋‘ ์ธ์ˆ˜ ํ˜•์‹์˜ ํŠน์ˆ˜ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ๋ฐฐ๋‚ญ์„ ์„ ํƒํ•˜๊ณ  ์žฌ๊ท€ ๋ฐ ๋ชจ๋“  ์ƒ‰์ƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” hue์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ตœ์ƒ์œ„ ์ˆ˜์ค€์˜ ๊ฒฝ์šฐ "my" ๋Œ€์‹  "backpack"๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์„ธ๊ณ„๋ฅผ ์œ„ํ•ด - "ground". ๋ฐ˜๋Œ€๋กœ ๋‘ ๋ฒˆ์งธ ์œ„์น˜์˜ ์ˆซ์ž๋Š” ์ปฌ๋Ÿฌ ํ•„ํ„ฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var wantedType = 0x0EED;
    var found = UO.FindType(wantedType, "my");
    if (Truth(found != ""))
    {
        UO.Print("Found in backpack or a loaded subcontainer: " + found);
    }
    else
    {
        UO.Print("Nothing found");
    }

    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.FindType(type) โ€” UO.FindType(Any)

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string FindType(InjectionValue type)

            => FindType(ResolveType(type));

UO.FindType(type, color) โ€” UO.FindType(Any,Any)

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string FindType(InjectionValue type, InjectionValue color)

        {

            if (color.Kind == InjectionValueKind.String

                && (color.String.Equals("ground", StringComparison.OrdinalIgnoreCase)

                    || color.String.Equals("backpack", StringComparison.OrdinalIgnoreCase)

                    || color.String.Equals("my", StringComparison.OrdinalIgnoreCase)))

            {

                return FindType(ResolveType(type), -1, ConvertContainer(color), -1, color.String.Equals("my", StringComparison.OrdinalIgnoreCase));

            }



            return FindType(ResolveType(type), NumberConversions.ToInt(color), -1, -1, false);

        }

UO.FindType(type, color, container) โ€” UO.FindType(Any,Any,Any)

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string FindType(InjectionValue type, InjectionValue color, InjectionValue container)

            => FindType(type, color, container, new InjectionValue(-1));

UO.FindType(type, color, container, range) โ€” UO.FindType(Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string FindType(InjectionValue type, InjectionValue color, InjectionValue container, InjectionValue range)

        {

            if (container.Kind == InjectionValueKind.String && container.String.Equals("my", StringComparison.OrdinalIgnoreCase))

                return FindType(ResolveType(type), NumberConversions.ToInt(color), ConvertContainer(container), NumberConversions.ToInt(range), true);

            else

                return FindType(ResolveType(type), NumberConversions.ToInt(color), ConvertContainer(container), NumberConversions.ToInt(range), false);

        }

UO.FindType(type, color, container, distance, recursive) โ€” UO.FindType(Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), color (Any), container (Any), distance (Any), recursive (Any)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

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

values =>

                new InjectionValue(FindType(values[0], values[1], values[2], values[3], values[4]))

UO.FindType(type, color, container, distance, notoriety, nearest) โ€” UO.FindType(Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

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

values =>

                CompactFindType(values[0], values[1], values[2], values[3], values[4], values[5])

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ) โ€” UO.FindType(Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly) โ€” UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly, itemOnly) โ€” UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any), itemOnly (Any)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly, itemOnly, includeIgnored) โ€” UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any), itemOnly (Any), includeIgnored (Any)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly, itemOnly, includeIgnored, includeSelf) โ€” UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any), itemOnly (Any), includeIgnored (Any), includeSelf (Any)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly, itemOnly, includeIgnored, includeSelf, aliveOnly) โ€” UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any), itemOnly (Any), includeIgnored (Any), includeSelf (Any), aliveOnly (Any)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly, itemOnly, includeIgnored, includeSelf, aliveOnly, visibleOnly) โ€” UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any), itemOnly (Any), includeIgnored (Any), includeSelf (Any), aliveOnly (Any), visibleOnly (Any)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactFindTypeExtended(values)

UO.FindType(type, color, container, distance, notoriety, nearest, maxZ, mobileOnly, itemOnly, includeIgnored, includeSelf, aliveOnly, visibleOnly, nameMask) โ€” UO.FindType(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), color (Any), container (Any), distance (Any), notoriety (Any), nearest (Any), maxZ (Any), mobileOnly (Any), itemOnly (Any), includeIgnored (Any), includeSelf (Any), aliveOnly (Any), visibleOnly (Any), nameMask (Any)

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactFindTypeExtended(values)

UO.FindTypeEx

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

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

int UO.FindTypeEx(object? objType, object? color, object? container, object? inSub);

์ปจํ…Œ์ด๋„ˆ๋‚˜ ์ง€๋ฉด์—์„œ ํ•˜๋‚˜์˜ ๊ทธ๋ž˜ํ”ฝ๊ณผ ์ƒ‰์ƒ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ฐพ์€ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค ID.

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

  • objType - ๊ทธ๋ž˜ํ”ฝ/body, serial ํ•ญ๋ชฉ ์•„๋‹˜. 0..65534 - ํŠน์ • ๊ทธ๋ž˜ํ”ฝ; -1 ๋˜๋Š” 0xFFFF - ๋ชจ๋‘. ์ด ํด๋ผ์ด์–ธํŠธ์˜ ๋‹ค๋ฅธ ๋ถ€์ •์ ์ธ int๋„ ํ•„ํ„ฐ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • color โ€” ํ•ญ๋ชฉ ๊ฐœ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ƒ‰์ƒ์ž…๋‹ˆ๋‹ค. 0 - ๋„์ƒ‰๋˜์ง€ ์•Š์€ ๊ฐœ์ฒด; -1 ๋˜๋Š” 0xFFFF - ๋ชจ๋“  hue. ๋‹ค๋ฅธ ๋„ค๊ฑฐํ‹ฐ๋ธŒ int๋„ ์ปฌ๋Ÿฌ ํ•„ํ„ฐ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • container - ์ ‘์ง€: UO.Ground(), 0, -1, 0xFFFFFFFF ๋˜๋Š” ๋ฌธ์ž์—ด ground. ๋ฐฐ๋‚ญ: ๋ฌธ์ž์—ด backpack ๋˜๋Š” serial. 10์ง„์ˆ˜/16์ง„์ˆ˜ serial ๋ฐ ์ด๋ฆ„ AddObject๊ฐ€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. my๋Š” ์žฅ๋น„์™€ ๋ถ€์ฐฉ๋œ ๊ฐ€๋ฐฉ์„ ํฌํ•จํ•œ ์บ๋ฆญํ„ฐ์˜ ์ „์ฒด ์ธ๋ฒคํ† ๋ฆฌ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์œผ๋กœ ์ธํ•ด ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ serial๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๋ช…์‹œ์ ์ธ 0๋Š” ์ง€๋ฉด์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„ ground/backpack์€ ๋ช…๋ น๊ตฐ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ˆซ์ž ์ง€์ •๋ณด๋‹ค ๋” ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.
  • inSub - ํ•„์ˆ˜ true/false (1/0). false - ํŠน์ • ์ปจํ…Œ์ด๋„ˆ์˜ ์ง์ ‘์ ์ธ ์ฝ˜ํ…์ธ ์ž…๋‹ˆ๋‹ค. true โ€“ ์ค‘์ฒฉ๋œ ๊ฐ€๋ฐฉ๋„ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ์ง€๊ตฌ์— ์žˆ์–ด์„œ ์žฌ๊ท€๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. my๋Š” ์ด๋ฏธ ์บ๋ฆญํ„ฐ์˜ ๋ชจ๋“  ์žฅ๋น„๋ฅผ ์„ ํƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int: serial ๋กœ์ปฌ ์ˆœํšŒ ์ˆœ์„œ์—์„œ ์ฒซ ๋ฒˆ์งธ ์ผ์น˜; 0 ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†๋Š” ๊ฒฝ์šฐ. graphic, ๊ฐœ์ˆ˜, ๋ฐฐ์—ด ๋˜๋Š” bool๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜์„ธ์š” != 0, ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹˜ == true ๋˜๋Š” ๊ฒฐ๊ณผ == 1. ์Šคํƒ์€ ํ•˜๋‚˜์˜ ๊ฐœ์ฒด๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ - ํ•˜๋‚˜์˜ ๊ฐ์ฒด์™€ ํ•˜๋‚˜์˜ ์œ ๋‹›. ์ˆœ์„œ๋Š” ๊ทผ์ ‘์„ฑ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ฒ€์ƒ‰ ๊ฐ„์—๋Š” ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋„ค ๊ฐ€์ง€ ์œ„์น˜ ์ธ์ˆ˜๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์  ์ธ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์–ด์Šค๋Š” ์ด ์Šคํฌ๋ฆฝํŠธ์˜ FindDistance ๋ฐ FindVertical๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  self๋ฅผ ์ œ์™ธํ•˜๋ฉฐ ์ ์ ˆํ•œ ํ•ญ๋ชฉ๊ณผ ๋ชจ๋ฐ”์ผ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๊ฑฐ๋ฆฌ/๋†’์ด ์ œํ•œ์ด ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ Ignore ๋ฐ ํŒŒ๊ดด๋œ ๊ฐ์ฒด๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ”์ดํŒจ์Šค ์ „ FindItem, FindCount, FindFullQuantity, GetFoundItems๊ฐ€ ํด๋ฆฌ์–ด๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ๊ฒ€์ƒ‰๊ณผ ๊ด€๋ จ๋ฉ๋‹ˆ๋‹ค. ๋นˆ ๊ฒ€์ƒ‰์€ 0๊ณผ ๋นˆ ๋ฐฐ์—ด์„ ๋‚จ๊น๋‹ˆ๋‹ค. FindFullQuantity๋Š” ์ตœ๋Œ€ ์•„์ดํ…œ(1, Amount)์„ ์š”์•ฝํ•˜๊ณ , ๋ชจ๋ฐ”์ผ์˜ ๊ฒฝ์šฐ 1๋กœ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค. FindQuantity๋Š” ํ˜„์žฌ ์ˆ˜๋Ÿ‰ FindItem์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๊ฒ€์ƒ‰ํ•œ ํ›„์—๋„ ์ด์ „ ๋ชฉ๋ก์ด ์—ฌ์ „ํžˆ ํ•„์š”ํ•œ ๊ฒฝ์šฐ GetFoundItems๋ฅผ ์ €์žฅํ•˜์„ธ์š”.
  • Bridge๋Š” ๋กœ๋“œ๋œ ํ•ญ๋ชฉ์„ ํ•œ ๋ฒˆ ํ†ต๊ณผํ•œ ๋‹ค์Œ Land๊ฐ€ ์„ ํƒ๋œ ๊ฒฝ์šฐ Mobile์„ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜•, ์ƒ‰์ƒ ๋ฐ ํ•˜๋‚˜ ์ด์ƒ์˜ ์šฉ๊ธฐ๊ฐ€ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋”๋ผ๋„ ํ•˜๋‚˜์˜ ๊ฐœ์ฒด๋Š” ํ•œ ๋ฒˆ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์กฐํ•ฉ์— ๋Œ€ํ•ด ๋ฐ˜๋ณต๋˜๋Š” ์™„์ „ํ•œ ์„ธ๊ณ„ ์ˆœํšŒ๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—ด๋ฆฌ์ง€ ์•Š๊ณ , ๋งต ์…€์ด ๋กœ๋“œ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ „์†ก์ด ์—†์Šต๋‹ˆ๋‹ค. ๋นˆ ๊ฒฐ๊ณผ๋Š” ์„œ๋ฒ„์˜ ์ƒ์ž๊ฐ€ ๋น„์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑ ๋งํฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ Connected๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๊ฒ€์ƒ‰ ์ž์ฒด๊ฐ€ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ์ฒซ ๋ฒˆ์งธ ๋กœ์ปฌ ์ผ์น˜ ํ•ญ๋ชฉ์ด ์—ฌ๊ธฐ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์€ ๊ฒ€์ƒ‰์„ ๋ฐฐ๋‚ญ์œผ๋กœ ์ „ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Ground๋„ 0๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. FindDistance ๊ธฐ๋ณธ๊ฐ’ 18, ์ตœ๋Œ€ 255. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ด ํด๋ผ์ด์–ธํŠธ์˜ ํŠน์ง•์ž…๋‹ˆ๋‹ค.

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

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

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

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

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

var result = UO.FindTypeEx(0x0EED, -1, "backpack", false);
UO.Print("FindTypeEx: " + Convert.ToString(result));

1. ๋‹ค์ด๋ ‰ํŠธ ๋ฐฑํŒฉ ์ปจํ…์ธ  - ๋‹ค์ด๋ ‰ํŠธ ์Šคํฌ๋ฆฝํŠธ

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

  • 0x0EED - ๊ณจ๋“œ, -1 - ๋ชจ๋“  hue; backpack/false ์ค‘์ฒฉ๋œ ๋ฐฑ์€ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. ์„ธ ์ค„์€ 0x๊ฐ€ ์—†๋Š” 16์ง„์ˆ˜๋กœ ์ฒซ ๋ฒˆ์งธ ID, ๊ฐ์ฒด ์ˆ˜ ๋ฐ ๊ฐ์ฒด์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. 20 ๋ฐ 50์˜ ๋‘ ์Šคํƒ: ๊ฐœ์ฒด 2, ๋‹จ์œ„ 70.
var item = UO.FindTypeEx(0x0EED, -1, "backpack", false);
UO.Print(Hex(item));
UO.Print(Convert.ToString(UO.FindCount()));
UO.Print(Convert.ToString(UO.FindFullQuantity()));

string Hex(object? value) => Convert.ToInt64(value).ToString("X");

2. ํ’€ํƒ€์ž„ ์ง€์ƒํƒ์ƒ‰ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋ฐ˜๊ฒฝ=5 ๋ฐ ๋†’์ด=10๋Š” FindGoldNearSelf ๋‚ด๋ถ€์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐ˜ํ™˜ ๋˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋‘ ๊ฐ€์ง€ ์ œํ•œ์„ ๋ชจ๋‘ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” serial gold ๋˜๋Š” 0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ ์ „ ์ฃผ์š” ํ™•์ธ != 0.
return  RunScenario();
 object? RunScenario()
{
    var item = FindGoldNearSelf(5, 10);
    if (Truth(item != 0))
    {
        UO.Print(Hex(item));
    }
    else
    {
        UO.Print("Empty");
    }

    return null;
}

dynamic FindGoldNearSelf(dynamic radius, dynamic height)
{
    var oldDistance = UO.FindDistance();
    var oldVertical = UO.FindVertical();
    try
    {
        UO.FindDistance(radius);
        UO.FindVertical(height);
        return UO.FindTypeEx(0x0EED, -1, UO.Ground(), false);
    }
    finally
    {
        UO.FindDistance(oldDistance);
        UO.FindVertical(oldVertical);
    }
}

string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„ ๋ฐ ์ค‘์ฒฉ๋œ ๊ฐ€๋ฐฉ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • GetSerial๋Š” backpack์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. 0์„ ํ™•์ธํ•˜๋ฉด ๋ฌด์ž‘์œ„ ์ ‘์ง€ ์„ ํƒ์ด ๋ฐฉ์ง€๋ฉ๋‹ˆ๋‹ค. AddObject๋Š” ID๋ฅผ search_bag๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. true์—๋Š” ์ค‘์ฒฉ๋œ ๊ฐ€๋ฐฉ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. GetFoundItems๋Š” ๋ณ„๋„์˜ ๋ฐฐ์—ด์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. IsObjectExists๋Š” ID๋งˆ๋‹ค ๋‹ค์‹œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var bag = UO.GetSerial("backpack");
        if (Truth(bag != "0x00000000"))
        {
            UO.AddObject("search_bag", bag);
            UO.FindTypeEx(0x0EED, -1, "search_bag", true);
            var items = UO.GetFoundItems();
            foreach (var item in items)
            {
                if (Truth(UO.IsObjectExists(item)))
                {
                    UO.Print(Hex(item));
                }
            }
        }

        return null;
    }

    string Hex(object? value) => Convert.ToInt64(value).ToString("X");
    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.FindTypeEx(objType, color, container, inSub) โ€” UO.FindTypeEx(Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: objType (Any), color (Any), container (Any), inSub (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "findtypeex": return new InjectionValue(bridge.FindType(ResolveType(arguments[0]), Arg(1), StealthContainer(2), -1, Arg(3) != 0));

UO.FindTypesArrayEx

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

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

int UO.FindTypesArrayEx(object? objTypes, object? colors, object? containers, object? inSub);

ํ•œ ๋ฒˆ์˜ ์ˆœํšŒ์—์„œ ๋‹ค์–‘ํ•œ ๊ทธ๋ž˜ํ”ฝ, ์ƒ‰์ƒ ๋ฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ฐพ์€ ํ•ญ๋ชฉ ID์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋ชฉ๋ก์€ GetFoundItems๋ฅผ ํ†ตํ•ด ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • objTypes - ๊ทธ๋ž˜ํ”ฝ/body, serial ํ•ญ๋ชฉ ์•„๋‹˜. 0..65534 - ํŠน์ • ๊ทธ๋ž˜ํ”ฝ; -1 ๋˜๋Š” 0xFFFF - ๋ชจ๋‘. ์ด ํด๋ผ์ด์–ธํŠธ์˜ ๋‹ค๋ฅธ ๋ถ€์ •์ ์ธ int๋„ ํ•„ํ„ฐ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • colors โ€” ํ•ญ๋ชฉ ๊ฐœ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ƒ‰์ƒ์ž…๋‹ˆ๋‹ค. 0 - ๋„์ƒ‰๋˜์ง€ ์•Š์€ ๊ฐœ์ฒด; -1 ๋˜๋Š” 0xFFFF - ๋ชจ๋“  hue. ๋‹ค๋ฅธ ๋„ค๊ฑฐํ‹ฐ๋ธŒ int๋„ ์ปฌ๋Ÿฌ ํ•„ํ„ฐ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • containers - ์ ‘์ง€: UO.Ground(), 0, -1, 0xFFFFFFFF ๋˜๋Š” ๋ฌธ์ž์—ด ground. ๋ฐฐ๋‚ญ: ๋ฌธ์ž์—ด backpack ๋˜๋Š” serial. 10์ง„์ˆ˜/16์ง„์ˆ˜ serial ๋ฐ ์ด๋ฆ„ AddObject๊ฐ€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. my๋Š” ์žฅ๋น„์™€ ๋ถ€์ฐฉ๋œ ๊ฐ€๋ฐฉ์„ ํฌํ•จํ•œ ์บ๋ฆญํ„ฐ์˜ ์ „์ฒด ์ธ๋ฒคํ† ๋ฆฌ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์œผ๋กœ ์ธํ•ด ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ serial๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๋ช…์‹œ์ ์ธ 0๋Š” ์ง€๋ฉด์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„ ground/backpack์€ ๋ช…๋ น๊ตฐ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ˆซ์ž ์ง€์ •๋ณด๋‹ค ๋” ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.
  • inSub - ํ•„์ˆ˜ true/false (1/0). false - ํŠน์ • ์ปจํ…Œ์ด๋„ˆ์˜ ์ง์ ‘์ ์ธ ์ฝ˜ํ…์ธ ์ž…๋‹ˆ๋‹ค. true โ€“ ์ค‘์ฒฉ๋œ ๊ฐ€๋ฐฉ๋„ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ์ง€๊ตฌ์— ์žˆ์–ด์„œ ์žฌ๊ท€๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. my๋Š” ์ด๋ฏธ ์บ๋ฆญํ„ฐ์˜ ๋ชจ๋“  ์žฅ๋น„๋ฅผ ์„ ํƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int: serial ๋กœ์ปฌ ์ˆœํšŒ ์ˆœ์„œ์—์„œ ์ฒซ ๋ฒˆ์งธ ์ผ์น˜; 0 ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†๋Š” ๊ฒฝ์šฐ. graphic, ๊ฐœ์ˆ˜, ๋ฐฐ์—ด ๋˜๋Š” bool๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜์„ธ์š” != 0, ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹˜ == true ๋˜๋Š” ๊ฒฐ๊ณผ == 1. ์Šคํƒ์€ ํ•˜๋‚˜์˜ ๊ฐœ์ฒด๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ - ํ•˜๋‚˜์˜ ๊ฐ์ฒด์™€ ํ•˜๋‚˜์˜ ์œ ๋‹›. ์ˆœ์„œ๋Š” ๊ทผ์ ‘์„ฑ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ฒ€์ƒ‰ ๊ฐ„์—๋Š” ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋ฐฐ์—ด์ด ์ „๋‹ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ๊ฐ’์€ ํ•˜๋‚˜์˜ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐฐ์—ด๋กœ๋„ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ๊ฐ’[1]์„ ์„ ์–ธํ•˜๋ฉด ์ธ๋ฑ์Šค 0 ๋ฐ 1๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์„ ์ฑ„์›๋‹ˆ๋‹ค. ์ข…๋ฅ˜์™€ ์ƒ‰์ƒ์€ ์ƒ‰์ธ๋ณ„ ์Œ์ด ์•„๋‹Œ ๋…๋ฆฝ์ ์ธ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ์ž„์˜์˜ ์œ„์น˜์— ์žˆ๋Š” "๋ชจ๋“ " ๋งˆ์Šคํฌ ๋˜๋Š” ์œ ํ˜•/์ƒ‰์ƒ์˜ ๋นˆ ๋ฐฐ์—ด์€ ์ด ํ•„ํ„ฐ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋นˆ ์ปจํ…Œ์ด๋„ˆ ๋ฐฐ์—ด์€ ์บ๋ฆญํ„ฐ์˜ ์ธ๋ฒคํ† ๋ฆฌ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฐ˜๋ณต๊ณผ ๊ต์ฐจ๋Š” ID์™€ ์ค‘๋ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋„ค ๊ฐ€์ง€ ์œ„์น˜ ์ธ์ˆ˜๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์  ์ธ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์–ด์Šค๋Š” ์ด ์Šคํฌ๋ฆฝํŠธ์˜ FindDistance ๋ฐ FindVertical๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  self๋ฅผ ์ œ์™ธํ•˜๋ฉฐ ์ ์ ˆํ•œ ํ•ญ๋ชฉ๊ณผ ๋ชจ๋ฐ”์ผ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๊ฑฐ๋ฆฌ/๋†’์ด ์ œํ•œ์ด ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ Ignore ๋ฐ ํŒŒ๊ดด๋œ ๊ฐ์ฒด๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ”์ดํŒจ์Šค ์ „ FindItem, FindCount, FindFullQuantity, GetFoundItems๊ฐ€ ํด๋ฆฌ์–ด๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ๊ฒ€์ƒ‰๊ณผ ๊ด€๋ จ๋ฉ๋‹ˆ๋‹ค. ๋นˆ ๊ฒ€์ƒ‰์€ 0๊ณผ ๋นˆ ๋ฐฐ์—ด์„ ๋‚จ๊น๋‹ˆ๋‹ค. FindFullQuantity๋Š” ์ตœ๋Œ€ ์•„์ดํ…œ(1, Amount)์„ ์š”์•ฝํ•˜๊ณ , ๋ชจ๋ฐ”์ผ์˜ ๊ฒฝ์šฐ 1๋กœ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค. FindQuantity๋Š” ํ˜„์žฌ ์ˆ˜๋Ÿ‰ FindItem์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๊ฒ€์ƒ‰ํ•œ ํ›„์—๋„ ์ด์ „ ๋ชฉ๋ก์ด ์—ฌ์ „ํžˆ ํ•„์š”ํ•œ ๊ฒฝ์šฐ GetFoundItems๋ฅผ ์ €์žฅํ•˜์„ธ์š”.
  • Bridge๋Š” ๋กœ๋“œ๋œ ํ•ญ๋ชฉ์„ ํ•œ ๋ฒˆ ํ†ต๊ณผํ•œ ๋‹ค์Œ Land๊ฐ€ ์„ ํƒ๋œ ๊ฒฝ์šฐ Mobile์„ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜•, ์ƒ‰์ƒ ๋ฐ ํ•˜๋‚˜ ์ด์ƒ์˜ ์šฉ๊ธฐ๊ฐ€ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋”๋ผ๋„ ํ•˜๋‚˜์˜ ๊ฐœ์ฒด๋Š” ํ•œ ๋ฒˆ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์กฐํ•ฉ์— ๋Œ€ํ•ด ๋ฐ˜๋ณต๋˜๋Š” ์™„์ „ํ•œ ์„ธ๊ณ„ ์ˆœํšŒ๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—ด๋ฆฌ์ง€ ์•Š๊ณ , ๋งต ์…€์ด ๋กœ๋“œ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ „์†ก์ด ์—†์Šต๋‹ˆ๋‹ค. ๋นˆ ๊ฒฐ๊ณผ๋Š” ์„œ๋ฒ„์˜ ์ƒ์ž๊ฐ€ ๋น„์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑ ๋งํฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ Connected๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๊ฒ€์ƒ‰ ์ž์ฒด๊ฐ€ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ์ฒซ ๋ฒˆ์งธ ๋กœ์ปฌ ์ผ์น˜ ํ•ญ๋ชฉ์ด ์—ฌ๊ธฐ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์€ ๊ฒ€์ƒ‰์„ ๋ฐฐ๋‚ญ์œผ๋กœ ์ „ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Ground๋„ 0๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. FindDistance ๊ธฐ๋ณธ๊ฐ’ 18, ์ตœ๋Œ€ 255. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ด ํด๋ผ์ด์–ธํŠธ์˜ ํŠน์ง•์ž…๋‹ˆ๋‹ค.

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

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

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

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

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

var result = UO.FindTypesArrayEx(new[] { 0x0EED }, new[] { -1 }, new[] { "backpack" }, false);
UO.Print("FindTypesArrayEx: " + Convert.ToString(result));

1. ์ง€์ƒ์— ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ๊ทธ๋ž˜ํ”„ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์œ ํ˜•์—๋Š” ๊ธˆ 0x0EED ๋ฐ ํ‘์ง„์ฃผ 0x0F7A๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ƒ‰์ƒ=-1 - ๋ชจ๋“  hue, ํ•˜๋‚˜์˜ Ground - ์ง€๊ตฌ. false๋Š” ์ง€๊ตฌ์ƒ์— ์•„๋ฌด๊ฒƒ๋„ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ฒ€์ƒ‰ ์ œํ•œ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ID, ๊ฐœ์ฒด ์ˆ˜์™€ ๋‹จ์œ„์˜ ํ•ฉ์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
dynamic[] types = new dynamic[checked((int)(1) + 1)];
types[0] = 0x0EED;
types[1] = 0x0F7A;
dynamic[] colors = new dynamic[checked((int)(0) + 1)];
colors[0] = -1;
dynamic[] containers = new dynamic[checked((int)(0) + 1)];
containers[0] = UO.Ground();
var first = UO.FindTypesArrayEx(types, colors, containers, false);
UO.Print(Hex(first));
UO.Print(Convert.ToString(UO.FindCount()));
UO.Print(Convert.ToString(UO.FindFullQuantity()));

string Hex(object? value) => Convert.ToInt64(value).ToString("X");

2. ๋ฐฐ๋‚ญ๊ณผ ์ง€์ƒ์˜ ๊ธˆ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์œ ํ˜• - ๊ธˆ๋งŒ; ์ƒ‰์ƒ - ๋ชจ๋“  hue. ์ปจํ…Œ์ด๋„ˆ - backpack ๋ฐ ํ† ์ง€; true์—๋Š” ์ค‘์ฒฉ๋œ ๊ฐ€๋ฐฉ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋‘ ์˜์—ญ ๋ชจ๋‘์˜ ๊ฐœ์ฒด/์Šคํƒ ๋ฐ ๋‹จ์œ„๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉฐ ๊ฐ ๊ฐœ์ฒด๋Š” ํ•œ ๋ฒˆ์”ฉ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    dynamic[] types = new dynamic[checked((int)(0) + 1)];
    types[0] = 0x0EED;
    dynamic[] colors = new dynamic[checked((int)(0) + 1)];
    colors[0] = -1;
    dynamic[] containers = new dynamic[checked((int)(1) + 1)];
    containers[0] = "backpack";
    containers[1] = UO.Ground();
    UO.FindTypesArrayEx(types, colors, containers, true);
    UO.Print(Convert.ToString(UO.FindCount()));
    UO.Print(Convert.ToString(UO.FindFullQuantity()));
    return null;
}

3. ๊ฒฐ๊ณผ ๋ชฉ๋ก์ด ํฌํ•จ๋œ ์™„์ „ํ•œ ํ•จ์ˆ˜ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • SearchTypesIn(container,firstType,secondType)๋Š” Array๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ˜๋ฉด, ๋‚ด์žฅ ๋ช…๋ น์€ ๋‹จ์ผ int ID๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์ „์ฒด ํ•จ์ˆ˜๋Š” ๋ฐฐ์—ด์„ ์ฑ„์šฐ๊ณ  ์žฌ๊ท€์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•œ ํ›„ ์ฆ‰์‹œ GetFoundItems๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ์€ ์ €์žฅ๋œ ID ๊ฐ๊ฐ์„ ํ™•์ธํ•˜์—ฌ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var items = SearchTypesIn("backpack", 0x0EED, 0x0F7A);
        foreach (var item in items)
        {
            if (Truth(UO.IsObjectExists(item)))
            {
                UO.Print(Hex(item));
            }
        }

        return null;
    }

    dynamic SearchTypesIn(dynamic container, dynamic firstType, dynamic secondType)
    {
        dynamic[] types = new dynamic[checked((int)(1) + 1)];
        types[0] = firstType;
        types[1] = secondType;
        dynamic[] colors = new dynamic[checked((int)(0) + 1)];
        colors[0] = -1;
        dynamic[] containers = new dynamic[checked((int)(0) + 1)];
        containers[0] = container;
        UO.FindTypesArrayEx(types, colors, containers, true);
        return UO.GetFoundItems();
    }

    string Hex(object? value) => Convert.ToInt64(value).ToString("X");
    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.FindTypesArrayEx(objTypes, colors, containers, inSub) โ€” UO.FindTypesArrayEx(Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: objTypes (Any), colors (Any), containers (Any), inSub (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "findtypesarrayex":

                    InjectionValue[] searchContainers = arguments[2].Kind == InjectionValueKind.Array

                        ? arguments[2].Array : new[] { arguments[2] };

                    return new InjectionValue(bridge.FindTypes(arguments[0].Kind == InjectionValueKind.Array

                        ? arguments[0].Array.Select(ResolveType).ToArray() : new[] { ResolveType(arguments[0]) }, ArrayArg(1),

                        searchContainers.Select(ConvertClientSearchContainer).ToArray(), Arg(3) != 0));

UO.FindVertical

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

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

int UO.FindVertical();
void UO.FindVertical(object? value);

๊ธฐ๋ณธ ๊ฒ€์ƒ‰์—์„œ ํ—ˆ์šฉ๋˜๋Š” ๋†’์ด ์ฐจ์ด๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

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

  • value - ์„ ํƒ์‚ฌํ•ญ int. ๋…ผ์Ÿ ์—†์ด - ์ฝ๊ธฐ; ๊ฐ’ - ์„ค์ •. ๊ฐ’์€ 0..120 ๋ฒ”์œ„๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ์Œ์ˆ˜๋Š” ๋ฌด์ œํ•œ์ด ์•„๋‹Œ 0๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋Ÿฐํƒ€์ž„: 2; ๋ณต์›๋œ ์ƒํƒœ์—๋Š” ๋‹ค๋ฅธ ๊ฐ’์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„์ˆ˜๋Š” 0์œผ๋กœ ์ž˜๋ฆฝ๋‹ˆ๋‹ค. ์ˆซ์ž ๋ฌธ์ž์—ด double/0x๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ์•”์‹œ์  ๋ณ€ํ™˜์„ ํ”ผํ•˜๋ ค๋ฉด int๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋ฐ˜ํ™˜๊ฐ’

์ธ์ˆ˜ ์—†์Œ: int - ํ˜„์žฌ ์ œํ•œ(์„ธ๊ณ„ ๋‹จ์œ„์˜ ์ฐจ์ด Z), ์ฐพ์„ ์ˆ˜ ์—†์Œ ID, ๊ฐ์ฒด ์ˆ˜ ๋˜๋Š” bool. 0๋Š” ์‹คํŒจ๊ฐ€ ์•„๋‹Œ ์ œ๋กœ ํ•œ๊ณ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’ ํฌํ•จ: void - ๊ฐ’ ์—†์Œ; ์ด๊ฒƒ์€ true/false ๋˜๋Š” ์ด์ „ ์„ค์ •์ด ์•„๋‹™๋‹ˆ๋‹ค. ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด FindVertical()์„ ์ฝ์–ด ์ €์žฅ๋œ ๊ฐ’์„ ์•Œ์•„๋ณด์„ธ์š”.

๋™์ž‘

  • ๋†’์ด: abs(object.Z - player.Z), ์–‘๋ฐฉํ–ฅ, ํ…Œ๋‘๋ฆฌ ํฌํ•จ. 0์˜ ๊ฒฝ์šฐ ๋™์ผํ•œ Z๋งŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ธต์ˆ˜๋‚˜ ๊ฐ€๋กœ ์…€์˜ ๊ฐœ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์„ค์ •์€ ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ์˜ ๋Ÿฐํƒ€์ž„์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ”„๋กœ์‹œ์ €๋Š” ๋‹จ์ผ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋…๋ฆฝ ๋Ÿฐํƒ€์ž„์—๋Š” ๋ณ„๋„์˜ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ๋Š” ๊ฒ€์ƒ‰์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์œผ๋ฉฐ, FindItem/FindCount/GetFoundItems๋ฅผ ์ง€์šฐ๊ณ , ํŒจํ‚ท์„ ๋ณด๋‚ด๊ณ , ๋ฌธ์ž๋ฅผ ์ด๋™ํ•˜๊ฑฐ๋‚˜, ๋ฉ€๋ฆฌ ์žˆ๋Š” ๊ฐœ์ฒด๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • FindTypeEx ๋ฐ FindTypesArrayEx ์ง€์ƒ์—์„œ ๊ฒ€์ƒ‰ํ•  ๋•Œ๋Š” ์ด๋Ÿฌํ•œ ์ œํ•œ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ๋Š” ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ํ•„ํ„ฐ๋Š” type, hue, Ignore ๋ฐ ๋กœ๋“œ๋œ ๊ฐ์ฒด์˜ ์กด์žฌ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. FindAtCoord๋Š” ๋‘ ๊ฐ€์ง€ ์ œํ•œ์„ ๋ชจ๋‘ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅ ๋ช…๋ น์—์„œ๋Š” ๋ช…์‹œ์ ์ธ ๊ฑฐ๋ฆฌ/maxZ๊ฐ€ ์„ค์ •์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -1 ์ด๋Ÿฌํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ๋Š” ์„ค์ • ์ž์ฒด๋ฅผ -1๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์„ค์ •์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. FindList๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ Z๋„ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •๋œ ์ปจํ…Œ์ด๋„ˆ ์˜ˆ์™ธ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ž„์‹œ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  finally๋กœ ๋ณต์›ํ•ด ๋ณด์„ธ์š”. ์„ค์น˜๊ฐ€ ์ž๋™์œผ๋กœ ์ทจ์†Œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์ •์ƒ์ ์ธ ์™„๋ฃŒ ๋ฐ ์žกํžŒ ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋น„์ƒ ์ •์ง€๋Š” ์ฒญ์†Œ ์žฅ์น˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์ด์ „ ์‹ค์ œ ์„ค์ •์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. value:=10๋Š” ์ •์ƒ ํ•œ๊ณ„๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. 1000๋Š” 120๊นŒ์ง€์˜ ํ•œ๊ณ„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. Print๋Š” ์ธ์ˆ˜ ์—†์ด ๋ณ„๋„์˜ ํ˜ธ์ถœ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์ด์ „์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
var previous = UO.FindVertical();
try
{
    UO.FindVertical(10);
    UO.Print(Convert.ToString(UO.FindVertical()));
    UO.FindVertical(1000);
    UO.Print(Convert.ToString(UO.FindVertical()));
}
finally
{
    UO.FindVertical(previous);
}

2. ์ž„์‹œ ์ง€์ƒ ์ˆ˜์ƒ‰ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ด์ „ ํ˜ธ์ถœ ์ฝ”๋“œ์˜ ์„ค์ •์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. 10๋Š” FindVertical๋งŒ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ํ•œ๋„๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. 0x0EED - ๊ณจ๋“œ ๊ทธ๋ž˜ํ”ฝ, -1 - ๋ชจ๋“  hue, Container=-1 - ์›”๋“œ, false - ์ปจํ…Œ์ด๋„ˆ ์žฌ๊ท€ ์—†์Œ. id - ํ•˜๋‚˜ serial; != 0 ๊ฐ€์šฉ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. FindCount ์ „์ฒด ๊ฐœ์ฒด/์Šคํƒ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ข…์ ์œผ๋กœ ๊ฒฐ๊ณผ ๋ชฉ๋ก์ด ์•„๋‹Œ ์„ค์ •์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var previous = UO.FindVertical();
    try
    {
        UO.FindVertical(10);
        var id = UO.FindTypeEx(0x0EED, -1, -1, false);
        if (Truth(id != 0))
        {
            UO.Print(Hex(id) + ":" + Convert.ToString(UO.FindCount()));
        }
        else
        {
            UO.Print("0");
        }
    }
    finally
    {
        UO.FindVertical(previous);
    }

    return null;
}

string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. ์ „์ฒด ๊ธฐ๋Šฅ CountGroundInRange - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • CountGroundInRange(graphic, radius, height)๋Š” ๋‘ ์ œํ•œ์„ ๋ชจ๋‘ ์ €์žฅํ•˜๊ณ , radius=5 ๋ฐ height=10๋ฅผ ์„ค์ •ํ•˜๊ณ , graphic=0x0EED๋ฅผ ์ฐพ์•„ FindCount()๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ์€ ํ•˜๋‚˜์˜ ๊ฐœ์ฒด๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๊ธฐ๋Šฅ์€ Main ๋‹ค์Œ์— ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฆฌํ„ด์„ ํ†ตํ•ด ์ข…๋ฃŒํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋‘ ์ œํ•œ์„ ๋ชจ๋‘ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋Š” ๊ณ„์† ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
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 count = CountGroundInRange(0x0EED, 5, 10);
        UO.Print(Convert.ToString(count));
        return null;
    }

    dynamic CountGroundInRange(dynamic graphic, dynamic radius, dynamic height)
    {
        var oldDistance = UO.FindDistance();
        var oldVertical = UO.FindVertical();
        try
        {
            UO.FindDistance(radius);
            UO.FindVertical(height);
            UO.FindTypeEx(graphic, -1, -1, false);
            return UO.FindCount();
        }
        finally
        {
            UO.FindDistance(oldDistance);
            UO.FindVertical(oldVertical);
        }
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.FindVertical() โ€” UO.FindVertical()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "findvertical":

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

                    return new InjectionValue(bridge.GetFindVertical());

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "findvertical":

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

                    return new InjectionValue(bridge.GetFindVertical());

UO.GetFindedList

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

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

dynamic UO.GetFindedList(object? userList);

๋งˆ์ง€๋ง‰ ์ผ๋ฐ˜ ๊ฒ€์ƒ‰ ๋ชฉ๋ก ID์˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

  • userList โ€” ํ•„์ˆ˜ ํ˜ธํ™˜์„ฑ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ตฌํ˜„์—์„œ๋Š” ์ฑ„์›Œ์ง€๊ฑฐ๋‚˜ ์ˆ˜์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชฉ๋ก์€ ๋ช…๋ น์˜ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. 0๋ฅผ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜•์‹์˜ ๊ฒฝ์šฐ GetFoundItems๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋ฐ˜ํ™˜๊ฐ’

๋ฐฐ์—ด์€ ๋งˆ์ง€๋ง‰ ๊ฒ€์ƒ‰ ์ˆœ์„œ์—์„œ ๋ณ„๋„์˜ ๋ฐฐ์—ด serial/ID์ž…๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†์œผ๋ฉด ๋นˆ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. graphic, hue ๋˜๋Š” ๊ธˆ์•ก์„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ๋ฐฐ์—ด์„ ๋ณ€๊ฒฝํ•ด๋„ ์ €์žฅ๋œ ๊ฒ€์ƒ‰ ๋ชฉ๋ก์€ ํŽธ์ง‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ „์ฒด ์„œ๋ฒ„์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์—ด๊ฑฐ๋‚˜ ํ•ญ๋ชฉ์„ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๊ฐœ์ฒด๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด - 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. var์— ์ €์žฅํ•˜๊ณ , ArrayLength๋ฅผ ํ™•์ธํ•œ ํ›„ ์ ‘์†ํ•˜์„ธ์š”. ์Šค๋ƒ…์ƒท์„ ์ฐ์€ ํ›„ ์š”์†Œ๊ฐ€ ์„ธ๊ณ„์—์„œ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— Exists(serial)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • ๋ฐ์ดํ„ฐ๋Š” ์ด ์Šคํฌ๋ฆฝํŠธ์˜ ๋งˆ์ง€๋ง‰ ์ผ๋ฐ˜ ๊ฒ€์ƒ‰์— ์†ํ•ฉ๋‹ˆ๋‹ค. FindType๋Š” 1โ€“5 ์ธ์ˆ˜, FindTypeEx, Count/CountEx/CountGround๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์ด ์Šค๋ƒ…์ƒท์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ๋Š” ๊ณ ๊ธ‰ ํ•„ํ„ฐ๋ง๋œ ๋ฌธ์ž ๋ช…๋ น์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†๋Š” ์ƒˆ ๊ฒ€์ƒ‰์—์„œ๋Š” FindItem, FindCount ๋ฐ FindFullQuantity๊ฐ€ ์ง€์›Œ์ง€๊ณ  GetFoundItems๊ฐ€ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ์ฝ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ƒˆ๋กœ์šด ๊ฒ€์ƒ‰์ด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.FindType(0x0EED, -1, "backpack");
object? result = UO.GetFindedList(0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ๋ชฉ๋ก ํฌ๊ธฐ ๊ฐ€์ ธ์˜ค๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋ฐฐ๋‚ญ์— ์žˆ๋Š” ๊ธˆ์˜ ์ผ๋ฐ˜์ ์ธ FindType๋Š” ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. UserList=0๋Š” ์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ๊ธธ์ด - ๋ ˆ์ฝ”๋“œ ์ˆ˜/ID. ์ด๊ฒƒ์€ ์Šคํƒ์˜ ์–‘์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋นˆ ๋ชฉ๋ก์€ 0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
var found = UO.FindType(0x0EED, -1, "backpack");
var items = UO.GetFindedList(0);
UO.Print(Convert.ToString(ArrayLength(items)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. ๋ฐœ๊ฒฌ๋œ ๋ชจ๋“  ํ•ญ๋ชฉ ํƒ์ƒ‰ ID - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋ฐฐ๋‚ญ์— ์žˆ๋Š” ๊ธˆ์˜ ์ผ๋ฐ˜์ ์ธ FindType๋Š” ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. UserList=0๋Š” ์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • items[i] โ€” ์ˆซ์ž serial. 16์ง„์ˆ˜๋Š” ์ถœ๋ ฅ์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฃจํ”„๋Š” ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— ์•ก์„ธ์Šคํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var found = UO.FindType(0x0EED, -1, "backpack");
    var items = UO.GetFindedList(0);
    var i = 0;
    while (Truth(i < ArrayLength(items)))
    {
        UO.Print("0x" + Hex(items[i]));
        i = i + 1;
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. ์ฝ๊ธฐ ์ „์— ์ฒซ ๋ฒˆ์งธ ๊ธฐ๋ก์„ ํ™•์ธํ•˜์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์—…

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

  • ๋ฐฐ๋‚ญ์— ์žˆ๋Š” ๊ธˆ์˜ ์ผ๋ฐ˜์ ์ธ FindType๋Š” ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. UserList=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 found = UO.FindType(0x0EED, -1, "backpack");
        var items = UO.GetFindedList(0);
        if (Truth(ArrayLength(items) > 0))
        {
            var first = items[0];
            if (Truth(UO.Exists(first)))
            {
                UO.Print(UO.GetName(first));
            }
        }
        else
        {
            UO.Print("Empty list");
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetFindedList(userList) โ€” UO.GetFindedList(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getfindedlist":

                    return new InjectionValue(bridge.GetFoundItems().Select(serial => new InjectionValue(serial)).ToArray());

UO.GetFoundItems

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

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

dynamic UO.GetFoundItems();

๋งˆ์ง€๋ง‰ ์ผ๋ฐ˜ ๊ฒ€์ƒ‰ ๋ชฉ๋ก ID์˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

๋ฐฐ์—ด์€ ๋งˆ์ง€๋ง‰ ๊ฒ€์ƒ‰ ์ˆœ์„œ์—์„œ ๋ณ„๋„์˜ ๋ฐฐ์—ด serial/ID์ž…๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†์œผ๋ฉด ๋นˆ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. graphic, hue ๋˜๋Š” ๊ธˆ์•ก์„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ๋ฐฐ์—ด์„ ๋ณ€๊ฒฝํ•ด๋„ ์ €์žฅ๋œ ๊ฒ€์ƒ‰ ๋ชฉ๋ก์€ ํŽธ์ง‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ „์ฒด ์„œ๋ฒ„์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์—ด๊ฑฐ๋‚˜ ํ•ญ๋ชฉ์„ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๊ฐœ์ฒด๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด - 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. var์— ์ €์žฅํ•˜๊ณ , ArrayLength๋ฅผ ํ™•์ธํ•œ ํ›„ ์ ‘์†ํ•˜์„ธ์š”. ์Šค๋ƒ…์ƒท์„ ์ฐ์€ ํ›„ ์š”์†Œ๊ฐ€ ์„ธ๊ณ„์—์„œ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— Exists(serial)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • ๋ฐ์ดํ„ฐ๋Š” ์ด ์Šคํฌ๋ฆฝํŠธ์˜ ๋งˆ์ง€๋ง‰ ์ผ๋ฐ˜ ๊ฒ€์ƒ‰์— ์†ํ•ฉ๋‹ˆ๋‹ค. FindType๋Š” 1โ€“5 ์ธ์ˆ˜, FindTypeEx, Count/CountEx/CountGround๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์ด ์Šค๋ƒ…์ƒท์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ๋Š” ๊ณ ๊ธ‰ ํ•„ํ„ฐ๋ง๋œ ๋ฌธ์ž ๋ช…๋ น์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†๋Š” ์ƒˆ ๊ฒ€์ƒ‰์—์„œ๋Š” FindItem, FindCount ๋ฐ FindFullQuantity๊ฐ€ ์ง€์›Œ์ง€๊ณ  GetFoundItems๊ฐ€ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ์ฝ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ƒˆ๋กœ์šด ๊ฒ€์ƒ‰์ด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

UO.FindType(0x0EED, -1, "backpack");
object? result = UO.GetFoundItems();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ๋ชฉ๋ก ํฌ๊ธฐ ๊ฐ€์ ธ์˜ค๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋ฐฐ๋‚ญ์— ์žˆ๋Š” ๊ธˆ์˜ ์ผ๋ฐ˜์ ์ธ FindType๋Š” ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ธธ์ด - ๋ ˆ์ฝ”๋“œ ์ˆ˜/ID. ์ด๊ฒƒ์€ ์Šคํƒ์˜ ์–‘์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋นˆ ๋ชฉ๋ก์€ 0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
var found = UO.FindType(0x0EED, -1, "backpack");
var items = UO.GetFoundItems();
UO.Print(Convert.ToString(ArrayLength(items)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. ๋ฐœ๊ฒฌ๋œ ๋ชจ๋“  ํ•ญ๋ชฉ ํƒ์ƒ‰ ID - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋ฐฐ๋‚ญ์— ์žˆ๋Š” ๊ธˆ์˜ ์ผ๋ฐ˜์ ์ธ FindType๋Š” ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • items[i] โ€” ์ˆซ์ž serial. 16์ง„์ˆ˜๋Š” ์ถœ๋ ฅ์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฃจํ”„๋Š” ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— ์•ก์„ธ์Šคํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var found = UO.FindType(0x0EED, -1, "backpack");
    var items = UO.GetFoundItems();
    var i = 0;
    while (Truth(i < ArrayLength(items)))
    {
        UO.Print("0x" + Hex(items[i]));
        i = i + 1;
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. ์ฝ๊ธฐ ์ „์— ์ฒซ ๋ฒˆ์งธ ๊ธฐ๋ก์„ ํ™•์ธํ•˜์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์—…

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

  • ๋ฐฐ๋‚ญ์— ์žˆ๋Š” ๊ธˆ์˜ ์ผ๋ฐ˜์ ์ธ FindType๋Š” ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์‚ฌํ•ญ, ์ฆ‰ ์Šค๋ƒ…์ƒท์˜ ๊ธฐ๋ก๊ณผ ํ˜„์žฌ ๊ฐœ์ฒด์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ ์ •๋ ฌ์ด ์—†๋Š” ์ˆœ์„œ๋Š” ์นœ๋ฐ€ํ•จ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 found = UO.FindType(0x0EED, -1, "backpack");
        var items = UO.GetFoundItems();
        if (Truth(ArrayLength(items) > 0))
        {
            var first = items[0];
            if (Truth(UO.Exists(first)))
            {
                UO.Print(UO.GetName(first));
            }
        }
        else
        {
            UO.Print("Empty list");
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetFoundItems() โ€” UO.GetFoundItems()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getfounditems":

                    return new InjectionValue(bridge.GetFoundItems().Select(serial => new InjectionValue(serial)).ToArray());

UO.GetIgnoreList

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

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

dynamic UO.GetIgnoreList();

Ignore๋ฅผ ํ†ตํ•ด serial ํ•„ํ„ฐ์— ์ถ”๊ฐ€๋œ ํŠน์ • ID์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด๋ฏธ ์ฒ˜๋ฆฌ๋˜์–ด ์žฌ๊ฒ€์ƒ‰์—์„œ ์ œ์™ธ๋œ ํ•ญ๋ชฉ์„ ํ™•์ธํ•˜๋Š”๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. AddIgnoreList์˜ ๋ช…๋ช…๋œ ๊ทœ์น™ type/hue์€ ์ด ๋ฐฐ์—ด์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

๋ฐฐ์—ด - Ignore ๋ชฉ๋ก์˜ serial(์ˆซ์ž ID์˜ ์˜ค๋ฆ„์ฐจ์ˆœ). ๋ชฉ๋ก์ด ๋น„์–ด ์žˆ์œผ๋ฉด ๋ฐฐ์—ด์ด ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ID์€ ์„ธ์ƒ์— ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ‘œ์‹œ๋˜๋Š” ํ•ญ๋ชฉ ๋ชฉ๋ก์ด ์•„๋‹Œ ๊ฒ€์ƒ‰ ๊ทœ์น™์ž…๋‹ˆ๋‹ค.

๋™์ž‘

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ „์ฒด ์„œ๋ฒ„์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์—ด๊ฑฐ๋‚˜ ํ•ญ๋ชฉ์„ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๊ฐœ์ฒด๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด - 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. var์— ์ €์žฅํ•˜๊ณ , ArrayLength๋ฅผ ํ™•์ธํ•œ ํ›„ ์ ‘์†ํ•˜์„ธ์š”. ์Šค๋ƒ…์ƒท์„ ์ฐ์€ ํ›„ ์š”์†Œ๊ฐ€ ์„ธ๊ณ„์—์„œ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— Exists(serial)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • ํด๋ผ์ด์–ธํŠธ์—์„œ ์„ธํŠธ๋Š” ํ”„๋กœํ•„ ์Šคํฌ๋ฆฝํŠธ์˜ ์ผ๋ฐ˜ ์ƒํƒœ์— ์†ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์€ ๋ณต์‚ฌ๋ณธ์ž…๋‹ˆ๋‹ค. IgnoreOff(serial)๋Š” ํ•˜๋‚˜์˜ ์˜ˆ์™ธ๋ฅผ ์ง€์šฐ๊ณ , IgnoreReset๋Š” ๋ชจ๋“  serial๋ฅผ ์ง€์›๋‹ˆ๋‹ค. ์„ ํƒํ•œ ๊ทœ์น™ type/hue์€ ๋น„ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. SelectIgnoreList, DeleteIgnoreList ๋˜๋Š” ClearIgnoreList๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†๋Š” GetContent/GetEquipment ๋ฐ GetWorldItems์—๋Š” ์ด ํ•„ํ„ฐ ์ž์ฒด๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ๋ชฉ๋ก ํฌ๊ธฐ ๊ฐ€์ ธ์˜ค๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ช…๋ฐฑํ•œ serial ์˜ˆ์™ธ์˜ ์Šค๋ƒ…์ƒท์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๋นˆ ๋ฐฐ์—ด์ด ๋ช…๋ช…๋œ ๊ทœ์น™ type/hue์ด ๋ˆ„๋ฝ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ธธ์ด - ๋ ˆ์ฝ”๋“œ ์ˆ˜/ID. ์ด๊ฒƒ์€ ์Šคํƒ์˜ ์–‘์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋นˆ ๋ชฉ๋ก์€ 0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
var items = UO.GetIgnoreList();
UO.Print(Convert.ToString(ArrayLength(items)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. ๋ฐœ๊ฒฌ๋œ ๋ชจ๋“  ํ•ญ๋ชฉ ํƒ์ƒ‰ ID - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ช…๋ฐฑํ•œ serial ์˜ˆ์™ธ์˜ ์Šค๋ƒ…์ƒท์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๋นˆ ๋ฐฐ์—ด์ด ๋ช…๋ช…๋œ ๊ทœ์น™ type/hue์ด ๋ˆ„๋ฝ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
  • items[i] โ€” ์ˆซ์ž serial. 16์ง„์ˆ˜๋Š” ์ถœ๋ ฅ์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฃจํ”„๋Š” ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— ์•ก์„ธ์Šคํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var items = UO.GetIgnoreList();
    var i = 0;
    while (Truth(i < ArrayLength(items)))
    {
        UO.Print("0x" + Hex(items[i]));
        i = i + 1;
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. ์ฝ๊ธฐ ์ „์— ์ฒซ ๋ฒˆ์งธ ๊ธฐ๋ก์„ ํ™•์ธํ•˜์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์—…

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

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ช…๋ฐฑํ•œ serial ์˜ˆ์™ธ์˜ ์Šค๋ƒ…์ƒท์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๋นˆ ๋ฐฐ์—ด์ด ๋ช…๋ช…๋œ ๊ทœ์น™ type/hue์ด ๋ˆ„๋ฝ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์‚ฌํ•ญ, ์ฆ‰ ์Šค๋ƒ…์ƒท์˜ ๊ธฐ๋ก๊ณผ ํ˜„์žฌ ๊ฐœ์ฒด์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ ์ •๋ ฌ์ด ์—†๋Š” ์ˆœ์„œ๋Š” ์นœ๋ฐ€ํ•จ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
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 items = UO.GetIgnoreList();
        if (Truth(ArrayLength(items) > 0))
        {
            var first = items[0];
            if (Truth(UO.Exists(first)))
            {
                UO.Print(UO.GetName(first));
            }
        }
        else
        {
            UO.Print("Empty list");
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetIgnoreList() โ€” UO.GetIgnoreList()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getignorelist":

                    return new InjectionValue(bridge.GetIgnoreList().Select(value => new InjectionValue(value)).ToArray());

UO.GetWorldItems

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

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

dynamic UO.GetWorldItems();
dynamic UO.GetWorldItems(object? @type);
dynamic UO.GetWorldItems(object? @type, object? color);
dynamic UO.GetWorldItems(object? @type, object? color, object? distance);
dynamic UO.GetWorldItems(object? @type, object? color, object? distance, object? container);
dynamic UO.GetWorldItems(object? @type, object? color, object? distance, object? container, object? nearest);
dynamic UO.GetWorldItems(object? @type, object? color, object? distance, object? container, object? nearest, object? maxZ);

์›”๋“œ ์•„์ดํ…œ ๋˜๋Š” ์„ ํƒํ•œ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฐฐ์—ด ID์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

  • type - ํ•„ํ„ฐ๋ง๋œ ํ˜•์‹์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜: graphic/type, -1 ๋˜๋Š” 0xFFFF - ๋ชจ๋‘. ์ด๊ฒƒ์€ serial๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ชจ๋“  ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ํ•„ํ„ฐ๋งํ•˜์ง€ ์•Š๊ณ  ๋ณ„๋„์˜ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • color - ์ƒ‰์กฐ; ๊ธฐ๋ณธ๊ฐ’ - 1, ๋ชจ๋“  ์ƒ‰์ƒ. 0xFFFF๋Š” hue๋„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • distance โ€” X/Y๋ฅผ ๋”ฐ๋ผ ์žˆ๋Š” ์…€์˜ ๋ฐ˜๊ฒฝ์ž…๋‹ˆ๋‹ค. ์Œ์ˆ˜ ๋˜๋Š” ๋ถ€์žฌ ์‚ฌ์šฉ FindDistance; 0๋Š” ๋™์ผํ•œ ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ์šฐ ๋‚ด๋ถ€ X/Y๊ฐ€ ์•„๋‹Œ ์ปจํ…Œ์ด๋„ˆ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
  • container - ๊ธฐ๋ณธ์€ ์ ‘์ง€์ž…๋‹ˆ๋‹ค. ground, ์ˆซ์ž 0/1 ๋ฐ ํ•ด๋‹น ๋ฌธ์ž์—ด์€ ์ ‘์ง€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. backpack, my ๋ฐ ์ˆซ์ž -1๋Š” ๋ฐฐ๋‚ญ์˜ ์ง์ ‘์ ์ธ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์˜ ์ผ๋ จ๋ฒˆํ˜ธ/16์ง„์ˆ˜ ๋ฌธ์ž์—ด/๋ณ„์นญ - ์ง์ ‘์ ์ธ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. self๋Š” ๋ถ€๋ชจ๊ฐ€ ์บ๋ฆญํ„ฐ์ธ ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„๊ณผ ์‚ฌ๋ผ์ง„ ๋ฐฐ๋‚ญ์€ ๋•…์ด ์•„๋‹Œ ๋นˆ ๋ฐฐ์—ด์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • nearest โ€” ๊ธฐ๋ณธ๊ฐ’ false. true๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•œ ๋‹ค์Œ ์ˆซ์ž serial๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ๋ชจ๋“  ๊ฒฐ๊ณผ์˜ ๊ฑฐ๋ฆฌ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
  • maxZ โ€” self๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ—ˆ์šฉ๋˜๋Š” ๋†’์ด ์ฐจ์ด. ์Œ์ˆ˜ ๋˜๋Š” ๋ถ€์žฌ ์‚ฌ์šฉ FindVertical; 0์—๋Š” ๋™์ผํ•œ ๋†’์ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์—์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ ์ž์ฒด์˜ ๋†’์ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

๋ฐฐ์—ด - serial/ID ํ•ญ๋ชฉ(type ์•„๋‹˜, ์ขŒํ‘œ ๋˜๋Š” ์–‘). ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†๋Š” ๋นˆ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. GetWorldItems()๋Š” Ignore/๋ฒ”์œ„/๋†’์ด ์—†์ด ์ปจํ…Œ์ด๋„ˆ ์™ธ๋ถ€์— ๋กœ๋“œ๋œ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. GetWorldItems(type,...)๋Š” ๋‚˜์—ด๋œ ํ•„ํ„ฐ์™€ Ignore๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. NPC/players๋Š” ์–ด๋–ค ํ˜•ํƒœ๋กœ๋„ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ „์ฒด ์„œ๋ฒ„์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์—ด๊ฑฐ๋‚˜ ํ•ญ๋ชฉ์„ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๊ฐœ์ฒด๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด - 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. var์— ์ €์žฅํ•˜๊ณ , ArrayLength๋ฅผ ํ™•์ธํ•œ ํ›„ ์ ‘์†ํ•˜์„ธ์š”. ์Šค๋ƒ…์ƒท์„ ์ฐ์€ ํ›„ ์š”์†Œ๊ฐ€ ์„ธ๊ณ„์—์„œ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— Exists(serial)๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • ์‚ฌ์ง„ FindItem/FindCount/GetFoundItems๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒ€์€ ์šฉ๊ธฐ๋ฅผ ๊ฐœ๋ด‰ํ•˜๊ฑฐ๋‚˜ ๋™๋ด‰๋œ ๊ฐ€๋ฐฉ์„ ํ†ต๊ณผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ œํ•œ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด -1๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฌดํ•œ ๋ฐ˜๊ฒฝ์ด ์•„๋‹Œ ํ˜„์žฌ ์„ค์ •์˜ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ์Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฑฐ๋ฆฌ/maxZ๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ๋กœ๋“œ๋œ ๋ชจ๋“  ํ† ์ง€ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์ธ์ˆ˜ ์—†์ด ์–‘์‹์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

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

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

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

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

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

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

1. ๋กœ๋“œ๋œ ๋ชจ๋“  ํ† ์ง€ ํ•ญ๋ชฉ ์ˆ˜ ๊ณ„์‚ฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์Œ: ํ•„ํ„ฐ๊ฐ€ ์—†๋Š” ํŠน์ˆ˜ ํ˜•์‹์ž…๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๊ฐ€ ๋ชจ๋“  ๋งต์ด๋‚˜ ์„œ๋ฒ„ ํ•ญ๋ชฉ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. Ignore๋Š” ์—ฌ๊ธฐ์— ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var items = UO.GetWorldItems();
UO.Print(Convert.ToString(ArrayLength(items)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. ์›ํ•˜๋Š” ์œ ํ˜•๊ณผ ์ƒ‰์ƒ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์Šคํƒ ์ฐพ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • type=0x0EED โ€” ๊ธˆ์ƒ‰, ์ƒ‰์ƒ=-1 โ€” ๋ชจ๋‘; ๊ฑฐ๋ฆฌ=5, ์ปจํ…Œ์ด๋„ˆ=ground, ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด=true, maxZ=3.
  • ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฌด์‹œํ•  ์ˆ˜ ์—†๋Š” ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ๋Š” ๋ฒฝ์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์ ‘๊ทผ์„ฑ์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var items = UO.GetWorldItems(0x0EED, -1, 5, "ground", true, 3);
    if (Truth(ArrayLength(items) > 0))
    {
        var item = items[0];
        if (Truth(UO.Exists(item)))
        {
            UO.Print("Nearest ID: 0x" + Hex(item));
        }
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. ๋ฐฐ๋‚ญ์˜ ๋‚ด์šฉ์„ ์ง์ ‘ ๊ณ„์‚ฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋ชจ๋“  type/์ƒ‰์ƒ; my์€ ๋ฐฐ๋‚ญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ 20์™€ ์ฐจ์ด Z 255๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. 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()
    {
        var items = UO.GetWorldItems(-1, -1, 20, "my", false, 255);
        UO.Print(Convert.ToString(ArrayLength(items)));
        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.GetWorldItems() โ€” UO.GetWorldItems()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getworlditems":

                    return new InjectionValue(bridge.GetWorldItems().Select(serial => new InjectionValue(serial)).ToArray());

UO.GetWorldItems(type) โ€” UO.GetWorldItems(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactGetWorldItems(values)

UO.GetWorldItems(type, color) โ€” UO.GetWorldItems(Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactGetWorldItems(values)

UO.GetWorldItems(type, color, distance) โ€” UO.GetWorldItems(Any,Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactGetWorldItems(values)

UO.GetWorldItems(type, color, distance, container) โ€” UO.GetWorldItems(Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactGetWorldItems(values)

UO.GetWorldItems(type, color, distance, container, nearest) โ€” UO.GetWorldItems(Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), color (Any), distance (Any), container (Any), nearest (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactGetWorldItems(values)

UO.GetWorldItems(type, color, distance, container, nearest, maxZ) โ€” UO.GetWorldItems(Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: type (Any), color (Any), distance (Any), container (Any), nearest (Any), maxZ (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

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

values => CompactGetWorldItems(values)

UO.Ignore

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

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

void UO.Ignore(object? objID);
void UO.Ignore(object? id, object? stateValue);

์ผ๋ฐ˜ ๊ฒ€์ƒ‰ ๋ฌด์‹œ ๋ชฉ๋ก์—์„œ serial๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

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

  • id โ€” ์ง๋ ฌ/ID ๊ฐœ์ฒด: int, ์ˆซ์ž/16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ์„ค์ •๋œ ๋ณ„์นญ(์˜ˆ: "lasttarget"). ์ด๊ฒƒ์€ graphic/type๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— ๋กœ๋“œ๋œ ๊ฐœ์ฒด๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
  • objID โ€” ์ง๋ ฌ/ID ๊ฐœ์ฒด: int, ์ˆซ์ž/16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ์„ค์ •๋œ ๋ณ„์นญ(์˜ˆ: "lasttarget"). ์ด๊ฒƒ์€ graphic/type๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— ๋กœ๋“œ๋œ ๊ฐœ์ฒด๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
  • stateValue โ€” ์„ ํƒ์  ๋ชจ๋“œ. ์ˆซ์ž 0๊ฐ€ ๊บผ์ง€๊ณ , 0์ด ์•„๋‹Œ ์ˆซ์ž๊ฐ€ ์ผœ์ง‘๋‹ˆ๋‹ค. "off", "false"(๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„) ๋ฐ ์ •ํ™•ํžˆ "0" ์ค„์€ ๊บผ์ง‘๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ค„์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“œ ์ธ์ˆ˜ ์—†์ด - ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ์™„๋ฃŒ๋Š” ์„œ๋ฒ„์˜ ์ž‘์—…์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • Ignore(id)๋Š” bridge.Ignore(serial)๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ State.IgnoredSerials์— serial๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Ignore(id,stateValue)๋Š” Ignore ๋˜๋Š” Unignore๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋ฌธ์ž์—ด์€ ์ฐธ์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜์—ด๋œ ์ด์Šค์ผ€์ดํ”„ ๋‹จ์–ด๋Š” ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋Š” ๊ฐœ์ฒด๋ฅผ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๊ฒ€์ƒ‰ ํ•„ํ„ฐ์ž…๋‹ˆ๋‹ค. AddIgnoreList ์œ ํ˜•์˜ ๋ช…๋ช…๋œ ํ•„ํ„ฐ๋Š” ๋ณ„๋„๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.Ignore");
UO.Ignore("lasttarget");

1. ์ง์ ‘ ํ†ตํ™” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ผ๋ฐ˜ ๊ฒ€์ƒ‰ ๋ฌด์‹œ ๋ชฉ๋ก์—์„œ serial๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
UO.Ignore("lasttarget");

2. ๋ช…์‹œ์  ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • Ignore(id)๋Š” bridge.Ignore(serial)๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ State.IgnoredSerials์— serial๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Ignore(id,stateValue)๋Š” Ignore ๋˜๋Š” Unignore๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋ฌธ์ž์—ด์€ ์ฐธ์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜์—ด๋œ ์ด์Šค์ผ€์ดํ”„ ๋‹จ์–ด๋Š” ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Ignore("lasttarget", "off");
    return null;
}

3. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ด๋Š” ๊ฐœ์ฒด๋ฅผ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๊ฒ€์ƒ‰ ํ•„ํ„ฐ์ž…๋‹ˆ๋‹ค. AddIgnoreList ์œ ํ˜•์˜ ๋ช…๋ช…๋œ ํ•„ํ„ฐ๋Š” ๋ณ„๋„๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var id = UO.GetSerial("lasttarget");
        if (Truth(UO.Exists(id)))
        {
            UO.Ignore(id, 1);
            UO.Print(UO.GetIgnoreList());
            UO.Ignore(id, 0);
        }

        return null;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "ignore": bridge.Ignore(Arg(0)); return InjectionValue.Unit;

UO.Ignore(objID) โ€” UO.Ignore(Integer)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void Ignore(int id) => bridge.Ignore(id);

UO.Ignore(objID) โ€” UO.Ignore(String)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void Ignore(string id) => Ignore(GetObject(id));

UO.Ignore(id, stateValue) โ€” UO.Ignore(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void Ignore(InjectionValue id, InjectionValue stateValue)

        {

            int serial = GetObject(id);

            bool enabled = stateValue.Kind != InjectionValueKind.String

                ? NumberConversions.ToInt(stateValue) != 0

                : !stateValue.String.Equals("off", StringComparison.OrdinalIgnoreCase)

                    && !stateValue.String.Equals("false", StringComparison.OrdinalIgnoreCase)

                    && stateValue.String != "0";



            if (enabled)

                bridge.Ignore(serial);

            else

                bridge.Unignore(serial);

        }

UO.IgnoreOff

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

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

void UO.IgnoreOff(object? objID);

์ผ๋ฐ˜ ๋ฌด์‹œ ๋ชฉ๋ก์—์„œ ํ•˜๋‚˜์˜ serial์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

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

  • objID โ€” ์ง๋ ฌ/ID ๊ฐœ์ฒด: int, ์ˆซ์ž/16์ง„์ˆ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ์„ค์ •๋œ ๋ณ„์นญ(์˜ˆ: "lasttarget"). ์ด๊ฒƒ์€ graphic/type๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— ๋กœ๋“œ๋œ ๊ฐœ์ฒด๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ์™„๋ฃŒ๋Š” ์„œ๋ฒ„์˜ ์ž‘์—…์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • Bridge.Unignore๋Š” State.IgnoredSerials์—์„œ ID๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ serial ๋ฐ ๋ช…๋ช…๋œ AddIgnoreList ํ•„ํ„ฐ๋Š” ์ง€์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„์ดํ…œ์€ ์›”๋“œ์—์„œ ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒ€์ƒ‰ ํ•„ํ„ฐ์˜ ๋กœ์ปฌ ๋ณ€๊ฒฝ ํŒจํ‚ท์ด ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.IgnoreOff");
UO.IgnoreOff(UO.GetSerial("lasttarget"));

1. ์ง์ ‘ ํ†ตํ™” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ผ๋ฐ˜ ๋ฌด์‹œ ๋ชฉ๋ก์—์„œ ํ•˜๋‚˜์˜ serial์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.IgnoreOff(id);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. ๋ช…์‹œ์  ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • Bridge.Unignore๋Š” State.IgnoredSerials์—์„œ ID๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ serial ๋ฐ ๋ช…๋ช…๋œ AddIgnoreList ํ•„ํ„ฐ๋Š” ์ง€์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„์ดํ…œ์€ ์›”๋“œ์—์„œ ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.IgnoreOff(id);
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

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()
    {
        ApplyToLoaded(UO.GetSerial("lasttarget"));
        return null;
    }

    void ApplyToLoaded(dynamic id)
    {
        if (Truth(UO.Exists(id)))
        {
            UO.IgnoreOff(id);
        }
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "ignoreoff": bridge.Unignore(Arg(0)); return InjectionValue.Unit;

UO.IgnoreReset

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

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

void UO.IgnoreReset();

๋ฌด์‹œ๋œ serial์˜ ์ผ๋ฐ˜ ๋ชฉ๋ก์„ ์ง€์›๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ์™„๋ฃŒ๋Š” ์„œ๋ฒ„์˜ ์ž‘์—…์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • Bridge.IgnoreReset๋Š” State.IgnoredSerials.Clear๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋ธŒ๋ฆฌ์ง€ ์„ธ์…˜์—์„œ ๋‹ค๋ฅธ ๊ฒ€์ƒ‰์œผ๋กœ ์ถ”๊ฐ€๋œ ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜์—ฌ ์ด ํ•„ํ„ฐ์—์„œ ๋ชจ๋“  serial๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • ๋ช…๋ช…๋œ AddIgnoreList์„ ์ง€์šฐ๊ฑฐ๋‚˜ ๊ฐœ์ฒด๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ FindType์˜ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์„ค์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ง์ ‘ ํ†ตํ™” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋ฌด์‹œ๋œ serial์˜ ์ผ๋ฐ˜ ๋ชฉ๋ก์„ ์ง€์›๋‹ˆ๋‹ค.
UO.IgnoreReset();

2. ๋ช…์‹œ์  ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • Bridge.IgnoreReset๋Š” State.IgnoredSerials.Clear๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋ธŒ๋ฆฌ์ง€ ์„ธ์…˜์—์„œ ๋‹ค๋ฅธ ๊ฒ€์ƒ‰์œผ๋กœ ์ถ”๊ฐ€๋œ ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜์—ฌ ์ด ํ•„ํ„ฐ์—์„œ ๋ชจ๋“  serial๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.GetIgnoreList());
    UO.IgnoreReset();
    return null;
}

3. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋ช…๋ช…๋œ AddIgnoreList์„ ์ง€์šฐ๊ฑฐ๋‚˜ ๊ฐœ์ฒด๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ FindType์˜ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์„ค์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.Ignore("lasttarget");
        UO.IgnoreReset();
        UO.Print(UO.GetIgnoreList());
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.IgnoreReset() โ€” UO.IgnoreReset()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void IgnoreReset() => bridge.IgnoreReset();

UO.InfoFindList

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

string UO.InfoFindList();

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

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

๊ทธ๋ž˜ํ”ฝ ์ฑ„ํŒ…์—์„œ ์ธ์ˆ˜ ์—†๋Š” Info์™€ InfoTile์€ ํƒ€๊นƒ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ์˜ Info()๋Š” ๋งˆ์ง€๋ง‰ ๋ฌผ์ฒด ํƒ€๊นƒ ๋˜๋Š” ํ”Œ๋ ˆ์ด์–ด๋ฅผ, InfoTile()์€ ๋ฐœ๋ฐ‘ ์ง€ํ˜•์„ ์ฝ์Šต๋‹ˆ๋‹ค. serial, type, ์ขŒํ‘œ๋กœ ๋Œ€์ƒ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. InfoTile(x,y,map)์˜ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ๋งต ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.

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

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

์ ‘๋‘์‚ฌ๋Š” C# Scripts IDE์—์„œ ์„ค์ •ํ•˜๋ฉฐ #์€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ  ๋”ฐ์˜ดํ‘œ ์•ˆ์˜ ํ…์ŠคํŠธ๋Š” ํ•˜๋‚˜์˜ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. id๋Š” serial, type์€ graphic์ž…๋‹ˆ๋‹ค. xy x y [z]๋Š” ํ•ด๋‹น ์œ„์น˜์˜ ์ฒซ ๋กœ๋“œ ๊ฐœ์ฒด, type๋งŒ ์“ฐ๋ฉด ์ฒซ ์ผ์น˜ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. InfoTile(x,y,map)์˜ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” Z๊ฐ€ ์•„๋‹ˆ๋ผ ์ง€๋„์ž…๋‹ˆ๋‹ค.

์ฑ„ํŒ… ๋ช…๋ น

#infofindlist

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

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

1

UO.Print(UO.InfoFindList());

2

string ReadDefinitions() => UO.InfoFindList();
UO.Print(ReadDefinitions());

3

string report = UO.InfoFindList();
foreach (string line in report.Split('\n'))
    UO.Print(line);

4

new CommandSample().Execute(UO);

sealed class CommandSample
{
    public void Execute(global::ClassicUO.CSharp.CSharpGameApi api)
    {
        api.Print(api.InfoFindList());
    }
}

๋‚ด๋ถ€ ํ˜ธ์ถœ

CSharpGameApi.InfoFindList
  -> CSharpScriptGlobals
  -> InjectionScript.Runtime.InjectionApiUO.InfoFindList
ClassicUOInjectionApiBridge -> YokoInfoReport -> YokoInfoGump


UO.MFGI

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

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

void UO.MFGI();

ํ˜„์žฌ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ชฉ๋ก์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ์™„๋ฃŒ๋Š” ์„œ๋ฒ„์˜ ์ž‘์—…์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ExecuteLegacyManualAlias๋Š” GetFoundItems๋ฅผ ์ฝ๊ณ , ๊ฐ serial์˜ ํ˜•์‹์„ 0xXXXXXXXX๋กœ ์ง€์ •ํ•˜๊ณ , ์ค„์„ "|"๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋ถ„ ๊ธฐํ˜ธ. ์ƒˆ๋กœ์šด ๊ฒ€์ƒ‰์€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋นˆ ๋ชฉ๋ก์€ ๋นˆ ๋ฌธ์ž์—ด์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ง€์ •๋œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋งŒ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ์„œ๋ฒ„ ํ™•์ธ์ด ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ง์ ‘ ํ†ตํ™” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ˜„์žฌ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ชฉ๋ก์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.
UO.MFGI();

2. ๋ช…์‹œ์  ์˜ต์…˜ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ExecuteLegacyManualAlias๋Š” GetFoundItems๋ฅผ ์ฝ๊ณ , ๊ฐ serial์˜ ํ˜•์‹์„ 0xXXXXXXXX๋กœ ์ง€์ •ํ•˜๊ณ , ์ค„์„ "|"๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋ถ„ ๊ธฐํ˜ธ. ์ƒˆ๋กœ์šด ๊ฒ€์ƒ‰์€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋นˆ ๋ชฉ๋ก์€ ๋นˆ ๋ฌธ์ž์—ด์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.FindType("0x0E21");
    UO.MFGI();
    return null;
}

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()
    {
        UO.MFGI();
        UO.Print(UO.GetArrayLength(UO.GetFoundItems()));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.MFGI() โ€” UO.MFGI()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "mfgi":

                    SystemMessage(string.Join(" | ", bridge.GetFoundItems().Select(id => $"0x{id:X8}")));

                    break;

UO.SelectIgnoreList

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

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

void UO.SelectIgnoreList(object? list);

ํ™œ์„ฑ ๋ช…๋ช…๋œ ๊ฒ€์ƒ‰ ํ•„ํ„ฐ๋ฅผ ํ† ๊ธ€ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ๊ทœ์น™์„ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ๋งˆ์ด๋‹, ์ •๋ ฌ ๋ฐ ํƒ€๊ฒŸํŒ… ๊ฐ„์˜ ์˜ˆ์™ธ ์ง‘ํ•ฉ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๊ฒ€์ƒ‰ ์ž์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

  • list โ€” ๋น„์–ด ์žˆ์ง€ ์•Š์€ ์ž„์˜์˜ ์ด๋ฆ„(์˜ˆ: "loot_skip") ์ด๋ฆ„์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์•„์ดํ…œ์˜ ์ด๋ฆ„๋„, serial ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„๋„, FindList์˜ ์ด๋ฆ„๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋นˆ ๋ฌธ์ž์—ด ""๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ๊ทœ์น™์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. var ๊ฒฐ๊ณผ = ๋ฐ ํ™•์ธ =true ์—†์ด ๋ณ„๋„์˜ ์ค„์— ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด ๋ช…๋ น์€ ๋กœ์ปฌ ํ•„ํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ํ•ญ๋ชฉ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์„œ๋ฒ„์— ์•„๋ฌด ๊ฒƒ๋„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ด๋ฆ„์€ ๋นˆ ํ•„ํ„ฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋Šฆ์€ AddIgnoreList๊ฐ€ ๋‹ค์Œ ๊ฒ€์ƒ‰์—์„œ ํ™œ๋™ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. Regular Ignore(serial)๋Š” ์„ ํƒ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ๊ณ„์† ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ช…๋ช…๋œ ๋ชฉ๋ก์—๋Š” graphic/type + hue ๊ทœ์น™์ด ํฌํ•จ๋˜์–ด ์žˆ๊ณ  ์ผ๋ฐ˜ Ignore์—๋Š” ํŠน์ • serial ๊ทœ์น™์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ์„œ๋กœ ๋‹ค๋ฅธ ํ•„ํ„ฐ์ž…๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰์ด ์ง€์›๋˜๋ฉด ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ์ฒด๋Š” ๊ณ„์† ํ‘œ์‹œ๋˜๊ณ  ์ง์ ‘ UseObject/MoveItem์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Hide ๋˜๋Š” ํ–‰์œ„ ๊ธˆ์ง€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ๋ชฉ๋ก ์ด๋ฆ„์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ์ž๋ฆฌ ๊ณต๊ฐ„์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ช…๋ช…๋œ ๋ชฉ๋ก์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ ์ดˆ๊ธฐ์—๋Š” ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค. AddIgnoreList๋Š” ์ž๋™์œผ๋กœ ์„ ํƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. SelectIgnoreList("")์€ ๋ช…๋ช…๋œ ํ•„ํ„ฐ๋งŒ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทœ์น™์€ ์ถ”๊ฐ€๋œ ํ›„์— ์—…๋กœ๋“œ๋œ ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฒ€์ƒ‰์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์ˆ˜์‹ ๋œ ๋ฐฐ์—ด๊ณผ ์ด์ „ ๊ฒฐ๊ณผ FindCount๋Š” ์ƒˆ๋กœ์šด ๊ฒ€์ƒ‰์ด ์ด๋ฃจ์–ด์งˆ ๋•Œ๊นŒ์ง€ ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์„ ์ œ์™ธํ•˜๋ ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด -1,-1 ๊ทœ์น™์ด ์žˆ๋Š” ๋ชฉ๋ก์„ ์„ ํƒํ•˜์ง€ ๋งˆ์„ธ์š”.
  • ํ•„ํ„ฐ๋Š” FindType/FindTypeEx/FindTypesArrayEx, FindList, FindAtCoord, FindNotoriety, Count/CountEx ๋ฐ ํ™•์žฅ ์„ ํƒ ํ•ญ๋ชฉ GetMobiles, GetWorldItems, UseType์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. WaitTarget, Attack/AttackNearest/FindMan. includeIgnored=true(์ œ๊ณต๋œ ๊ฒฝ์šฐ)๋Š” serial ๋ฐ type/hue๋ฅผ ๋ชจ๋‘ ์šฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ์ „์ฒด ์—ด๊ฑฐํ˜• GetContent/GetEquipment, GetWorldItems() ๋ฐ ๋™์‚ฌ FindMobile(human,near,...) ๋Š” ์ด๋Ÿฌํ•œ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • GetIgnoreList๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€๋œ serial๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ๋ชฉ๋ก์˜ ํ–‰์€ ์ด ๋ฐฐ์—ด์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. IgnoreReset๋Š” ์ „์ฒด serial ํ•„ํ„ฐ๋ฅผ ์ง€์šฐ๊ณ , IgnoreOff(serial)๋Š” ํ•˜๋‚˜์˜ serial-์˜ˆ์™ธ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ๊ทœ์น™์€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ClearIgnoreList()๋Š” ๋‘ ๋ณด๊ธฐ๋ฅผ ๋ชจ๋‘ ์ง€์›๋‹ˆ๋‹ค.
  • ์ƒํƒœ๋Š” ํด๋ผ์ด์–ธํŠธ ํ”„๋กœํ•„ ์Šคํฌ๋ฆฝํŠธ์˜ ์ผ๋ฐ˜ ์ƒํƒœ์— ์†ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ด ์ƒํƒœ์˜ ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์„ค์ •์€ ์ €์žฅ๋œ ์Šค๋ƒ…์ƒท์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ทœ์น™์„ ๋ณ€๊ฒฝํ•œ ํ›„ ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ๋Š” ์ด๋ฏธ ์ด์ „์— ์ฐ์€ ์Šค๋ƒ…์ƒท์œผ๋กœ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฒ€์ƒ‰์—์„œ๋Š” ์—…๋ฐ์ดํŠธ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.SelectIgnoreList");
UO.SelectIgnoreList("SORT");

1. ์ •๋ ฌ ๋ชจ๋“œ ์ „ํ™˜ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • SORT์™€ sort๋Š” ํ•˜๋‚˜์˜ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰์—์„œ๋Š” ํ—ˆ์šฉ๋œ ์ฒซ ๋ฒˆ์งธ ๋ฐฐ๋‚ญ ๊ฐœ์ฒด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์„ ์ €์žฅํ•ด๋„ ์ „์†ก๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
UO.AddIgnoreList("sort", 0x0EED);
UO.SelectIgnoreList("SORT");
var item = UO.FindType(-1, -1, "backpack");
if (Truth(item != ""))
{
    UO.AddObject("sort_candidate", item);
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. ๊ทœ์น™ ๋„๊ธฐ type, ์„ธํŠธ ์ž์ฒด ์ €์žฅ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋นˆ ์ค„์€ ๋ช…๋ช…๋œ ํ•„ํ„ฐ๋งŒ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋ณต์›ํ•˜๋ ค๋ฉด ์„ธํŠธ ์ด๋ฆ„์„ ๋‹ค์‹œ ์ „๋‹ฌํ•˜์„ธ์š”.
return  RunScenario();
 object? RunScenario()
{
    UO.SelectIgnoreList("");
    var gold = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(gold != ""))
    {
        UO.AddObject("gold_candidate", gold);
    }

    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()
    {
        UO.SelectIgnoreList("later");
        UO.AddIgnoreList("later", 0x0EED);
        var item = UO.FindType(0x0EED, -1, "ground");
        if (Truth(item == ""))
        {
            UO.Print("Gold is excluded by the selected rule");
        }

        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.SelectIgnoreList(list) โ€” UO.SelectIgnoreList(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "selectignorelist": state.SelectedIgnoreList = Text(0).Trim(); break;

UO.SetBadLocation

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

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

void UO.SetBadLocation(object? x, object? y);

๋‹ค์Œ ๊ฒฝ๋กœ MoveXY, NewMoveXY, MoveXYZ, PMove์— ๋Œ€ํ•œ ๊ธˆ์ง€ ์…€ ๋ชฉ๋ก์— X/Y๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  GetPathArray/GetPathArray3D๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

  • x โ€” ์ œ์™ธ๋œ ์…€์˜ ์›”๋“œ X.
  • y โ€” ์ œ์™ธ๋œ ์…€์˜ ์›”๋“œ Y.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. true/false ๋˜๋Š” ๊ฑธ์Œ ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ํ‚ค๋Š” X/Y, ์นด๋“œ ์—†์Œ, Z๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ขŒํ‘œ๋Š” 0..65535 ๋‚ด์˜ ์ •์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœ ์Šคํฌ๋ฆฝํŠธ์˜ ๋Ÿฐํƒ€์ž„์—๋Š” ๊ธˆ์ง€ ์‚ฌํ•ญ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ ๊ฒฝ๋กœ๋‚˜ ์š”์ฒญ์€ ์ด์— ๋Œ€ํ•œ ์Šค๋ƒ…์ƒท์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ๊ฒฝ๋กœ๋Š” ๋‚ด๋ถ€ ์žฌ๊ณ„์‚ฐ์„ ํฌํ•จํ•˜์—ฌ ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ชฉ๋ก์„ ๋ณ€๊ฒฝํ•œ ํ›„ ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ๋ฅผ ์‹œ์ž‘ํ•˜์„ธ์š”.
  • ์ด๋Š” ๋งต ๋ณ€๊ฒฝ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ˆ˜๋™ ์ด๋™ ๋ฐ ๊ธฐํƒ€ ๋Ÿฐํƒ€์ž„ ๊ฒฝ๋กœ๋Š” ์ด ๊ธˆ์ง€๋ฅผ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธˆ์ง€๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์–ด๋„ ์›๋ž˜ ์‚ฌ๊ฐํ˜•์„ ๋– ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.SetBadLocation");
UO.SetBadLocation(UO.GetX() + 1, UO.GetY());

1. ๊ณ„์‚ฐ์—์„œ ์ธ์ ‘ ์…€ ์ œ์™ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • X/Y - ๋ฌธ์ž์˜ ๋™์ชฝ ์…€์ž…๋‹ˆ๋‹ค.
  • ์ˆœํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉด ๋‹ค๋ฅธ ์ „์ฒด ๊ฒฝ๋กœ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ๊ฐ€ ์›€์ง์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
UO.SetBadLocation(UO.GetX() + 1, UO.GetY());
var path = UO.GetPathArray(UO.GetX() + 3, UO.GetY(), true, 0);
UO.Print(Convert.ToString(ArrayLength(path)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. ๋‘ ๊ฐœ์˜ ์…€ ์ถ”๊ฐ€ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ํ•˜๋‚˜์˜ X/Y ์Œ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
  • ํ•œ ์Œ์„ ๋ฐ˜๋ณตํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ณ„๋„์˜ ๋‘ ๋ฒˆ์งธ ๊ธˆ์ง€ ์‚ฌํ•ญ์ด ์ƒ์„ฑ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. Z๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.SetBadLocation(1445, 1690);
    UO.SetBadLocation(1445, 1691);
    return null;
}

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()
    {
        int x = UO.GetX() + 1;
        int y = UO.GetY();
        UO.SetBadLocation(x, y);
        UO.Print($"Marked known blocked location: {x},{y}");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.SetBadLocation(x, y) โ€” UO.SetBadLocation(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setbadlocation":

                {

                    int x = Arg(0), y = Arg(1);

                    if (x < 0 || x > ushort.MaxValue || y < 0 || y > ushort.MaxValue)

                        throw new NativeSubrutineException("UO.SetBadLocation requires world X/Y in 0..65535.");

                    state.BadLocations.Add(x + "," + y);

                    return InjectionValue.Unit;

                }

UO.SetBadObject

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

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

void UO.SetBadObject(object? objType, object? color, object? radius);

๋‹ค์Œ ๊ฒฝ๋กœ์—์„œ ์ œ์™ธํ•˜๊ณ  graphic ๋ฐ hue์— ์˜ํ•ด ์„ ํƒ๋œ ๋กœ๋“œ๋œ ์„ธ๊ณ„ ๊ฐœ์ฒด ์ฃผ๋ณ€์˜ ์…€ ๊ฒฝ๋กœ๋ฅผ ์ฟผ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

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

  • objType - ์•„์ดํ…œ์˜ ๊ทธ๋ž˜ํ”ฝ/type, 0..65535. 0xFFFF ๋˜๋Š” -1๋Š” ๋ชจ๋“  ์œ ํ˜•์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” serial ํŠน์ • ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • color โ€” ์•„์ดํ…œ์˜ ์ƒ‰์ƒ, 0..65535. 0xFFFF ๋˜๋Š” -1๋Š” ๋ชจ๋“  ์ƒ‰์ƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. 0์€ ์ •ํ™•ํžˆ hue 0์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • radius โ€” ์…€์˜ ๋ฐ˜๊ฒฝ, 0..255 ํฌํ•จ. 0๋Š” ํ•ญ๋ชฉ ์…€์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. R์€ ๋Œ€๊ฐ์„  ์…€์„ ํฌํ•จํ•˜์—ฌ ์ฃผ๋ณ€์˜ ์ •์‚ฌ๊ฐํ˜• max(abs(dx),abs(dy)) <= R์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. true/false ๋˜๋Š” ๊ฑธ์Œ ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ฒ”์œ„๊ฐ€ ์ ์ ˆํ•˜์ง€ ์•Š์œผ๋ฉด ์ˆซ์ž๊ฐ€ ์ž๋™์œผ๋กœ ์ž˜๋ฆฌ์ง€ ์•Š๊ณ  ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทœ์น™์€ ํ˜„์žฌ ๋Ÿฐํƒ€์ž„์— ๋ˆ„์ ๋ฉ๋‹ˆ๋‹ค. ์ผ์น˜ ๊ทœ์น™์ด ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ๋ฐ˜๊ฒฝ์ด ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ClearBadObjectList๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ทœ์น™์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์„ ํฌํ•จํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ=0๋กœ ๋กœ๋“œ๋œ ๋™์  ํ•ญ๋ชฉ์ด ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ํ•ญ๋ชฉ, NPC ๋ฐ ์ง€๋„ ํ†ต๊ณ„๋Š” ์ด ํ•„ํ„ฐ์— ์˜ํ•ด ์„ ํƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์˜ ๊ฒฝ์šฐ avoidMobiles๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๊ฐœ๋ณ„ ์…€์˜ ๊ฒฝ์šฐ SetBadLocation๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • MoveXY/NewMoveXY/MoveXYZ/PMove ๋˜๋Š” GetPathArray/GetPathArray3D๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ํ•ญ๋ชฉ์˜ ๊ทœ์น™๊ณผ ์œ„์น˜์— ๋Œ€ํ•œ ์Šค๋ƒ…์ƒท์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์„ธ๊ณ„์™€ ๋ชฉ๋ก์„ ์ถ”๊ฐ€๋กœ ๋ณ€๊ฒฝํ•ด๋„ ์ด ์Šค๋ƒ…์ƒท์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ถœ์‹œ๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ํ•„ํ„ฐ๋Š” ์„œ๋ฒ„์— ์•„๋ฌด ๊ฒƒ๋„ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉฐ ๋‹ซํžŒ ์ปจํ…Œ์ด๋„ˆ์— ์ฝ˜ํ…์ธ ๋ฅผ ๊ฐ•์ œ๋กœ ๋กœ๋“œํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ˆ˜๋™ ์ด๋™์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. X/Y ๊ทœ์น™์—๋Š” ๋ณ„๋„์˜ Z ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.SetBadObject");
UO.SetBadObject(0x398C, 0xFFFF, 1);

1. ํŠน์ • ์œ ํ˜•์˜ ๊ฐ์ฒด ์šฐํšŒ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ObjType=0x398C - ์˜ˆ graphic: ์„œ๋ฒ„์— ์žˆ๋Š” ์žฅ์• ๋ฌผ ์œ ํ˜•์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. Color=0xFFFF๋Š” ์›ํ•˜๋Š” ์ƒ‰์ƒ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. Radius=1๋Š” ์ผ์น˜ํ•˜๋Š” ๊ฐ ํ•ญ๋ชฉ ์ฃผ์œ„์˜ 3ร—3 ์‚ฌ๊ฐํ˜•์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • NewMoveXY๋Š” ์ •ํ™•ํžˆ X/Y๋กœ ๋™์ชฝ์œผ๋กœ 5๊ฐœ ์…€๋กœ ์ด๋™ํ•˜๋ฉฐ ๋„๋ณด๋กœ ์ฝœ๋ฐฑ ์—†์ด ์‹œ๊ฐ„ ์ œํ•œ=5000 ms๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ok=1๋Š” ๋ชฉํ‘œ ๋‹ฌ์„ฑ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 0๋Š” ์šฐํšŒ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
UO.SetBadObject(0x398C, 0xFFFF, 1);
var ok = UO.NewMoveXY(UO.GetX() + 5, UO.GetY(), true, 0, false, 0, 5000);
UO.Print(Convert.ToString(ok));

2. ์›€์ง์ž„ ์—†์ด ์ •ํ™•ํ•œ ์ƒ‰์ƒ์œผ๋กœ ๊ฒฝ๋กœ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • Color=0x0044๋Š” hue๋งŒ ์„ ํƒํ•˜๊ณ  Radius=0๋Š” ํ•ญ๋ชฉ์ด ์ฐจ์ง€ํ•˜๋Š” ์…€๋งŒ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ClearBadObjectList๋Š” ์ด์ „ ์œ ํ˜• ๋ฐ ์ƒ‰์ƒ ๊ทœ์น™์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • GetPathArray๋Š” ์›์ ์„ ํฌํ•จํ•˜์—ฌ [x,y,z] ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋นˆ ๋ฐฐ์—ด์€ ํ˜„์žฌ ์ œ์•ฝ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ „์ฒด ๊ฒฝ๋กœ๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    UO.ClearBadObjectList();
    UO.SetBadObject(0x398C, 0x0044, 0);
    var path = UO.GetPathArray(UO.GetX() + 4, UO.GetY(), true, 0);
    UO.Print("Path records: " + Convert.ToString(ArrayLength(path)));
    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

3. ์„ธ๊ณ„์˜ ๋ชจ๋“  ๊ฐœ์ฒด์˜ ์…€์„ ์ผ์‹œ์ ์œผ๋กœ ์ œ์™ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ObjType=-1 ๋ฐ Color=-1๋Š” ๋ชจ๋‘ ์™€์ผ๋“œ์นด๋“œ์ž…๋‹ˆ๋‹ค. Radius=0๋Š” ๋กœ๋“œ๋œ ๋ชจ๋“  ์›”๋“œ ์•„์ดํ…œ์˜ ์…€์„ ์ œ์™ธํ•˜์ง€๋งŒ NPC ๋˜๋Š” ๊ฐ€๋ฐฉ์˜ ๋‚ด์šฉ๋ฌผ์€ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ •๋ฆฌ๋Š” ํ–ฅํ›„ ์š”์ฒญ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์ˆ˜์‹ ๋œ ๊ฒฝ๋กœ๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ™œ์„ฑ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹Œ ์ขŒํ‘œ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.SetBadObject(-1, -1, 0);
        var path = UO.GetPathArray(UO.GetX() + 2, UO.GetY(), true, 0);
        UO.ClearBadObjectList();
        UO.Print(Convert.ToString(ArrayLength(path)));
        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
}

๋ช…๋ น ๊ตฌํ˜„

C#์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ UO ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ˆซ์ž ํ”Œ๋ž˜๊ทธ๋Š” 0๊ณผ ๋น„๊ตํ•˜๊ณ  ๋ฐ˜ํ™˜ ํ˜•์‹์ด bool์ผ ๋•Œ๋งŒ bool์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

UO.SetBadObject(objType, color, radius) โ€” UO.SetBadObject(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: objType (Any), color (Any), radius (Any)

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setbadobject":

                {

                    int type = ResolveType(arguments[0]), hue = Arg(1), radius = Arg(2);

                    if (type < -1 || type > ushort.MaxValue || hue < -1 || hue > ushort.MaxValue || radius < 0 || radius > byte.MaxValue)

                        throw new NativeSubrutineException("UO.SetBadObject requires type/color 0..65535 (or -1) and radius 0..255.");

                    state.BadObjects.Add(type + "," + hue + "," + radius);

                    return InjectionValue.Unit;

                }
โš ๏ธ **GitHub.com Fallback** โš ๏ธ