KO UO Topic movement 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.NewMoveXY

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

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

int UO.NewMoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running);
int UO.NewMoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running, object? stepCallback);
int UO.NewMoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running, object? stepCallback, object? timeout);
int UO.NewMoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running, object? stepCallback, object? timeout, object? maxSteps);
int UO.NewMoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running, object? stepCallback, object? timeout, object? maxSteps, object? maxDistance);
int UO.NewMoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running, object? stepCallback, object? timeout, object? maxSteps, object? maxDistance, object? accuracyZ);
int UO.NewMoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running, object? stepCallback, object? timeout, object? maxSteps, object? maxDistance, object? accuracyZ, object? avoidMobiles);
int UO.NewMoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running, object? stepCallback, object? timeout, object? maxSteps, object? maxDistance, object? accuracyZ, object? avoidMobiles, object? openDoors);
int UO.NewMoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running, object? stepCallback, object? timeout, object? maxSteps, object? maxDistance, object? accuracyZ, object? avoidMobiles, object? openDoors, object? stopOnStuck);

์บ๋ฆญํ„ฐ๋ฅผ X/Y๋กœ ์ด๋™์‹œํ‚จ ํ›„ ์ข…๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ๋ชฉํ‘œ ๋‹ฌ์„ฑ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ œํ•œ ์‚ฌํ•ญ ๋ฐ ์ฝœ๋ฐฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

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

  • xdst โ€” ๋ชฉ์ ์ง€์˜ ์„ธ๊ณ„ ์ขŒํ‘œ X, 0..65535. ์ด๊ฒƒ์€ serial๋„ ์•„๋‹ˆ๊ณ  ๊ฒ€ํ”„ ๋‚ด๋ถ€์˜ ์œ„์น˜๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • ydst โ€” ๋ชฉ์ ์ง€์˜ ์„ธ๊ณ„ Y ์ขŒํ‘œ, 0..65535.
  • optimized - true - ์•ž์œผ๋กœ์˜ ๊ฒฝ๋กœ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ํ™•์ธํ•˜๋Š” ์ผ๋ฐ˜ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. false - ๊ฐ์†Œ๋œ ๊ฒฝํ—˜์  ๋ฐฉ๋ฒ•๊ณผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋‹จ๊ณ„ ํ™•์ธ. false๋Š” ์žฅ์• ๋ฌผ ํšŒํ”ผ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • accuracy โ€” ์…€์˜ X ๋ฐ Y์— ๋Œ€ํ•œ ๊ณต์ฐจ: ๋‘ ํŽธ์ฐจ๊ฐ€ ๋ชจ๋‘ ๊ทธ ์•ˆ์— ๋งž์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ 0..20 ๋ฒ”์œ„๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. 0์—๋Š” ์ •ํ™•ํ•œ X/Y๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • running - true/1 - ์‹คํ–‰ ์š”์ฒญ, false/0 - ๋‹จ๊ณ„. ์„œ๋ฒ„ ๋™์ž‘ ์ง€์—ฐ์ด ์ง€์†๋ฉ๋‹ˆ๋‹ค. ์†๋„ ์Šน์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • timeout โ€” ์„ ํƒ์  ๋Œ€๊ธฐ ์ œํ•œ(๋ฐ€๋ฆฌ์ดˆ). ๋ˆ„๋ฝ๋œ ์ธ์ˆ˜ 0 ๋ฐ ์Œ์ˆ˜ ๊ฐ’์€ ์ด ์ถ”๊ฐ€ ์ œํ•œ์ด ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • maxSteps โ€” ๋„คํŠธ์›Œํฌ ํŒจํ‚ท์ด ์•„๋‹Œ ๊ด€์ฐฐ๋œ ์œ„์น˜ ๋ณ€๊ฒฝ์˜ ์„ ํƒ์  ์ œํ•œ์ž…๋‹ˆ๋‹ค. 0/negative/absent - ์ด ์ œํ•œ์€ ์—†์Šต๋‹ˆ๋‹ค. ํด๋ง ์‚ฌ์ด์—๋Š” ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Š” ์ •ํ™•ํ•œ ์…€ ์นด์šดํ„ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • maxDistance โ€” ๋Œ€์ƒ๊นŒ์ง€์˜ ์ดˆ๊ธฐ ๊ฑฐ๋ฆฌ max(abs(dx),abs(dy))์— ๋Œ€ํ•œ ์„ ํƒ์  ์ œํ•œ์ž…๋‹ˆ๋‹ค. 0/absence๋Š” ์ด๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํƒ์ƒ‰ ์ค‘์— ํ—ˆ์šฉ๋˜๋Š” ํŽธ์ฐจ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๋ฐœ๊ฒฌ๋œ ๊ฒฝ๋กœ์˜ ๊ธธ์ด๋„ ์•„๋‹™๋‹ˆ๋‹ค.
  • accuracyZ โ€” ๋†’์ด ํ—ˆ์šฉ ์˜ค์ฐจ: abs(์‹ค์ œ Z - ํ•„์ˆ˜ Z), 0..255๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. 0์—๋Š” ์ •ํ™•ํ•œ ๊ณ ๋„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. 255๋Š” ์‹ค์งˆ์ ์œผ๋กœ Z ์ œํ•œ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. NewMoveXY์˜ ๊ฒฝ์šฐ ๋Œ€์ƒ Z๋Š” ์†Œํ™˜ ์‹œ ์บ๋ฆญํ„ฐ์˜ Z์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ณต์ฐจ๋Š” 255์ž…๋‹ˆ๋‹ค.
  • avoidMobiles โ€” ์„ ํƒ์  ํ”Œ๋ž˜๊ทธ: true๋Š” ๊ณ ๋ ค๋˜๋Š” ๋ฌธ์ž ํ†ต๊ณผ๋ฅผ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค. false๋Š” ์‹œ๋„๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด moveThroughNPC๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์—ฌ์ „ํžˆ ์•ก์„ธ์Šค๋ฅผ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • openDoors โ€” ๋„์ค‘์— ๋ฌธ์„ ์—ฌ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์„ ํƒ์  ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด moveOpenDoor๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. true์—์„œ๋Š” ์ž ๊ธด ๋ฌธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • stopOnStuck - true๋Š” 0๋กœ ์ด๋™์„ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ์•ฝ 1000ms X/Y/Z๋ฅผ ๊ณ„ํšํ•œ ํ›„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ํ™œ์„ฑ ๊ฒ€์ƒ‰ ๋ฐ ์žฌ๊ณ„์‚ฐ ๋ถ€๋ถ„์€ ์ด ํƒ€์ด๋จธ๋ฅผ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋Š” ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int 1 - ํ™•์ธ์ด ๋๋‚˜๋ฉด ์บ๋ฆญํ„ฐ๋Š” ์ฃผ์–ด์ง„ ํ—ˆ์šฉ ์˜ค์ฐจ X/Y/Z(์ฑŒ๋ฆฐ์ง€ ์ „์— ์ด๋ฏธ ๊ฑฐ๊ธฐ์— ์žˆ์—ˆ์„ ๋•Œ ํฌํ•จ) ๋‚ด์— ์žˆ์Šต๋‹ˆ๋‹ค. int 0 - ์ž˜๋ชป๋œ ์ขŒํ‘œ, ๋ฐœ์‚ฌ ์‹คํŒจ, ๋„๋‹ฌํ•˜์ง€ ๋ชปํ•œ ์ง€์  ๋˜๋Š” ํŠธ๋ฆฌ๊ฑฐ๋œ ์ •์ง€ ์กฐ๊ฑด. ๊ฑธ์Œ ์ˆ˜๋‚˜ serial๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ธด๊ธ‰์ทจ์†Œ์˜ ๊ฒฝ์šฐ ์ •์ƒ์ ์œผ๋กœ ๋ณต๊ท€ํ•˜์ง€ ์•Š๊ณ  ์ ˆ์ฐจ๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค 0.

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

๋™์ž‘

  • ์™„์ „ํ•œ A* ๊ฒฝ๋กœ๋Š” ํด๋ผ์ด์–ธํŠธ ์—…๋ฐ์ดํŠธ ์‚ฌ์ด์˜ ์งง์€ ๋ถ€๋ถ„์—์„œ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„ ์ „์— ๊ตฌ์ถ•๋ฉ๋‹ˆ๋‹ค. Optimized=true์ด๋ฉด ๊ฒฝ๋กœ์˜ ๋‹ค์Œ 4 ์…€์ด ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. false์ด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋‹จ๊ณ„์ผ ๋•Œ. ์ด๋Š” ์ „์ฒด ๊ฒฝ๋กœ์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ์•„๋‹Œ ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ ๋งˆ์šฐ์Šค๋ฅผ ์›€์ง์ผ ๋•Œ ์šฐํšŒ ์Šฌ๋ผ์ด๋”๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„ ์žฅ์•  DenyWalk ๋˜๋Š” ์ƒˆ๋กœ์šด ์žฅ์• ๋ฌผ๋กœ ์ธํ•ด ๋‹จ๊ณ„ ๋Œ€๊ธฐ์—ด์„ ์™„๋ฃŒํ•œ ํ›„ ํ˜„์žฌ ์œ„์น˜์—์„œ ์žฌ๊ณ„์‚ฐ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต ํšŸ์ˆ˜์™€ ์žฌ๊ณ„์‚ฐ ๋นˆ๋„๋Š” ์ œํ•œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ๋กœ๋„ 0๋กœ ์ด๋™์„ ๋๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ฒฝ๋กœ๋Š” ๊ฒฝ๋กœ๋ฅผ ์‹œ์ž‘ํ•œ ์ ˆ์ฐจ์— ์†ํ•ฉ๋‹ˆ๋‹ค. ๋น„์ƒ ์ •์ง€๋Š” ๋‚˜๋จธ์ง€ ์ž๋™ ๊ฒฝ๋กœ๋ฅผ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋‹ฌ๋ฆฌ๊ธฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ๊ฒฝ๋กœ๋ฅผ ๊ต์ฒดํ•œ ๊ฒฝ์šฐ ์ด์ „ ์†Œ์œ ์ž๋ฅผ ์ทจ์†Œํ•ด๋„ ์ƒˆ ๊ฒฝ๋กœ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์ „์†ก๋œ ๋‹จ๊ณ„๋Š” ํšŒ์ˆ˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • SetBadLocation ๋ฐ SetBadObject๋Š” ๊ฒฝ๋กœ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ํ˜„์žฌ ๋Ÿฐํƒ€์ž„ ๊ธˆ์ง€ ์‚ฌํ•ญ์˜ ์Šค๋ƒ…์ƒท์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ์žฌ๊ณ„์‚ฐ ์ค‘์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋ชฉ๋ก์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ง€์šฐ๋ฉด ์ด๋ฏธ ์ง„ํ–‰ ์ค‘์ธ ๊ฒฝ๋กœ๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹ค์Œ ๊ฒฝ๋กœ์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.
  • UO.LimitMove๋Š” ๋ชฉ์ ์ง€ ๊ฑฐ๋ฆฌ๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 2000์ด๊ณ  0์€ ๋ฌด์ œํ•œ์ž…๋‹ˆ๋‹ค. ์ˆจ๊ฒจ์ง„ 4096๊ฑธ์Œ/๋…ธ๋“œ ๋ฐ 10000๋…ธ๋“œ ์ œํ•œ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ž‘์—…์€ ์ค‘๋‹จ ๊ฐ€๋Šฅํ•œ ๋‹จ์œ„๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. GetPathArray๋Š” moveThroughNPC ์ฒด๋ ฅ ๊ธฐ์ค€๊ณผ moveOpenDoor๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„ ์ดˆ๊ณผ๋Š” ์š”์ฒญ์ด ์ˆ˜๋ฝ๋œ ํ›„์— ๊ณ„์‚ฐ๋˜๋ฉฐ ๊ฒ€์ƒ‰ ๋ฐ ์žฌ๊ณ„์‚ฐ์˜ ํ›„์† ๋ถ€๋ถ„์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. stopOnStuck๋Š” ์‹คํ–‰ ์ค‘์ธ ๊ฒ€์ƒ‰์„ ๋ฌธ์ž๊ฐ€ ๋ฉˆ์ถ˜ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณ„ํš์ด ์™„๋ฃŒ๋œ ํ›„์—๋Š” ์œ„์น˜ ๋ณ€๊ฒฝ์ด ๋‹ค์‹œ ๊ณ ๋ ค๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ 1/0๋Š” ๊ฒฝ๋กœ์˜ ์ค€๋น„ ์ƒํƒœ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‹ค์ œ ์ขŒํ‘œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋กœ์ปฌ ์œ„์น˜๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ํ›„์† ์„œ๋ฒ„ ์ˆ˜์ •์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋ฃจํ‹ด์—์„œ ๊ฒฝ์Ÿ์ ์ธ ์ด๋™ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ์บ๋ฆญํ„ฐ์˜ ์ „์ฒด ๊ฒฝ๋กœ๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
  • moveCheckStamina, moveExitOnDisconnect, moveOpenDoor, moveThroughCorner, moveThroughNPC, moveHeuristicMult, moveTurnCost ๋ฐ moveBetweenTwoCorners ์„ค์ •์€ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์  avoidMobiles/openDoors๋Š” ์ด ํ˜ธ์ถœ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ 0๋Š” ์ •ํ™•ํ•œ ์›์ธ์„ ๋‚˜ํƒ€๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ขŒํ‘œ, ์—ฐ๊ฒฐ, ์ฒด๋ ฅ, ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜์„ธ์š”. UO.Wait ๋ฐ ์‹œ๋„ ํšŸ์ˆ˜ ์ œํ•œ ์—†์ด ๋์—†์ด ๋™์ž‘์„ ๋ฐ˜๋ณตํ•˜์ง€ ๋งˆ์„ธ์š”.
  • ๋ฉ”์ธ ๋ธŒ๋ฆฌ์ง€๋Š” ์š”์ฒญ ๋ฒˆํ˜ธ, ํ”Œ๋ ˆ์ด์–ด/ํŒจ์ŠคํŒŒ์ธ๋”/๋งต ์ธ์Šคํ„ด์Šค ๋ฐ ์ง€๋„ ์ธ๋ฑ์Šค๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์š”์ฒญ, ์ƒํ™ฉ ๋ณ€๊ฒฝ ๋˜๋Š” ์ตœ์ข… ๊ฑฐ๋ถ€๋Š” 0; ์ขŒํ‘œ์™€ ๋งˆ์ง€๋ง‰ ์ฝœ๋ฐฑ์„ ์ฝ์€ ํ›„ ํ™•์ธ์ด ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค. Timeout, maxSteps ๋ฐ callback=0๋Š” ์ €์žฅ๋œ ์š”์ฒญ๋งŒ ์ค‘์ง€ํ•˜๋ฉฐ ์ƒˆ๋กœ์šด ์™ธ๋ถ€ ๊ฒฝ๋กœ๋Š” ์ค‘์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž„์‹œ ์ฐจ๋‹จ๋จ์€ ๋ณต๊ตฌ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š” ๋™์•ˆ ์†Œ์œ ๊ถŒ์„ ์žƒ์ง€ ์•Š๊ณ  ๋Œ€๊ธฐ๊ฐ€ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค. IApiMovementOwnershipBridge๊ฐ€ ์—†๋Š” ์™ธ๋ถ€ ๋ ˆ๊ฑฐ์‹œ ๋ธŒ๋ฆฌ์ง€์˜ ๊ฒฝ์šฐ ์ด์ „ ํ˜ธํ™˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ Pathfinder๋Š” ํ•ด๋‹น ํ™œ์„ฑ ์š”์ฒญ์˜ ๊ฑฐ๋ถ€๋œ ์ด๋™์—๋งŒ 2000 ms ๋™์•ˆ ๋ฐฉํ–ฅ ์ „ํ™˜ X/Y/Z์— ๋Œ€ํ•œ ์ตœ๋Œ€ 8 ์ž„์‹œ ๊ธˆ์ง€๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํšŒ์ „, ์•Œ ์ˆ˜ ์—†๋Š” ์‹œํ€€์Šค, ์žฌ๋™๊ธฐํ™” ๋ฐ ์ด์ „/์™ธ๋ถ€ ์š”์ฒญ์€ ์ด๋Ÿฌํ•œ ๊ธˆ์ง€๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์™ธ๋ถ€ ์š”์ฒญ ๋ฐ ์ง€๋„/ํ”Œ๋ ˆ์ด์–ด ์ปจํ…์ŠคํŠธ ์†์‹ค๋กœ ์ธํ•ด ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๊ฐ€ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค. ๋กœ๋“œ๋œ ํ˜•์ƒ ๊ฒ€์ƒ‰์€ ์ „ํ™˜์„ ์šฐํšŒํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์˜ ๋ชจ๋“  ์žฅ์• ๋ฌผ์„ ์•„๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด์˜ X/Y/Z๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ตœ์†Œ 40 ms์˜ ์ผ์‹œ ์ค‘์ง€๋ฅผ ํ†ตํ•ด ์ตœ๋Œ€ 8 ๋‚ด๋ถ€ ์žฌ๊ณ„์‚ฐ์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ์™„์ „ํ•œ ๊ฒฝ๋กœ๊ฐ€ ์—†๊ฑฐ๋‚˜ ์ด ์˜ˆ์‚ฐ์ด ์†Œ์ง„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ œ์ถœ๋œ ๋‹จ๊ณ„๋ฅผ ์ฒ˜๋ฆฌํ•œ ํ›„ ์กฐ์ • ์ž‘์—…์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค. mobile~Follow๋Š” ์ง€์—ฐ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋‹ค์‹œ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

C#์˜ ๋‹จ๊ณ„ ์ฝœ๋ฐฑ์€ RegisterStepCallback(name, Func<int,int,int,bool>) ๋˜๋Š” Func<int,int,int,int>๋ฅผ ํ†ตํ•ด ๋ช…์‹œ์ ์œผ๋กœ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค. x/y/z ์ขŒํ‘œ๋Š” int๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. false/0๋Š” ๊ฒฝ๋กœ๋ฅผ ์ค‘์ง€ํ•˜๊ณ , true/0์ด ์•„๋‹Œ ์ˆซ์ž๋Š” ๊ณ„์†๋ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก์€ ํ˜„์žฌ ์‹คํ–‰์—์„œ ์œ ํšจํ•˜๋ฉฐ ํ•จ๊ป˜ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

var result = UO.NewMoveXY((UO.GetX() + 3), UO.GetY(), true, 0, false);
UO.Print("NewMoveXY: " + Convert.ToString(result));

1. ๋‹ค์Œ ์ง€์ ์— ๋„๋‹ฌํ•˜์—ฌ ๊ฒฐ๊ณผ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • x/y โ€” ์›”๋“œ ํƒ€๊ฒŸ; ์ตœ์ ํ™”=true, ์ •ํ™•๋„=0๋Š” ์ •๋ฐ€ํ•œ X/Y, ๋‹ฌ๋ฆฌ๊ธฐ=false๋Š” ๊ฑท๊ธฐ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ok - int 1 ๋˜๋Š” 0, ํ†ต๊ณผ๋œ ์…€ ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ˜„์žฌ ์ง€๋„์—์„œ ๋Œ€์ƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
var x = UO.GetX() + 3;
var y = UO.GetY();
var ok = UO.NewMoveXY(x, y, true, 0, false);
if (Truth(ok))
{
    UO.Print("Destination reached");
}
else
{
    UO.Print("Destination not reached");
}

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

2. ์‹œ๊ฐ„ ๋ฐ ๊ฑฐ๋ฆฌ ์ œํ•œ์„ ๋‘๊ณ  ๋‹ฌ๋ฆฌ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 1445/1690 - ๊ณจ์˜ ์˜ˆ; ์ •ํ™•์„ฑ=1 ๊ทผ์ฒ˜์— ์ฃผ์ฐจ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ๊ธฐ=true. StepCallback=0 ์ฝœ๋ฐฑ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„ ์ดˆ๊ณผ=5000ms; maxSteps=100 ์›€์ง์ž„์ด ๊ด€์ฐฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. maxDistance=30๋Š” ์›์ ์—์„œ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
  • AccuracyZ=255์—๋Š” ๋ฐ”๋‹ฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. avoidMobiles=true, openDoors=true, stopOnStuck=true์—๋Š” ์ด๋Ÿฌํ•œ ์กฐ๊ฑด์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var ok = UO.NewMoveXY(1445, 1690, true, 1, true, 0, 5000, 100, 30, 255, true, true, true);
    UO.Print("Move result: " + Convert.ToString(ok));
    return null;
}

3. ์ฝœ๋ฐฑ์˜ ๋‚ด๊ตฌ์„ฑ ํ…Œ์ŠคํŠธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • StepCallback="AfterStep"์€ ์„ธ ๊ฐœ์˜ ์ขŒํ‘œ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. RegisterStepCallback ๋“ฑ๋ก์€ ์ด๋ฆ„์„ bool ์œ„์ž„๊ณผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. Stamina <= 10์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ด๋™์„ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. true๋Š” ๊ฒฝ๋กœ๋ฅผ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.
  • timeout=5000 ms๋Š” ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๊ฐ์ง€๋œ ํ›„์— ํ˜ธ์ถœ๋˜๋ฉฐ ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ๋‹จ๊ณ„์—์„œ ๋ณด์žฅ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ์•ˆ์—์„œ ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
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 stepRegistration = RegisterStepCallback("AfterStep", AfterStep);
        var ok = UO.NewMoveXY(UO.GetX() + 5, UO.GetY(), true, 0, false, "AfterStep", 5000);
        UO.Print("Move result: " + Convert.ToString(ok));
        return null;
    }

    bool AfterStep(int x, int y, int z)
    {
        UO.Print("Position: " + Convert.ToString(x) + "," + Convert.ToString(y) + "," + Convert.ToString(z));
        return UO.Stamina() > 10;
    }

    private IDisposable RegisterStepCallback(string name, Func<int, int, int, bool> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterStepCallback(name, handler);
    private IDisposable RegisterStepCallback(string name, Func<int, int, int, int> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterStepCallback(name, handler);
}

4. GoToPoint: ์™„์ „ํ•œ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜ ์ฝ”๋“œ ๋ฐ ๋ฉ”์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • GoToPoint๋Š” ์ด ์˜ˆ์ œ์—๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๋„์šฐ๋ฏธ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. 4๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ x/y/accuracy/running์€ ํ•จ์ˆ˜ ์„ ์–ธ ์œ„์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜์˜ ์ „์ฒด ๋ณธ๋ฌธ์€ ๋™์ผํ•œ ๋ณต์‚ฌ ๋ธ”๋ก์— ์žˆ์Šต๋‹ˆ๋‹ค.
  • Main์€ ๋Œ€์ƒ์„ ํ‰๊ฐ€ํ•˜๊ณ  GoToPoint๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. optimized=true, callback=0, timeout=8000 ๋ฐ maxSteps=100๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  NewMoveXY๋ฅผ ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•˜๊ณ  ๋ฐ˜ํ™˜๋œ int๋ฅผ Main์œผ๋กœ ๋‹ค์‹œ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • NewMoveXY๋Š” ๋‚ด์žฅ๋œ ํด๋ผ์ด์–ธํŠธ ๋ช…๋ น์ž…๋‹ˆ๋‹ค. A* ๊ฒ€์ƒ‰, ๊ฐœํ†ต์„ฑ ํ™•์ธ ๋ฐ ์„œ๋ฒ„ ๋‹จ๊ณ„ ์ฒ˜๋ฆฌ๋Š” ์ด ์Šคํฌ๋ฆฝํŠธ์˜ ์ถ”๊ฐ€ ์ˆจ๊ฒจ์ง„ ํ”„๋กœ์‹œ์ €๊ฐ€ ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.
  • ์ด ์˜ˆ์—์„œ๋Š” ์ฝœ๋ฐฑ์ด ๋น„ํ™œ์„ฑํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์˜ˆ์‹œ์—์„œ ์ฝœ๋ฐฑ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ ์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์ •์˜๋„ ์ „์ฒด์ ์œผ๋กœ ์ œ๊ณต๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • C#์—์„œ (๋„๋‹ฌ != 0)์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”. 0 ์ˆ˜์น˜ ๊ฒฐ๊ณผ๋Š” ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. int๊ณผ bool๋ฅผ ์ง์ ‘ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธด๊ธ‰ ์ทจ์†Œ๋Š” ์‹คํ–‰์„ ์ค‘๋‹จํ•˜๋ฉฐ false๋ฅผ ๋ฐ˜ํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
var x = UO.GetX() + 3;
var y = UO.GetY();
var reached = GoToPoint(x, y, 0, true);
if (Truth(Truth(reached) == true))
{
    UO.Print("Destination reached");
}
else
{
    UO.Print("Destination not reached");
}

dynamic GoToPoint(dynamic x, dynamic y, dynamic accuracy, dynamic running)
{
    dynamic optimized = true;
    var callback = 0;
    var timeout = 8000;
    var maxSteps = 100;
    var reached = UO.NewMoveXY(x, y, optimized, accuracy, running, callback, timeout, maxSteps);
    return reached;
}

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.NewMoveXY(xdst, ydst, optimized, accuracy, running) โ€” UO.NewMoveXY(Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactNewMoveXY(values))

UO.NewMoveXY(xdst, ydst, optimized, accuracy, running, stepCallback) โ€” UO.NewMoveXY(Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any), stepCallback (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactNewMoveXY(values))

UO.NewMoveXY(xdst, ydst, optimized, accuracy, running, stepCallback, timeout) โ€” UO.NewMoveXY(Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any), stepCallback (Any), timeout (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactNewMoveXY(values))

UO.NewMoveXY(xdst, ydst, optimized, accuracy, running, stepCallback, timeout, maxSteps) โ€” UO.NewMoveXY(Any,Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any), stepCallback (Any), timeout (Any), maxSteps (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactNewMoveXY(values))

UO.NewMoveXY(xdst, ydst, optimized, accuracy, running, stepCallback, timeout, maxSteps, maxDistance) โ€” UO.NewMoveXY(Any,Any,Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any), stepCallback (Any), timeout (Any), maxSteps (Any), maxDistance (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactNewMoveXY(values))

UO.NewMoveXY(xdst, ydst, optimized, accuracy, running, stepCallback, timeout, maxSteps, maxDistance, accuracyZ) โ€” UO.NewMoveXY(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any), stepCallback (Any), timeout (Any), maxSteps (Any), maxDistance (Any), accuracyZ (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactNewMoveXY(values))

UO.NewMoveXY(xdst, ydst, optimized, accuracy, running, stepCallback, timeout, maxSteps, maxDistance, accuracyZ, avoidMobiles) โ€” UO.NewMoveXY(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any), stepCallback (Any), timeout (Any), maxSteps (Any), maxDistance (Any), accuracyZ (Any), avoidMobiles (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactNewMoveXY(values))

UO.NewMoveXY(xdst, ydst, optimized, accuracy, running, stepCallback, timeout, maxSteps, maxDistance, accuracyZ, avoidMobiles, openDoors) โ€” UO.NewMoveXY(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any), stepCallback (Any), timeout (Any), maxSteps (Any), maxDistance (Any), accuracyZ (Any), avoidMobiles (Any), openDoors (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactNewMoveXY(values))

UO.NewMoveXY(xdst, ydst, optimized, accuracy, running, stepCallback, timeout, maxSteps, maxDistance, accuracyZ, avoidMobiles, openDoors, stopOnStuck) โ€” UO.NewMoveXY(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any), stepCallback (Any), timeout (Any), maxSteps (Any), maxDistance (Any), accuracyZ (Any), avoidMobiles (Any), openDoors (Any), stopOnStuck (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactNewMoveXY(values))

UO.OpenDoor

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

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

void UO.OpenDoor();

์บ๋ฆญํ„ฐ์—๊ฒŒ ๋ฌธ์„ ์—ด์–ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • OpenDoor๋Š” Invoke๋ฅผ ํ†ตํ•ด GameActions.OpenDoor๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ง๋ ฌ ๋„์–ด๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๋ฐ ๋ฐœ๊ฒฌ ๊ทœ์น™์€ GameActions/server์— ์†ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์ œ์—์„œ UO.Wait๋Š” ์Šคํฌ๋ฆฝํŠธ ์ผ์‹œ ์ค‘์ง€๋งŒ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ผ์‹œ ์ค‘์ง€๊ฐ€ ๋๋‚ฌ๋‹ค๊ณ  ํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์™„๋ฃŒํ–ˆ์Œ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์บ๋ฆญํ„ฐ์—๊ฒŒ ๋ฌธ์„ ์—ด์–ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
UO.OpenDoor();

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

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

  • OpenDoor๋Š” Invoke๋ฅผ ํ†ตํ•ด GameActions.OpenDoor๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ง๋ ฌ ๋„์–ด๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๋ฐ ๋ฐœ๊ฒฌ ๊ทœ์น™์€ GameActions/server์— ์†ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.IsOnline()))
    {
        UO.OpenDoor();
    }

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

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

  • ์˜ˆ์ œ์—์„œ UO.Wait๋Š” ์Šคํฌ๋ฆฝํŠธ ์ผ์‹œ ์ค‘์ง€๋งŒ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ผ์‹œ ์ค‘์ง€๊ฐ€ ๋๋‚ฌ๋‹ค๊ณ  ํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์™„๋ฃŒํ–ˆ์Œ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
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.OpenDoor();
        UO.Wait(250);
        UO.Print("Door request sent");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.OpenDoor() โ€” UO.OpenDoor()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "opendoor": bridge.OpenDoor(); break;

UO.PMove

PMove๋Š” ๊ฒฝ๋กœ ํƒ์ƒ‰๊ณผ ์ด๋™ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. XY ํ˜•์‹์€ ์ •ํ™•ํ•œ XY๋ฅผ, XYZ ํ˜•์‹์€ ์ง€์ •ํ•œ ๋†’์ด๋„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๊ฐ’์€ void์ด๋ฏ€๋กœ ์‹ค์ œ ์ขŒํ‘œ๋ฅผ ๋น„๊ตํ•˜์„ธ์š”. ์ˆซ์ž ๊ฒฐ๊ณผ๋Š” NewMoveXY ๋˜๋Š” MoveXYZ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์•”๋ฌต์ ์ธ 30์ดˆ ์ œํ•œ์€ ์—†์Šต๋‹ˆ๋‹ค.

UO.PMove

UO.PredictedDirection

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

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

int UO.PredictedDirection();

์บ๋ฆญํ„ฐ๊ฐ€ ์ด๋ฏธ ๋Œ€๊ธฐ ์ค‘์ธ ๋‹จ๊ณ„ ์ดํ›„์— ์˜ˆ์ƒ๋˜๋Š” ๋ฐฉํ–ฅ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int ๋ฐฉํ–ฅ 0..7, ์‹คํ–‰ ๋น„ํŠธ ์—†์Œ. 0 - ๋ถ์ชฝ ๋˜๋Š” ๋ฌธ์ž๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ตฌ๋ฌธ์— ํ‘œ์‹œ๋œ ํ•จ์ˆ˜๋งŒ ์ธ์ˆ˜๊ฐ€ ์—†๋Š” UO์ž…๋‹ˆ๋‹ค. ๋ชฉํ‘œ, serial, type, ๋ชฉํ‘œ, ๊ฑฐ๋ฆฌ ๋˜๋Š” ์‹œ๊ฐ„ ์ œํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. bool, ID์ด ์•„๋‹Œ ์ˆซ์ž ๋˜๋Š” ํƒ€์ผ ํ‘œ๊ธฐ: 1๋Š” ๋ชฉํ‘œ ๋‹ฌ์„ฑ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • GetEndPosition๋Š” ์ด๋ฏธ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ถ”๊ฐ€๋œ ๋ชจ๋ฐ”์ผ์˜ X/Y/Z/๋ฐฉํ–ฅ์„ ์ฝ์Šต๋‹ˆ๋‹ค.Step. ๋Œ€๊ธฐ์—ด์ด ๋น„์–ด ์žˆ์œผ๋ฉด ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ์œ„์น˜/๋ฐฉํ–ฅ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด๋Š” O(1) ์ฝ๊ธฐ์ž…๋‹ˆ๋‹ค. ๋‹จ๊ณ„๊ฐ€ ๊ฒ€์ƒ‰๋˜์ง€ ์•Š๊ณ , ๋ชจ์…˜๊ณผ ํŒจํ‚ท์ด ์ „์†ก๋˜์ง€ ์•Š๊ณ , ๊ฒฝ๋กœ๊ฐ€ ๊ณ„์‚ฐ๋˜์ง€ ์•Š๊ณ , ๋ช…๋ น์ด ์„ฑ์ทจ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์„ธ๊ณ„ ๋ฐฉํ–ฅ: 0 ๋ถ์ชฝ, 1 ๋ถ๋™์ชฝ, 2 ๋™์ชฝ, 3 ๋‚จ๋™์ชฝ, 4 ๋‚จ์ชฝ, 5 ๋‚จ์„œ์ชฝ, 6 ์„œ์ชฝ, 7 ๋ถ์„œ์ชฝ. ํ™”๋ฉด์€ ์•„์ด์†Œ๋ฉ”ํŠธ๋ฆญ์ž…๋‹ˆ๋‹ค. Direction.Mask๋Š” ์‹คํ–‰ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์†๋„๊ฐ€ ๋Œ์•„์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ™•์ •๋œ ๋„์ฐฉ์ด ์•„๋‹Œ ํ˜„์ง€ ์˜ˆ๋ณด์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด/์™„๋ฃŒ๋œ ๋‹จ๊ณ„, ์„œ๋ฒ„ ์˜ค๋ฅ˜, ๋Œ€๊ธฐ์—ด ์‚ญ์ œ ๋˜๋Š” ์ˆœ๊ฐ„ ์ด๋™์œผ๋กœ ์ธํ•ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ๊ตฌ์„ฑ์š”์†Œ ํ˜ธ์ถœ์€ ์›์ž์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. X ์ผ์น˜๋Š” Y/Z ์ผ์น˜ ๋˜๋Š” ์„œ๋ฒ„ ํ™•์ธ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Invoke๋Š” ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ž ์Šค๋ ˆ๋“œ๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ทจ์†Œํ•˜๋ฉด ๋Œ€๊ธฐ๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ผ์‹œ์ค‘์ง€ ๋ฐ ์ถ”๊ฐ€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์€ ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • IPredictedMovementBridge๊ฐ€ ์—†๋Š” IApiBridge์˜ ์™ธ๋ถ€ ๊ตฌํ˜„์€ ํ˜„์žฌ ์ขŒํ‘œ/๋ฐฉํ–ฅ์˜ ๋Œ€์ฒด ํŒ๋…๊ฐ’์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์‹ UO์€ ๋Œ€๊ธฐ์—ด ์ธ์‹ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ํ•˜๋‚˜์˜ ๊ตฌ์„ฑ์š”์†Œ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์˜ˆ์ธก์€ ์ธ์ˆ˜ ์—†์ด ํ˜ธ์ถœ ํ•˜๋‚˜๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Convert.ToString๋Š” ๋กœ๊ทธ ๋ฒˆํ˜ธ์˜ ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
var predicted = UO.PredictedDirection();
UO.Print("Predicted: " + Convert.ToString(predicted));

2. ์˜ˆ์ธก ๋ณ€ํ™” ๊ด€์ฐฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • UO.Wait(100)๋Š” 100ms ๋™์•ˆ ์˜ˆ์ œ๋ฅผ ์ผ์‹œ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ „ํ›„๋Š” ์ค‘๊ฐ„ ์›€์ง์ž„๊ณผ๋„ ์ผ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒ๋…๊ฐ’์€ ์›€์ง์ž„์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.PredictedDirection();
    await Delay(100);
    var after = UO.PredictedDirection();
    if (Truth(before != after))
    {
        UO.Print("Prediction changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
    }

    return null;
}

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

3. ์™„์ „ํ•œ ๋น„๊ต ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์˜ˆ์ƒ - ๊ธฐ๋ณธ ๋ช…๋ น์— ๋Œ€ํ•œ ์ธ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ขŒํ‘œ/๋†’์ด/๋ฐฉํ–ฅ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. PredictionEquals๋Š” UO.Self()๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ฐ’์„ ํ•œ ๋ฒˆ ์ฝ๊ณ  ๊ฐ™์œผ๋ฉด 1(์กฐ๊ฑด ์ถฉ์กฑ)์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0(์กฐ๊ฑด ์ถฉ์กฑ๋˜์ง€ ์•Š์Œ)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๊ธฐ๋Šฅ ์ฝ”๋“œ๋Š” 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()
    {
        if (Truth(Truth(PredictionEquals(4)) == true))
        {
            UO.Print("Queued endpoint matches this component");
        }
        else
        {
            UO.Print("Different component or no player");
        }

        return null;
    }

    dynamic PredictionEquals(dynamic expected)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var predicted = UO.PredictedDirection();
        return Truth(predicted == expected);
    }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "predicteddirection": return new InjectionValue(ReadPredictedCoordinate(3));

UO.PredictedX

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

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

int UO.PredictedX();

์บ๋ฆญํ„ฐ๊ฐ€ ์ด๋ฏธ ๋Œ€๊ธฐ ์ค‘์ธ ๋‹จ๊ณ„ ์ดํ›„์— ์˜ˆ์ธก๋œ X ์ขŒํ‘œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

๋งต ์…€์˜ int X. 0 - ์œ ํšจํ•œ ์ขŒํ‘œ ๋˜๋Š” ๋ฌธ์ž๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ตฌ๋ฌธ์— ํ‘œ์‹œ๋œ ํ•จ์ˆ˜๋งŒ ์ธ์ˆ˜๊ฐ€ ์—†๋Š” UO์ž…๋‹ˆ๋‹ค. ๋ชฉํ‘œ, serial, type, ๋ชฉํ‘œ, ๊ฑฐ๋ฆฌ ๋˜๋Š” ์‹œ๊ฐ„ ์ œํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. bool, ID์ด ์•„๋‹Œ ์ˆซ์ž ๋˜๋Š” ํƒ€์ผ ํ‘œ๊ธฐ: 1๋Š” ๋ชฉํ‘œ ๋‹ฌ์„ฑ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • GetEndPosition๋Š” ์ด๋ฏธ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ถ”๊ฐ€๋œ ๋ชจ๋ฐ”์ผ์˜ X/Y/Z/๋ฐฉํ–ฅ์„ ์ฝ์Šต๋‹ˆ๋‹ค.Step. ๋Œ€๊ธฐ์—ด์ด ๋น„์–ด ์žˆ์œผ๋ฉด ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ์œ„์น˜/๋ฐฉํ–ฅ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด๋Š” O(1) ์ฝ๊ธฐ์ž…๋‹ˆ๋‹ค. ๋‹จ๊ณ„๊ฐ€ ๊ฒ€์ƒ‰๋˜์ง€ ์•Š๊ณ , ๋ชจ์…˜๊ณผ ํŒจํ‚ท์ด ์ „์†ก๋˜์ง€ ์•Š๊ณ , ๊ฒฝ๋กœ๊ฐ€ ๊ณ„์‚ฐ๋˜์ง€ ์•Š๊ณ , ๋ช…๋ น์ด ์„ฑ์ทจ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • X ๋ฐ Y๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ฒ€ํ”„ ํ”ฝ์…€์ด ์•„๋‹Œ ์„ธ๊ณ„/์ง€๋„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. Z - ์ธต์ˆ˜๊ฐ€ ์•„๋‹Œ ๋†’์ด์ž…๋‹ˆ๋‹ค. ์ „์ฒด ๊ฒฝ๋กœ์˜ ๋ฐฐ์—ด์ด๋‚˜ ์ตœ์ข… ๋Œ€์ƒ์ด ์•„๋‹Œ ๋‹จ์ผ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ™•์ •๋œ ๋„์ฐฉ์ด ์•„๋‹Œ ํ˜„์ง€ ์˜ˆ๋ณด์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด/์™„๋ฃŒ๋œ ๋‹จ๊ณ„, ์„œ๋ฒ„ ์˜ค๋ฅ˜, ๋Œ€๊ธฐ์—ด ์‚ญ์ œ ๋˜๋Š” ์ˆœ๊ฐ„ ์ด๋™์œผ๋กœ ์ธํ•ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ๊ตฌ์„ฑ์š”์†Œ ํ˜ธ์ถœ์€ ์›์ž์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. X ์ผ์น˜๋Š” Y/Z ์ผ์น˜ ๋˜๋Š” ์„œ๋ฒ„ ํ™•์ธ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Invoke๋Š” ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ž ์Šค๋ ˆ๋“œ๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ทจ์†Œํ•˜๋ฉด ๋Œ€๊ธฐ๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ผ์‹œ์ค‘์ง€ ๋ฐ ์ถ”๊ฐ€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์€ ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • IPredictedMovementBridge๊ฐ€ ์—†๋Š” IApiBridge์˜ ์™ธ๋ถ€ ๊ตฌํ˜„์€ ํ˜„์žฌ ์ขŒํ‘œ/๋ฐฉํ–ฅ์˜ ๋Œ€์ฒด ํŒ๋…๊ฐ’์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์‹ UO์€ ๋Œ€๊ธฐ์—ด ์ธ์‹ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ํ•˜๋‚˜์˜ ๊ตฌ์„ฑ์š”์†Œ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์˜ˆ์ธก์€ ์ธ์ˆ˜ ์—†์ด ํ˜ธ์ถœ ํ•˜๋‚˜๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Convert.ToString๋Š” ๋กœ๊ทธ ๋ฒˆํ˜ธ์˜ ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
var predicted = UO.PredictedX();
UO.Print("Predicted: " + Convert.ToString(predicted));

2. ์˜ˆ์ธก ๋ณ€ํ™” ๊ด€์ฐฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • UO.Wait(100)๋Š” 100ms ๋™์•ˆ ์˜ˆ์ œ๋ฅผ ์ผ์‹œ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ „ํ›„๋Š” ์ค‘๊ฐ„ ์›€์ง์ž„๊ณผ๋„ ์ผ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒ๋…๊ฐ’์€ ์›€์ง์ž„์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.PredictedX();
    await Delay(100);
    var after = UO.PredictedX();
    if (Truth(before != after))
    {
        UO.Print("Prediction changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
    }

    return null;
}

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

3. ์™„์ „ํ•œ ๋น„๊ต ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์˜ˆ์ƒ - ๊ธฐ๋ณธ ๋ช…๋ น์— ๋Œ€ํ•œ ์ธ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ขŒํ‘œ/๋†’์ด/๋ฐฉํ–ฅ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. PredictionEquals๋Š” UO.Self()๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ฐ’์„ ํ•œ ๋ฒˆ ์ฝ๊ณ  ๊ฐ™์œผ๋ฉด 1(์กฐ๊ฑด ์ถฉ์กฑ)์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0(์กฐ๊ฑด ์ถฉ์กฑ๋˜์ง€ ์•Š์Œ)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๊ธฐ๋Šฅ ์ฝ”๋“œ๋Š” 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()
    {
        if (Truth(Truth(PredictionEquals(1445)) == true))
        {
            UO.Print("Queued endpoint matches this component");
        }
        else
        {
            UO.Print("Different component or no player");
        }

        return null;
    }

    dynamic PredictionEquals(dynamic expected)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var predicted = UO.PredictedX();
        return Truth(predicted == expected);
    }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "predictedx": return new InjectionValue(ReadPredictedCoordinate(0));

UO.PredictedY

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

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

int UO.PredictedY();

์บ๋ฆญํ„ฐ๊ฐ€ ์ด๋ฏธ ๋Œ€๊ธฐ ์ค‘์ธ ๋‹จ๊ณ„ ์ดํ›„์— ์˜ˆ์ธก๋œ Y ์ขŒํ‘œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

๋งต ์…€์˜ int Y. 0 - ์œ ํšจํ•œ ์ขŒํ‘œ ๋˜๋Š” ๋ฌธ์ž๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ตฌ๋ฌธ์— ํ‘œ์‹œ๋œ ํ•จ์ˆ˜๋งŒ ์ธ์ˆ˜๊ฐ€ ์—†๋Š” UO์ž…๋‹ˆ๋‹ค. ๋ชฉํ‘œ, serial, type, ๋ชฉํ‘œ, ๊ฑฐ๋ฆฌ ๋˜๋Š” ์‹œ๊ฐ„ ์ œํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. bool, ID์ด ์•„๋‹Œ ์ˆซ์ž ๋˜๋Š” ํƒ€์ผ ํ‘œ๊ธฐ: 1๋Š” ๋ชฉํ‘œ ๋‹ฌ์„ฑ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • GetEndPosition๋Š” ์ด๋ฏธ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ถ”๊ฐ€๋œ ๋ชจ๋ฐ”์ผ์˜ X/Y/Z/๋ฐฉํ–ฅ์„ ์ฝ์Šต๋‹ˆ๋‹ค.Step. ๋Œ€๊ธฐ์—ด์ด ๋น„์–ด ์žˆ์œผ๋ฉด ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ์œ„์น˜/๋ฐฉํ–ฅ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด๋Š” O(1) ์ฝ๊ธฐ์ž…๋‹ˆ๋‹ค. ๋‹จ๊ณ„๊ฐ€ ๊ฒ€์ƒ‰๋˜์ง€ ์•Š๊ณ , ๋ชจ์…˜๊ณผ ํŒจํ‚ท์ด ์ „์†ก๋˜์ง€ ์•Š๊ณ , ๊ฒฝ๋กœ๊ฐ€ ๊ณ„์‚ฐ๋˜์ง€ ์•Š๊ณ , ๋ช…๋ น์ด ์„ฑ์ทจ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • X ๋ฐ Y๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ฒ€ํ”„ ํ”ฝ์…€์ด ์•„๋‹Œ ์„ธ๊ณ„/์ง€๋„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. Z - ์ธต์ˆ˜๊ฐ€ ์•„๋‹Œ ๋†’์ด์ž…๋‹ˆ๋‹ค. ์ „์ฒด ๊ฒฝ๋กœ์˜ ๋ฐฐ์—ด์ด๋‚˜ ์ตœ์ข… ๋Œ€์ƒ์ด ์•„๋‹Œ ๋‹จ์ผ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ™•์ •๋œ ๋„์ฐฉ์ด ์•„๋‹Œ ํ˜„์ง€ ์˜ˆ๋ณด์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด/์™„๋ฃŒ๋œ ๋‹จ๊ณ„, ์„œ๋ฒ„ ์˜ค๋ฅ˜, ๋Œ€๊ธฐ์—ด ์‚ญ์ œ ๋˜๋Š” ์ˆœ๊ฐ„ ์ด๋™์œผ๋กœ ์ธํ•ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ๊ตฌ์„ฑ์š”์†Œ ํ˜ธ์ถœ์€ ์›์ž์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. X ์ผ์น˜๋Š” Y/Z ์ผ์น˜ ๋˜๋Š” ์„œ๋ฒ„ ํ™•์ธ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Invoke๋Š” ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ž ์Šค๋ ˆ๋“œ๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ทจ์†Œํ•˜๋ฉด ๋Œ€๊ธฐ๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ผ์‹œ์ค‘์ง€ ๋ฐ ์ถ”๊ฐ€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์€ ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • IPredictedMovementBridge๊ฐ€ ์—†๋Š” IApiBridge์˜ ์™ธ๋ถ€ ๊ตฌํ˜„์€ ํ˜„์žฌ ์ขŒํ‘œ/๋ฐฉํ–ฅ์˜ ๋Œ€์ฒด ํŒ๋…๊ฐ’์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์‹ UO์€ ๋Œ€๊ธฐ์—ด ์ธ์‹ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ํ•˜๋‚˜์˜ ๊ตฌ์„ฑ์š”์†Œ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์˜ˆ์ธก์€ ์ธ์ˆ˜ ์—†์ด ํ˜ธ์ถœ ํ•˜๋‚˜๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Convert.ToString๋Š” ๋กœ๊ทธ ๋ฒˆํ˜ธ์˜ ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
var predicted = UO.PredictedY();
UO.Print("Predicted: " + Convert.ToString(predicted));

2. ์˜ˆ์ธก ๋ณ€ํ™” ๊ด€์ฐฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • UO.Wait(100)๋Š” 100ms ๋™์•ˆ ์˜ˆ์ œ๋ฅผ ์ผ์‹œ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ „ํ›„๋Š” ์ค‘๊ฐ„ ์›€์ง์ž„๊ณผ๋„ ์ผ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒ๋…๊ฐ’์€ ์›€์ง์ž„์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.PredictedY();
    await Delay(100);
    var after = UO.PredictedY();
    if (Truth(before != after))
    {
        UO.Print("Prediction changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
    }

    return null;
}

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

3. ์™„์ „ํ•œ ๋น„๊ต ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์˜ˆ์ƒ - ๊ธฐ๋ณธ ๋ช…๋ น์— ๋Œ€ํ•œ ์ธ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ขŒํ‘œ/๋†’์ด/๋ฐฉํ–ฅ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. PredictionEquals๋Š” UO.Self()๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ฐ’์„ ํ•œ ๋ฒˆ ์ฝ๊ณ  ๊ฐ™์œผ๋ฉด 1(์กฐ๊ฑด ์ถฉ์กฑ)์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0(์กฐ๊ฑด ์ถฉ์กฑ๋˜์ง€ ์•Š์Œ)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๊ธฐ๋Šฅ ์ฝ”๋“œ๋Š” 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()
    {
        if (Truth(Truth(PredictionEquals(1690)) == true))
        {
            UO.Print("Queued endpoint matches this component");
        }
        else
        {
            UO.Print("Different component or no player");
        }

        return null;
    }

    dynamic PredictionEquals(dynamic expected)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var predicted = UO.PredictedY();
        return Truth(predicted == expected);
    }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "predictedy": return new InjectionValue(ReadPredictedCoordinate(1));

UO.PredictedZ

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

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

int UO.PredictedZ();

์บ๋ฆญํ„ฐ๊ฐ€ ์ด๋ฏธ ๋Œ€๊ธฐ์—ด์— ๋„ฃ์€ ๋‹จ๊ณ„ ์ดํ›„์— ์˜ˆ์ธก๋œ Z ๋†’์ด๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int Z, ๊ธฐํ˜ธ ๋†’์ด -128..127; ์Œ์ˆ˜ ๊ฐ’์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. 0 - ํ—ˆ์šฉ๋˜๋Š” ํ‚ค ๋˜๋Š” ๋ฌธ์ž ์—†์Œ.

๋™์ž‘

  • ๊ตฌ๋ฌธ์— ํ‘œ์‹œ๋œ ํ•จ์ˆ˜๋งŒ ์ธ์ˆ˜๊ฐ€ ์—†๋Š” UO์ž…๋‹ˆ๋‹ค. ๋ชฉํ‘œ, serial, type, ๋ชฉํ‘œ, ๊ฑฐ๋ฆฌ ๋˜๋Š” ์‹œ๊ฐ„ ์ œํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. bool, ID์ด ์•„๋‹Œ ์ˆซ์ž ๋˜๋Š” ํƒ€์ผ ํ‘œ๊ธฐ: 1๋Š” ๋ชฉํ‘œ ๋‹ฌ์„ฑ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • GetEndPosition๋Š” ์ด๋ฏธ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ถ”๊ฐ€๋œ ๋ชจ๋ฐ”์ผ์˜ X/Y/Z/๋ฐฉํ–ฅ์„ ์ฝ์Šต๋‹ˆ๋‹ค.Step. ๋Œ€๊ธฐ์—ด์ด ๋น„์–ด ์žˆ์œผ๋ฉด ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ์œ„์น˜/๋ฐฉํ–ฅ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด๋Š” O(1) ์ฝ๊ธฐ์ž…๋‹ˆ๋‹ค. ๋‹จ๊ณ„๊ฐ€ ๊ฒ€์ƒ‰๋˜์ง€ ์•Š๊ณ , ๋ชจ์…˜๊ณผ ํŒจํ‚ท์ด ์ „์†ก๋˜์ง€ ์•Š๊ณ , ๊ฒฝ๋กœ๊ฐ€ ๊ณ„์‚ฐ๋˜์ง€ ์•Š๊ณ , ๋ช…๋ น์ด ์„ฑ์ทจ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • X ๋ฐ Y๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ฒ€ํ”„ ํ”ฝ์…€์ด ์•„๋‹Œ ์„ธ๊ณ„/์ง€๋„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. Z - ์ธต์ˆ˜๊ฐ€ ์•„๋‹Œ ๋†’์ด์ž…๋‹ˆ๋‹ค. ์ „์ฒด ๊ฒฝ๋กœ์˜ ๋ฐฐ์—ด์ด๋‚˜ ์ตœ์ข… ๋Œ€์ƒ์ด ์•„๋‹Œ ๋‹จ์ผ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ™•์ •๋œ ๋„์ฐฉ์ด ์•„๋‹Œ ํ˜„์ง€ ์˜ˆ๋ณด์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด/์™„๋ฃŒ๋œ ๋‹จ๊ณ„, ์„œ๋ฒ„ ์˜ค๋ฅ˜, ๋Œ€๊ธฐ์—ด ์‚ญ์ œ ๋˜๋Š” ์ˆœ๊ฐ„ ์ด๋™์œผ๋กœ ์ธํ•ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ๊ตฌ์„ฑ์š”์†Œ ํ˜ธ์ถœ์€ ์›์ž์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. X ์ผ์น˜๋Š” Y/Z ์ผ์น˜ ๋˜๋Š” ์„œ๋ฒ„ ํ™•์ธ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Invoke๋Š” ๊ฒŒ์ž„ ์Šค๋ ˆ๋“œ์—์„œ ์ฝ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ž ์Šค๋ ˆ๋“œ๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ทจ์†Œํ•˜๋ฉด ๋Œ€๊ธฐ๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ผ์‹œ์ค‘์ง€ ๋ฐ ์ถ”๊ฐ€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์€ ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • IPredictedMovementBridge๊ฐ€ ์—†๋Š” IApiBridge์˜ ์™ธ๋ถ€ ๊ตฌํ˜„์€ ํ˜„์žฌ ์ขŒํ‘œ/๋ฐฉํ–ฅ์˜ ๋Œ€์ฒด ํŒ๋…๊ฐ’์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์‹ UO์€ ๋Œ€๊ธฐ์—ด ์ธ์‹ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ํ•˜๋‚˜์˜ ๊ตฌ์„ฑ์š”์†Œ ์ฝ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์˜ˆ์ธก์€ ์ธ์ˆ˜ ์—†์ด ํ˜ธ์ถœ ํ•˜๋‚˜๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Convert.ToString๋Š” ๋กœ๊ทธ ๋ฒˆํ˜ธ์˜ ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
var predicted = UO.PredictedZ();
UO.Print("Predicted: " + Convert.ToString(predicted));

2. ์˜ˆ์ธก ๋ณ€ํ™” ๊ด€์ฐฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • UO.Wait(100)๋Š” 100ms ๋™์•ˆ ์˜ˆ์ œ๋ฅผ ์ผ์‹œ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ „ํ›„๋Š” ์ค‘๊ฐ„ ์›€์ง์ž„๊ณผ๋„ ์ผ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒ๋…๊ฐ’์€ ์›€์ง์ž„์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.PredictedZ();
    await Delay(100);
    var after = UO.PredictedZ();
    if (Truth(before != after))
    {
        UO.Print("Prediction changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
    }

    return null;
}

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

3. ์™„์ „ํ•œ ๋น„๊ต ๊ธฐ๋Šฅ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์˜ˆ์ƒ - ๊ธฐ๋ณธ ๋ช…๋ น์— ๋Œ€ํ•œ ์ธ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ขŒํ‘œ/๋†’์ด/๋ฐฉํ–ฅ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. PredictionEquals๋Š” UO.Self()๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ฐ’์„ ํ•œ ๋ฒˆ ์ฝ๊ณ  ๊ฐ™์œผ๋ฉด 1(์กฐ๊ฑด ์ถฉ์กฑ)์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0(์กฐ๊ฑด ์ถฉ์กฑ๋˜์ง€ ์•Š์Œ)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๊ธฐ๋Šฅ ์ฝ”๋“œ๋Š” 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()
    {
        if (Truth(Truth(PredictionEquals(-4)) == true))
        {
            UO.Print("Queued endpoint matches this component");
        }
        else
        {
            UO.Print("Different component or no player");
        }

        return null;
    }

    dynamic PredictionEquals(dynamic expected)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var predicted = UO.PredictedZ();
        return Truth(predicted == expected);
    }

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

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "predictedz": return new InjectionValue(ReadPredictedCoordinate(2));

UO.SetRunMountTimer

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

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

void UO.SetRunMountTimer(object? value);

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

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

  • value โ€” ํ•„์ˆ˜ ์ •์ˆ˜ ๋ฐ€๋ฆฌ์ดˆ์ž…๋‹ˆ๋‹ค. ๋ฒ”์œ„ 100..2000; 0 ๋ฐ ์Œ์ˆ˜ ๊ฐ’์„ ํฌํ•จํ•œ ์ž‘์€ ๊ฐ’์€ 100๋กœ ์˜ฌ๋ผ๊ฐ€๊ณ , ํฐ ๊ฐ’์€ 2000๋กœ ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ์ ์šฉ๋œ ๊ฐ„๊ฒฉ์„ ์ฝ์œผ๋ ค๋ฉด UO.GetRunMountTimer()๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด๋Š” ์„œ๋ฒ„์—์„œ ๋‹จ๊ณ„๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์„ค์ •์€ ๋ผ์ด๋”ฉ ๋ชจ๋“œ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ฐ ์ตœ์†Œ ํ—ˆ์šฉ ๊ฐ’์€ 100 ms์ž…๋‹ˆ๋‹ค. ์ƒํ•œ์€ 2000ms์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„ธ ๊ฐ€์ง€ ๋ชจ๋“œ์—๋Š” ๋ณ„๋„์˜ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ•‘, FPS, ๊ฒฝ๋กœ ์ฐพ๊ธฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋˜๋Š” ์ธก์ •๋œ ์„œ๋ฒ„ ๋‹จ๊ณ„ ์ง€์† ์‹œ๊ฐ„์ด ์•„๋‹Œ ์บ๋ฆญํ„ฐ์˜ ๋กœ์ปฌ ์ด๋™ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ ๋Š˜๋ฆฌ๋ฉด ์›€์ง์ž„์ด ๋А๋ ค์ง‘๋‹ˆ๋‹ค. ํ‘œ์ค€ ๊ฐ„๊ฒฉ ์•„๋ž˜๋กœ ์ค„์ด๋ฉด ํŒจํ‚ท ์ „์†ก ์†๋„๊ฐ€ ๋นจ๋ผ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํŒ€ ์ž์ฒด๋Š” ์›€์ง์ด์ง€ ์•Š๊ณ , ํƒˆ๊ฒƒ์„ ์žฅ์ฐฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฑท๊ธฐ/๋‹ฌ๋ฆฌ๊ธฐ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šด์ „ ์ค‘์— ๋ชจ๋“œ๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ์ง€์ •ํ•œ ์†๋„ ๋ชจ๋“œ์™€ ๋น„ํ–‰๋„ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.
  • ์„ค์ •์€ ์ด ํด๋ผ์ด์–ธํŠธ์˜ ์ด๋™์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜๋™ ์ œ์–ด, ์ง€๋„ ๊ฒฝ๋กœ ๋ฐ ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ด์ „ ๊ฐ’์„ ์œ ์ง€ํ•˜๊ณ  ์ž‘์—… ํ›„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ ˆ์ฐจ์—์„œ ๋™์‹œ์— ํ•˜๋‚˜์˜ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  • ํšŒ์ „ ๋ฐ ์ดํƒˆ ๋‹จ๊ณ„๋Š” ์ผ๋ฐ˜์ ์ธ ๋™์ž‘๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ํ™•์ธ, ํ†ต์‹  ์ง€์—ฐ ๋ฐ ์žฅ์• ๋กœ ์ธํ•ด ์‹ค์ œ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ๋ˆ„๋ฝ๋œ ํ”„๋ ˆ์ž„์„ ๋”ฐ๋ผ์žก๊ธฐ ์œ„ํ•ด ์ผ๋ จ์˜ ๊ฐ€์†ํ™”๋œ ๋‹จ๊ณ„๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.SetRunMountTimer");
UO.SetRunMountTimer(100);

1. ํ‘œ์ค€ ํ…œํฌ ๋ณต์› - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๊ฐ’=100 โ€” ๋ฐ€๋ฆฌ์ดˆ. ํ˜ธ์ถœ์€ ํ›„์† ์ด๋™์„ ์„ค์ •ํ•˜์ง€๋งŒ ๊ฒฝ๋กœ๋ฅผ ์‹œ์ž‘ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
UO.SetRunMountTimer(100);

2. ํ•˜๋‚˜์˜ ๋ชจ์…˜ ์š”์ฒญ์„ ์ผ์‹œ์ ์œผ๋กœ ๋А๋ฆฌ๊ฒŒ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๊ฐ’=200์€ ํ‘œ์ค€ ๊ฐ„๊ฒฉ์— 100ms๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์Šน๋งˆ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž์œ  ๋ฐฉํ–ฅ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • UO.Step์€ Direction=2 ๋ฐ Running=true์„ ์–ป์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ 7๋Š” ํšŒ์ „๋งŒ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ฝ”๋“œ๋Š” true/false๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. finally ์ •์ƒ ์ข…๋ฃŒ ๋˜๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์‹œ ์ด์ „ ์„ค์ •์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var previous = UO.GetRunMountTimer();
    try
    {
        UO.SetRunMountTimer(200);
        var stepResult = UO.Step(2, true);
        if (Truth(stepResult != 7))
        {
            UO.Print("Step was not confirmed: " + Convert.ToString(stepResult));
        }
    }
    finally
    {
        UO.SetRunMountTimer(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. ๋„ˆ๋ฌด ๋‚ฎ์€ ๊ฐ’์— ๋Œ€ํ•œ ๋ณดํ˜ธ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ ์šฉ๋œ ๊ฐ’=1 ์ดํ›„๋Š” 100๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ๋ฌธ์ž๋ฅผ ์ด๋™ํ•˜์ง€ ์•Š๊ณ  ์›๋ž˜ ๊ฐ„๊ฒฉ์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
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 previous = UO.GetRunMountTimer();
        try
        {
            UO.SetRunMountTimer(1);
            var applied = UO.GetRunMountTimer();
            UO.Print("Applied delay, ms: " + Convert.ToString(applied));
        }
        finally
        {
            UO.SetRunMountTimer(previous);
        }

        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setrunmounttimer":

                    state.RunMountTimer = ClampMoveTimer(Arg(0), 100);

                    bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer);

                    return InjectionValue.Unit;

UO.SetRunUnmountTimer

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

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

void UO.SetRunUnmountTimer(object? value);

๊ฑท๋Š” ๋ณดํญ ๊ฐ„๊ฒฉ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜๋„์ ์œผ๋กœ ์†๋„๋ฅผ ์ค„์ด๊ฑฐ๋‚˜ ํ‘œ์ค€ ์†๋„๋กœ ๋Œ์•„๊ฐˆ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ํ‘œ์ค€ ํ…œํฌ ์ด์ƒ์œผ๋กœ ์ด๋™ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

  • value โ€” ํ•„์ˆ˜ ์ •์ˆ˜ ๋ฐ€๋ฆฌ์ดˆ์ž…๋‹ˆ๋‹ค. ๋ฒ”์œ„ 200..2000; 0 ๋ฐ ์Œ์ˆ˜ ๊ฐ’์„ ํฌํ•จํ•œ ์ž‘์€ ๊ฐ’์€ 200๋กœ ์˜ฌ๋ผ๊ฐ€๊ณ , ํฐ ๊ฐ’์€ 2000๋กœ ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ์ ์šฉ๋œ ๊ฐ„๊ฒฉ์„ ์ฝ์œผ๋ ค๋ฉด UO.GetRunUnmountTimer()๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด๋Š” ์„œ๋ฒ„์—์„œ ๋‹จ๊ณ„๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์„ค์ •์€ ๊ฑท๊ธฐ ๋ชจ๋“œ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ฐ ์ตœ์†Œ ํ—ˆ์šฉ ๊ฐ’์€ 200 ms์ž…๋‹ˆ๋‹ค. ์ƒํ•œ์€ 2000ms์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„ธ ๊ฐ€์ง€ ๋ชจ๋“œ์—๋Š” ๋ณ„๋„์˜ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ•‘, FPS, ๊ฒฝ๋กœ ์ฐพ๊ธฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋˜๋Š” ์ธก์ •๋œ ์„œ๋ฒ„ ๋‹จ๊ณ„ ์ง€์† ์‹œ๊ฐ„์ด ์•„๋‹Œ ์บ๋ฆญํ„ฐ์˜ ๋กœ์ปฌ ์ด๋™ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ ๋Š˜๋ฆฌ๋ฉด ์›€์ง์ž„์ด ๋А๋ ค์ง‘๋‹ˆ๋‹ค. ํ‘œ์ค€ ๊ฐ„๊ฒฉ ์•„๋ž˜๋กœ ์ค„์ด๋ฉด ํŒจํ‚ท ์ „์†ก ์†๋„๊ฐ€ ๋นจ๋ผ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํŒ€ ์ž์ฒด๋Š” ์›€์ง์ด์ง€ ์•Š๊ณ , ํƒˆ๊ฒƒ์„ ์žฅ์ฐฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฑท๊ธฐ/๋‹ฌ๋ฆฌ๊ธฐ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šด์ „ ์ค‘์— ๋ชจ๋“œ๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ์ง€์ •ํ•œ ์†๋„ ๋ชจ๋“œ์™€ ๋น„ํ–‰๋„ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.
  • ์„ค์ •์€ ์ด ํด๋ผ์ด์–ธํŠธ์˜ ์ด๋™์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜๋™ ์ œ์–ด, ์ง€๋„ ๊ฒฝ๋กœ ๋ฐ ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ด์ „ ๊ฐ’์„ ์œ ์ง€ํ•˜๊ณ  ์ž‘์—… ํ›„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ ˆ์ฐจ์—์„œ ๋™์‹œ์— ํ•˜๋‚˜์˜ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  • ํšŒ์ „ ๋ฐ ์ดํƒˆ ๋‹จ๊ณ„๋Š” ์ผ๋ฐ˜์ ์ธ ๋™์ž‘๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ํ™•์ธ, ํ†ต์‹  ์ง€์—ฐ ๋ฐ ์žฅ์• ๋กœ ์ธํ•ด ์‹ค์ œ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ๋ˆ„๋ฝ๋œ ํ”„๋ ˆ์ž„์„ ๋”ฐ๋ผ์žก๊ธฐ ์œ„ํ•ด ์ผ๋ จ์˜ ๊ฐ€์†ํ™”๋œ ๋‹จ๊ณ„๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.SetRunUnmountTimer");
UO.SetRunUnmountTimer(200);

1. ํ‘œ์ค€ ํ…œํฌ ๋ณต์› - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๊ฐ’=200 โ€” ๋ฐ€๋ฆฌ์ดˆ. ํ˜ธ์ถœ์€ ํ›„์† ์ด๋™์„ ์„ค์ •ํ•˜์ง€๋งŒ ๊ฒฝ๋กœ๋ฅผ ์‹œ์ž‘ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
UO.SetRunUnmountTimer(200);

2. ํ•˜๋‚˜์˜ ๋ชจ์…˜ ์š”์ฒญ์„ ์ผ์‹œ์ ์œผ๋กœ ๋А๋ฆฌ๊ฒŒ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๊ฐ’=300์€ ํ‘œ์ค€ ๊ฐ„๊ฒฉ์— 100ms๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋„๋ณด๋กœ ๋‹ฌ๋ฆฌ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž์œ  ๋ฐฉํ–ฅ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • UO.Step์€ Direction=2 ๋ฐ Running=true์„ ์–ป์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ 7๋Š” ํšŒ์ „๋งŒ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ฝ”๋“œ๋Š” true/false๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. finally ์ •์ƒ ์ข…๋ฃŒ ๋˜๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์‹œ ์ด์ „ ์„ค์ •์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var previous = UO.GetRunUnMountTimer();
    try
    {
        UO.SetRunUnmountTimer(300);
        var stepResult = UO.Step(2, true);
        if (Truth(stepResult != 7))
        {
            UO.Print("Step was not confirmed: " + Convert.ToString(stepResult));
        }
    }
    finally
    {
        UO.SetRunUnmountTimer(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. ๋„ˆ๋ฌด ๋‚ฎ์€ ๊ฐ’์— ๋Œ€ํ•œ ๋ณดํ˜ธ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ ์šฉ๋œ ๊ฐ’=1 ์ดํ›„๋Š” 200๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ๋ฌธ์ž๋ฅผ ์ด๋™ํ•˜์ง€ ์•Š๊ณ  ์›๋ž˜ ๊ฐ„๊ฒฉ์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
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 previous = UO.GetRunUnMountTimer();
        try
        {
            UO.SetRunUnmountTimer(1);
            var applied = UO.GetRunUnMountTimer();
            UO.Print("Applied delay, ms: " + Convert.ToString(applied));
        }
        finally
        {
            UO.SetRunUnmountTimer(previous);
        }

        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setrununmounttimer":

                    state.RunUnmountTimer = ClampMoveTimer(Arg(0), 200);

                    bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer);

                    return InjectionValue.Unit;

UO.SetWalkMountTimer

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

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

void UO.SetWalkMountTimer(object? value);

๋ง์„ ํƒ€๊ณ  ๊ฑท๊ธฐ ์œ„ํ•œ ๊ฑธ์Œ ๊ฐ„๊ฒฉ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜๋„์ ์œผ๋กœ ์†๋„๋ฅผ ์ค„์ด๊ฑฐ๋‚˜ ํ‘œ์ค€ ์†๋„๋กœ ๋Œ์•„๊ฐˆ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ํ‘œ์ค€ ํ…œํฌ ์ด์ƒ์œผ๋กœ ์ด๋™ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

  • value โ€” ํ•„์ˆ˜ ์ •์ˆ˜ ๋ฐ€๋ฆฌ์ดˆ์ž…๋‹ˆ๋‹ค. ๋ฒ”์œ„ 200..2000; 0 ๋ฐ ์Œ์ˆ˜ ๊ฐ’์„ ํฌํ•จํ•œ ์ž‘์€ ๊ฐ’์€ 200๋กœ ์˜ฌ๋ผ๊ฐ€๊ณ , ํฐ ๊ฐ’์€ 2000๋กœ ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ์ ์šฉ๋œ ๊ฐ„๊ฒฉ์„ ์ฝ์œผ๋ ค๋ฉด UO.GetWalkMountTimer()๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด๋Š” ์„œ๋ฒ„์—์„œ ๋‹จ๊ณ„๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์„ค์ •์€ ๋ผ์ด๋”ฉ ๋ชจ๋“œ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ฐ ์ตœ์†Œ ํ—ˆ์šฉ ๊ฐ’์€ 200 ms์ž…๋‹ˆ๋‹ค. ์ƒํ•œ์€ 2000ms์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„ธ ๊ฐ€์ง€ ๋ชจ๋“œ์—๋Š” ๋ณ„๋„์˜ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ•‘, FPS, ๊ฒฝ๋กœ ์ฐพ๊ธฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋˜๋Š” ์ธก์ •๋œ ์„œ๋ฒ„ ๋‹จ๊ณ„ ์ง€์† ์‹œ๊ฐ„์ด ์•„๋‹Œ ์บ๋ฆญํ„ฐ์˜ ๋กœ์ปฌ ์ด๋™ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ ๋Š˜๋ฆฌ๋ฉด ์›€์ง์ž„์ด ๋А๋ ค์ง‘๋‹ˆ๋‹ค. ํ‘œ์ค€ ๊ฐ„๊ฒฉ ์•„๋ž˜๋กœ ์ค„์ด๋ฉด ํŒจํ‚ท ์ „์†ก ์†๋„๊ฐ€ ๋นจ๋ผ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํŒ€ ์ž์ฒด๋Š” ์›€์ง์ด์ง€ ์•Š๊ณ , ํƒˆ๊ฒƒ์„ ์žฅ์ฐฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฑท๊ธฐ/๋‹ฌ๋ฆฌ๊ธฐ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šด์ „ ์ค‘์— ๋ชจ๋“œ๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ์ง€์ •ํ•œ ์†๋„ ๋ชจ๋“œ์™€ ๋น„ํ–‰๋„ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.
  • ์„ค์ •์€ ์ด ํด๋ผ์ด์–ธํŠธ์˜ ์ด๋™์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜๋™ ์ œ์–ด, ์ง€๋„ ๊ฒฝ๋กœ ๋ฐ ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ด์ „ ๊ฐ’์„ ์œ ์ง€ํ•˜๊ณ  ์ž‘์—… ํ›„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ ˆ์ฐจ์—์„œ ๋™์‹œ์— ํ•˜๋‚˜์˜ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  • ํšŒ์ „ ๋ฐ ์ดํƒˆ ๋‹จ๊ณ„๋Š” ์ผ๋ฐ˜์ ์ธ ๋™์ž‘๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ํ™•์ธ, ํ†ต์‹  ์ง€์—ฐ ๋ฐ ์žฅ์• ๋กœ ์ธํ•ด ์‹ค์ œ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ๋ˆ„๋ฝ๋œ ํ”„๋ ˆ์ž„์„ ๋”ฐ๋ผ์žก๊ธฐ ์œ„ํ•ด ์ผ๋ จ์˜ ๊ฐ€์†ํ™”๋œ ๋‹จ๊ณ„๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.SetWalkMountTimer");
UO.SetWalkMountTimer(200);

1. ํ‘œ์ค€ ํ…œํฌ ๋ณต์› - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๊ฐ’=200 โ€” ๋ฐ€๋ฆฌ์ดˆ. ํ˜ธ์ถœ์€ ํ›„์† ์ด๋™์„ ์„ค์ •ํ•˜์ง€๋งŒ ๊ฒฝ๋กœ๋ฅผ ์‹œ์ž‘ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
UO.SetWalkMountTimer(200);

2. ํ•˜๋‚˜์˜ ๋ชจ์…˜ ์š”์ฒญ์„ ์ผ์‹œ์ ์œผ๋กœ ๋А๋ฆฌ๊ฒŒ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๊ฐ’=300์€ ํ‘œ์ค€ ๊ฐ„๊ฒฉ์— 100ms๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์Šน๋งˆ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž์œ  ๋ฐฉํ–ฅ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • UO.Step์€ Direction=2 ๋ฐ Running=false์„ ์–ป์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ 7๋Š” ํšŒ์ „๋งŒ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ฝ”๋“œ๋Š” true/false๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. finally ์ •์ƒ ์ข…๋ฃŒ ๋˜๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์‹œ ์ด์ „ ์„ค์ •์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var previous = UO.GetWalkMountTimer();
    try
    {
        UO.SetWalkMountTimer(300);
        var stepResult = UO.Step(2, false);
        if (Truth(stepResult != 7))
        {
            UO.Print("Step was not confirmed: " + Convert.ToString(stepResult));
        }
    }
    finally
    {
        UO.SetWalkMountTimer(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. ๋„ˆ๋ฌด ๋‚ฎ์€ ๊ฐ’์— ๋Œ€ํ•œ ๋ณดํ˜ธ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ ์šฉ๋œ ๊ฐ’=1 ์ดํ›„๋Š” 200๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ๋ฌธ์ž๋ฅผ ์ด๋™ํ•˜์ง€ ์•Š๊ณ  ์›๋ž˜ ๊ฐ„๊ฒฉ์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
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 previous = UO.GetWalkMountTimer();
        try
        {
            UO.SetWalkMountTimer(1);
            var applied = UO.GetWalkMountTimer();
            UO.Print("Applied delay, ms: " + Convert.ToString(applied));
        }
        finally
        {
            UO.SetWalkMountTimer(previous);
        }

        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setwalkmounttimer":

                    state.WalkMountTimer = ClampMoveTimer(Arg(0), 200);

                    bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer);

                    return InjectionValue.Unit;

UO.SetWalkUnmountTimer

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

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

void UO.SetWalkUnmountTimer(object? value);

๊ฑท๋Š” ๋‹จ๊ณ„ ๊ฐ„๊ฒฉ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜๋„์ ์œผ๋กœ ์†๋„๋ฅผ ์ค„์ด๊ฑฐ๋‚˜ ํ‘œ์ค€ ์†๋„๋กœ ๋Œ์•„๊ฐˆ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ํ‘œ์ค€ ํ…œํฌ ์ด์ƒ์œผ๋กœ ์ด๋™ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

  • value โ€” ํ•„์ˆ˜ ์ •์ˆ˜ ๋ฐ€๋ฆฌ์ดˆ์ž…๋‹ˆ๋‹ค. ๋ฒ”์œ„ 400..2000; 0 ๋ฐ ์Œ์ˆ˜ ๊ฐ’์„ ํฌํ•จํ•œ ์ž‘์€ ๊ฐ’์€ 400๋กœ ์˜ฌ๋ผ๊ฐ€๊ณ , ํฐ ๊ฐ’์€ 2000๋กœ ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

void - ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํšŒ์„ ์œผ๋กœ ์ „ํ™”ํ•˜์„ธ์š”. ์ ์šฉ๋œ ๊ฐ„๊ฒฉ์„ ์ฝ์œผ๋ ค๋ฉด UO.GetWalkUnmountTimer()๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด๋Š” ์„œ๋ฒ„์—์„œ ๋‹จ๊ณ„๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์„ค์ •์€ ๊ฑท๊ธฐ ๋ชจ๋“œ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ฐ ์ตœ์†Œ ํ—ˆ์šฉ ๊ฐ’์€ 400 ms์ž…๋‹ˆ๋‹ค. ์ƒํ•œ์€ 2000ms์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„ธ ๊ฐ€์ง€ ๋ชจ๋“œ์—๋Š” ๋ณ„๋„์˜ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ•‘, FPS, ๊ฒฝ๋กœ ์ฐพ๊ธฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋˜๋Š” ์ธก์ •๋œ ์„œ๋ฒ„ ๋‹จ๊ณ„ ์ง€์† ์‹œ๊ฐ„์ด ์•„๋‹Œ ์บ๋ฆญํ„ฐ์˜ ๋กœ์ปฌ ์ด๋™ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ ๋Š˜๋ฆฌ๋ฉด ์›€์ง์ž„์ด ๋А๋ ค์ง‘๋‹ˆ๋‹ค. ํ‘œ์ค€ ๊ฐ„๊ฒฉ ์•„๋ž˜๋กœ ์ค„์ด๋ฉด ํŒจํ‚ท ์ „์†ก ์†๋„๊ฐ€ ๋นจ๋ผ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํŒ€ ์ž์ฒด๋Š” ์›€์ง์ด์ง€ ์•Š๊ณ , ํƒˆ๊ฒƒ์„ ์žฅ์ฐฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฑท๊ธฐ/๋‹ฌ๋ฆฌ๊ธฐ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šด์ „ ์ค‘์— ๋ชจ๋“œ๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ์ง€์ •ํ•œ ์†๋„ ๋ชจ๋“œ์™€ ๋น„ํ–‰๋„ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.
  • ์„ค์ •์€ ์ด ํด๋ผ์ด์–ธํŠธ์˜ ์ด๋™์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜๋™ ์ œ์–ด, ์ง€๋„ ๊ฒฝ๋กœ ๋ฐ ๊ธฐํƒ€ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ด์ „ ๊ฐ’์„ ์œ ์ง€ํ•˜๊ณ  ์ž‘์—… ํ›„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ ˆ์ฐจ์—์„œ ๋™์‹œ์— ํ•˜๋‚˜์˜ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  • ํšŒ์ „ ๋ฐ ์ดํƒˆ ๋‹จ๊ณ„๋Š” ์ผ๋ฐ˜์ ์ธ ๋™์ž‘๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ํ™•์ธ, ํ†ต์‹  ์ง€์—ฐ ๋ฐ ์žฅ์• ๋กœ ์ธํ•ด ์‹ค์ œ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ๋ˆ„๋ฝ๋œ ํ”„๋ ˆ์ž„์„ ๋”ฐ๋ผ์žก๊ธฐ ์œ„ํ•ด ์ผ๋ จ์˜ ๊ฐ€์†ํ™”๋œ ๋‹จ๊ณ„๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

UO.Print("Calling UO.SetWalkUnmountTimer");
UO.SetWalkUnmountTimer(400);

1. ํ‘œ์ค€ ํ…œํฌ ๋ณต์› - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๊ฐ’=400 โ€” ๋ฐ€๋ฆฌ์ดˆ. ํ˜ธ์ถœ์€ ํ›„์† ์ด๋™์„ ์„ค์ •ํ•˜์ง€๋งŒ ๊ฒฝ๋กœ๋ฅผ ์‹œ์ž‘ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
UO.SetWalkUnmountTimer(400);

2. ํ•˜๋‚˜์˜ ๋ชจ์…˜ ์š”์ฒญ์„ ์ผ์‹œ์ ์œผ๋กœ ๋А๋ฆฌ๊ฒŒ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๊ฐ’=500์€ ํ‘œ์ค€ ๊ฐ„๊ฒฉ์— 100ms๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๊ฑท๊ธฐ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž์œ  ๋ฐฉํ–ฅ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • UO.Step์€ Direction=2 ๋ฐ Running=false์„ ์–ป์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ 7๋Š” ํšŒ์ „๋งŒ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ฝ”๋“œ๋Š” true/false๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. finally ์ •์ƒ ์ข…๋ฃŒ ๋˜๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์‹œ ์ด์ „ ์„ค์ •์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var previous = UO.GetWalkUnmountTimer();
    try
    {
        UO.SetWalkUnmountTimer(500);
        var stepResult = UO.Step(2, false);
        if (Truth(stepResult != 7))
        {
            UO.Print("Step was not confirmed: " + Convert.ToString(stepResult));
        }
    }
    finally
    {
        UO.SetWalkUnmountTimer(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. ๋„ˆ๋ฌด ๋‚ฎ์€ ๊ฐ’์— ๋Œ€ํ•œ ๋ณดํ˜ธ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ ์šฉ๋œ ๊ฐ’=1 ์ดํ›„๋Š” 400๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ๋ฌธ์ž๋ฅผ ์ด๋™ํ•˜์ง€ ์•Š๊ณ  ์›๋ž˜ ๊ฐ„๊ฒฉ์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
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 previous = UO.GetWalkUnmountTimer();
        try
        {
            UO.SetWalkUnmountTimer(1);
            var applied = UO.GetWalkUnmountTimer();
            UO.Print("Applied delay, ms: " + Convert.ToString(applied));
        }
        finally
        {
            UO.SetWalkUnmountTimer(previous);
        }

        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "setwalkunmounttimer":

                    state.WalkUnmountTimer = ClampMoveTimer(Arg(0), 400);

                    bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer);

                    return InjectionValue.Unit;

UO.Step

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

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

dynamic UO.Step(object? direction, object? running);

๋‹จ์ผ ๋‹จ๊ณ„/ํšŒ์ „์„ ์š”์ฒญํ•˜๊ณ  ๋‹จ๊ณ„๊ฐ€ ์ „์†ก๋œ ๊ฒฝ์šฐ ์„œ๋ฒ„ ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

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

  • direction โ€” ๋ฐฉํ–ฅ 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW. ๊ตฌํ˜„์—์„œ๋Š” ๋น„ํŠธ๋ณ„ &7; ๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด 0..7๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • running - true/1 - ์‹คํ–‰ ์š”์ฒญ, false/0 - ๋‹จ๊ณ„. ์„œ๋ฒ„ ๋™์ž‘ ์ง€์—ฐ์ด ์ง€์†๋ฉ๋‹ˆ๋‹ค. ์†๋„ ์Šน์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int: 7 โ€” ๋‹จ๊ณ„๊ฐ€ ํ™•์ธ๋˜๊ฑฐ๋‚˜ ํšŒ์ „๋งŒ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. 5 โ€” ์„œ๋ฒ„๊ฐ€ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค. 4 โ€” ํ™•์ธ ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์ตœ๋Œ€ 10000ms). 3 โ€” ํด๋ผ์ด์–ธํŠธ์— ์˜ํ•ด ์ฐจ๋‹จ๋œ ๋‹จ๊ณ„; 2 โ€” ๋Œ€๊ธฐ์—ด์ด ๊ฝ‰ ์ฐผ์Šต๋‹ˆ๋‹ค. 0 - ์ผ๋ฐ˜์ ์ธ ๊ณ ์žฅ, ์ข…๋ฃŒ ๋˜๋Š” ๋ถˆ์ถฉ๋ถ„ํ•œ ๋‚ด๊ตฌ์„ฑ. true/false๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 0์ด ์•„๋‹Œ ์ฝ”๋“œ 5๋Š” ์‹คํŒจ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ํ•œ ํŒ€์€ ๋จผ์ € ์บ๋ฆญํ„ฐ๋ฅผ ํšŒ์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ ์‚ฌ๊ฐํ˜•์œผ๋กœ ์ด๋™ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
  • moveCheckStamina, moveExitOnDisconnect ๋ฐ moveOpenDoor๊ฐ€ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ธˆ์ง€์™€ ๋กœ์ปฌ ๊ธˆ์ง€๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋ฅผ ๋ถ„์„ํ•˜์ง€ ์•Š๊ณ  ๋ฃจํ”„์—์„œ ๋ช…๋ น์„ ๋ฐ˜๋ณตํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. UO.Wait: ๋ชจ์…˜ ํ์™€ ์„œ๋ฒ„ ์†๋„๊ฐ€ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์˜ QueueStep๋Š” ํ”Œ๋ ˆ์ด์–ด, ์—ฐ๊ฒฐ, ๋ฐฉํ–ฅ, ๋Œ€๊ธฐ์—ด, ํ…œํฌ ๋ฐ ๋กœ์ปฌ ํŠธ๋ž˜ํ”ฝ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Player.Walk ์ด์ „์—๋Š” ๊ฐ ํ˜ธ์ถœ์ด ํ•ด๋‹น ์‹œํ€€์Šค์™€ Walker์˜ ํ™•์ธ/๊ฑฐ๋ถ€ ์„ธ๋Œ€๋ฅผ ๋ณ„๋„๋กœ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ์Šค๋ƒ…์ƒท๊ณผ ํ•จ๊ป˜ Result๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Step ๋ฐ ๋ณด๋ฅ˜ ์ค‘ StepControlled ๋‹ค์Œ ์š”์ฒญ์˜ ๊ณตํ†ต ํ•„๋“œ๊ฐ€ ์•„๋‹Œ ์ด ์ €์žฅ๋œ ์Œ๋งŒ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ต์ฒด ํ”Œ๋ ˆ์ด์–ด/์›Œ์ปค๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฑฐ๋ถ€๋กœ ๋Œ€๊ธฐ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ผ๋ฐ˜ ๋ช…๋ น์„ ํ™•์ธํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ด ๋‹จ๊ณ„๊ฐ€ ํ™•์ธ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์›€์ง์ž„์ด ์—†๋Š” ํšŒ์ „์€ ๋ณ„๋„์˜ ๊ฒฝ์šฐ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • Direction=2 โ€” E, ๋‹ฌ๋ฆฌ๊ธฐ=false โ€” ๊ฑธ์Œ.
  • ์ •ํ™•ํ•œ ์ฝ”๋“œ 7๊ฐ€ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ์›€์ง์ž„์„ ํ™•์ธํ•˜๋ ค๋ฉด X/Y ์ „ํ›„๋ฅผ ๋น„๊ตํ•ด ๋ณด์„ธ์š”.
var result = UO.Step(2, false);
if (Truth(result == 7))
{
    UO.Print("Step accepted or turn completed");
}
else
{
    UO.Print("Movement status: " + Convert.ToString(result));
}

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

2. ํšŒ์ „๊ณผ ๋ฒˆ์—ญ ๊ตฌ๋ณ„ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • Direction=0 โ€” N. ํ˜ธ์ถœ ์ „ํ›„์— ์ขŒํ‘œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ํšŒ์ „์ด๋‚˜ โ€‹โ€‹์‹คํŒจ ์‹œ ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฒฐ๊ณผ๊ฐ€ ๋ณ„๋„๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX();
    var y = UO.GetY();
    var result = UO.Step(0, false);
    if (Truth(UO.GetX() == x) && Truth(UO.GetY() == y))
    {
        UO.Print("Position unchanged; status=" + Convert.ToString(result));
    }

    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. ์‹คํ–‰ ์‹œ ์„œ๋ฒ„ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • Direction=4 โ€” S, Running=true.
  • ์ฝ”๋“œ 5โ€”์„œ๋ฒ„ ์˜ค๋ฅ˜. UO.Wait=250 ms๋Š” ์Šคํฌ๋ฆฝํŠธ์˜ ์ผ์‹œ ์ค‘์ง€๋ฅผ ์ง€์ •ํ•˜๋ฉฐ ๋‹ค์Œ ์‹œ๋„์˜ ์„ฑ๊ณต์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ‘œ์ค€ ์ฃผํ–‰ ์†๋„

์ตœ์†Œ ๊ฑธ์Œ ๊ฐ„๊ฒฉ: ๊ฑท๊ธฐ - ๊ฑท๊ธฐ 400 ms, ๋‹ฌ๋ฆฌ๊ธฐ 200 ms; ๋ผ์ด๋”ฉ - ๊ฑท๊ธฐ 200 ms, ๋‹ฌ๋ฆฌ๊ธฐ 100 ms.

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

๋‹จ๊ณ„, ๊ฒฝ๋กœ, Follow, ๋งˆ์šฐ์Šค/ํ‚ค ์ œ์–ด ๋ฐ ์ง€๋„๋Š” ์บ๋ฆญํ„ฐ์˜ ๊ณต์œ  ๋Œ€๊ธฐ์—ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๊ฒฝ๋กœ๋ฅผ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์œ„์น˜๋ฅผ ์กฐ์ •ํ•ด๋„ ๊ฑธ์Œ ์š”์ฒญ ํ›„ ๋‚จ์€ ์ผ์‹œ์ •์ง€๋Š” ์ทจ์†Œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ ํ›„์—๋Š” ์†์‹ค๋œ ํ”„๋ ˆ์ž„์„ ๋ณด์ƒํ•  ๋น ๋ฅธ ๋ฒ„์ŠคํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์žฅ์• ๋ฌผ, ์˜์‚ฌ์†Œํ†ต ๋ถˆ๋Ÿ‰์œผ๋กœ ์ธํ•ด ์›€์ง์ž„์ด ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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 result = UO.Step(4, true);
        if (Truth(result == 5))
        {
            UO.Print("Server denied the step");
            await Delay(250);
        }

        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.Step(direction, running) โ€” UO.Step(Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "step":

                    if (state.MoveExitOnDisconnect != 0 && bridge.IsOnline() == 0)

                        return new InjectionValue(0);

                    if (state.MoveCheckStamina > 0 && bridge.Stamina < state.MoveCheckStamina)

                        return new InjectionValue(0);

                    if (state.MoveOpenDoor != 0)

                        bridge.OpenDoor();

                    return new InjectionValue(bridge.Step(Arg(0) & 7, Arg(1) != 0));

UO.StepQ

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

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

int UO.StepQ(object? direction, object? run);
int UO.StepQ(object? direction, object? run, object? timeout);
int UO.StepQ(object? direction, object? run, object? timeout, object? queue);
int UO.StepQ(object? direction, object? run, object? timeout, object? queue, object? waitForAck);

๋Œ€๊ธฐ์—ด์˜ ํ•œ ๋‹จ๊ณ„๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์–‘์‹์€ ๋Œ€๊ธฐ์—ด์ด ๋น„์–ด ์žˆ๊ณ  ํ™•์ธ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  • direction โ€” ๋ฐฉํ–ฅ 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW. ๊ตฌํ˜„์—์„œ๋Š” ๋น„ํŠธ๋ณ„ &7; ๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด 0..7๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • run - true/1 - ์‹คํ–‰ ์š”์ฒญ, false/0 - ๋‹จ๊ณ„. ์„œ๋ฒ„ ๋™์ž‘ ์ง€์—ฐ์ด ์ง€์†๋ฉ๋‹ˆ๋‹ค. ์†๋„ ์Šน์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • timeout โ€” ์„ ํƒ์  ๋Œ€๊ธฐ์—ด ๋Œ€๊ธฐ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)์ž…๋‹ˆ๋‹ค. 0/negative๋Š” ์ถœ์‹œ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. waitForAck=true ๋ฐ timeout=0์ธ ๊ฒฝ์šฐ 10000ms ์ „์— ํ™•์ธ์ด ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์ด ์–‘์ˆ˜์ธ ๊ฒฝ์šฐ ํ™•์ธ ๋Œ€๊ธฐ๋Š” ๋™์ผํ•œ ๊ธฐ๊ฐ„์˜ ๋ณ„๋„ ๊ธฐ๊ฐ„์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • queue โ€” ์„ ํƒ์  ํ”Œ๋ž˜๊ทธ, ๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค. false๋Š” ๋‹จ๊ณ„๋ฅผ ์š”์ฒญํ•  ๋•Œ forcePacket๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ œํ•œ์„ โ€‹โ€‹๋ฌด์‹œํ•˜๊ฑฐ๋‚˜ ๋ˆ„์ ๋œ ๋Œ€๊ธฐ์—ด์„ ์ง€์šฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • waitForAck - false/absent - ๋ฌธ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. true โ€” ์ „์†ก๋œ ๋‹จ๊ณ„์— ๋Œ€ํ•ด ํ™•์ธ/๊ฑฐ์ ˆ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int waitForAck ์—†์Œ: 0..255 โ€” ์œ ํšจํ•œ 0๋ฅผ ํฌํ•จํ•˜์—ฌ ์ „์†ก๋œ ์š”์ฒญ์˜ ์ˆœ์„œ; 256 - ํšŒ์ „๋งŒ ๊ฐ€๋Šฅ; -2 โ€” ํด๋ผ์ด์–ธํŠธ์˜ ์žฅ์• ๋ฌผ; -1 - ์ผ๋ฐ˜ ์˜ค๋ฅ˜/์ „์ฒด ๋Œ€๊ธฐ์—ด/์ข…๋ฃŒ/์ง€์†์„ฑ. waitForAck=true ์‚ฌ์šฉ: 7 - ํ™•์ธ, 5 - ์„œ๋ฒ„ ์˜ค๋ฅ˜, 4 - ์‹œ๊ฐ„ ์ดˆ๊ณผ; -1/-2/256๋Š” ์ด์ „ ์˜๋ฏธ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์–‘์‹์— ๋‚˜์˜ค๋Š” ์ˆซ์ž 7๋Š” ํ™•์ธ์ด ์•„๋‹Œ ์ˆœ์„œ์ž…๋‹ˆ๋‹ค. ํŠน์ • ์ˆซ์ž ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”. C#์˜ int์— ๋Œ€ํ•œ if(๊ฒฐ๊ณผ)๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ํ•œ ํŒ€์€ ๋จผ์ € ์บ๋ฆญํ„ฐ๋ฅผ ํšŒ์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ ์‚ฌ๊ฐํ˜•์œผ๋กœ ์ด๋™ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
  • moveCheckStamina, moveExitOnDisconnect ๋ฐ moveOpenDoor๊ฐ€ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ธˆ์ง€์™€ ๋กœ์ปฌ ๊ธˆ์ง€๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋ฅผ ๋ถ„์„ํ•˜์ง€ ์•Š๊ณ  ๋ฃจํ”„์—์„œ ๋ช…๋ น์„ ๋ฐ˜๋ณตํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. UO.Wait: ๋ชจ์…˜ ํ์™€ ์„œ๋ฒ„ ์†๋„๊ฐ€ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋ช…๋ น์€ ์œ„์น˜ ๋ณ€๊ฒฝ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. LastStepQUsedDoor๋Š” ๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฌธ์„ ์—ด๋ ค๊ณ  ์‹œ๋„ํ–ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ๊ฒŒ์ž„ ์ŠคํŠธ๋ฆผ์˜ QueueStep๋Š” ํ”Œ๋ ˆ์ด์–ด, ์—ฐ๊ฒฐ, ๋ฐฉํ–ฅ, ๋Œ€๊ธฐ์—ด, ํ…œํฌ ๋ฐ ๋กœ์ปฌ ํŠธ๋ž˜ํ”ฝ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Player.Walk ์ด์ „์—๋Š” ๊ฐ ํ˜ธ์ถœ์ด ํ•ด๋‹น ์‹œํ€€์Šค์™€ Walker์˜ ํ™•์ธ/๊ฑฐ๋ถ€ ์„ธ๋Œ€๋ฅผ ๋ณ„๋„๋กœ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ์Šค๋ƒ…์ƒท๊ณผ ํ•จ๊ป˜ Result๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Step ๋ฐ ๋ณด๋ฅ˜ ์ค‘ StepControlled ๋‹ค์Œ ์š”์ฒญ์˜ ๊ณตํ†ต ํ•„๋“œ๊ฐ€ ์•„๋‹Œ ์ด ์ €์žฅ๋œ ์Œ๋งŒ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ต์ฒด ํ”Œ๋ ˆ์ด์–ด/์›Œ์ปค๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฑฐ๋ถ€๋กœ ๋Œ€๊ธฐ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ผ๋ฐ˜ ๋ช…๋ น์„ ํ™•์ธํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ด ๋‹จ๊ณ„๊ฐ€ ํ™•์ธ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์›€์ง์ž„์ด ์—†๋Š” ํšŒ์ „์€ ๋ณ„๋„์˜ ๊ฒฝ์šฐ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

var result = UO.StepQ(2, false);
UO.Print("StepQ: " + Convert.ToString(result));

1. ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์‹œํ€€์Šค ๊ฐ€์ ธ์˜ค๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋ฐฉํ–ฅ=2 โ€” E, ์‹คํ–‰=false. ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜๋Š” ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ •์ƒ์ ์ธ ์„ค์ •์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œํ€€์Šค=0๋Š” ์œ ํšจํ•œ ์Šคํ…Œ์ด์ง• ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค. ์‹œํ€€์Šค=256๋Š” ํšŒ์ „์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
var sequence = UO.StepQ(2, false);
if (Truth(sequence >= 0) && Truth(sequence <= 255))
{
    UO.Print("Queued sequence: " + Convert.ToString(sequence));
}
else
{
    UO.Print("Queue status: " + Convert.ToString(sequence));
}

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

2. ํ™•์ธ ๋Œ€๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • direction=4 โ€” S, run=true, timeout=1500 ms. ๋Œ€๊ธฐ์—ด=true, waitForAck=true.
  • ์ขŒ์„์„ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ํ™•์ธํ•˜๋Š” ๋ฐ ์ตœ๋Œ€ 2๊ฐœ์˜ 1500ms ๊ฐ„๊ฒฉ์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 256 ํšŒ์ „์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ๊ณ ๋ ค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var status = UO.StepQ(4, true, 1500, true, true);
    if (Truth(status == 7))
    {
        UO.Print("Server confirmed");
    }
    else
    {
        UO.Print("Step status: " + Convert.ToString(status));
    }

    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. ๋กœ์ปฌ ์›” ๋ณ„๋„ ์ฒ˜๋ฆฌ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋ฐฉํ–ฅ=6 โ€” W, ์‹คํ–‰=false; timeout=0๋Š” ์ค„์„ ์„œ์„œ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. queue=false ์š”์ฒญ forcePacket, waitForAck=false.
  • ForcePacket๋Š” ๋ฒฝ์„ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. -2์˜ ๊ฒฝ์šฐ ๋™์ผํ•œ ์…€๋กœ ๋‹ค์‹œ ๋ณด๋‚ด๋Š” ๋Œ€์‹  ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

ํ‘œ์ค€ ์ฃผํ–‰ ์†๋„

์ตœ์†Œ ๊ฑธ์Œ ๊ฐ„๊ฒฉ: ๊ฑท๊ธฐ - ๊ฑท๊ธฐ 400 ms, ๋‹ฌ๋ฆฌ๊ธฐ 200 ms; ๋ผ์ด๋”ฉ - ๊ฑท๊ธฐ 200 ms, ๋‹ฌ๋ฆฌ๊ธฐ 100 ms.

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

๋‹จ๊ณ„, ๊ฒฝ๋กœ, Follow, ๋งˆ์šฐ์Šค/ํ‚ค ์ œ์–ด ๋ฐ ์ง€๋„๋Š” ์บ๋ฆญํ„ฐ์˜ ๊ณต์œ  ๋Œ€๊ธฐ์—ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๊ฒฝ๋กœ๋ฅผ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์œ„์น˜๋ฅผ ์กฐ์ •ํ•ด๋„ ๊ฑธ์Œ ์š”์ฒญ ํ›„ ๋‚จ์€ ์ผ์‹œ์ •์ง€๋Š” ์ทจ์†Œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ ํ›„์—๋Š” ์†์‹ค๋œ ํ”„๋ ˆ์ž„์„ ๋ณด์ƒํ•  ๋น ๋ฅธ ๋ฒ„์ŠคํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ™•์ธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์žฅ์• ๋ฌผ, ์˜์‚ฌ์†Œํ†ต ๋ถˆ๋Ÿ‰์œผ๋กœ ์ธํ•ด ์›€์ง์ž„์ด ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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 status = UO.StepQ(6, false, 0, false, false);
        if (Truth(status == -2))
        {
            UO.Print("Local obstacle; calculate another route");
        }

        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.StepQ(direction, run) โ€” UO.StepQ(Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactStepQ(values))

UO.StepQ(direction, run, timeout) โ€” UO.StepQ(Any,Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactStepQ(values))

UO.StepQ(direction, run, timeout, queue) โ€” UO.StepQ(Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactStepQ(values))

UO.StepQ(direction, run, timeout, queue, waitForAck) โ€” UO.StepQ(Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: direction (Any), run (Any), timeout (Any), queue (Any), waitForAck (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(CompactStepQ(values))

UO.moveBetweenTwoCorners

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

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

dynamic UO.moveBetweenTwoCorners();
dynamic UO.moveBetweenTwoCorners(object? value);

๋‘ ๊ฐœ์˜ ์ธก๋ฉด ์‚ฌ๊ฐํ˜•์ด ์ฐจ๋‹จ๋œ ๋Œ€๊ฐ์„  ํ•ด์ƒ๋„์ž…๋‹ˆ๋‹ค.

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

  • value โ€” ์„ ํƒ์ ์ธ ์ƒˆ ๊ฐ’์ž…๋‹ˆ๋‹ค. 0 ๊ธˆ์ง€, 0์ด ์•„๋‹Œ ๊ฐ’์€ 1๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ ๊ตฌ์„ฑ์— ๊ด€๊ณ„์—†์ด ์ด๋Ÿฌํ•œ ์ „๋‹ฌ์„ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int - ํ˜„์žฌ ์ €์žฅ๋œ ๊ฐ’. ์ธ์ˆ˜ ์—†์ด๋Š” ์ฝ๊ธฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์˜ ๊ทœ์น™์„ ์ ์šฉํ•œ ํ›„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์›€์ง์ž„์˜ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ ์„ค์ •์ž…๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉฐ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • value๋Š” ์ด ์„ค์ •์˜ ์ˆซ์ž ๊ฐ’์ž…๋‹ˆ๋‹ค.
var value = UO.moveBetweenTwoCorners();
UO.Print(Convert.ToString(value));

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

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

  • ๊ฐ’=0. 0 ๊ธˆ์ง€, 0์ด ์•„๋‹Œ ๊ฐ’์€ 1๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ ๊ตฌ์„ฑ์— ๊ด€๊ณ„์—†์ด ์ด๋Ÿฌํ•œ ์ „๋‹ฌ์„ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ ์šฉ๋œ ๊ฐ’์€ ๋ชฉํ‘œ์˜ ์„ฑ๊ณต์ ์ธ ๋‹ฌ์„ฑ์ด ์•„๋‹Œ ์ €์žฅ๋œ ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var applied = UO.moveBetweenTwoCorners(0);
    UO.Print("Applied: " + Convert.ToString(applied));
    return null;
}

3. ์Šคํฌ๋ฆฝํŠธ์˜ ํ•œ ์„น์…˜์— ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ด์ „์€ ์ดˆ๊ธฐ ์„ค์ •์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. NewMoveXY๋Š” 3000ms๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰ ๋ช…๋ น์€ ์ผ๋ฐ˜ ๋ชจ์…˜ ๋ณต๊ท€ ํ›„ ์„ค์ •์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
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 previous = UO.moveBetweenTwoCorners();
        UO.moveBetweenTwoCorners(0);
        var ok = UO.NewMoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false, 0, 3000);
        UO.moveBetweenTwoCorners(previous);
        UO.Print(Convert.ToString(ok));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.moveBetweenTwoCorners() โ€” UO.moveBetweenTwoCorners()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "movebetweentwocorners":

                    if (arguments.Length > 0) state.MoveBetweenTwoCorners = Arg(0) != 0 ? 1 : 0;

                    return new InjectionValue(state.MoveBetweenTwoCorners);

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "movebetweentwocorners":

                    if (arguments.Length > 0) state.MoveBetweenTwoCorners = Arg(0) != 0 ? 1 : 0;

                    return new InjectionValue(state.MoveBetweenTwoCorners);

UO.moveCheckStamina

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

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

dynamic UO.moveCheckStamina();
dynamic UO.moveCheckStamina(object? value);

์ด๋™ ๋ช…๋ น์„ ์œ„ํ•œ ์ตœ์†Œ ์ฒด๋ ฅ.

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

  • value โ€” ์„ ํƒ์ ์ธ ์ƒˆ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ •์ˆ˜ >=0; ๋ถ€์ •์€ 0๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 0์€ ์ž„๊ณ„๊ฐ’ ํ™•์ธ์„ ๋•๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int - ํ˜„์žฌ ์ €์žฅ๋œ ๊ฐ’. ์ธ์ˆ˜ ์—†์ด๋Š” ์ฝ๊ธฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์˜ ๊ทœ์น™์„ ์ ์šฉํ•œ ํ›„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์›€์ง์ž„์˜ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ ์„ค์ •์ž…๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉฐ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • value๋Š” ์ด ์„ค์ •์˜ ์ˆซ์ž ๊ฐ’์ž…๋‹ˆ๋‹ค.
var value = UO.moveCheckStamina();
UO.Print(Convert.ToString(value));

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

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

  • ๊ฐ’=15. ์ •์ˆ˜ >=0; ๋ถ€์ •์€ 0๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 0์€ ์ž„๊ณ„๊ฐ’ ํ™•์ธ์„ ๋•๋‹ˆ๋‹ค.
  • ์ ์šฉ๋œ ๊ฐ’์€ ๋ชฉํ‘œ์˜ ์„ฑ๊ณต์ ์ธ ๋‹ฌ์„ฑ์ด ์•„๋‹Œ ์ €์žฅ๋œ ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var applied = UO.moveCheckStamina(15);
    UO.Print("Applied: " + Convert.ToString(applied));
    return null;
}

3. ์Šคํฌ๋ฆฝํŠธ์˜ ํ•œ ์„น์…˜์— ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ด์ „์€ ์ดˆ๊ธฐ ์„ค์ •์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. NewMoveXY๋Š” 3000ms๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰ ๋ช…๋ น์€ ์ผ๋ฐ˜ ๋ชจ์…˜ ๋ณต๊ท€ ํ›„ ์„ค์ •์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
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 previous = UO.moveCheckStamina();
        UO.moveCheckStamina(15);
        var ok = UO.NewMoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false, 0, 3000);
        UO.moveCheckStamina(previous);
        UO.Print(Convert.ToString(ok));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.moveCheckStamina() โ€” UO.moveCheckStamina()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "movecheckstamina": if (arguments.Length > 0) state.MoveCheckStamina = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveCheckStamina);

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "movecheckstamina": if (arguments.Length > 0) state.MoveCheckStamina = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveCheckStamina);

UO.moveExitOnDisconnect

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

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

dynamic UO.moveExitOnDisconnect();
dynamic UO.moveExitOnDisconnect(object? value);

์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋ฉด ์ด๋™์„ ์ค‘์ง€/๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

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

  • value โ€” ์„ ํƒ์ ์ธ ์ƒˆ ๊ฐ’์ž…๋‹ˆ๋‹ค. 0๊ฐ€ ๊บผ์ง€๊ณ  0์ด ์•„๋‹Œ ๊ฐ’์€ 1๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ธ์ฆ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ์—ฐ๊ฒฐ ์—†์ด๋Š” ์„œ๋ฒ„์—์„œ ์ด๋™ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int - ํ˜„์žฌ ์ €์žฅ๋œ ๊ฐ’. ์ธ์ˆ˜ ์—†์ด๋Š” ์ฝ๊ธฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์˜ ๊ทœ์น™์„ ์ ์šฉํ•œ ํ›„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์›€์ง์ž„์˜ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ ์„ค์ •์ž…๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉฐ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • value๋Š” ์ด ์„ค์ •์˜ ์ˆซ์ž ๊ฐ’์ž…๋‹ˆ๋‹ค.
var value = UO.moveExitOnDisconnect();
UO.Print(Convert.ToString(value));

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

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

  • ๊ฐ’=1. 0๊ฐ€ ๊บผ์ง€๊ณ  0์ด ์•„๋‹Œ ๊ฐ’์€ 1๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ธ์ฆ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ์—ฐ๊ฒฐ ์—†์ด๋Š” ์„œ๋ฒ„์—์„œ ์ด๋™ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ ์šฉ๋œ ๊ฐ’์€ ๋ชฉํ‘œ์˜ ์„ฑ๊ณต์ ์ธ ๋‹ฌ์„ฑ์ด ์•„๋‹Œ ์ €์žฅ๋œ ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var applied = UO.moveExitOnDisconnect(1);
    UO.Print("Applied: " + Convert.ToString(applied));
    return null;
}

3. ์Šคํฌ๋ฆฝํŠธ์˜ ํ•œ ์„น์…˜์— ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ด์ „์€ ์ดˆ๊ธฐ ์„ค์ •์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. NewMoveXY๋Š” 3000ms๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰ ๋ช…๋ น์€ ์ผ๋ฐ˜ ๋ชจ์…˜ ๋ณต๊ท€ ํ›„ ์„ค์ •์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
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 previous = UO.moveExitOnDisconnect();
        UO.moveExitOnDisconnect(1);
        var ok = UO.NewMoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false, 0, 3000);
        UO.moveExitOnDisconnect(previous);
        UO.Print(Convert.ToString(ok));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.moveExitOnDisconnect() โ€” UO.moveExitOnDisconnect()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "moveexitondisconnect": if (arguments.Length > 0) state.MoveExitOnDisconnect = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveExitOnDisconnect);

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "moveexitondisconnect": if (arguments.Length > 0) state.MoveExitOnDisconnect = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveExitOnDisconnect);

UO.moveHeuristicMult

๊ฒฝ๋กœ ํƒ์ƒ‰ ์ดˆ๊ธฐ ์„ค์ •

์ƒˆ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์—์„œ UO.moveHeuristicMult()๋Š” 120, UO.moveTurnCost()๋Š” 14์ž…๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•œ ๊ฐ’์€ ์ดํ›„ ์ด๋™ ๋ช…๋ น์—๋„ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๋ฐฐ์ˆ˜ 100์€ ๋Œ€๊ฐ์„ ์„ ๊ณ ๋ คํ•˜๋Š” ์ผ๋ฐ˜ ๊ฑฐ๋ฆฌ ์ถ”์ •์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋” ํฐ ๋ฐฐ์ˆ˜๋Š” ๋ณดํ†ต ํƒ์ƒ‰์„ ๋น ๋ฅด๊ฒŒ ํ•˜์ง€๋งŒ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋” ์ž‘์€ ๊ฐ’์€ ๊ณ„์‚ฐ ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํšŒ์ „ ๋น„์šฉ 0์€ ๋ฐฉํ–ฅ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋น„์šฉ์„ ์—†์•ฑ๋‹ˆ๋‹ค. ์ด ์„ค์ •์€ ๊ฒฝ๋กœ ํƒ์ƒ‰์—๋งŒ ์˜ํ–ฅ์„ ์ฃผ๋ฉฐ ์บ๋ฆญํ„ฐ ์†๋„๋‚˜ UO.LimitMove ๊ฑฐ๋ฆฌ ์ œํ•œ๊ณผ๋Š” ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค.

int previousHeuristic = (int)UO.moveHeuristicMult();
int previousTurnCost = (int)UO.moveTurnCost();
try
{
    UO.moveHeuristicMult(120);
    UO.moveTurnCost(14);
    UO.Print($"Heuristic: {UO.moveHeuristicMult()}, turn cost: {UO.moveTurnCost()}");
}
finally
{
    UO.moveHeuristicMult(previousHeuristic);
    UO.moveTurnCost(previousTurnCost);
}

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

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

dynamic UO.moveHeuristicMult();
dynamic UO.moveHeuristicMult(object? value);

ํŒจ์ŠคํŒŒ์ธ๋” ๊ฒฝํ—˜์  ์Šน์ˆ˜(%)์ž…๋‹ˆ๋‹ค.

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

  • value โ€” ์„ ํƒ์ ์ธ ์ƒˆ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ •์ˆ˜ >=0๋Š” ๋ณด์กด๋ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ 1๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์ „์—. 100 ๊ฐ’์€ ์ผ๋ฐ˜์ ์ธ ์ถ”์ •์น˜์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. >100๋Š” ์ตœ์†Œ ๋น„์šฉ ๋ณด์žฅ ์—†์ด ๋” ๋น ๋ฅธ ๊ฒ€์ƒ‰์„ ์„ ํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Optimized=false์ธ ๊ฒฝ์šฐ 1๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int - ํ˜„์žฌ ์ €์žฅ๋œ ๊ฐ’. ์ธ์ˆ˜ ์—†์ด๋Š” ์ฝ๊ธฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์˜ ๊ทœ์น™์„ ์ ์šฉํ•œ ํ›„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์›€์ง์ž„์˜ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ ์„ค์ •์ž…๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉฐ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • value๋Š” ์ด ์„ค์ •์˜ ์ˆซ์ž ๊ฐ’์ž…๋‹ˆ๋‹ค.
var value = UO.moveHeuristicMult();
UO.Print(Convert.ToString(value));

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

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

  • ๊ฐ’=100. ์ •์ˆ˜ >=0๋Š” ๋ณด์กด๋ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ 1๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์ „์—. 100 ๊ฐ’์€ ์ผ๋ฐ˜์ ์ธ ์ถ”์ •์น˜์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. >100๋Š” ์ตœ์†Œ ๋น„์šฉ ๋ณด์žฅ ์—†์ด ๋” ๋น ๋ฅธ ๊ฒ€์ƒ‰์„ ์„ ํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Optimized=false์ธ ๊ฒฝ์šฐ 1๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ ์šฉ๋œ ๊ฐ’์€ ๋ชฉํ‘œ์˜ ์„ฑ๊ณต์ ์ธ ๋‹ฌ์„ฑ์ด ์•„๋‹Œ ์ €์žฅ๋œ ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var applied = UO.moveHeuristicMult(100);
    UO.Print("Applied: " + Convert.ToString(applied));
    return null;
}

3. ์Šคํฌ๋ฆฝํŠธ์˜ ํ•œ ์„น์…˜์— ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ด์ „์€ ์ดˆ๊ธฐ ์„ค์ •์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. NewMoveXY๋Š” 3000ms๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰ ๋ช…๋ น์€ ์ผ๋ฐ˜ ๋ชจ์…˜ ๋ณต๊ท€ ํ›„ ์„ค์ •์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
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 previous = UO.moveHeuristicMult();
        UO.moveHeuristicMult(100);
        var ok = UO.NewMoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false, 0, 3000);
        UO.moveHeuristicMult(previous);
        UO.Print(Convert.ToString(ok));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.moveHeuristicMult() โ€” UO.moveHeuristicMult()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "moveheuristicmult": if (arguments.Length > 0) state.MoveHeuristicMultiplier = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveHeuristicMultiplier);

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "moveheuristicmult": if (arguments.Length > 0) state.MoveHeuristicMultiplier = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveHeuristicMultiplier);

UO.moveOpenDoor

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

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

dynamic UO.moveOpenDoor();
dynamic UO.moveOpenDoor(object? value);

์ด๋™ ๋ฐฉํ–ฅ์œผ๋กœ ๋ฌธ์„ ์—ด๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

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

  • value โ€” ์„ ํƒ์ ์ธ ์ƒˆ ๊ฐ’์ž…๋‹ˆ๋‹ค. 0๊ฐ€ ๊บผ์ง€๊ณ  0์ด ์•„๋‹Œ ๊ฐ’์€ 1๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. NewMoveXY/MoveXYZ์˜ ๋ช…์‹œ์ ์ธ openDoors๋Š” ํ˜ธ์ถœ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int - ํ˜„์žฌ ์ €์žฅ๋œ ๊ฐ’. ์ธ์ˆ˜ ์—†์ด๋Š” ์ฝ๊ธฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์˜ ๊ทœ์น™์„ ์ ์šฉํ•œ ํ›„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์›€์ง์ž„์˜ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ ์„ค์ •์ž…๋‹ˆ๋‹ค.

๋™์ž‘

  • ์„ค์ •์€ ๋Ÿฐํƒ€์ž„ ์ƒํƒœ์— ์ €์žฅ๋˜๋ฉฐ ์‹œ์ž‘ ์‹œ ํ•ด๋‹น ๋ช…๋ น์— ์˜ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ด๋ฏธ ๋นŒ๋“œ๋œ ๊ฒฝ๋กœ๋ฅผ ์ž๋™์œผ๋กœ ๋ฎ์–ด์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด ์›๋ž˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ถฉ๋Œ ํ›„์—๋Š” ๋‹ค์Œ ๋ณต๊ตฌ ๋ผ์ธ์ด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค. 1์—์„œ ๋„์–ด ์…€์€ A* ๋™์•ˆ ํ†ต๊ณผ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ํŠน์ • ์ธ์ ‘ํ•œ ๋ฌธ์„ ์—ด๋ ค๊ณ  ํ•˜๋Š” ์‹œ๋„๋Š” ๊ณ„๋‹จ ์ด์ „์— ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์•Œ๋ ค์ง„ ๋ฌธ ๊ฐ์ฒด๊ฐ€ ์—†์œผ๋ฉด OpenDoor ์ฟผ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ด ํ”Œ๋ž˜๊ทธ๋Š” ๋ฌธ ์ž์ฒด๋ฅผ ๋‹ซ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ๊ฐ€ ์—ฐ ๋ฌธ์„ ๋‹ซ๋Š” ๊ฒƒ์€ ๋ณ„๋„์˜ ํด๋ผ์ด์–ธํŠธ ์„ค์ •์ž…๋‹ˆ๋‹ค. ๋ฌธ์ด ์ž ๊ธฐ๊ฑฐ๋‚˜ ์„œ๋ฒ„๊ฐ€ ๊ธˆ์ง€๋˜๋ฉด ๊ฒฝ๋กœ๊ฐ€ ๋ฐฉํ•ด๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉฐ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • value๋Š” ์ด ์„ค์ •์˜ ์ˆซ์ž ๊ฐ’์ž…๋‹ˆ๋‹ค.
var value = UO.moveOpenDoor();
UO.Print(Convert.ToString(value));

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

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

  • ๊ฐ’=1. 0๊ฐ€ ๊บผ์ง€๊ณ  0์ด ์•„๋‹Œ ๊ฐ’์€ 1๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. NewMoveXY/MoveXYZ์˜ ๋ช…์‹œ์ ์ธ openDoors๋Š” ํ†ตํ™” ๊ธฐ๊ฐ„ ๋™์•ˆ ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.
  • ์ ์šฉ๋œ ๊ฐ’์€ ๋ชฉํ‘œ์˜ ์„ฑ๊ณต์ ์ธ ๋‹ฌ์„ฑ์ด ์•„๋‹Œ ์ €์žฅ๋œ ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var applied = UO.moveOpenDoor(1);
    UO.Print("Applied: " + Convert.ToString(applied));
    return null;
}

3. ์Šคํฌ๋ฆฝํŠธ์˜ ํ•œ ์„น์…˜์— ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ด์ „์€ ์ดˆ๊ธฐ ์„ค์ •์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. NewMoveXY๋Š” 3000ms๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰ ๋ช…๋ น์€ ์ผ๋ฐ˜ ๋ชจ์…˜ ๋ณต๊ท€ ํ›„ ์„ค์ •์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
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 previous = UO.moveOpenDoor();
        UO.moveOpenDoor(1);
        var ok = UO.NewMoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false, 0, 3000);
        UO.moveOpenDoor(previous);
        UO.Print(Convert.ToString(ok));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.moveOpenDoor() โ€” UO.moveOpenDoor()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "moveopendoor": if (arguments.Length > 0) state.MoveOpenDoor = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveOpenDoor);

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "moveopendoor": if (arguments.Length > 0) state.MoveOpenDoor = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveOpenDoor);

UO.moveThroughCorner

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

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

dynamic UO.moveThroughCorner();
dynamic UO.moveThroughCorner(object? value);

ํ•œ์ชฝ ์…€์ด ์ฐจ๋‹จ๋œ ์…€ ์‚ฌ์ด์˜ ๋Œ€๊ฐ์„  ํ•ด์ƒ๋„์ž…๋‹ˆ๋‹ค.

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

  • value โ€” ์„ ํƒ์ ์ธ ์ƒˆ ๊ฐ’์ž…๋‹ˆ๋‹ค. 0 ๊ธˆ์ง€, 0์ด ์•„๋‹Œ ๊ฐ’์€ 1๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์–‘์ชฝ ์‚ฌ๊ฐํ˜•์ด ๋ง‰ํžˆ๋ฉด moveBetweenTwoCorners๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int - ํ˜„์žฌ ์ €์žฅ๋œ ๊ฐ’. ์ธ์ˆ˜ ์—†์ด๋Š” ์ฝ๊ธฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์˜ ๊ทœ์น™์„ ์ ์šฉํ•œ ํ›„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์›€์ง์ž„์˜ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ ์„ค์ •์ž…๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉฐ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • value๋Š” ์ด ์„ค์ •์˜ ์ˆซ์ž ๊ฐ’์ž…๋‹ˆ๋‹ค.
var value = UO.moveThroughCorner();
UO.Print(Convert.ToString(value));

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

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

  • ๊ฐ’=0. 0 ๊ธˆ์ง€, 0์ด ์•„๋‹Œ ๊ฐ’์€ 1๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์–‘์ชฝ ์‚ฌ๊ฐํ˜•์ด ๋ง‰ํžˆ๋ฉด moveBetweenTwoCorners๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ ์šฉ๋œ ๊ฐ’์€ ๋ชฉํ‘œ์˜ ์„ฑ๊ณต์ ์ธ ๋‹ฌ์„ฑ์ด ์•„๋‹Œ ์ €์žฅ๋œ ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var applied = UO.moveThroughCorner(0);
    UO.Print("Applied: " + Convert.ToString(applied));
    return null;
}

3. ์Šคํฌ๋ฆฝํŠธ์˜ ํ•œ ์„น์…˜์— ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ด์ „์€ ์ดˆ๊ธฐ ์„ค์ •์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. NewMoveXY๋Š” 3000ms๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰ ๋ช…๋ น์€ ์ผ๋ฐ˜ ๋ชจ์…˜ ๋ณต๊ท€ ํ›„ ์„ค์ •์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
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 previous = UO.moveThroughCorner();
        UO.moveThroughCorner(0);
        var ok = UO.NewMoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false, 0, 3000);
        UO.moveThroughCorner(previous);
        UO.Print(Convert.ToString(ok));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.moveThroughCorner() โ€” UO.moveThroughCorner()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "movethroughcorner": if (arguments.Length > 0) state.MoveThroughCorner = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveThroughCorner);

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "movethroughcorner": if (arguments.Length > 0) state.MoveThroughCorner = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveThroughCorner);

UO.moveThroughNPC

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

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

dynamic UO.moveThroughNPC();
dynamic UO.moveThroughNPC(object? value);

๋ฌธ์ž ํ†ต๊ณผ ์‹œ๋„๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

  • ์ˆซ์ž ์ฒด๋ ฅ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ Stamina >= ๊ธฐ์ค€์ผ ๋•Œ ์บ๋ฆญํ„ฐ๋ฅผ ํ†ต๊ณผํ•˜๋ ค๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’ 1000์ด๋ฉฐ 0์€ ์ฒด๋ ฅ์— ๊ด€๊ณ„์—†์ด ์‹œ๋„๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์ด๋™์„ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int - ํ˜„์žฌ ์ €์žฅ๋œ ๊ฐ’. ์ธ์ˆ˜ ์—†์ด๋Š” ์ฝ๊ธฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์˜ ๊ทœ์น™์„ ์ ์šฉํ•œ ํ›„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์›€์ง์ž„์˜ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ ์„ค์ •์ž…๋‹ˆ๋‹ค.

๋™์ž‘

  • ์„ค์ •์€ ๋Ÿฐํƒ€์ž„ ์ƒํƒœ์— ์ €์žฅ๋˜๋ฉฐ ์‹œ์ž‘ ์‹œ ํ•ด๋‹น ๋ช…๋ น์— ์˜ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ด๋ฏธ ๋นŒ๋“œ๋œ ๊ฒฝ๋กœ๋ฅผ ์ž๋™์œผ๋กœ ๋ฎ์–ด์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด ์›๋ž˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ถฉ๋Œ ํ›„์—๋Š” ๋‹ค์Œ ๋ณต๊ตฌ ๋ผ์ธ์ด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ˆซ์ž ์ฒด๋ ฅ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ Stamina >= ๊ธฐ์ค€์ผ ๋•Œ ์บ๋ฆญํ„ฐ๋ฅผ ํ†ต๊ณผํ•˜๋ ค๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’ 1000์ด๋ฉฐ 0์€ ์ฒด๋ ฅ์— ๊ด€๊ณ„์—†์ด ์‹œ๋„๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์ด๋™์„ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉฐ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • value๋Š” ์ด ์„ค์ •์˜ ์ˆซ์ž ๊ฐ’์ž…๋‹ˆ๋‹ค.
var value = UO.moveThroughNPC();
UO.Print(Convert.ToString(value));

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

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

  • ๊ฐ’=0. ์ •์ˆ˜ >=0, ์Œ์ˆ˜๋Š” 0๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ธ์ •์ ์ธ ๊ฒฝ์šฐ ์‹œ๋„๊ฐ€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ avoidMobiles๋Š” ๋‹จ์ผ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์—ญ๋ฐฉํ–ฅ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์ ์šฉ๋œ ๊ฐ’์€ ๋ชฉํ‘œ์˜ ์„ฑ๊ณต์ ์ธ ๋‹ฌ์„ฑ์ด ์•„๋‹Œ ์ €์žฅ๋œ ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var applied = UO.moveThroughNPC(0);
    UO.Print("Applied: " + Convert.ToString(applied));
    return null;
}

3. ์Šคํฌ๋ฆฝํŠธ์˜ ํ•œ ์„น์…˜์— ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ด์ „์€ ์ดˆ๊ธฐ ์„ค์ •์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. NewMoveXY๋Š” 3000ms๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰ ๋ช…๋ น์€ ์ผ๋ฐ˜ ๋ชจ์…˜ ๋ณต๊ท€ ํ›„ ์„ค์ •์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
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 previous = UO.moveThroughNPC();
        UO.moveThroughNPC(0);
        var ok = UO.NewMoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false, 0, 3000);
        UO.moveThroughNPC(previous);
        UO.Print(Convert.ToString(ok));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.moveThroughNPC() โ€” UO.moveThroughNPC()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "movethroughnpc": if (arguments.Length > 0) state.MoveThroughNpc = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveThroughNpc);

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "movethroughnpc": if (arguments.Length > 0) state.MoveThroughNpc = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveThroughNpc);

UO.moveTurnCost

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

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

dynamic UO.moveTurnCost();
dynamic UO.moveTurnCost(object? value);

๊ฒฝ๋กœ๋ฅผ ์ฐพ์„ ๋•Œ ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ๋Š” ๋ฐ ์ถ”๊ฐ€ ๋น„์šฉ์ด ๋“ญ๋‹ˆ๋‹ค.

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

  • value โ€” ์„ ํƒ์ ์ธ ์ƒˆ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ •์ˆ˜ >=0, ์Œ์ˆ˜๋Š” 0๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ์•„๋‹Œ ๊ฒฝ๋กœ์˜ ๊ฐ€์ค‘์น˜์ž…๋‹ˆ๋‹ค. ์ง์„  ๋‹จ๊ณ„์˜ ๋น„์šฉ์€ 10, ๋Œ€๊ฐ์„  ๋‹จ๊ณ„์˜ ๋น„์šฉ์€ 14์ด๋ฉฐ ์ด๋Š” ํ„ด๋‹น ์ถ”๊ฐ€์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int - ํ˜„์žฌ ์ €์žฅ๋œ ๊ฐ’. ์ธ์ˆ˜ ์—†์ด๋Š” ์ฝ๊ธฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์˜ ๊ทœ์น™์„ ์ ์šฉํ•œ ํ›„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์›€์ง์ž„์˜ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ ์„ค์ •์ž…๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

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

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

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

  • ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉฐ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • value๋Š” ์ด ์„ค์ •์˜ ์ˆซ์ž ๊ฐ’์ž…๋‹ˆ๋‹ค.
var value = UO.moveTurnCost();
UO.Print(Convert.ToString(value));

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

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

  • ๊ฐ’=14. ์ •์ˆ˜ >=0, ์Œ์ˆ˜๋Š” 0๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ์•„๋‹Œ ๊ฒฝ๋กœ์˜ ๊ฐ€์ค‘์น˜์ž…๋‹ˆ๋‹ค. ์ง์„  ๋‹จ๊ณ„์˜ ๋น„์šฉ์€ 10, ๋Œ€๊ฐ์„  ๋‹จ๊ณ„์˜ ๋น„์šฉ์€ 14์ด๋ฉฐ ์ด๋Š” ํ„ด๋‹น ์ถ”๊ฐ€์ž…๋‹ˆ๋‹ค.
  • ์ ์šฉ๋œ ๊ฐ’์€ ๋ชฉํ‘œ์˜ ์„ฑ๊ณต์ ์ธ ๋‹ฌ์„ฑ์ด ์•„๋‹Œ ์ €์žฅ๋œ ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var applied = UO.moveTurnCost(14);
    UO.Print("Applied: " + Convert.ToString(applied));
    return null;
}

3. ์Šคํฌ๋ฆฝํŠธ์˜ ํ•œ ์„น์…˜์— ์ ์šฉ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ด์ „์€ ์ดˆ๊ธฐ ์„ค์ •์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. NewMoveXY๋Š” 3000ms๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰ ๋ช…๋ น์€ ์ผ๋ฐ˜ ๋ชจ์…˜ ๋ณต๊ท€ ํ›„ ์„ค์ •์„ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
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 previous = UO.moveTurnCost();
        UO.moveTurnCost(14);
        var ok = UO.NewMoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false, 0, 3000);
        UO.moveTurnCost(previous);
        UO.Print(Convert.ToString(ok));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.moveTurnCost() โ€” UO.moveTurnCost()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "moveturncost": if (arguments.Length > 0) state.MoveTurnCost = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveTurnCost);

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "moveturncost": if (arguments.Length > 0) state.MoveTurnCost = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveTurnCost);

UO.LimitMove โ€” ์ด๋™ ๊ฑฐ๋ฆฌ ์ œํ•œ. UO.LimitMove๋Š” ๋ชฉ์ ์ง€ ๊ฑฐ๋ฆฌ๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 2000์ด๊ณ  0์€ ๋ฌด์ œํ•œ์ž…๋‹ˆ๋‹ค. ์ˆจ๊ฒจ์ง„ 4096๊ฑธ์Œ/๋…ธ๋“œ ๋ฐ 10000๋…ธ๋“œ ์ œํ•œ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ž‘์—…์€ ์ค‘๋‹จ ๊ฐ€๋Šฅํ•œ ๋‹จ์œ„๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. GetPathArray๋Š” moveThroughNPC ์ฒด๋ ฅ ๊ธฐ์ค€๊ณผ moveOpenDoor๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

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