KO UO Topic items 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.MoveItem

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

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

int UO.MoveItem(object? id);
int UO.MoveItem(object? id, object? amount);
int UO.MoveItem(object? id, object? amount, object? targetContainer);
int UO.MoveItem(object? item, object? amount, object? container, object? x);
int UO.MoveItem(object? item, object? amount, object? container, object? x, object? y);
int UO.MoveItem(object? id, object? amount, object? targetContainer, object? x, object? y, object? z);
int UO.MoveItem(object? item, object? amount, object? container, object? x, object? y, object? z, object? timeout);
int UO.MoveItem(object? item, object? amount, object? container, object? x, object? y, object? z, object? timeout, object? waitConfirmation);

serial๋กœ ํ•˜๋‚˜์˜ ํŠน์ • ์•„์ดํ…œ/์Šคํƒ์„ ์šด๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. ํฌํšํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋‚˜ ๋•…์— ๋–จ์–ด๋œจ๋ฆฝ๋‹ˆ๋‹ค.

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

  • id โ€” ํŠน์ • ํ•ญ๋ชฉ/๋ฌธ์ž์˜ ์ผ๋ จ๋ฒˆํ˜ธ: ์ˆซ์ž, 16์ง„์ˆ˜/10์ง„์ˆ˜ ๋ฌธ์ž์—ด, self/backpack/lasttarget/lastobject/lastcontainer/lastcorpse/finditem/laststatus ๋˜๋Š” ์ €์žฅ๋œ ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ type์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐœ์ฒด๋ฅผ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—… ์ „์— Exists๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • item โ€” ํŠน์ • ํ•ญ๋ชฉ/๋ฌธ์ž์˜ ์ผ๋ จ๋ฒˆํ˜ธ: ์ˆซ์ž, 16์ง„์ˆ˜/10์ง„์ˆ˜ ๋ฌธ์ž์—ด, self/backpack/lasttarget/lastobject/lastcontainer/lastcorpse/finditem/laststatus ๋˜๋Š” ์ €์žฅ๋œ ์ด๋ฆ„ AddObject. ์ด๊ฒƒ์€ type์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐœ์ฒด๋ฅผ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—… ์ „์— Exists๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • amount โ€” ํ•œ ์Šคํƒ ์•ˆ์— ์žˆ๋Š” ๋‹จ์œ„ ์ˆ˜์ž…๋‹ˆ๋‹ค. 0 ๋˜๋Š” ์Œ์ˆ˜ ๊ฐ’์€ ์ „์ฒด ์Šคํƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ธ์ •์ ์ธ ๊ฒƒ์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ˆ˜๋Ÿ‰์— ์˜ํ•ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. MassMove๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒƒ์€ ์Šคํƒ ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค.
  • targetContainer โ€” ์ปจํ…Œ์ด๋„ˆ์˜ ์ผ๋ จ๋ฒˆํ˜ธ ๋˜๋Š” ์„ธํŠธ ์ด๋ฆ„ AddObject; backpack/self/my ๋ฐฐ๋‚ญ์„ ์„ ํƒํ•˜๊ณ , receiving/catchbag - SetCatchBag๋ฅผ ์„ ํƒํ•˜๊ณ , ๋ฐฐ๋‚ญ์ด ์—†์œผ๋ฉด ๋ฐฐ๋‚ญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. lastcontainer/lastobject/lasttarget/lastcorpse/finditem/laststatus๋Š” ์˜ฌ๋ฐ”๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋กœ ํ™•์ธ๋˜๋ฉด ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ground ๋˜๋Š” 0๋Š” ํ† ์ง€๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. -1โ€”๋™์ผํ•œ ๋ฐฐ๋‚ญ ์„ ํƒ๊ธฐ. ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ง€์ •๋˜์ง€ ์•Š์€ ์ด๋ฆ„์œผ๋กœ ์ธํ•ด ํ•ญ๋ชฉ์ด ์บก์ฒ˜๋˜๊ธฐ ์ „์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ชฉ์ ์ง€ ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ๋ฐฐ๋‚ญ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • container โ€” ์ปจํ…Œ์ด๋„ˆ์˜ ์ผ๋ จ๋ฒˆํ˜ธ ๋˜๋Š” ์„ธํŠธ ์ด๋ฆ„ AddObject; backpack/self/my ๋ฐฐ๋‚ญ์„ ์„ ํƒํ•˜๊ณ , receiving/catchbag - SetCatchBag๋ฅผ ์„ ํƒํ•˜๊ณ , ๋ฐฐ๋‚ญ์ด ์—†์œผ๋ฉด ๋ฐฐ๋‚ญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. lastcontainer/lastobject/lasttarget/lastcorpse/finditem/laststatus๋Š” ์˜ฌ๋ฐ”๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋กœ ํ™•์ธ๋˜๋ฉด ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ground ๋˜๋Š” 0๋Š” ํ† ์ง€๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. -1โ€”๋™์ผํ•œ ๋ฐฐ๋‚ญ ์„ ํƒ๊ธฐ. ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ง€์ •๋˜์ง€ ์•Š์€ ์ด๋ฆ„์œผ๋กœ ์ธํ•ด ํ•ญ๋ชฉ์ด ์บก์ฒ˜๋˜๊ธฐ ์ „์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ชฉ์ ์ง€ ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ๋ฐฐ๋‚ญ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • x โ€” ์ปจํ…Œ์ด๋„ˆ ํฌํ•จ โ€” ๊ฒ€ํ”„์— X, ๊ธฐ๋ณธ๊ฐ’ 65535(์ž๋™). ์ง€์ƒ์— ์žˆ์„ ๋•Œ - ์›”๋“œ X, ๊ธฐ๋ณธ ์บ๋ฆญํ„ฐ X.
  • y - Y ๊ฒ€ํ”„ ๋˜๋Š” ์„ธ๊ณ„ Y; ๊ธฐ๋ณธ๊ฐ’์€ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ์šฐ 65535, ๋žœ๋“œ์˜ ๊ฒฝ์šฐ Y ๋ฌธ์ž์ž…๋‹ˆ๋‹ค.
  • z โ€” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ์˜ ๋†’์ด๋Š” 0 ๋˜๋Š” ์ง€๋ฉด์— ์žˆ๋Š” ์บ๋ฆญํ„ฐ์˜ Z์ž…๋‹ˆ๋‹ค.
  • timeout โ€” ์ผ๊ณฑ ๋ฒˆ์งธ ์ธ์ˆ˜: ์ตœ๋Œ€ ๋Œ€๊ธฐ ์‹œ๊ฐ„(ms), ๊ธฐ๋ณธ๊ฐ’ 1000; ์Œ์ˆ˜ ๊ฐ’์€ 0์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿ ๋ฒˆ์งธ waitConfirmation=true์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • waitConfirmation โ€” ์—ฌ๋Ÿ ๋ฒˆ์งธ ์ธ์ˆ˜: true/1์—๋Š” ๊ด€์ฐฐ๋œ ์„ธ๊ณ„ ๋ณ€ํ™”์— ๋Œ€ํ•œ ๊ธฐ๋Œ€๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. false/0(๊ธฐ๋ณธ๊ฐ’)์€ ์š”์ฒญ ์ „์†ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int 1 โ€” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์บก์ฒ˜ ๋ฐ ์žฌ์„ค์ • ์š”์ฒญ์„ ์ˆ˜๋ฝํ–ˆ์Šต๋‹ˆ๋‹ค. 0โ€”์š”์ฒญ์„ ์™„๋ฃŒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. waitConfirmation=true ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ/์ขŒํ‘œ์˜ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ณ€๊ฒฝ ๋˜๋Š” ์›๋ž˜ ์Šคํƒ์˜ ๊ฐ์†Œ๊ฐ€ ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ƒˆ๋กœ์šด ์Šคํƒ์˜ serial๋„ ์•„๋‹ˆ๊ณ  ์ „์†ก๋œ ์•„์ดํ…œ์˜ ๊ฐœ์ˆ˜๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์šด์˜์„ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช…๋ น์˜ ๊ฒฐ๊ณผ๋Š” ์ˆซ์ž ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. 1๋Š” ์ถฉ์กฑ๋œ ์กฐ๊ฑด์„ ์˜๋ฏธํ•˜๊ณ , 0๋Š” ์ถฉ์กฑ๋˜์ง€ ์•Š์€ ์กฐ๊ฑด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. var result = command(...) ํ›„์— (๊ฒฐ๊ณผ != 0) ๋˜๋Š” (๊ฒฐ๊ณผ == 0)์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”. ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ํ•ด๋‹น ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ด๋ฏธ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • 1๋ถ€ํ„ฐ 8๊นŒ์ง€์˜ ๋ชจ๋“  ์ธ์ˆ˜ ๊ธธ์ด๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. x๊ฐ€ ์ฃผ์–ด์ง€๋ฉด y/z๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค๋ช…๋œ ๊ธฐ๋ณธ๊ฐ’์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์•Œ๋ ค์ง„ ๋Œ€์ƒ ์ด๋ฆ„์€ ์บก์ฒ˜ ์ „์— ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ์ ‘์ง€์˜ ๊ฒฝ์šฐ ๋ช…์‹œ์ ์œผ๋กœ ground/0๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด๋ฆ„์— ์˜คํƒ€๊ฐ€ ์žˆ์–ด๋„ ํ•ด๋‹น ํ•ญ๋ชฉ์„ ๋ฐ”๋‹ฅ์— ๋˜์ ธ์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
  • ์•„์ดํ…œ์€ ์ƒ์ž, ๊ฐ€๋ฐฉ ๋˜๋Š” ๋ฐฐ๋‚ญ์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ground๋Š” ์›๋ž˜ ์ปจํ…Œ์ด๋„ˆ์— ๊ด€๊ณ„์—†์ด ์ง€์ƒ์— ๋ชฉ์ ์ง€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ๊ฐ€์Šด์ด๋‚˜ type๊ฐ€ ์•„๋‹Œ ํ•ญ๋ชฉ ์ž์ฒด์˜ serial์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํŒ€์€ ํƒœํด ์ž์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ๋งˆ์šฐ์Šค๋กœ ํ•ญ๋ชฉ์„ ์žก์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • DropCheckCoord๊ฐ€ ์ผœ์ง€๋ฉด 2์…€์„ ๋„˜์–ด ๋•…์— ํˆฌ๊ธฐ๊ฐ€ ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์ถ”๊ฐ€๋กœ ๊ณต๊ฐ„ ๊ฐ€์šฉ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. X/Y - ๊ฒ€ํ”„ ํ”ฝ์…€์ด ์•„๋‹Œ ์…€์„ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. Zโ€”๋„ค๊ฑฐํ‹ฐ๋ธŒ๋ฅผ ํฌํ•จํ•œ ์„ ํƒํ•œ ํ‘œ๋ฉด์˜ ๋†’์ด. ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ์šฐ X/Y๋Š” ์—ฌ์ „ํžˆ ์šฉ๊ธฐ ๋‚ด๋ถ€์˜ ์žฅ์†Œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ ์„ธ๊ณ„์˜ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ์Šคํƒ์˜ ๊ฒฝ์šฐ ์ˆ˜๋Ÿ‰ ๊ฐ์†Œ, ์ „์ฒด์˜ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ, ์ง€์ƒ์˜ ๊ฒฝ์šฐ ๋˜ ๋‹ค๋ฅธ X/Y/Z. ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๊ฒ€ํ”„์˜ ์ •ํ™•ํ•œ ์œ„์น˜๋Š” ์ด๋Ÿฌํ•œ ์˜ˆ์ƒ์œผ๋กœ ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šคํƒ์ด ์‚ฌ๋ผ์ง€๊ฑฐ๋‚˜ ๋ณ‘ํ•ฉ๋˜๋ฉด ํ™•์ธ์ด ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ๋ณ„๋„์˜ ๊ฑฐ๋ž˜ ID ํ™•์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์ด ์ด๋ฏธ ๋™์ผํ•œ ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ผ์น˜ํ•œ๋‹ค๊ณ  ํ•ด์„œ Gump ๋‚ด์—์„œ ์ƒˆ๋กœ์šด ์ด๋™์ด ์ฆ๋ช…๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ๋ฐฐ๋‚ญ ์† ์•„์ดํ…œ ์ „์ฒด๊ฐ€ ๋‹ค์ด๋ ‰ํŠธ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค

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

  • ์ „๋ฆฌํ’ˆ - ์ด๋ฆ„ AddObject; ๊ธˆ์•ก์ด ๋ˆ„๋ฝ๋˜์—ˆ์œผ๋ฉฐ 0๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชฉ์ ์ง€๋Š” ๋ฐฐ๋‚ญ์ž…๋‹ˆ๋‹ค.
  • ํŠน์ • ์œ ํ˜•์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์ด ์•„๋‹Œ ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ/์Šคํƒ์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
var ok = UO.MoveItem("loot");
UO.Print("Move request: " + Convert.ToString(ok));

2. ํŠน์ • ๊ฐ€์Šด ์œ„์น˜์— ๋Œ€ํ•œ ์Šคํƒ์˜ ์ผ๋ถ€ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • amount=10 ํ•œ ์Šคํƒ์˜ ๋‹จ์œ„, chest๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„, x/y=60/70, ๊ฒ€ํ”„ ๋‚ด๋ถ€, z=0.
  • ์ˆ˜๋Ÿ‰์— MassMove์—์„œ ์ฑ„ํƒํ•œ "10์Šคํƒ" ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var ok = UO.MoveItem("loot", 10, "chest", 60, 70, 0);
    return null;
}

3. ์บ๋ฆญํ„ฐ ์•„๋ž˜ ํ† ์ง€๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

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

  • ground๋Š” ํ† ์ง€๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ X/Y/Z๋Š” ์บ๋ฆญํ„ฐ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ์ง€์ ์˜ ๊ฒฝ์šฐ ๋ฒ”์œ„์™€ DropCheckCoord๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์„ธ๊ณ„ ์ขŒํ‘œ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
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 ok = UO.MoveItem("loot", 0, "ground");
        return null;
    }
}

4. ๊ฐ€์Šด๋ถ€ํ„ฐ ์บ๋ฆญํ„ฐ ์˜† ๋•…๋ฐ”๋‹ฅ๊นŒ์ง€ - ์ง์ ‘ ๋Œ€๋ณธ

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

  • ground_item - ์„ ํƒํ•œ ์•„์ดํ…œ์„ ์—ด๋ฆฐ ์ƒ์ž์— serial ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์›๋ž˜ ์ƒ์ž๋Š” ๋ณ„๋„์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. amount=0๋Š” ์ „์ฒด ์Šคํƒ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 10๋Š” ์ด ์Šคํƒ์˜ ์ตœ๋Œ€ 10๊ฐœ ๋‹จ์œ„๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ground๋Š” ํ† ์ง€๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. x/y โ€” ๋ฌธ์ž๋กœ๋ถ€ํ„ฐ X๋ฅผ ๋”ฐ๋ผ ํ•œ ์…€์— ์žˆ๋Š” ์…€์˜ ์ ˆ๋Œ€ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. z๋Š” ๋ฌธ์ž์—์„œ ๋”ฐ์˜จ ๊ฒƒ์ด๋ฉฐ ์ธ์ ‘ํ•œ ํ‘œ๋ฉด์˜ ๋†’์ด๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๊ณ„๋‹จ, ํ…Œ์ด๋ธ”, ๊ธฐํƒ€ ๋ฐ”๋‹ฅ์— ์›ํ•˜๋Š” ํ‘œ๋ฉด์˜ ์‹ค์ œ Z๋ฅผ ์„ค์ •ํ•˜์„ธ์š”.
  • sent=1๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ์„œ๋ฒ„ ํ™•์ธ์ด ์˜ˆ์ƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0 ๊ฐ’์€ ์š”์ฒญ์ด ์‹คํŒจํ–ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ˆซ์ž ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค int 1/0: check sent != 0 ๋˜๋Š” sent == 0; bool์™€์˜ ๋น„๊ต๋Š” ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฐœ์—์„œ ์ง์ ‘ ์žฌ์„ค์ •ํ•˜๋ ค๋ฉด UO.MoveItem('ground_item', 0, 'ground')์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์„ธ ์ขŒํ‘œ๋Š” ๋ชจ๋‘ ์บ๋ฆญํ„ฐ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ƒ์ž ์•ˆ์— ๋ฐฐ์น˜ํ•˜๋ ค๋ฉด ground ๋Œ€์‹  serial/์ƒ์ž ์ด๋ฆ„๊ณผ ๊ฒ€ํ”„ ์ขŒํ‘œ๋ฅผ ์ง€์ •ํ•˜์„ธ์š”.
UO.AddObject("ground_item");
var x = UO.GetX() + 1;
var y = UO.GetY();
var z = UO.GetZ();
var sent = UO.MoveItem("ground_item", 0, "ground", x, y, z);
if (Truth(sent == 1))
{
    UO.Print("Ground move request sent");
}
else
{
    UO.Print("Ground move request was not sent");
}

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

5. ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ํ™•์ธ ์š”์ฒญ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • waitConfirmation=true์ด๋ฏ€๋กœ timeout=1500ms๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. x/y=-1 โ€” ์ž๋™ ๋ฐฐ์น˜.
  • 0๋Š” ์ด๋ฏธ ์ „์†ก๋œ ์š”์ฒญ์— ๋Œ€ํ•œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งน๋ชฉ์ ์œผ๋กœ ์ „์†ก์„ ๋ฐ˜๋ณตํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋จผ์ € ์ƒํ’ˆ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”.
return  RunScenario();
 object? RunScenario()
{
    var ok = UO.MoveItem("loot", 0, "backpack", -1, -1, 0, 1500, true);
    if (Truth(ok == 0))
    {
        UO.Print("Move was rejected or not confirmed");
    }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int MoveItem(InjectionValue id)

            => CompactMoveItem(new[] { id });

UO.MoveItem(id, amount) โ€” UO.MoveItem(Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int MoveItem(InjectionValue id, InjectionValue amount)

            => CompactMoveItem(new[] { id, amount });

UO.MoveItem(id, amount, targetContainer) โ€” UO.MoveItem(Any,Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int MoveItem(InjectionValue id, InjectionValue amount, InjectionValue targetContainer)

            => CompactMoveItem(new[] { id, amount, targetContainer });

UO.MoveItem(item, amount, container, x) โ€” UO.MoveItem(Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactMoveItem(values))

UO.MoveItem(item, amount, container, x, y) โ€” UO.MoveItem(Any,Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactMoveItem(values))

UO.MoveItem(id, amount, targetContainer, x, y, z) โ€” UO.MoveItem(Any,Any,Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int MoveItem(InjectionValue id, InjectionValue amount, InjectionValue targetContainer, InjectionValue x, InjectionValue y, InjectionValue z)

            => CompactMoveItem(new[] { id, amount, targetContainer, x, y, z });

UO.MoveItem(item, amount, container, x, y, z, timeout) โ€” UO.MoveItem(Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: item (Any), amount (Any), container (Any), x (Any), y (Any), z (Any), timeout (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactMoveItem(values))

UO.MoveItem(item, amount, container, x, y, z, timeout, waitConfirmation) โ€” UO.MoveItem(Any,Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: item (Any), amount (Any), container (Any), x (Any), y (Any), z (Any), timeout (Any), waitConfirmation (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactMoveItem(values))

UO.MoveItems

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

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

dynamic UO.MoveItems(object? container, object? itemsType, object? itemsColor, object? moveIntoID, object? x, object? y, object? z, object? delayMS);

๋ชจ๋“  ์ ํ•ฉํ•œ ํ’ˆ๋ชฉ์„ ํ•œ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋˜๋Š” ์ง€์ƒ์œผ๋กœ ์ง์ ‘ ์˜ฎ๊น๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์€ graphic ๋ฐ hue์— ์˜ํ•ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์Šคํƒ์€ ์™„์ „ํžˆ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฌผ๊ฑด์„ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด์ง€ ์บ๋ฆญํ„ฐ ๊ฑท๊ธฐ๋‚˜ MassMove์˜ ๋Œ€ํ™”ํ˜• ํ™œ์„ฑํ™”๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

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

  • container โ€” backpack, "backpack", ์ด๋ฆ„ AddObject ๋˜๋Š” hex-ID์™€ ๊ฐ™์€ ์†Œ์Šค ์ปจํ…Œ์ด๋„ˆ์˜ ์ผ๋ จ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ ๊ฐ€ ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 0์€ ์œ ํšจํ•œ ์ถœ์ฒ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ground๋Š” ์บ๋ฆญํ„ฐ ์ฃผ๋ณ€์˜ ์‚ฌ๋ฌผ์„ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฐ๋‚ญ์˜ ๊ฒฝ์šฐ self ๋Œ€์‹  backpack๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • itemsType - ๊ทธ๋ž˜ํ”ฝ ํ•ญ๋ชฉ(์˜ˆ: 0x0EED) - ๊ธˆ. ID ์‚ฌ๋ฌผ๋„ ์•„๋‹ˆ๊ณ  mobile ๋ชธ๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์Œ์ˆ˜ ๋˜๋Š” 0xFFFF - ๋ชจ๋“  ์œ ํ˜•. ๋ฐฐ์—ด/์œ ํ˜• ๋งˆ์Šคํฌ๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • itemsColor โ€” Hue ๊ฒƒ๋“ค. -1(๋˜๋Š” ๊ธฐํƒ€ ์Œ์ˆ˜) ๋ฐ 0xFFFF - ๋ชจ๋‘; 0 - hue 0์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. serial๋„ ์•„๋‹ˆ๊ณ  ์•…๋ช…๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • moveIntoID โ€” ๋Œ€์ƒ ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” ๊ฐœ์ฒด ๋ณ„์นญ์˜ ์ผ๋ จ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค. ๋ฐฐ๋‚ญ์šฉ - backpack. ํ† ์ง€์˜ ๊ฒฝ์šฐ - ์ˆซ์ž 0 (๋˜ํ•œ ground/"ground"/UO.Ground()). ์†Œ์Šค์™€ ๋Œ€์ƒ์ด ๋‹ฌ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค. - ์ด ๋ช…๋ น์—์„œ 1๋Š” backpack์˜ ์•ฝ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. Self - serial mobile ๋ฐฐ๋‚ญ์„ ์ž๋™์œผ๋กœ ๊ต์ฒดํ•˜๋Š” ๋Œ€์‹ .
  • x โ€” 0์ด ์•„๋‹Œ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ์šฐ ๊ฒ€ํ”„ ๋‚ด๋ถ€์˜ ์œ„์น˜์ž…๋‹ˆ๋‹ค. -1,-1 ๋ฐฐ์น˜๋Š” ์„œ๋ฒ„์— ๋งก๊ธฐ์„ธ์š”. ์ง€์ƒ - ์„ธ๊ณ„ ์ขŒํ‘œ 0..65535, ๋‘˜ ๋‹ค ํ•„์ˆ˜์ด๋ฉฐ ์Œ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์„ธ๊ณ„์˜ ํ™”๋ฉด ํ”ฝ์…€๋„ ์•„๋‹ˆ๊ณ  ๊ฒฝ๋กœ์˜ ๋์ ๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • y โ€” 0์ด ์•„๋‹Œ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฒฝ์šฐ ๊ฒ€ํ”„ ๋‚ด๋ถ€์˜ ์œ„์น˜์ž…๋‹ˆ๋‹ค. -1,-1 ๋ฐฐ์น˜๋Š” ์„œ๋ฒ„์— ๋งก๊ธฐ์„ธ์š”. ์ง€์ƒ - ์„ธ๊ณ„ ์ขŒํ‘œ 0..65535, ๋‘˜ ๋‹ค ํ•„์ˆ˜์ด๋ฉฐ ์Œ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์„ธ๊ณ„์˜ ํ™”๋ฉด ํ”ฝ์…€๋„ ์•„๋‹ˆ๊ณ  ๊ฒฝ๋กœ์˜ ๋์ ๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • z โ€” ์ง€์ƒ์— ๋ฐฐ์น˜ํ–ˆ์„ ๋•Œ ์„ธ๊ณ„์˜ ๋†’์ด. ์‚ฌ์ดํŠธ์˜ ์‹ค์ œ ๊ณ ๋„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(ํ”„๋กœํ† ์ฝœ ๋ฒ”์œ„ -128..127). ์ปจํ…Œ์ด๋„ˆ ์˜ˆ์‹œ์—์„œ๋Š” 0๋ฅผ ํ‘œ์‹œํ•˜์„ธ์š”. ์ด๊ฒƒ์€ ์žฅ๋น„ ๋ ˆ์ด์–ด ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • delayMS โ€” ์Šน์ธ๋œ ์š”์ฒญ ๊ฐ„์˜ ์ง€์—ฐ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” max(GrabDelay, max(0, DelayMS)); ๋งˆ์ง€๋ง‰ ์ „์†ก์ด ์ „์†ก๋œ ํ›„์—๋„ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. 350๋Š” 350 ํ•ญ๋ชฉ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์œผ๋ฉฐ 350ms ์•ˆ์— ํ™•์ธ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

๋“ฑ๋ก object? ํ•˜๋‚˜ ์ด์ƒ์˜ ์ „์†ก ์š”์ฒญ์ด ์Šน์ธ๋˜๋ฉด ์‹ค์ œ๋กœ๋Š” int 1/true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0/false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•ญ๋ชฉ ์ˆ˜๋‚˜ ๋ชจ๋“  ๊ฒฝ๊ธฐ๊ฐ€ ์ด์›”๋œ๋‹ค๋Š” ๋ณด์žฅ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•œ ํ›„ ๋‚ด์šฉ์„ ํ™•์ธํ•˜์„ธ์š”. ๊ธด๊ธ‰ ์ทจ์†Œ๋Š” ์ ˆ์ฐจ๋ฅผ ์ค‘๋‹จํ•˜๋ฉฐ false๋ฅผ ๋ฐ˜ํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

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

1. ์„ ํƒํ•œ ์ƒ์ž์—์„œ ๋ฐฐ๋‚ญ์œผ๋กœ ๊ธˆ์„ ๋ชจ์œผ์‹ญ์‹œ์˜ค - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 0x0EED - type ๊ณจ๋“œ; -1 ~ ItemsColor - ๋ชจ๋“  hue. -1,-1 ์ดํ›„ backpack๋Š” ์ง€๋ฉด์ด ์•„๋‹Œ ๊ฒ€ํ”„์—์„œ์˜ ์ž๋™ ์œ„์น˜์ž…๋‹ˆ๋‹ค. 350 ms - GrabDelay์„ ๊ณ ๋ คํ•œ ์ตœ์†Œ ์›ํ•˜๋Š” ์ง€์—ฐ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ง์„  ๋”๋ฏธ์˜ ๊ธˆ์€ ์ „์ฒด๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.
var source = Asc(UO.GetSerial("lasttarget"), 0);
if (Truth(source == 0) || Truth(source == UO.Backpack()) || !(Truth(UO.Exists(source))))
{
    return null;
}
var sent = UO.MoveItems(source, 0x0EED, -1, "backpack", -1, -1, 0, 350);
if (Truth(Truth(sent) == false))
{
    UO.Print("No gold transfer request was accepted");
}

int Asc(object? value, int fallback = 0) { string text = Convert.ToString(value) ?? ""; if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback; return int.TryParse(text, out int number) ? number : fallback; }
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. ๊ฐ€์Šด ๊ฒ€ํ”„์˜ ์ง€์ •๋œ ์œ„์น˜์— ๋ถ•๋Œ€๋ฅผ ๋†“์Šต๋‹ˆ๋‹ค - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 0x0E21 - ์ธ์ฒด๊ฐ€ ์•„๋‹Œ ๋ถ•๋Œ€. backpack๋Š” ์†Œ์Šค์ด๊ณ , ๋Œ€์ƒ์€ ๊ฐ€์Šด์˜ serial์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒฝ๊ธฐ๋Š” ํ•œ ์ ์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค 30,40; ์„œ๋ฒ„๋Š” ์Šคํƒ์„ ๋ณ‘ํ•ฉํ•˜๊ฑฐ๋‚˜ ์œ„์น˜๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var destination = Asc(UO.GetSerial("lasttarget"), 0);
    if (Truth(destination == 0) || Truth(destination == UO.Backpack()) || !(Truth(UO.Exists(destination))))
    {
        return null;
    }

    var sent = UO.MoveItems("backpack", 0x0E21, -1, destination, 30, 40, 0, 350);
    if (Truth(sent != 0))
    {
        UO.Print("Transfer requested; verify the destination contents");
    }

    return null;
}

int Asc(object? value, int fallback = 0)
{
    string text = Convert.ToString(value) ?? "";
    if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
        return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
    return int.TryParse(text, out int number) ? number : fallback;
}

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

3. ์„ ํƒํ•œ type์˜ ๋ชจ๋“  ์ง์„  ์Šคํƒ์„ ๋ฐ”๋‹ฅ์— ๋‚˜๋ž€ํžˆ ๋†“์Šต๋‹ˆ๋‹ค. - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • itemType๋Š” ์ˆ˜๋Ÿ‰์ด ์•„๋‹Œ ์œ ํ˜•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ง์„  ์Šคํƒ์€ ๋ฐฐ๋‚ญ์— ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค. X+1/Y/Z๋Š” ๋™์ผํ•œ ๋†’์ด์— ์žˆ๋Š” ์ธ์ ‘ ์ง€์ ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ๊ฒฝ์‚ฌ๋ฉด/๋ฒฝ์˜ ๊ฒฝ์šฐ ์˜ฌ๋ฐ”๋ฅธ ์ขŒํ‘œ๋ฅผ ์„ ํƒํ•˜์„ธ์š”. 0 ์›”๋“œ ๋ชจ๋“œ์—๋Š” ํ• ๋‹น์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. true๋Š” ์ˆ˜๋ฝ๋œ ์š”์ฒญ์— ๋Œ€ํ•ด์„œ๋งŒ ๋งํ•˜๊ณ , ์ถœ์‹œ๋œ ๋ฐฐ๋‚ญ์— ๋Œ€ํ•ด์„œ๋Š” ๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        if (!(Truth(DropTypeBesideMe(0x0EED))))
        {
            UO.Print("No ground drop request was accepted");
        }

        return null;
    }

    dynamic DropTypeBesideMe(dynamic itemType)
    {
        if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
        {
            return false;
        }

        var x = UO.GetX() + 1;
        var y = UO.GetY();
        var z = UO.GetZ();
        return UO.MoveItems("backpack", itemType, -1, 0, x, y, z, 350);
    }

    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.MoveItems(container, itemsType, itemsColor, moveIntoID, x, y, z, delayMS) โ€” UO.MoveItems(Any,Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: container (Any), itemsType (Any), itemsColor (Any), moveIntoID (Any), x (Any), y (Any), z (Any), delayMS (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "moveitems": return new InjectionValue(bridge.MoveItems(Arg(0), ResolveType(arguments[1]), Arg(2), Arg(3), Arg(4), Arg(5), Arg(6), Arg(7)));

UO.Name

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

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

string UO.Name();

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

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์Œ: self๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ๋นˆ ๋ฌธ์ž์—ด์€ ๋ช…์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ "0" ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
var text = UO.Name();
if (Truth(text != ""))
{
    UO.Print(text);
}
else
{
    UO.Print("Text is unavailable");
}

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

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

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

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

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

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

  • ๋‘ ํ˜ธ์ถœ ๋ชจ๋‘ self๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. UO.Wait๋Š” ์ผ์‹œ ์ •์ง€ 1000ms๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ ์ฐจ์ด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ์„ธ์ƒ์„ ๋– ๋‚˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ์ด๋ฆ„์ด๋‚˜ ์ œ๋ชฉ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var previous = UO.Name();
        await Delay(1000);
        var current = UO.Name();
        if (Truth(previous != current))
        {
            UO.Print("Updated text: " + current);
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.Name() โ€” UO.Name()

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.GetName(bridge.Self)

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


UO.Picking

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

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

int UO.Picking();

ํด๋ผ์ด์–ธํŠธ์˜ ์ปค์„œ๊ฐ€ ์ฃผ์šด ์•„์ดํ…œ์— ์˜ํ•ด ์ ์œ ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int 1 - ItemHold.ํ™œ์„ฑํ™”๋œ ์„ธํŠธ; 0 - ์„ค์น˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Š” ID์ด๋‚˜ ์„œ๋ฒ„ ์ „๋‹ฌ ํ™•์ธ์ด ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šค๋‚˜ ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ๋กœ ์„ ํƒํ•œ ๊ฐœ์ฒด๊ฐ€ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.

๋ช…๋ น์˜ ๊ฒฐ๊ณผ๋Š” ์ˆซ์ž ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. 1๋Š” ์ถฉ์กฑ๋œ ์กฐ๊ฑด์„ ์˜๋ฏธํ•˜๊ณ , 0๋Š” ์ถฉ์กฑ๋˜์ง€ ์•Š์€ ์กฐ๊ฑด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. var result = command(...) ํ›„์— (๊ฒฐ๊ณผ != 0) ๋˜๋Š” (๊ฒฐ๊ณผ == 0)์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”. ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ํ•ด๋‹น ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ด๋ฏธ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋…์„œ๋Š” ๋ฌผ๊ฑด์„ ์ง‘๊ฑฐ๋‚˜ ๋–จ์–ด๋œจ๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ง์ ‘ ์ „์†กํ•˜๋ ค๋ฉด Drag/DragItem ๊ฒฐ๊ณผ๋„ ํ™•์ธํ•˜์„ธ์š”. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋ฐ”์œ ์ปค์„œ๊ฐ€ ์›ํ•˜๋Š” ํ•ญ๋ชฉ์„ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฐ€์ ธ์™”๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ƒํƒœ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋…ผ์Ÿ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • 1 ๋˜๋Š” 0์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
UO.Print(Convert.ToString(UO.Picking()));

2. ๊ทธ๋ฆฝ ์ „ ์‚ฌ์šฉ ์ค‘์ธ ์† ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ํ•˜๋‚˜์˜ ์ธ์ˆ˜ Drag๋Š” ์ „์ฒด ์Šคํƒ์„ ์˜๋ฏธํ•˜๋ฉฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ=0์ž…๋‹ˆ๋‹ค.
  • Picking ํด๋ผ์ด์–ธํŠธ์˜ ๊ณต์œ  ์ปค์„œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ๋‘ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‹คํ–‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Picking() == 0))
    {
        if (Truth(UO.Drag("loot")))
        {
            var dropped = UO.DropItem("backpack", -1, -1, 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;

3. ์ œํ•œ์ด ์žˆ๋Š” ์ž์œ  ์ปค์„œ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ํ™•์ธ์€ 50 ms์˜ ์ผ์‹œ ์ค‘์ง€๋ฅผ ํ†ตํ•ด ์ตœ๋Œ€ 20ํšŒ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ์ปค์„œ๋ฅผ ํ•ด์ œํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ด๋™์„ ์ทจ์†Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var tries = 0;
        while (Truth(UO.Picking()) && Truth(tries < 20))
        {
            await Delay(50);
            tries = tries + 1;
        }

        if (Truth(UO.Picking()))
        {
            UO.Print("Cursor is still occupied");
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.Picking() โ€” UO.Picking()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

UO.ReceiveObjectName

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

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

void UO.ReceiveObjectName(object? id);
void UO.ReceiveObjectName(object? id, object? timeout);

์›ํด๋ฆญ ์š”์ฒญ์œผ๋กœ ๊ฐ์ฒด์˜ ์ด๋ฆ„์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • Bridge.ReceiveObjectName๋Š” Click(id)๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ GetName(id)๊ฐ€ ๋น„์–ด ์žˆ์„ ๋•Œ๊นŒ์ง€ max(0,timeout)๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. 25ms ์ด์ƒ ์ผ์‹œ ์ค‘์ง€ํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด๋ฏธ ์ž˜ ์•Œ๋ ค์ง„ ์ด๋ฆ„์ด ์žˆ์œผ๋ฉด ๋Œ€๊ธฐ๊ฐ€ ์ฆ‰์‹œ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  • ํƒ€์ž„์•„์›ƒ์ด ์—†์œผ๋ฉด Click๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ์ด๋ฆ„์ด ์—†์Šต๋‹ˆ๋‹ค. GetName๋ฅผ ๋ณ„๋„๋กœ ์ฝ์œผ์„ธ์š”. ๋Œ€๊ธฐ๊ฐ€ ๋๋‚˜๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์›ํด๋ฆญ ์š”์ฒญ์œผ๋กœ ๊ฐ์ฒด์˜ ์ด๋ฆ„์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
UO.ReceiveObjectName("lasttarget");

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

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

  • Bridge.ReceiveObjectName๋Š” Click(id)๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ GetName(id)๊ฐ€ ๋น„์–ด ์žˆ์„ ๋•Œ๊นŒ์ง€ max(0,timeout)๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. 25ms ์ด์ƒ ์ผ์‹œ ์ค‘์ง€ํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด๋ฏธ ์ž˜ ์•Œ๋ ค์ง„ ์ด๋ฆ„์ด ์žˆ์œผ๋ฉด ๋Œ€๊ธฐ๊ฐ€ ์ฆ‰์‹œ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.Exists("lasttarget")))
    {
        UO.ReceiveObjectName("lasttarget", 1000);
    }

    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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ํƒ€์ž„์•„์›ƒ์ด ์—†์œผ๋ฉด Click๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ์ด๋ฆ„์ด ์—†์Šต๋‹ˆ๋‹ค. GetName๋ฅผ ๋ณ„๋„๋กœ ์ฝ์œผ์„ธ์š”. ๋Œ€๊ธฐ๊ฐ€ ๋๋‚˜๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
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.ReceiveObjectName(id, 1000);
            UO.Print(UO.GetName(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;
}

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void ReceiveObjectName(InjectionValue id) => bridge.ReceiveObjectName(GetObject(id), 0);

UO.ReceiveObjectName(id, timeout) โ€” UO.ReceiveObjectName(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void ReceiveObjectName(InjectionValue id, InjectionValue timeout) => bridge.ReceiveObjectName(GetObject(id), NumberConversions.ToInt(timeout));

UO.TicksUse

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

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

int UO.TicksUse();

์ €์žฅ๋œ ๋งˆํฌ TicksUse๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int โ€” ๋Ÿฐํƒ€์ž„ ์‹œ์ž‘๋ถ€ํ„ฐ 10๋ถ„์˜ 1์ดˆ ์•ˆ์— UO.Timer๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. 0 - ๋งˆํฌ๊ฐ€ ์•„์ง ์„ค์ •๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์ฒ˜์Œ 10๋ถ„์˜ 1์ดˆ์— ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ€๋ฆฌ์ดˆ๋‚˜ ๋‹ฌ๋ ฅ ์‹œ๊ฐ„์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ticksUse ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. UseObject์— ์˜ํ•ด ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ˆ˜๋™/์„œ๋ฒ„ ํ™œ๋™์„ ์ž๋™์œผ๋กœ ๊ด€์ฐฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ช…๋ น ์ž์ฒด๋Š” ํ‘œ์‹œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • UO.Timer() - ์ด ํ‘œ์‹œ๋Š” 10๋ถ„์˜ 1์ดˆ ๋‹จ์œ„๋กœ ๋‚˜์ด๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋งˆํฌ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋Ÿฐํƒ€์ž„ ๊ฐ„์— ๋น„๊ต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์ €์žฅ๋œ ๋งˆํฌ TicksUse๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
var stamp = UO.TicksUse();
UO.Print(stamp);

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

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

  • ticksUse ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. UseObject์— ์˜ํ•ด ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ˆ˜๋™/์„œ๋ฒ„ ํ™œ๋™์„ ์ž๋™์œผ๋กœ ๊ด€์ฐฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ช…๋ น ์ž์ฒด๋Š” ํ‘œ์‹œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var stamp = UO.TicksUse();
    var ageTenths = UO.Timer() - stamp;
    UO.Print(ageTenths);
    return null;
}

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

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

  • UO.Timer() - ์ด ํ‘œ์‹œ๋Š” 10๋ถ„์˜ 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 before = UO.TicksUse();
        UO.Wait(250);
        var after = UO.TicksUse();
        UO.Print(before = after);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.TicksUse() โ€” UO.TicksUse()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int TicksUse() => ticksUse;

UO.UpdateObject

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

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

void UO.UpdateObject(object? id);

์ด๋ฏธ ๋กœ๋“œ๋œ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ๋ชจ๋ฐ”์ผ์˜ ๊ฒฝ์šฐ ํ•ญ๋ชฉ - SingleClick์— ๋Œ€ํ•ด RequestMobileStatus(..., true)๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. serial๊ฐ€ ๋‘ ๋กœ์ปฌ ํ…Œ์ด๋ธ” ๋ชจ๋‘์— ์—†์œผ๋ฉด ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์ด๋ฏธ ๋กœ๋“œ๋œ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.UpdateObject(id);
}

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

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

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

  • ๋ชจ๋ฐ”์ผ์˜ ๊ฒฝ์šฐ ํ•ญ๋ชฉ - SingleClick์— ๋Œ€ํ•ด RequestMobileStatus(..., true)๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. serial๊ฐ€ ๋‘ ๋กœ์ปฌ ํ…Œ์ด๋ธ” ๋ชจ๋‘์— ์—†์œผ๋ฉด ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.UpdateObject(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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.
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.UpdateObject(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.UpdateObject(id) โ€” UO.UpdateObject(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void UpdateObject(InjectionValue id) => bridge.UpdateObject(GetObject(id));

UO.UseFromGround

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

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

int UO.UseFromGround(object? @type);
int UO.UseFromGround(object? @type, object? color);

์ง€์ƒ/์„ธ๊ณ„์—์„œ ์ฃผ์–ด์ง„ graphic์˜ ๊ฐ์ฒด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ฆ‰์‹œ ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฐ๋‚ญ์„ ์—ฌ๋Š” ๋“ฑ ๊ฐ€๊นŒ์šด ๋ฌผ์ฒด์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๋Ÿฐํƒ€์ž„์˜ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ: ๊ฒ€์ƒ‰์€ FindType๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ ๋™์ผํ•œ body๋กœ mobile๋„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ํ•ญ๋ชฉ๋งŒ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ ๋ฐ˜๊ฒฝ๊ณผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์„ ํƒ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ํ•ญ๋ชฉ์˜ ๊ฒฝ์šฐ UseType(..., ground, ...)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

  • type - ํ•„์ˆ˜ graphic. ์˜ˆ๋ฅผ ๋“ค์–ด 0x0E75๋Š” ๋ฐฐ๋‚ญ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž ๋˜๋Š” ์ˆซ์ž 16์ง„์ˆ˜ ๋ฌธ์ž์—ด. ์Œ์ˆ˜/0xFFFF โ€” ๋ชจ๋“  graphic. 0x0190(๋‚จ์„ฑ) ๋ฐ 0x0191(์—ฌ์„ฑ)๊ณผ ๊ฐ™์€ ์‹ ์ฒด ๊ฐ’์€ mobile๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. type ํ•ญ๋ชฉ์„ ๋Œ€์ฒดํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด ์–‘์‹์—์„œ๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์ด ๋™์‹œ์— ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • color - ์„ ํƒ ์‚ฌํ•ญ hue, ๊ธฐ๋ณธ๊ฐ’ - 1(๋ชจ๋“  ๊ฒƒ). ์Œ์ˆ˜/0xFFFF - ๋ชจ๋‘, 0 - hue 0๋งŒ. ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ, ๊ฑฐ๋ฆฌ, ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฐ maxZ๋Š” ์ด ๋ช…๋ น์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int - ๋ฐœ๊ฒฌ๋œ ์ฒซ ๋ฒˆ์งธ ๊ฐœ์ฒด์˜ serial๋Š” UseObject ๋˜๋Š” 0์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ graphic๋„ ์•„๋‹ˆ๊ณ  true/false๋„ ์•„๋‹Œ ๊ฐœ์ฒด์˜ ๊ฐœ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐœ์ฒด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์„œ๋ฒ„์—์„œ ํ•ด๋‹น ๊ฐœ์ฒด์˜ ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. id != 0 ์™€ ์˜ˆ์ƒ๋˜๋Š” ๊ฒŒ์ž„ ํšจ๊ณผ๋ฅผ ๋ณ„๋„๋กœ ํ™•์ธํ•˜์„ธ์š”.

๋™์ž‘

  • ํ˜„์žฌ FindDistance ๋ฐ FindVertical๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  Ignore๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ์ปจํ…Œ์ด๋„ˆ๋Š” ground๋กœ ๊ณ ์ •๋˜๊ณ  ์ค‘์ฒฉ๋œ ์ฝ˜ํ…์ธ ๋Š” ํƒ์ƒ‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ์€ self๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋ช…/๊ฐ€์‹œ์„ฑ/์•…๋ช…์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ์ œํ•œ์€ ์—†์Šต๋‹ˆ๋‹ค.
  • FindItem/FindCount/GetFoundItems๋ฅผ ๋ชจ๋“  ๊ฒ€์ƒ‰ ์ผ์น˜ ํ•ญ๋ชฉ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜์ง€๋งŒ ์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋งŒ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒƒ์ด ๋ณด์žฅ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์›”๋“œ ๊ฐ์ฒด๋Š” ๋ชจ๋ฐ”์ผ๋ณด๋‹ค ๋จผ์ € ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐ๋‚ญ์— ์žˆ๋Š” ์•„์ดํ…œ์„ ์ง‘๊ฑฐ๋‚˜, ์บ๋ฆญํ„ฐ๋ฅผ ์›€์ง์ด์ง€ ์•Š์œผ๋ฉฐ, ์„œ๋ฒ„ ์‘๋‹ต์ด๋‚˜ ๋Œ€์ƒ์˜ ์ข…๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†์œผ๋ฉด ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด๋Ÿฐ ์กฐ์น˜ ์—†์ด ๊ฒ€์ƒ‰ํ•˜๋ ค๋ฉด UO.FindType๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

var result = UO.UseFromGround(0x0E75);
UO.Print("UseFromGround: " + Convert.ToString(result));

1. ํ‘œ์ค€ ์œ ํ˜•์˜ ๋ˆ„์›Œ์žˆ๋Š” ๋ฐฐ๋‚ญ ์—ด๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • type๋งŒ ํ•ด๋‹น; ๋ชจ๋“  hue. ํ˜„์žฌ FindDistance/FindVertical๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. bag - ์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ์˜ ID, ๋ฐ˜๋“œ์‹œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒฐ๊ณผ์ผ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ ๋Š” ์„œ๋ฒ„์—์„œ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์—ด๋ฆฝ๋‹ˆ๋‹ค.
var bag = UO.UseFromGround(0x0E75);
if (Truth(bag != 0))
{
    UO.AddObject("ground_bag", bag);
}
else
{
    UO.Print("No loaded ground backpack matches the search settings");
}

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

2. ๊ฐ™์€ ๋†’์ด ๊ทผ์ฒ˜์— ์›ํ•˜๋Š” ์ƒ‰์ƒ์˜ ๋ฐฑํŒฉ์„ ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๊ฒ€์ƒ‰์€ ๋‘ ๊ฐœ์˜ ์…€๋กœ ์ œํ•œ๋˜๋ฉฐ ๋™์ผํ•œ Z์ž…๋‹ˆ๋‹ค. ์ƒ‰์ƒ 0x0044๋Š” ์˜ˆ์‹œ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ƒ‰์ƒ์„ ์•„์ดํ…œ์˜ hue๋กœ ๋ฐ”๊พธ์„ธ์š”. ์˜ค๋ฅ˜๊ฐ€ ์žˆ์–ด๋„ ์„ค์ •์ด ๋ณต์›๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var oldDistance = UO.FindDistance();
    var oldZ = UO.FindVertical();
    try
    {
        UO.FindDistance(2);
        UO.FindVertical(0);
        var bag = UO.UseFromGround(0x0E75, 0x0044);
        if (Truth(bag != 0))
        {
            UO.AddObject("colored_ground_bag", bag);
        }
    }
    finally
    {
        UO.FindDistance(oldDistance);
        UO.FindVertical(oldZ);
    }

    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. ๋ช…์‹œ์  ๊ฒ€์ƒ‰ ๋ฐ˜๊ฒฝ์„ ํฌํ•จํ•œ ์ „์ฒด ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋ฐ˜๊ฒฝ์€ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜ UseFromGround ๋Œ€์‹  FindDistance๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. 3000 ms โ€” ์—ด๊ธฐ ํ™•์ธ์ด ์•„๋‹Œ ์˜ˆ์ œ๋ฅผ ๋ณด๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ฐฝ ์œ ํ˜• 3 - ์ปจํ…Œ์ด๋„ˆ. ์ด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋Š” ์ฐพ๊ธฐ*์— ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var selected = OpenGroundBagWithin(2);
        if (Truth(selected != 0))
        {
            await Delay(3000);
            UO.CloseClientUIWindow(3, selected);
        }

        return null;
    }

    dynamic OpenGroundBagWithin(dynamic radius)
    {
        var previous = UO.FindDistance();
        try
        {
            UO.FindDistance(radius);
            return UO.UseFromGround(0x0E75, -1);
        }
        finally
        {
            UO.FindDistance(previous);
        }
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int UseFromGround(InjectionValue type) => UseFromGround(type, new InjectionValue(-1));

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int UseFromGround(InjectionValue type, InjectionValue color)

        {

            int id = bridge.FindType(ResolveType(type), NumberConversions.ToInt(color), 1, -1, false);

            if (id != 0)

                UseObject(id);

            else

                SystemMessage("No matching item found on ground.");

            return id;

        }

UO.UseItemOnMobile

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

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

void UO.UseItemOnMobile(object? itemSerial, object? targetSerial);

์บ๋ฆญํ„ฐ์˜ ํƒ€๊ฒŸ์„ ์ค€๋น„ํ•˜๊ณ  ์•„์ดํ…œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • ExecuteClientApiCompatibility ๋จผ์ € ๋ธŒ๋ฆฌ์ง€WaitTargetObject(TargetSerial)๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ ๋ธŒ๋ฆฌ์ง€UseObject(ItemSerial)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” ๊ตํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ง์ ‘ ๋ธŒ๋ฆฌ์ง€ ํ˜ธ์ถœ์€ TicksTarget/TicksUse ๋Ÿฐํƒ€์ž„์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋Œ€์ƒ/ํ•ญ๋ชฉ ์œ ํ˜•์„ ํ™•์ธํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ปค์„œ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋Œ€์ƒ์„ ์ค€๋น„ํ•˜๋ฉด ๋น ๋ฅด๊ฒŒ ๋„์ฐฉํ•˜๋Š” ๋Œ€์ƒ์ด ๋ˆ„๋ฝ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์„œ๋ฒ„๋Š” ์—ฌ์ „ํžˆ ํ•ด๋‹น ์ž‘์—…์ด ์œ ํšจํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.UseItemOnMobile");
UO.UseItemOnMobile("0x40001234", "self");

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

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

  • ์บ๋ฆญํ„ฐ์˜ ํƒ€๊ฒŸ์„ ์ค€๋น„ํ•˜๊ณ  ์•„์ดํ…œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
UO.UseItemOnMobile("0x40001234", "self");

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

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

  • ExecuteClientApiCompatibility ๋จผ์ € ๋ธŒ๋ฆฌ์ง€WaitTargetObject(TargetSerial)๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ ๋ธŒ๋ฆฌ์ง€UseObject(ItemSerial)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” ๊ตํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ง์ ‘ ๋ธŒ๋ฆฌ์ง€ ํ˜ธ์ถœ์€ TicksTarget/TicksUse ๋Ÿฐํƒ€์ž„์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.GetSerial("lastobject");
    var mobile = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(item)) && Truth(UO.Exists(mobile)))
    {
        UO.UseItemOnMobile(item, 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;

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()
    {
        var item = UO.GetSerial("lastobject");
        if (Truth(UO.Exists(item)))
        {
            UO.UseItemOnMobile(item, "self");
            UO.Print(UO.Waiting());
        }

        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.UseItemOnMobile(itemSerial, targetSerial) โ€” UO.UseItemOnMobile(Any,Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "useitemonmobile": bridge.WaitTargetObject(Arg(1)); bridge.UseObject(Arg(0)); return InjectionValue.Unit;

UO.UseObject

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

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

void UO.UseObject(object? objID);

serial๋กœ ๊ฐ์ฒด์˜ ์‚ฌ์šฉ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ฆฌ์ง€ ํ†ตํ™” GameActions.DoubleClick; type ํ•ญ๋ชฉ์ด ๊ฒ€์ƒ‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • GetObject๋Š” ๋ณ„์นญ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์€ -1๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ ํ›„ ๋Ÿฐํƒ€์ž„์€ TicksUse๋ฅผ UO.Timer ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์˜ ํ™•์ธ์ด ์•„๋‹Œ ์š”์ฒญ์˜ ์ˆœ๊ฐ„์ž…๋‹ˆ๋‹ค.
  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • serial๋กœ ๊ฐ์ฒด์˜ ์‚ฌ์šฉ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ฆฌ์ง€ ํ†ตํ™” GameActions.DoubleClick; type ํ•ญ๋ชฉ์ด ๊ฒ€์ƒ‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.UseObject(id);
}

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

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

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

  • GetObject๋Š” ๋ณ„์นญ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์€ -1๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ ํ›„ ๋Ÿฐํƒ€์ž„์€ TicksUse๋ฅผ UO.Timer ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์˜ ํ™•์ธ์ด ์•„๋‹Œ ์š”์ฒญ์˜ ์ˆœ๊ฐ„์ž…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.UseObject(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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.
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.UseObject(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.UseObject(objID) โ€” UO.UseObject(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "useobject": bridge.UseObject(Arg(0)); return InjectionValue.Unit;

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void UseObject(int id)

        {

            bridge.UseObject(id);

            ticksUse = Timer();

        }

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

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

UO.UseType

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

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

int UO.UseType(object? @type);
int UO.UseType(object? @type, object? color);
int UO.UseType(object? @type, object? color, object? container);
int UO.UseType(object? @type, object? color, object? container, object? distance);
int UO.UseType(object? @type, object? color, object? container, object? distance, object? nearest);
int UO.UseType(object? @type, object? color, object? container, object? distance, object? nearest, object? maxZ);

์›ํ•˜๋Š” graphic/type ์ค‘ ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์„ ์ฐพ์•„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐฐ๋‚ญ์—์„œ ๋ฌผ์•ฝ์„ ๋งˆ์‹œ๊ฑฐ๋‚˜, ๊ทผ์ฒ˜์— ์žˆ๋Š” ๋ฐฐ๋‚ญ์„ ์—ด๊ฑฐ๋‚˜, ์„ ํƒํ•œ ์ƒ์ž์˜ ์•„์ดํ…œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์บ๋ฆญํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ์ด๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์— ๋ฒ”์œ„๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋Œ€์ƒ์„ ๋ณ„๋„๋กœ ์ค€๋น„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int - UseObject๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ํ•ญ๋ชฉ์˜ serial 0 ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†๋Š” ๊ฒฝ์šฐ. ReturnKind object์— ๋“ฑ๋กํ•ด๋„ ๋˜๋‚˜์š”? ์‹ค์ œ๋กœ ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” true/false ๋˜๋Š” ์„œ๋ฒ„์˜ ์‚ฌ์šฉ ํ™•์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค. Used == true ๋Œ€์‹  ์‚ฌ์šฉ๋จ != 0๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ํšจ๊ณผ๊ฐ€ ์„ฑ๊ณตํ•˜๋ ค๋ฉด ์ƒํƒœ, ๋‚ด์šฉ, ๋กœ๊ทธ์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • 1์—์„œ 6 ์ธ์ˆ˜. ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด ์ƒ‰์ƒ๊ณผ ์ปจํ…Œ์ด๋„ˆ๋„ ์ง€์ •ํ•˜์„ธ์š”. maxZ๋ฅผ ์ง€์ •ํ•˜๋ ค๋ฉด 6๊ฐœ ์œ„์น˜๋ฅผ ๋ชจ๋‘ ์™„๋ฃŒํ•˜์„ธ์š”. ๋ฐฐ์—ด type, ๋งˆ์Šคํฌ | ์ด ๋ช…๋ น์—์„œ๋Š” ์ถ”๊ฐ€ ๋ชฉํ‘œ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • int/string๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜ ์–‘์‹๊ณผ ํ™•์žฅ ์–‘์‹์€ CompactUseType๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค: ํ•ญ๋ชฉ๋งŒ, Ignore, ๊ฑฐ๋ฆฌ ๋ฐ ๋†’์ด; ์ปจํ…Œ์ด๋„ˆ๋Š” ์ด๋ฏธ ๋กœ๋“œ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๋”ฉ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ž๋™์œผ๋กœ ์—ด๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. FindItem/FindCount/GetFoundItems๋Š” ์ด ๋ถ„๊ธฐ์—์„œ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ณต์œ  ์†Œ์œ ์ž ๋ฐ ์ปจํ…Œ์ด๋„ˆ์˜ ๋†’์ด๋Š” ๊ฐ ์Šคํƒ์— ๋Œ€ํ•œ ์ˆœํšŒ ๋ฐ˜๋ณต์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ๋‹น ํ•œ ๋ฒˆ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์›ํ˜• ๋˜๋Š” ์ง€๋‚˜์น˜๊ฒŒ ๊นŠ์€ ์ปจํ…Œ์ด๋„ˆ ์ฒด์ธ(๋ฃจํŠธ๊ฐ€ ์—†๋Š” 128 ๋งํฌ)์€ ๋†’์ด ์ผ์น˜๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • 2๊ฐœ์˜ object?์˜ ๊ณตํ†ต ํ˜ธํ™˜ ๋“ฑ๋ก์„ ์œ ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ†ตํ™”๋ฅผ ๋ธŒ๋ฆฌ์ง€๋กœ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค.UseType ๋ฐฐ๋‚ญ ์œ„์—์„œ FindType๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฐพ๊ธฐ*๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์••์ถ• ํ˜•์‹์„ ์œ„ํ•ด์„œ๋Š” ๋ถ€์ ์ ˆํ•œ ๊ฐ’ ์œ ํ˜•์˜ ์•”์‹œ์  ๋ณ€ํ™˜๋ณด๋‹ค๋Š” int/string๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • UseObject๋Š” ์‹œ์ „ ๋™์ž‘์„ ๋ณด๋‚ด์ง€๋งŒ ๋ช…๋ น์€ ๋Œ€์ƒ, ์น˜์œ , ์Œ์ฃผ, ์ฐฝ ์—ด๊ธฐ, ์„œ๋ฒ„ ์žฅ์• ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๋ฒ”์œ„๋Š” ์„œ๋ฒ„์—์„œ ํ—ˆ์šฉํ•˜๋Š” ์‚ฌ์šฉ ๋ฒ”์œ„๋ฅผ ํ™•์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†์œผ๋ฉด ์••์ถ• ํ˜•์‹์€ ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์‡„ํ•˜๊ณ  0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž/์—ฐ๊ฒฐ์ด ์—†๋Š” ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๋Š” ํ–‰์œ„ ๊ถŒํ•œ์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ID์„ ์œ„ํ•ด์„œ๋Š” UO.UseObject๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

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

var result = UO.UseType(0x0F0C);
UO.Print("UseType: " + Convert.ToString(result));

1. ๋ฐฐ๋‚ญ์—์„œ ์น˜์œ  ๋ฌผ์•ฝ ์ ์šฉ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 0x0F0C๋Š” ํ‘œ์ค€ ์œ ํ˜•์˜ ์น˜์œ  ๋ฌผ์•ฝ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์บ๋ฆญํ„ฐ ์ƒํƒœ, ์ง€์—ฐ ์‹œ๊ฐ„ ๋˜๋Š” ์ž์ฒด ๊ทœ์น™์œผ๋กœ ์ธํ•ด ํ•ด๋‹น ์ž‘์—…์„ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ‰์ƒ๊ณผ ๋ฒ”์œ„๋Š” ๋ณ„๋„๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
if (!(Truth(UO.Connected())) || Truth(UO.Dead()))
{
    return null;
}
var used = UO.UseType(0x0F0C);
if (Truth(used == 0))
{
    UO.Print("No matching healing potion in the loaded backpack");
}
else
{
    UO.Print("Potion use requested; check health and the game message");
}

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

2. ๋‘ ์…€ ๋‚ด ์ง€์ƒ์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฐฐ๋‚ญ ์—ด๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 0x0E75 โ€” ๋ฐฐ๋‚ญ์˜ type, -1 โ€” ๋ชจ๋“  hue, ground โ€” ์„ธ๊ณ„์˜ ๋ฌผ์ฒด. 2 - ์…€ X/Y, true - ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด, 4 - ์ฐจ์ด Z. ๋ฐ˜ํ’ˆ ๊ฐ€๋ฐฉ โ€” ID. ์ฝ˜ํ…์ธ ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋Š” ์„œ๋ฒ„์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ํŒ€์€ ๋ฐฐ๋‚ญ์„ ์ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var bag = UO.UseType(0x0E75, -1, "ground", 2, true, 4);
    if (Truth(bag != 0))
    {
        UO.AddObject("nearby_bag", bag);
    }
    else
    {
        UO.Print("No suitable ground backpack within the selected bounds");
    }

    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. ๋ฏธ๋ฆฌ ์„ ํƒ๋œ ์ปจํ…Œ์ด๋„ˆ์˜ ์•„์ดํ…œ ์‚ฌ์šฉ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

  • itemType โ€” graphic ์‚ฌ๋ฌผ, ์†Œ์Šค โ€” ๋ณ„๋„์˜ serial ์ปจํ…Œ์ด๋„ˆ. ๋„์šฐ๋ฏธ๋Š” UseType์™€ ๋™์ผํ•˜๊ฒŒ serial/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 source = Asc(UO.GetSerial("lasttarget"), 0);
        if (Truth(source == 0) || !(Truth(UO.Exists(source))))
        {
            return null;
        }

        UO.AddObject("supply", source);
        var used = UseFromNamedSupply(0x0F0C);
        if (Truth(used == 0))
        {
            UO.Print("Supply item was not found with these filters");
        }

        return null;
    }

    dynamic UseFromNamedSupply(dynamic itemType)
    {
        var source = Asc(UO.GetSerial("supply"), 0);
        if (Truth(source == 0) || !(Truth(UO.Exists(source))))
        {
            return 0;
        }

        return UO.UseType(itemType, 0, source, 2, false, 16);
    }

    int Asc(object? value, int fallback = 0)
    {
        string text = Convert.ToString(value) ?? "";
        if (text.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
            return int.TryParse(text[2..], System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out int hex) ? hex : fallback;
        return int.TryParse(text, out int number) ? number : fallback;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.UseType(type) โ€” UO.UseType(Integer)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int UseType(int type) => UseType(type, -1);

UO.UseType(type) โ€” UO.UseType(String)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int UseType(string type) => UseType(ResolveType(type));

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

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

๊ฒฐ๊ณผ: int / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "usetype": return new InjectionValue(bridge.UseType(ResolveType(arguments[0]), arguments.Length > 1 ? Arg(1) : -1));

UO.UseType(type, color) โ€” UO.UseType(Integer,Integer)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int UseType(int type, int color) => CompactUseType(new[]

        {

            new InjectionValue(type),

            new InjectionValue(color)

        });

UO.UseType(type, color) โ€” UO.UseType(Integer,String)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int UseType(int type, string color) => UseType(type, NumberConversions.ToInt(color));

UO.UseType(type, color) โ€” UO.UseType(String,Integer)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int UseType(string type, int color) => UseType(ResolveType(type), color);

UO.UseType(type, color) โ€” UO.UseType(String,String)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int UseType(string type, string color) => UseType(ResolveType(type), NumberConversions.ToInt(color));

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactUseType(values))

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactUseType(values))

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactUseType(values))

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactUseType(values))

UO.UseWorldObject

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

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

void UO.UseWorldObject(object? serialOrName);

serialOrName๋ถ€ํ„ฐ GetObject๊นŒ์ง€ ํ™œ์„ฑํ™”ํ•˜๊ณ  UseObject๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ์ด๋ฆ„์€ ์ด๋ฆ„ graphic/type์ด ์•„๋‹Œ ๊ฐœ์ฒด ๋ณ„์นญ์ž…๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • UserObject์— ์ง์ ‘ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ๋“ฑ๋ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์„œ๋ฒ„ ์ „์ฒด ๊ฒ€์ƒ‰์ด ์•„๋‹Œ serial์˜ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์ž…๋‹ˆ๋‹ค.
  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • serialOrName๋ถ€ํ„ฐ GetObject๊นŒ์ง€ ํ™œ์„ฑํ™”ํ•˜๊ณ  UseObject๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ์ด๋ฆ„์€ ์ด๋ฆ„ graphic/type์ด ์•„๋‹Œ ๊ฐœ์ฒด ๋ณ„์นญ์ž…๋‹ˆ๋‹ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.UseWorldObject(id);
}

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

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

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

  • UserObject์— ์ง์ ‘ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ๋“ฑ๋ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์„œ๋ฒ„ ์ „์ฒด ๊ฒ€์ƒ‰์ด ์•„๋‹Œ serial์˜ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์ž…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.UseWorldObject(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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.
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.UseWorldObject(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.UseWorldObject(serialOrName) โ€” UO.UseWorldObject(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void UserObject(InjectionValue serialOrName)

            => UseObject(GetObject(serialOrName));

UO.UserObject

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

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

void UO.UserObject(object? serialOrName);

serialOrName๋ถ€ํ„ฐ GetObject๊นŒ์ง€ ํ™œ์„ฑํ™”ํ•˜๊ณ  UseObject๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ์ด๋ฆ„์€ ์ด๋ฆ„ graphic/type์ด ์•„๋‹Œ ๊ฐœ์ฒด ๋ณ„์นญ์ž…๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • UO.UseWorldObject์™€ ์‚ฌ์šฉ ๊ฒฝ๋กœ๊ฐ€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ AddObject ์ด๋ฆ„์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • serialOrName๋ถ€ํ„ฐ GetObject๊นŒ์ง€ ํ™œ์„ฑํ™”ํ•˜๊ณ  UseObject๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ์ด๋ฆ„์€ ์ด๋ฆ„ graphic/type์ด ์•„๋‹Œ ๊ฐœ์ฒด ๋ณ„์นญ์ž…๋‹ˆ๋‹ค.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(id)))
{
    UO.UserObject(id);
}

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

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

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

  • UO.UseWorldObject์™€ ์‚ฌ์šฉ ๊ฒฝ๋กœ๊ฐ€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ AddObject ์ด๋ฆ„์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("self");
    if (Truth(UO.Exists(id)))
    {
        UO.UserObject(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. ์ „์ฒด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • Bridge๋Š” ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.
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.UserObject(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.UserObject(serialOrName) โ€” UO.UserObject(Any)

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

public void UserObject(InjectionValue serialOrName)

            => UseObject(GetObject(serialOrName));
โš ๏ธ **GitHub.com Fallback** โš ๏ธ