KO UO Topic movement Part 2 - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
ํ ยท C# ยท IDE ยท UO API ยท AโZ ยท ์ ยท ์ธ์ด
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ด ์๋ ์ซ์๋ ๊ณ์๋ฉ๋๋ค. ๋ฑ๋ก์ ํ์ฌ ์คํ์์ ์ ํจํ๋ฉฐ ํจ๊ป ํด์ ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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);
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [NewMoveXY]. -
InjectionScript.Runtime.InjectionApiUO.CompactNewMoveXY:CompactNewMoveXY(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ 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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [NewMoveXY]. -
InjectionScript.Runtime.InjectionApiUO.CompactNewMoveXY:CompactNewMoveXY(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ 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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [NewMoveXY]. -
InjectionScript.Runtime.InjectionApiUO.CompactNewMoveXY:CompactNewMoveXY(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ 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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [NewMoveXY]. -
InjectionScript.Runtime.InjectionApiUO.CompactNewMoveXY:CompactNewMoveXY(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ 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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [NewMoveXY]. -
InjectionScript.Runtime.InjectionApiUO.CompactNewMoveXY:CompactNewMoveXY(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ 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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [NewMoveXY]. -
InjectionScript.Runtime.InjectionApiUO.CompactNewMoveXY:CompactNewMoveXY(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ 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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [NewMoveXY]. -
InjectionScript.Runtime.InjectionApiUO.CompactNewMoveXY:CompactNewMoveXY(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ 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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [NewMoveXY]. -
InjectionScript.Runtime.InjectionApiUO.CompactNewMoveXY:CompactNewMoveXY(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ 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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [NewMoveXY]. -
InjectionScript.Runtime.InjectionApiUO.CompactNewMoveXY:CompactNewMoveXY(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactNewMoveXY(values))ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.OpenDoor();์บ๋ฆญํฐ์๊ฒ ๋ฌธ์ ์ด์ด๋ฌ๋ผ๊ณ ์์ฒญํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์๋ฃ๋ ์๋ฒ์ ์์ ์ ํ์ธํ์ง ์์ต๋๋ค.
- OpenDoor๋ Invoke๋ฅผ ํตํด GameActions.OpenDoor๋ฅผ ํธ์ถํฉ๋๋ค. ์ง๋ ฌ ๋์ด๋ ํ์ฉ๋์ง ์์ต๋๋ค. ๊ฒ์ ๋ฐ ๋ฐ๊ฒฌ ๊ท์น์ GameActions/server์ ์ํฉ๋๋ค.
- ์์ ์์ UO.Wait๋ ์คํฌ๋ฆฝํธ ์ผ์ ์ค์ง๋ง ์ง์ ํฉ๋๋ค. ์ผ์ ์ค์ง๊ฐ ๋๋ฌ๋ค๊ณ ํด์ ์๋ฒ๊ฐ ์์ฒญ์ ์๋ฃํ์์ ์ฆ๋ช ํ๋ ๊ฒ์ ์๋๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.OpenDoor");
UO.OpenDoor();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์บ๋ฆญํฐ์๊ฒ ๋ฌธ์ ์ด์ด๋ฌ๋ผ๊ณ ์์ฒญํฉ๋๋ค.
UO.OpenDoor();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ ์์ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.OpenDoor:bridge.OpenDoor().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "opendoor": bridge.OpenDoor(); break;PMove๋ ๊ฒฝ๋ก ํ์๊ณผ ์ด๋ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค. XY ํ์์ ์ ํํ XY๋ฅผ, XYZ ํ์์ ์ง์ ํ ๋์ด๋ ์๊ตฌํฉ๋๋ค. ๋ฐํ๊ฐ์ void์ด๋ฏ๋ก ์ค์ ์ขํ๋ฅผ ๋น๊ตํ์ธ์. ์ซ์ ๊ฒฐ๊ณผ๋ NewMoveXY ๋๋ MoveXYZ๋ฅผ ์ฌ์ฉํ์ธ์. ์๋ฌต์ ์ธ 30์ด ์ ํ์ ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ๋๊ธฐ์ด ์ธ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.PredictedDirection();
UO.Print("PredictedDirection: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ธก์ ์ธ์ ์์ด ํธ์ถ ํ๋๋ฅผ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค.
var predicted = UO.PredictedDirection();
UO.Print("Predicted: " + Convert.ToString(predicted));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ - ๊ธฐ๋ณธ ๋ช ๋ น์ ๋ํ ์ธ์๊ฐ ์๋ ์ขํ/๋์ด/๋ฐฉํฅ์ ์์ ๋๋ค. 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ReadPredictedCoordinate:ReadPredictedCoordinate(3).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "predicteddirection": return new InjectionValue(ReadPredictedCoordinate(3));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ๋๊ธฐ์ด ์ธ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.PredictedX();
UO.Print("PredictedX: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ธก์ ์ธ์ ์์ด ํธ์ถ ํ๋๋ฅผ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค.
var predicted = UO.PredictedX();
UO.Print("Predicted: " + Convert.ToString(predicted));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ - ๊ธฐ๋ณธ ๋ช ๋ น์ ๋ํ ์ธ์๊ฐ ์๋ ์ขํ/๋์ด/๋ฐฉํฅ์ ์์ ๋๋ค. 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ReadPredictedCoordinate:ReadPredictedCoordinate(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "predictedx": return new InjectionValue(ReadPredictedCoordinate(0));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ๋๊ธฐ์ด ์ธ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.PredictedY();
UO.Print("PredictedY: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ธก์ ์ธ์ ์์ด ํธ์ถ ํ๋๋ฅผ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค.
var predicted = UO.PredictedY();
UO.Print("Predicted: " + Convert.ToString(predicted));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ - ๊ธฐ๋ณธ ๋ช ๋ น์ ๋ํ ์ธ์๊ฐ ์๋ ์ขํ/๋์ด/๋ฐฉํฅ์ ์์ ๋๋ค. 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ReadPredictedCoordinate:ReadPredictedCoordinate(1).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "predictedy": return new InjectionValue(ReadPredictedCoordinate(1));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ๋๊ธฐ์ด ์ธ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.PredictedZ();
UO.Print("PredictedZ: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ธก์ ์ธ์ ์์ด ํธ์ถ ํ๋๋ฅผ ์ ์ฅํฉ๋๋ค. Convert.ToString๋ ๋ก๊ทธ ๋ฒํธ์ ํ์์ ์ง์ ํฉ๋๋ค.
var predicted = UO.PredictedZ();
UO.Print("Predicted: " + Convert.ToString(predicted));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ - ๊ธฐ๋ณธ ๋ช ๋ น์ ๋ํ ์ธ์๊ฐ ์๋ ์ขํ/๋์ด/๋ฐฉํฅ์ ์์ ๋๋ค. 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ReadPredictedCoordinate:ReadPredictedCoordinate(2).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "predictedz": return new InjectionValue(ReadPredictedCoordinate(2));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetRunMountTimer(object? value);๋ง์ ํ๊ณ ๋ฌ๋ฆฌ๋ ๊ฑธ์ ๊ฐ๊ฒฉ์ ์ค์ ํฉ๋๋ค. ์๋์ ์ผ๋ก ์๋๋ฅผ ์ค์ด๊ฑฐ๋ ํ์ค ์๋๋ก ๋์๊ฐ ๋ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ช ๋ น์ ์ฌ์ฉํ๋ฉด ํ์ค ํ ํฌ ์ด์์ผ๋ก ์ด๋ ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค.
-
valueโ ํ์ ์ ์ ๋ฐ๋ฆฌ์ด์ ๋๋ค. ๋ฒ์ 100..2000; 0 ๋ฐ ์์ ๊ฐ์ ํฌํจํ ์์ ๊ฐ์ 100๋ก ์ฌ๋ผ๊ฐ๊ณ , ํฐ ๊ฐ์ 2000๋ก ๊ฐ์ํฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์ ์ฉ๋ ๊ฐ๊ฒฉ์ ์ฝ์ผ๋ ค๋ฉด UO.GetRunMountTimer()๋ฅผ ์ฌ์ฉํ์ธ์. ์ด๋ ์๋ฒ์์ ๋จ๊ณ๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์๋๋๋ค.
- ์ค์ ์ ๋ผ์ด๋ฉ ๋ชจ๋์ ์ ์ฉ๋ฉ๋๋ค. ํ์ค ๋ฐ ์ต์ ํ์ฉ ๊ฐ์ 100 ms์ ๋๋ค. ์ํ์ 2000ms์ ๋๋ค. ๋ค๋ฅธ ์ธ ๊ฐ์ง ๋ชจ๋์๋ ๋ณ๋์ ์ค์ ์ด ์์ต๋๋ค.
- ์ด๋ ํ, FPS, ๊ฒฝ๋ก ์ฐพ๊ธฐ ์๊ฐ ์ด๊ณผ ๋๋ ์ธก์ ๋ ์๋ฒ ๋จ๊ณ ์ง์ ์๊ฐ์ด ์๋ ์บ๋ฆญํฐ์ ๋ก์ปฌ ์ด๋ ๊ฐ๊ฒฉ์ ๋๋ค. ์ซ์๋ฅผ ๋๋ฆฌ๋ฉด ์์ง์์ด ๋๋ ค์ง๋๋ค. ํ์ค ๊ฐ๊ฒฉ ์๋๋ก ์ค์ด๋ฉด ํจํท ์ ์ก ์๋๊ฐ ๋นจ๋ผ์ง์ง ์์ต๋๋ค.
- ํ ์์ฒด๋ ์์ง์ด์ง ์๊ณ , ํ๊ฒ์ ์ฅ์ฐฉํ์ง ์์ผ๋ฉฐ, ๊ฑท๊ธฐ/๋ฌ๋ฆฌ๊ธฐ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ด์ ์ค์ ๋ชจ๋๊ฐ ์ ํ๋ฉ๋๋ค. ์๋ฒ์์ ์ง์ ํ ์๋ ๋ชจ๋์ ๋นํ๋ ํด๋ผ์ด์ธํธ์์ ๊ณ ๋ ค๋ฉ๋๋ค.
- ์ค์ ์ ์ด ํด๋ผ์ด์ธํธ์ ์ด๋์ ๋ํ ์ผ๋ฐ์ ์ธ ๊ฒ์ ๋๋ค. ์๋ ์ ์ด, ์ง๋ ๊ฒฝ๋ก ๋ฐ ๊ธฐํ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ผ์์ ์ผ๋ก ๋ณ๊ฒฝํ์ฌ ์ด์ ๊ฐ์ ์ ์งํ๊ณ ์์ ํ ๋ณต์ํฉ๋๋ค. ์ฌ๋ฌ ์ ์ฐจ์์ ๋์์ ํ๋์ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํ์ง ๋ง์ญ์์ค.
- ํ์ ๋ฐ ์ดํ ๋จ๊ณ๋ ์ผ๋ฐ์ ์ธ ๋์๊ณผ ๋ค๋ฆ ๋๋ค. ์๋ฒ ํ์ธ, ํต์ ์ง์ฐ ๋ฐ ์ฅ์ ๋ก ์ธํด ์ค์ ์๊ฐ์ด ๋์ด๋ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ๋๋ฝ๋ ํ๋ ์์ ๋ฐ๋ผ์ก๊ธฐ ์ํด ์ผ๋ จ์ ๊ฐ์ํ๋ ๋จ๊ณ๋ฅผ ๋ณด๋ด์ง ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetRunMountTimer");
UO.SetRunMountTimer(100);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ=100 โ ๋ฐ๋ฆฌ์ด. ํธ์ถ์ ํ์ ์ด๋์ ์ค์ ํ์ง๋ง ๊ฒฝ๋ก๋ฅผ ์์ํ์ง๋ ์์ต๋๋ค.
UO.SetRunMountTimer(100);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ=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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ฉ๋ ๊ฐ=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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ClampMoveTimer:ClampMoveTimer(Arg(0), 100). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetMovementTimers:bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setrunmounttimer":
state.RunMountTimer = ClampMoveTimer(Arg(0), 100);
bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer);
return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetRunUnmountTimer(object? value);๊ฑท๋ ๋ณดํญ ๊ฐ๊ฒฉ์ ์ค์ ํฉ๋๋ค. ์๋์ ์ผ๋ก ์๋๋ฅผ ์ค์ด๊ฑฐ๋ ํ์ค ์๋๋ก ๋์๊ฐ ๋ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ช ๋ น์ ์ฌ์ฉํ๋ฉด ํ์ค ํ ํฌ ์ด์์ผ๋ก ์ด๋ ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค.
-
valueโ ํ์ ์ ์ ๋ฐ๋ฆฌ์ด์ ๋๋ค. ๋ฒ์ 200..2000; 0 ๋ฐ ์์ ๊ฐ์ ํฌํจํ ์์ ๊ฐ์ 200๋ก ์ฌ๋ผ๊ฐ๊ณ , ํฐ ๊ฐ์ 2000๋ก ๊ฐ์ํฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์ ์ฉ๋ ๊ฐ๊ฒฉ์ ์ฝ์ผ๋ ค๋ฉด UO.GetRunUnmountTimer()๋ฅผ ์ฌ์ฉํ์ธ์. ์ด๋ ์๋ฒ์์ ๋จ๊ณ๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์๋๋๋ค.
- ์ค์ ์ ๊ฑท๊ธฐ ๋ชจ๋์ ์ ์ฉ๋ฉ๋๋ค. ํ์ค ๋ฐ ์ต์ ํ์ฉ ๊ฐ์ 200 ms์ ๋๋ค. ์ํ์ 2000ms์ ๋๋ค. ๋ค๋ฅธ ์ธ ๊ฐ์ง ๋ชจ๋์๋ ๋ณ๋์ ์ค์ ์ด ์์ต๋๋ค.
- ์ด๋ ํ, FPS, ๊ฒฝ๋ก ์ฐพ๊ธฐ ์๊ฐ ์ด๊ณผ ๋๋ ์ธก์ ๋ ์๋ฒ ๋จ๊ณ ์ง์ ์๊ฐ์ด ์๋ ์บ๋ฆญํฐ์ ๋ก์ปฌ ์ด๋ ๊ฐ๊ฒฉ์ ๋๋ค. ์ซ์๋ฅผ ๋๋ฆฌ๋ฉด ์์ง์์ด ๋๋ ค์ง๋๋ค. ํ์ค ๊ฐ๊ฒฉ ์๋๋ก ์ค์ด๋ฉด ํจํท ์ ์ก ์๋๊ฐ ๋นจ๋ผ์ง์ง ์์ต๋๋ค.
- ํ ์์ฒด๋ ์์ง์ด์ง ์๊ณ , ํ๊ฒ์ ์ฅ์ฐฉํ์ง ์์ผ๋ฉฐ, ๊ฑท๊ธฐ/๋ฌ๋ฆฌ๊ธฐ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ด์ ์ค์ ๋ชจ๋๊ฐ ์ ํ๋ฉ๋๋ค. ์๋ฒ์์ ์ง์ ํ ์๋ ๋ชจ๋์ ๋นํ๋ ํด๋ผ์ด์ธํธ์์ ๊ณ ๋ ค๋ฉ๋๋ค.
- ์ค์ ์ ์ด ํด๋ผ์ด์ธํธ์ ์ด๋์ ๋ํ ์ผ๋ฐ์ ์ธ ๊ฒ์ ๋๋ค. ์๋ ์ ์ด, ์ง๋ ๊ฒฝ๋ก ๋ฐ ๊ธฐํ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ผ์์ ์ผ๋ก ๋ณ๊ฒฝํ์ฌ ์ด์ ๊ฐ์ ์ ์งํ๊ณ ์์ ํ ๋ณต์ํฉ๋๋ค. ์ฌ๋ฌ ์ ์ฐจ์์ ๋์์ ํ๋์ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํ์ง ๋ง์ญ์์ค.
- ํ์ ๋ฐ ์ดํ ๋จ๊ณ๋ ์ผ๋ฐ์ ์ธ ๋์๊ณผ ๋ค๋ฆ ๋๋ค. ์๋ฒ ํ์ธ, ํต์ ์ง์ฐ ๋ฐ ์ฅ์ ๋ก ์ธํด ์ค์ ์๊ฐ์ด ๋์ด๋ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ๋๋ฝ๋ ํ๋ ์์ ๋ฐ๋ผ์ก๊ธฐ ์ํด ์ผ๋ จ์ ๊ฐ์ํ๋ ๋จ๊ณ๋ฅผ ๋ณด๋ด์ง ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetRunUnmountTimer");
UO.SetRunUnmountTimer(200);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ=200 โ ๋ฐ๋ฆฌ์ด. ํธ์ถ์ ํ์ ์ด๋์ ์ค์ ํ์ง๋ง ๊ฒฝ๋ก๋ฅผ ์์ํ์ง๋ ์์ต๋๋ค.
UO.SetRunUnmountTimer(200);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ=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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ฉ๋ ๊ฐ=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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ClampMoveTimer:ClampMoveTimer(Arg(0), 200). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetMovementTimers:bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setrununmounttimer":
state.RunUnmountTimer = ClampMoveTimer(Arg(0), 200);
bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer);
return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetWalkMountTimer(object? value);๋ง์ ํ๊ณ ๊ฑท๊ธฐ ์ํ ๊ฑธ์ ๊ฐ๊ฒฉ์ ์ค์ ํฉ๋๋ค. ์๋์ ์ผ๋ก ์๋๋ฅผ ์ค์ด๊ฑฐ๋ ํ์ค ์๋๋ก ๋์๊ฐ ๋ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ช ๋ น์ ์ฌ์ฉํ๋ฉด ํ์ค ํ ํฌ ์ด์์ผ๋ก ์ด๋ ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค.
-
valueโ ํ์ ์ ์ ๋ฐ๋ฆฌ์ด์ ๋๋ค. ๋ฒ์ 200..2000; 0 ๋ฐ ์์ ๊ฐ์ ํฌํจํ ์์ ๊ฐ์ 200๋ก ์ฌ๋ผ๊ฐ๊ณ , ํฐ ๊ฐ์ 2000๋ก ๊ฐ์ํฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์ ์ฉ๋ ๊ฐ๊ฒฉ์ ์ฝ์ผ๋ ค๋ฉด UO.GetWalkMountTimer()๋ฅผ ์ฌ์ฉํ์ธ์. ์ด๋ ์๋ฒ์์ ๋จ๊ณ๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์๋๋๋ค.
- ์ค์ ์ ๋ผ์ด๋ฉ ๋ชจ๋์ ์ ์ฉ๋ฉ๋๋ค. ํ์ค ๋ฐ ์ต์ ํ์ฉ ๊ฐ์ 200 ms์ ๋๋ค. ์ํ์ 2000ms์ ๋๋ค. ๋ค๋ฅธ ์ธ ๊ฐ์ง ๋ชจ๋์๋ ๋ณ๋์ ์ค์ ์ด ์์ต๋๋ค.
- ์ด๋ ํ, FPS, ๊ฒฝ๋ก ์ฐพ๊ธฐ ์๊ฐ ์ด๊ณผ ๋๋ ์ธก์ ๋ ์๋ฒ ๋จ๊ณ ์ง์ ์๊ฐ์ด ์๋ ์บ๋ฆญํฐ์ ๋ก์ปฌ ์ด๋ ๊ฐ๊ฒฉ์ ๋๋ค. ์ซ์๋ฅผ ๋๋ฆฌ๋ฉด ์์ง์์ด ๋๋ ค์ง๋๋ค. ํ์ค ๊ฐ๊ฒฉ ์๋๋ก ์ค์ด๋ฉด ํจํท ์ ์ก ์๋๊ฐ ๋นจ๋ผ์ง์ง ์์ต๋๋ค.
- ํ ์์ฒด๋ ์์ง์ด์ง ์๊ณ , ํ๊ฒ์ ์ฅ์ฐฉํ์ง ์์ผ๋ฉฐ, ๊ฑท๊ธฐ/๋ฌ๋ฆฌ๊ธฐ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ด์ ์ค์ ๋ชจ๋๊ฐ ์ ํ๋ฉ๋๋ค. ์๋ฒ์์ ์ง์ ํ ์๋ ๋ชจ๋์ ๋นํ๋ ํด๋ผ์ด์ธํธ์์ ๊ณ ๋ ค๋ฉ๋๋ค.
- ์ค์ ์ ์ด ํด๋ผ์ด์ธํธ์ ์ด๋์ ๋ํ ์ผ๋ฐ์ ์ธ ๊ฒ์ ๋๋ค. ์๋ ์ ์ด, ์ง๋ ๊ฒฝ๋ก ๋ฐ ๊ธฐํ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ผ์์ ์ผ๋ก ๋ณ๊ฒฝํ์ฌ ์ด์ ๊ฐ์ ์ ์งํ๊ณ ์์ ํ ๋ณต์ํฉ๋๋ค. ์ฌ๋ฌ ์ ์ฐจ์์ ๋์์ ํ๋์ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํ์ง ๋ง์ญ์์ค.
- ํ์ ๋ฐ ์ดํ ๋จ๊ณ๋ ์ผ๋ฐ์ ์ธ ๋์๊ณผ ๋ค๋ฆ ๋๋ค. ์๋ฒ ํ์ธ, ํต์ ์ง์ฐ ๋ฐ ์ฅ์ ๋ก ์ธํด ์ค์ ์๊ฐ์ด ๋์ด๋ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ๋๋ฝ๋ ํ๋ ์์ ๋ฐ๋ผ์ก๊ธฐ ์ํด ์ผ๋ จ์ ๊ฐ์ํ๋ ๋จ๊ณ๋ฅผ ๋ณด๋ด์ง ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetWalkMountTimer");
UO.SetWalkMountTimer(200);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ=200 โ ๋ฐ๋ฆฌ์ด. ํธ์ถ์ ํ์ ์ด๋์ ์ค์ ํ์ง๋ง ๊ฒฝ๋ก๋ฅผ ์์ํ์ง๋ ์์ต๋๋ค.
UO.SetWalkMountTimer(200);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ=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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ฉ๋ ๊ฐ=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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ClampMoveTimer:ClampMoveTimer(Arg(0), 200). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetMovementTimers:bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setwalkmounttimer":
state.WalkMountTimer = ClampMoveTimer(Arg(0), 200);
bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer);
return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.SetWalkUnmountTimer(object? value);๊ฑท๋ ๋จ๊ณ ๊ฐ๊ฒฉ์ ์ค์ ํฉ๋๋ค. ์๋์ ์ผ๋ก ์๋๋ฅผ ์ค์ด๊ฑฐ๋ ํ์ค ์๋๋ก ๋์๊ฐ ๋ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ช ๋ น์ ์ฌ์ฉํ๋ฉด ํ์ค ํ ํฌ ์ด์์ผ๋ก ์ด๋ ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค.
-
valueโ ํ์ ์ ์ ๋ฐ๋ฆฌ์ด์ ๋๋ค. ๋ฒ์ 400..2000; 0 ๋ฐ ์์ ๊ฐ์ ํฌํจํ ์์ ๊ฐ์ 400๋ก ์ฌ๋ผ๊ฐ๊ณ , ํฐ ๊ฐ์ 2000๋ก ๊ฐ์ํฉ๋๋ค.
void - ๊ฐ์ด ์์ต๋๋ค. ๋ณ๋์ ํ์ ์ผ๋ก ์ ํํ์ธ์. ์ ์ฉ๋ ๊ฐ๊ฒฉ์ ์ฝ์ผ๋ ค๋ฉด UO.GetWalkUnmountTimer()๋ฅผ ์ฌ์ฉํ์ธ์. ์ด๋ ์๋ฒ์์ ๋จ๊ณ๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์๋๋๋ค.
- ์ค์ ์ ๊ฑท๊ธฐ ๋ชจ๋์ ์ ์ฉ๋ฉ๋๋ค. ํ์ค ๋ฐ ์ต์ ํ์ฉ ๊ฐ์ 400 ms์ ๋๋ค. ์ํ์ 2000ms์ ๋๋ค. ๋ค๋ฅธ ์ธ ๊ฐ์ง ๋ชจ๋์๋ ๋ณ๋์ ์ค์ ์ด ์์ต๋๋ค.
- ์ด๋ ํ, FPS, ๊ฒฝ๋ก ์ฐพ๊ธฐ ์๊ฐ ์ด๊ณผ ๋๋ ์ธก์ ๋ ์๋ฒ ๋จ๊ณ ์ง์ ์๊ฐ์ด ์๋ ์บ๋ฆญํฐ์ ๋ก์ปฌ ์ด๋ ๊ฐ๊ฒฉ์ ๋๋ค. ์ซ์๋ฅผ ๋๋ฆฌ๋ฉด ์์ง์์ด ๋๋ ค์ง๋๋ค. ํ์ค ๊ฐ๊ฒฉ ์๋๋ก ์ค์ด๋ฉด ํจํท ์ ์ก ์๋๊ฐ ๋นจ๋ผ์ง์ง ์์ต๋๋ค.
- ํ ์์ฒด๋ ์์ง์ด์ง ์๊ณ , ํ๊ฒ์ ์ฅ์ฐฉํ์ง ์์ผ๋ฉฐ, ๊ฑท๊ธฐ/๋ฌ๋ฆฌ๊ธฐ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ด์ ์ค์ ๋ชจ๋๊ฐ ์ ํ๋ฉ๋๋ค. ์๋ฒ์์ ์ง์ ํ ์๋ ๋ชจ๋์ ๋นํ๋ ํด๋ผ์ด์ธํธ์์ ๊ณ ๋ ค๋ฉ๋๋ค.
- ์ค์ ์ ์ด ํด๋ผ์ด์ธํธ์ ์ด๋์ ๋ํ ์ผ๋ฐ์ ์ธ ๊ฒ์ ๋๋ค. ์๋ ์ ์ด, ์ง๋ ๊ฒฝ๋ก ๋ฐ ๊ธฐํ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ผ์์ ์ผ๋ก ๋ณ๊ฒฝํ์ฌ ์ด์ ๊ฐ์ ์ ์งํ๊ณ ์์ ํ ๋ณต์ํฉ๋๋ค. ์ฌ๋ฌ ์ ์ฐจ์์ ๋์์ ํ๋์ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํ์ง ๋ง์ญ์์ค.
- ํ์ ๋ฐ ์ดํ ๋จ๊ณ๋ ์ผ๋ฐ์ ์ธ ๋์๊ณผ ๋ค๋ฆ ๋๋ค. ์๋ฒ ํ์ธ, ํต์ ์ง์ฐ ๋ฐ ์ฅ์ ๋ก ์ธํด ์ค์ ์๊ฐ์ด ๋์ด๋ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ๋๋ฝ๋ ํ๋ ์์ ๋ฐ๋ผ์ก๊ธฐ ์ํด ์ผ๋ จ์ ๊ฐ์ํ๋ ๋จ๊ณ๋ฅผ ๋ณด๋ด์ง ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.SetWalkUnmountTimer");
UO.SetWalkUnmountTimer(400);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ=400 โ ๋ฐ๋ฆฌ์ด. ํธ์ถ์ ํ์ ์ด๋์ ์ค์ ํ์ง๋ง ๊ฒฝ๋ก๋ฅผ ์์ํ์ง๋ ์์ต๋๋ค.
UO.SetWalkUnmountTimer(400);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ=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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ฉ๋ ๊ฐ=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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ClampMoveTimer:ClampMoveTimer(Arg(0), 400). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetMovementTimers:bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "setwalkunmounttimer":
state.WalkUnmountTimer = ClampMoveTimer(Arg(0), 400);
bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer);
return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ๋ค์ ์์ฒญ์ ๊ณตํต ํ๋๊ฐ ์๋ ์ด ์ ์ฅ๋ ์๋ง ํ์ธํฉ๋๋ค. ๊ต์ฒด ํ๋ ์ด์ด/์์ปค๋ ์ผ๋ฐ์ ์ธ ๊ฑฐ๋ถ๋ก ๋๊ธฐ๋ฅผ ์ข ๋ฃํฉ๋๋ค. ๋ค๋ฅธ ์ผ๋ฐ ๋ช ๋ น์ ํ์ธํ๋ค๊ณ ํด์ ์ด ๋จ๊ณ๊ฐ ํ์ธ๋๋ ๊ฒ์ ์๋๋๋ค. ์์ง์์ด ์๋ ํ์ ์ ๋ณ๋์ ๊ฒฝ์ฐ๋ก ์ ์ง๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: direction (Any), running (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsOnline:bridge.IsOnline(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.OpenDoor:bridge.OpenDoor(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Step:bridge.Step(Arg(0) & 7, Arg(1) != 0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Stamina:bridge.Stamina.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ๋ค์ ์์ฒญ์ ๊ณตํต ํ๋๊ฐ ์๋ ์ด ์ ์ฅ๋ ์๋ง ํ์ธํฉ๋๋ค. ๊ต์ฒด ํ๋ ์ด์ด/์์ปค๋ ์ผ๋ฐ์ ์ธ ๊ฑฐ๋ถ๋ก ๋๊ธฐ๋ฅผ ์ข ๋ฃํฉ๋๋ค. ๋ค๋ฅธ ์ผ๋ฐ ๋ช ๋ น์ ํ์ธํ๋ค๊ณ ํด์ ์ด ๋จ๊ณ๊ฐ ํ์ธ๋๋ ๊ฒ์ ์๋๋๋ค. ์์ง์์ด ์๋ ํ์ ์ ๋ณ๋์ ๊ฒฝ์ฐ๋ก ์ ์ง๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.StepQ(2, false);
UO.Print("StepQ: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฐฉํฅ=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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฐฉํฅ=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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: direction (Any), run (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [StepQ]. -
InjectionScript.Runtime.InjectionApiUO.CompactStepQ:CompactStepQ(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactStepQ(values))๋งค๊ฐ๋ณ์: direction (Any), run (Any), timeout (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [StepQ]. -
InjectionScript.Runtime.InjectionApiUO.CompactStepQ:CompactStepQ(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactStepQ(values))๋งค๊ฐ๋ณ์: direction (Any), run (Any), timeout (Any), queue (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [StepQ]. -
InjectionScript.Runtime.InjectionApiUO.CompactStepQ:CompactStepQ(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactStepQ(values))๋งค๊ฐ๋ณ์: direction (Any), run (Any), timeout (Any), queue (Any), waitForAck (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [StepQ]. -
InjectionScript.Runtime.InjectionApiUO.CompactStepQ:CompactStepQ(values).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
values => new InjectionValue(CompactStepQ(values))ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.moveBetweenTwoCorners();
dynamic UO.moveBetweenTwoCorners(object? value);๋ ๊ฐ์ ์ธก๋ฉด ์ฌ๊ฐํ์ด ์ฐจ๋จ๋ ๋๊ฐ์ ํด์๋์ ๋๋ค.
-
valueโ ์ ํ์ ์ธ ์ ๊ฐ์ ๋๋ค. 0 ๊ธ์ง, 0์ด ์๋ ๊ฐ์ 1๊ฐ ๋ฉ๋๋ค. ์๋ฒ๋ ํด๋ผ์ด์ธํธ ๊ตฌ์ฑ์ ๊ด๊ณ์์ด ์ด๋ฌํ ์ ๋ฌ์ ๊ฑฐ๋ถํ ์ ์์ต๋๋ค.
int - ํ์ฌ ์ ์ฅ๋ ๊ฐ. ์ธ์ ์์ด๋ ์ฝ๊ธฐ๋ง ํฉ๋๋ค. ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๊ท์น์ ์ ์ฉํ ํ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด๊ฒ์ ์์ง์์ ๊ฒฐ๊ณผ๊ฐ ์๋๋ผ ์ค์ ์ ๋๋ค.
- ์ค์ ์ ๋ฐํ์ ์ํ์ ์ ์ฅ๋๋ฉฐ ์์ ์ ํด๋น ๋ช ๋ น์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์ด๋ฏธ ๋น๋๋ ๊ฒฝ๋ก๋ฅผ ์๋์ผ๋ก ๋ฎ์ด์ฐ์ง ์์ต๋๋ค.
- ์ ์์ ์ผ๋ก ์๋ฃ๋๋ฉด ์๋ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ผ๋ก ํ์๋ฉ๋๋ค. ์ถฉ๋ ํ์๋ ๋ค์ ๋ณต๊ตฌ ๋ผ์ธ์ด ์คํ๋์ง ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.moveBetweenTwoCorners();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์์ผ๋ฉฐ ์ํ๊ฐ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- value๋ ์ด ์ค์ ์ ์ซ์ ๊ฐ์ ๋๋ค.
var value = UO.moveBetweenTwoCorners();
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ=0. 0 ๊ธ์ง, 0์ด ์๋ ๊ฐ์ 1๊ฐ ๋ฉ๋๋ค. ์๋ฒ๋ ํด๋ผ์ด์ธํธ ๊ตฌ์ฑ์ ๊ด๊ณ์์ด ์ด๋ฌํ ์ ๋ฌ์ ๊ฑฐ๋ถํ ์ ์์ต๋๋ค.
- ์ ์ฉ๋ ๊ฐ์ ๋ชฉํ์ ์ฑ๊ณต์ ์ธ ๋ฌ์ฑ์ด ์๋ ์ ์ฅ๋ ๊ฐ์ ๋ํ๋ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var applied = UO.moveBetweenTwoCorners(0);
UO.Print("Applied: " + Convert.ToString(applied));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ ์ ์ด๊ธฐ ์ค์ ์ ์ ์ฅํฉ๋๋ค. 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "movebetweentwocorners":
if (arguments.Length > 0) state.MoveBetweenTwoCorners = Arg(0) != 0 ? 1 : 0;
return new InjectionValue(state.MoveBetweenTwoCorners);๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "movebetweentwocorners":
if (arguments.Length > 0) state.MoveBetweenTwoCorners = Arg(0) != 0 ? 1 : 0;
return new InjectionValue(state.MoveBetweenTwoCorners);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.moveCheckStamina();
dynamic UO.moveCheckStamina(object? value);์ด๋ ๋ช ๋ น์ ์ํ ์ต์ ์ฒด๋ ฅ.
-
valueโ ์ ํ์ ์ธ ์ ๊ฐ์ ๋๋ค. ์ ์ >=0; ๋ถ์ ์ 0๊ฐ ๋ฉ๋๋ค. 0์ ์๊ณ๊ฐ ํ์ธ์ ๋๋๋ค.
int - ํ์ฌ ์ ์ฅ๋ ๊ฐ. ์ธ์ ์์ด๋ ์ฝ๊ธฐ๋ง ํฉ๋๋ค. ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๊ท์น์ ์ ์ฉํ ํ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด๊ฒ์ ์์ง์์ ๊ฒฐ๊ณผ๊ฐ ์๋๋ผ ์ค์ ์ ๋๋ค.
- ์ค์ ์ ๋ฐํ์ ์ํ์ ์ ์ฅ๋๋ฉฐ ์์ ์ ํด๋น ๋ช ๋ น์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์ด๋ฏธ ๋น๋๋ ๊ฒฝ๋ก๋ฅผ ์๋์ผ๋ก ๋ฎ์ด์ฐ์ง ์์ต๋๋ค.
- ์ ์์ ์ผ๋ก ์๋ฃ๋๋ฉด ์๋ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ผ๋ก ํ์๋ฉ๋๋ค. ์ถฉ๋ ํ์๋ ๋ค์ ๋ณต๊ตฌ ๋ผ์ธ์ด ์คํ๋์ง ์์ต๋๋ค.
- ๊ธฐ๋ณธ๊ฐ์ 1์ ๋๋ค. 0 ๊ฐ์ ์ด ๋ก์ปฌ ๊ฒ์ฌ๋ฅผ ๋นํ์ฑํํฉ๋๋ค. ์์๋ ์ต์ ์ง๊ตฌ๋ ฅ์ ์ค์ ํฉ๋๋ค. ์๊ณ๊ฐ ์ดํ์์๋ ์ฒด๋ ฅ์ด ํ๋ณต๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ฐ์ฌ๋ฅผ ๊ฑฐ๋ถํ๊ฑฐ๋ ์์ง์์ ๋ฉ์ถฅ๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.moveCheckStamina();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์์ผ๋ฉฐ ์ํ๊ฐ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- value๋ ์ด ์ค์ ์ ์ซ์ ๊ฐ์ ๋๋ค.
var value = UO.moveCheckStamina();
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ=15. ์ ์ >=0; ๋ถ์ ์ 0๊ฐ ๋ฉ๋๋ค. 0์ ์๊ณ๊ฐ ํ์ธ์ ๋๋๋ค.
- ์ ์ฉ๋ ๊ฐ์ ๋ชฉํ์ ์ฑ๊ณต์ ์ธ ๋ฌ์ฑ์ด ์๋ ์ ์ฅ๋ ๊ฐ์ ๋ํ๋ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var applied = UO.moveCheckStamina(15);
UO.Print("Applied: " + Convert.ToString(applied));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ ์ ์ด๊ธฐ ์ค์ ์ ์ ์ฅํฉ๋๋ค. 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "movecheckstamina": if (arguments.Length > 0) state.MoveCheckStamina = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveCheckStamina);๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "movecheckstamina": if (arguments.Length > 0) state.MoveCheckStamina = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveCheckStamina);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.moveExitOnDisconnect();
dynamic UO.moveExitOnDisconnect(object? value);์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์ด๋์ ์ค์ง/๊ฑฐ๋ถํฉ๋๋ค.
-
valueโ ์ ํ์ ์ธ ์ ๊ฐ์ ๋๋ค. 0๊ฐ ๊บผ์ง๊ณ 0์ด ์๋ ๊ฐ์ 1๊ฐ ๋ฉ๋๋ค. ์ธ์ฆ์ ๋นํ์ฑํํ๋ฉด ์ฐ๊ฒฐ ์์ด๋ ์๋ฒ์์ ์ด๋ํ ์ ์์ต๋๋ค.
int - ํ์ฌ ์ ์ฅ๋ ๊ฐ. ์ธ์ ์์ด๋ ์ฝ๊ธฐ๋ง ํฉ๋๋ค. ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๊ท์น์ ์ ์ฉํ ํ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด๊ฒ์ ์์ง์์ ๊ฒฐ๊ณผ๊ฐ ์๋๋ผ ์ค์ ์ ๋๋ค.
- ์ค์ ์ ๋ฐํ์ ์ํ์ ์ ์ฅ๋๋ฉฐ ์์ ์ ํด๋น ๋ช ๋ น์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์ด๋ฏธ ๋น๋๋ ๊ฒฝ๋ก๋ฅผ ์๋์ผ๋ก ๋ฎ์ด์ฐ์ง ์์ต๋๋ค.
- ์ ์์ ์ผ๋ก ์๋ฃ๋๋ฉด ์๋ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ผ๋ก ํ์๋ฉ๋๋ค. ์ถฉ๋ ํ์๋ ๋ค์ ๋ณต๊ตฌ ๋ผ์ธ์ด ์คํ๋์ง ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.moveExitOnDisconnect();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์์ผ๋ฉฐ ์ํ๊ฐ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- value๋ ์ด ์ค์ ์ ์ซ์ ๊ฐ์ ๋๋ค.
var value = UO.moveExitOnDisconnect();
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ=1. 0๊ฐ ๊บผ์ง๊ณ 0์ด ์๋ ๊ฐ์ 1๊ฐ ๋ฉ๋๋ค. ์ธ์ฆ์ ๋นํ์ฑํํ๋ฉด ์ฐ๊ฒฐ ์์ด๋ ์๋ฒ์์ ์ด๋ํ ์ ์์ต๋๋ค.
- ์ ์ฉ๋ ๊ฐ์ ๋ชฉํ์ ์ฑ๊ณต์ ์ธ ๋ฌ์ฑ์ด ์๋ ์ ์ฅ๋ ๊ฐ์ ๋ํ๋ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var applied = UO.moveExitOnDisconnect(1);
UO.Print("Applied: " + Convert.ToString(applied));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ ์ ์ด๊ธฐ ์ค์ ์ ์ ์ฅํฉ๋๋ค. 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "moveexitondisconnect": if (arguments.Length > 0) state.MoveExitOnDisconnect = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveExitOnDisconnect);๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "moveexitondisconnect": if (arguments.Length > 0) state.MoveExitOnDisconnect = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveExitOnDisconnect);์ ์คํฌ๋ฆฝํธ ์คํ ์ปจํ
์คํธ์์ 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 ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.moveHeuristicMult();
dynamic UO.moveHeuristicMult(object? value);ํจ์คํ์ธ๋ ๊ฒฝํ์ ์น์(%)์ ๋๋ค.
-
valueโ ์ ํ์ ์ธ ์ ๊ฐ์ ๋๋ค. ์ ์ >=0๋ ๋ณด์กด๋ฉ๋๋ค. ์ ์ด๋ 1๋ฅผ ๊ฒ์ํ๊ธฐ ์ ์. 100 ๊ฐ์ ์ผ๋ฐ์ ์ธ ์ถ์ ์น์ ํด๋นํฉ๋๋ค. >100๋ ์ต์ ๋น์ฉ ๋ณด์ฅ ์์ด ๋ ๋น ๋ฅธ ๊ฒ์์ ์ ํธํ ์ ์์ต๋๋ค. Optimized=false์ธ ๊ฒฝ์ฐ 1๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
int - ํ์ฌ ์ ์ฅ๋ ๊ฐ. ์ธ์ ์์ด๋ ์ฝ๊ธฐ๋ง ํฉ๋๋ค. ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๊ท์น์ ์ ์ฉํ ํ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด๊ฒ์ ์์ง์์ ๊ฒฐ๊ณผ๊ฐ ์๋๋ผ ์ค์ ์ ๋๋ค.
- ์ค์ ์ ๋ฐํ์ ์ํ์ ์ ์ฅ๋๋ฉฐ ์์ ์ ํด๋น ๋ช ๋ น์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์ด๋ฏธ ๋น๋๋ ๊ฒฝ๋ก๋ฅผ ์๋์ผ๋ก ๋ฎ์ด์ฐ์ง ์์ต๋๋ค.
- ์ ์์ ์ผ๋ก ์๋ฃ๋๋ฉด ์๋ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ผ๋ก ํ์๋ฉ๋๋ค. ์ถฉ๋ ํ์๋ ๋ค์ ๋ณต๊ตฌ ๋ผ์ธ์ด ์คํ๋์ง ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.moveHeuristicMult();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์์ผ๋ฉฐ ์ํ๊ฐ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- value๋ ์ด ์ค์ ์ ์ซ์ ๊ฐ์ ๋๋ค.
var value = UO.moveHeuristicMult();
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ=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;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ ์ ์ด๊ธฐ ์ค์ ์ ์ ์ฅํฉ๋๋ค. 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "moveheuristicmult": if (arguments.Length > 0) state.MoveHeuristicMultiplier = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveHeuristicMultiplier);๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "moveheuristicmult": if (arguments.Length > 0) state.MoveHeuristicMultiplier = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveHeuristicMultiplier);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.moveOpenDoor();
dynamic UO.moveOpenDoor(object? value);์ด๋ ๋ฐฉํฅ์ผ๋ก ๋ฌธ์ ์ด๋ ค๊ณ ์๋ํฉ๋๋ค.
-
valueโ ์ ํ์ ์ธ ์ ๊ฐ์ ๋๋ค. 0๊ฐ ๊บผ์ง๊ณ 0์ด ์๋ ๊ฐ์ 1๊ฐ ๋ฉ๋๋ค. NewMoveXY/MoveXYZ์ ๋ช ์์ ์ธ openDoors๋ ํธ์ถ ๊ธฐ๊ฐ ๋์ ์ด ํ๋๊ทธ๋ฅผ ๋์ฒดํฉ๋๋ค.
int - ํ์ฌ ์ ์ฅ๋ ๊ฐ. ์ธ์ ์์ด๋ ์ฝ๊ธฐ๋ง ํฉ๋๋ค. ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๊ท์น์ ์ ์ฉํ ํ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด๊ฒ์ ์์ง์์ ๊ฒฐ๊ณผ๊ฐ ์๋๋ผ ์ค์ ์ ๋๋ค.
- ์ค์ ์ ๋ฐํ์ ์ํ์ ์ ์ฅ๋๋ฉฐ ์์ ์ ํด๋น ๋ช ๋ น์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์ด๋ฏธ ๋น๋๋ ๊ฒฝ๋ก๋ฅผ ์๋์ผ๋ก ๋ฎ์ด์ฐ์ง ์์ต๋๋ค.
- ์ ์์ ์ผ๋ก ์๋ฃ๋๋ฉด ์๋ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ผ๋ก ํ์๋ฉ๋๋ค. ์ถฉ๋ ํ์๋ ๋ค์ ๋ณต๊ตฌ ๋ผ์ธ์ด ์คํ๋์ง ์์ต๋๋ค.
- ๊ธฐ๋ณธ๊ฐ์ 0์ ๋๋ค. 1์์ ๋์ด ์ ์ A* ๋์ ํต๊ณผ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ํน์ ์ธ์ ํ ๋ฌธ์ ์ด๋ ค๊ณ ํ๋ ์๋๋ ๊ณ๋จ ์ด์ ์ ์ด๋ฃจ์ด์ง๋๋ค. ์๋ ค์ง ๋ฌธ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด OpenDoor ์ฟผ๋ฆฌ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ด ํ๋๊ทธ๋ ๋ฌธ ์์ฒด๋ฅผ ๋ซ์ง ์์ต๋๋ค. ์บ๋ฆญํฐ๊ฐ ์ฐ ๋ฌธ์ ๋ซ๋ ๊ฒ์ ๋ณ๋์ ํด๋ผ์ด์ธํธ ์ค์ ์ ๋๋ค. ๋ฌธ์ด ์ ๊ธฐ๊ฑฐ๋ ์๋ฒ๊ฐ ๊ธ์ง๋๋ฉด ๊ฒฝ๋ก๊ฐ ๋ฐฉํด๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.moveOpenDoor();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์์ผ๋ฉฐ ์ํ๊ฐ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- value๋ ์ด ์ค์ ์ ์ซ์ ๊ฐ์ ๋๋ค.
var value = UO.moveOpenDoor();
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ=1. 0๊ฐ ๊บผ์ง๊ณ 0์ด ์๋ ๊ฐ์ 1๊ฐ ๋ฉ๋๋ค. NewMoveXY/MoveXYZ์ ๋ช ์์ ์ธ openDoors๋ ํตํ ๊ธฐ๊ฐ ๋์ ์ด ํ๋๊ทธ๋ฅผ ๋์ฒดํฉ๋๋ค.
- ์ ์ฉ๋ ๊ฐ์ ๋ชฉํ์ ์ฑ๊ณต์ ์ธ ๋ฌ์ฑ์ด ์๋ ์ ์ฅ๋ ๊ฐ์ ๋ํ๋ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var applied = UO.moveOpenDoor(1);
UO.Print("Applied: " + Convert.ToString(applied));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ ์ ์ด๊ธฐ ์ค์ ์ ์ ์ฅํฉ๋๋ค. 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "moveopendoor": if (arguments.Length > 0) state.MoveOpenDoor = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveOpenDoor);๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "moveopendoor": if (arguments.Length > 0) state.MoveOpenDoor = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveOpenDoor);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.moveThroughCorner();
dynamic UO.moveThroughCorner(object? value);ํ์ชฝ ์ ์ด ์ฐจ๋จ๋ ์ ์ฌ์ด์ ๋๊ฐ์ ํด์๋์ ๋๋ค.
-
valueโ ์ ํ์ ์ธ ์ ๊ฐ์ ๋๋ค. 0 ๊ธ์ง, 0์ด ์๋ ๊ฐ์ 1๊ฐ ๋ฉ๋๋ค. ์์ชฝ ์ฌ๊ฐํ์ด ๋งํ๋ฉด moveBetweenTwoCorners๊ฐ ์ ์ฉ๋ฉ๋๋ค.
int - ํ์ฌ ์ ์ฅ๋ ๊ฐ. ์ธ์ ์์ด๋ ์ฝ๊ธฐ๋ง ํฉ๋๋ค. ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๊ท์น์ ์ ์ฉํ ํ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด๊ฒ์ ์์ง์์ ๊ฒฐ๊ณผ๊ฐ ์๋๋ผ ์ค์ ์ ๋๋ค.
- ์ค์ ์ ๋ฐํ์ ์ํ์ ์ ์ฅ๋๋ฉฐ ์์ ์ ํด๋น ๋ช ๋ น์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์ด๋ฏธ ๋น๋๋ ๊ฒฝ๋ก๋ฅผ ์๋์ผ๋ก ๋ฎ์ด์ฐ์ง ์์ต๋๋ค.
- ์ ์์ ์ผ๋ก ์๋ฃ๋๋ฉด ์๋ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ผ๋ก ํ์๋ฉ๋๋ค. ์ถฉ๋ ํ์๋ ๋ค์ ๋ณต๊ตฌ ๋ผ์ธ์ด ์คํ๋์ง ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.moveThroughCorner();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์์ผ๋ฉฐ ์ํ๊ฐ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- value๋ ์ด ์ค์ ์ ์ซ์ ๊ฐ์ ๋๋ค.
var value = UO.moveThroughCorner();
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ=0. 0 ๊ธ์ง, 0์ด ์๋ ๊ฐ์ 1๊ฐ ๋ฉ๋๋ค. ์์ชฝ ์ฌ๊ฐํ์ด ๋งํ๋ฉด moveBetweenTwoCorners๊ฐ ์ ์ฉ๋ฉ๋๋ค.
- ์ ์ฉ๋ ๊ฐ์ ๋ชฉํ์ ์ฑ๊ณต์ ์ธ ๋ฌ์ฑ์ด ์๋ ์ ์ฅ๋ ๊ฐ์ ๋ํ๋ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var applied = UO.moveThroughCorner(0);
UO.Print("Applied: " + Convert.ToString(applied));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ ์ ์ด๊ธฐ ์ค์ ์ ์ ์ฅํฉ๋๋ค. 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "movethroughcorner": if (arguments.Length > 0) state.MoveThroughCorner = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveThroughCorner);๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "movethroughcorner": if (arguments.Length > 0) state.MoveThroughCorner = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveThroughCorner);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.moveThroughNPC();
dynamic UO.moveThroughNPC(object? value);๋ฌธ์ ํต๊ณผ ์๋๋ฅผ ํ์ฉํฉ๋๋ค.
- ์ซ์ ์ฒด๋ ฅ ๊ธฐ์ค์ ๋๋ค. ํ์ฌ Stamina >= ๊ธฐ์ค์ผ ๋ ์บ๋ฆญํฐ๋ฅผ ํต๊ณผํ๋ ค๊ณ ์๋ํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ 1000์ด๋ฉฐ 0์ ์ฒด๋ ฅ์ ๊ด๊ณ์์ด ์๋๋ฅผ ํ์ฉํฉ๋๋ค. ์๋ฒ๋ ์ด๋์ ๊ฑฐ๋ถํ ์ ์์ต๋๋ค.
int - ํ์ฌ ์ ์ฅ๋ ๊ฐ. ์ธ์ ์์ด๋ ์ฝ๊ธฐ๋ง ํฉ๋๋ค. ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๊ท์น์ ์ ์ฉํ ํ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด๊ฒ์ ์์ง์์ ๊ฒฐ๊ณผ๊ฐ ์๋๋ผ ์ค์ ์ ๋๋ค.
- ์ค์ ์ ๋ฐํ์ ์ํ์ ์ ์ฅ๋๋ฉฐ ์์ ์ ํด๋น ๋ช ๋ น์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์ด๋ฏธ ๋น๋๋ ๊ฒฝ๋ก๋ฅผ ์๋์ผ๋ก ๋ฎ์ด์ฐ์ง ์์ต๋๋ค.
- ์ ์์ ์ผ๋ก ์๋ฃ๋๋ฉด ์๋ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ผ๋ก ํ์๋ฉ๋๋ค. ์ถฉ๋ ํ์๋ ๋ค์ ๋ณต๊ตฌ ๋ผ์ธ์ด ์คํ๋์ง ์์ต๋๋ค.
- ์ซ์ ์ฒด๋ ฅ ๊ธฐ์ค์ ๋๋ค. ํ์ฌ Stamina >= ๊ธฐ์ค์ผ ๋ ์บ๋ฆญํฐ๋ฅผ ํต๊ณผํ๋ ค๊ณ ์๋ํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ 1000์ด๋ฉฐ 0์ ์ฒด๋ ฅ์ ๊ด๊ณ์์ด ์๋๋ฅผ ํ์ฉํฉ๋๋ค. ์๋ฒ๋ ์ด๋์ ๊ฑฐ๋ถํ ์ ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.moveThroughNPC();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์์ผ๋ฉฐ ์ํ๊ฐ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- value๋ ์ด ์ค์ ์ ์ซ์ ๊ฐ์ ๋๋ค.
var value = UO.moveThroughNPC();
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ=0. ์ ์ >=0, ์์๋ 0๊ฐ ๋ฉ๋๋ค. ๊ธ์ ์ ์ธ ๊ฒฝ์ฐ ์๋๊ฐ ํ์ฉ๋ฉ๋๋ค. ๋ช ์์ ์ธ avoidMobiles๋ ๋จ์ผ ํธ์ถ์ ๋ํ ์ญ๋ฐฉํฅ ์ ์ฝ ์กฐ๊ฑด์ ์ง์ ํฉ๋๋ค.
- ์ ์ฉ๋ ๊ฐ์ ๋ชฉํ์ ์ฑ๊ณต์ ์ธ ๋ฌ์ฑ์ด ์๋ ์ ์ฅ๋ ๊ฐ์ ๋ํ๋ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var applied = UO.moveThroughNPC(0);
UO.Print("Applied: " + Convert.ToString(applied));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ ์ ์ด๊ธฐ ์ค์ ์ ์ ์ฅํฉ๋๋ค. 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "movethroughnpc": if (arguments.Length > 0) state.MoveThroughNpc = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveThroughNpc);๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "movethroughnpc": if (arguments.Length > 0) state.MoveThroughNpc = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveThroughNpc);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.moveTurnCost();
dynamic UO.moveTurnCost(object? value);๊ฒฝ๋ก๋ฅผ ์ฐพ์ ๋ ๋ฐฉํฅ์ ๋ฐ๊พธ๋ ๋ฐ ์ถ๊ฐ ๋น์ฉ์ด ๋ญ๋๋ค.
-
valueโ ์ ํ์ ์ธ ์ ๊ฐ์ ๋๋ค. ์ ์ >=0, ์์๋ 0๊ฐ ๋ฉ๋๋ค. ์ด๊ฒ์ ๋ฐ๋ฆฌ์ด๊ฐ ์๋ ๊ฒฝ๋ก์ ๊ฐ์ค์น์ ๋๋ค. ์ง์ ๋จ๊ณ์ ๋น์ฉ์ 10, ๋๊ฐ์ ๋จ๊ณ์ ๋น์ฉ์ 14์ด๋ฉฐ ์ด๋ ํด๋น ์ถ๊ฐ์ ๋๋ค.
int - ํ์ฌ ์ ์ฅ๋ ๊ฐ. ์ธ์ ์์ด๋ ์ฝ๊ธฐ๋ง ํฉ๋๋ค. ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๊ท์น์ ์ ์ฉํ ํ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด๊ฒ์ ์์ง์์ ๊ฒฐ๊ณผ๊ฐ ์๋๋ผ ์ค์ ์ ๋๋ค.
- ์ค์ ์ ๋ฐํ์ ์ํ์ ์ ์ฅ๋๋ฉฐ ์์ ์ ํด๋น ๋ช ๋ น์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์ด๋ฏธ ๋น๋๋ ๊ฒฝ๋ก๋ฅผ ์๋์ผ๋ก ๋ฎ์ด์ฐ์ง ์์ต๋๋ค.
- ์ ์์ ์ผ๋ก ์๋ฃ๋๋ฉด ์๋ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ผ๋ก ํ์๋ฉ๋๋ค. ์ถฉ๋ ํ์๋ ๋ค์ ๋ณต๊ตฌ ๋ผ์ธ์ด ์คํ๋์ง ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.moveTurnCost();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์์ผ๋ฉฐ ์ํ๊ฐ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
- value๋ ์ด ์ค์ ์ ์ซ์ ๊ฐ์ ๋๋ค.
var value = UO.moveTurnCost();
UO.Print(Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ=14. ์ ์ >=0, ์์๋ 0๊ฐ ๋ฉ๋๋ค. ์ด๊ฒ์ ๋ฐ๋ฆฌ์ด๊ฐ ์๋ ๊ฒฝ๋ก์ ๊ฐ์ค์น์ ๋๋ค. ์ง์ ๋จ๊ณ์ ๋น์ฉ์ 10, ๋๊ฐ์ ๋จ๊ณ์ ๋น์ฉ์ 14์ด๋ฉฐ ์ด๋ ํด๋น ์ถ๊ฐ์ ๋๋ค.
- ์ ์ฉ๋ ๊ฐ์ ๋ชฉํ์ ์ฑ๊ณต์ ์ธ ๋ฌ์ฑ์ด ์๋ ์ ์ฅ๋ ๊ฐ์ ๋ํ๋ ๋๋ค.
return RunScenario();
object? RunScenario()
{
var applied = UO.moveTurnCost(14);
UO.Print("Applied: " + Convert.ToString(applied));
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ ์ ์ด๊ธฐ ์ค์ ์ ์ ์ฅํฉ๋๋ค. 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "moveturncost": if (arguments.Length > 0) state.MoveTurnCost = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveTurnCost);๋งค๊ฐ๋ณ์: value (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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๋ฅผ ๋ฐ๋ฆ ๋๋ค.