KO UO Topic world geometry - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

์„ธ๊ณ„์™€ ๊ธฐํ•˜ํ•™

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

์ขŒํ‘œ, ๊ฑฐ๋ฆฌ, ์‹œ์„ , ํฌ๋กœ์Šค์ปจํŠธ๋ฆฌ ๋Šฅ๋ ฅ ๋ฐ ์ง€๋„ ๋ฐ์ดํ„ฐ. ๊ฒฝ๋กœ๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์€ ์ด๋™ ํ•ญ๋ชฉ์— ๋ณ„๋„๋กœ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์„น์…˜

์ฃผ์ œ ๋ช…๋ น ๋ฐ ์„ค๋ช…
X / Y / Z UO.GetX ยท UO.GetY ยท UO.GetZ
Distance UO.GetDistance ยท UO.Dist
LOS UO.CheckLOS ยท UO.LOSOptions
World Number UO.WorldNum
World Cells UO.GetWorldCell ยท UO.GetWorldTilesArray
Passability UO.IsWorldCellPassable ยท UO.GetNextStepZ
Surface Z UO.GetSurfaceZ
Map Cells UO.GetMapCell
Land Tiles UO.GetLandTileAt ยท UO.GetLandTileData ยท UO.GetLandTilesArray ยท UO.GetLandTilesArrayEx
Static Tiles UO.GetStaticTileAt ยท UO.GetStaticTileData ยท UO.GetStaticTiles ยท UO.GetStaticTilesArray ยท UO.GetStaticTilesArrayEx
Tile Flags UO.GetTileFlags ยท UO.ConvertIntegerToFlags
Tile Height UO.GetTileHeight
Tile Layer UO.GetTileLayer
Tile Name UO.GetTileName
Water Tiles UO.IsWaterTile
Tree Tiles UO.IsTreeTile
Mine Tiles UO.IsMineTile

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

X / Y / Z

UO.X ยท UO.Y ยท UO.Z ยท UO.GetX ยท UO.GetY ยท UO.GetZ

๊ฑฐ๋ฆฌ

UO.Dist ยท UO.GetDistance

LOS

UO.CheckLOS ยท UO.LOSOptions

์„ธ๊ณ„๋ฒˆํ˜ธ

UO.WorldNum ยท UO.GetWorldNum

์›”๋“œ ์…€ / ํ†ต๊ณผ์„ฑ

UO.GetWorldCell ยท UO.GetMapCell ยท UO.IsWorldCellPassable ยท UO.GetSurfaceZ ยท UO.GetNextStepZ ยท UO.GetWorldTilesArray

ํ† ์ง€ ํƒ€์ผ

UO.GetLandscapeTile ยท UO.GetLandTileAt ยท UO.GetLandTileData ยท UO.GetLandTilesArray ยท UO.GetLandTilesArrayEx

์ •์  ํƒ€์ผ

UO.GetStaticArt ยท UO.GetStaticTileAt ยท UO.GetStaticTileData ยท UO.GetStaticTiles ยท UO.GetStaticTilesArray ยท UO.GetStaticTilesArrayEx ยท UO.ReadStaticsXY ยท UO.PrivateGetTile ยท UO.GetTileXYM ยท UO.GetLayerCount

ํƒ€์ผ โ€‹โ€‹์†์„ฑ

UO.GetTileFlags ยท UO.GetTileHeight ยท UO.GetTileLayer ยท UO.GetTileName ยท UO.IsWaterTile ยท UO.IsTreeTile ยท UO.IsMineTile ยท UO.ConvertIntegerToFlags

ํด๋ผ์ด์–ธํŠธ ์ •์ 

UO.AddUserStatic ยท UO.ClearUserStatics ยท UO.GetUserStatic ยท UO.GetUserStatics ยท UO.RemoveUserStatic ยท UO.UserStaticExists

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

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

UO.GetDistance

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

var target = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(target)))
{
    var distance = UO.GetDistance(target);
    if (Truth(distance <= 2))
    {
        UO.Print("Target is within two tiles");
    }
}

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

UO.IsWorldCellPassable

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

var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var result = UO.IsWorldCellPassable(x,y,z,x+1,y,z,UO.WorldNum());
if (Truth(Truth(result[0]) == true))
{
    UO.Print("Passable, Z=" + Convert.ToString(result[1]));
}
else
{
    UO.Print("Blocked");
}

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

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

1 ยท 2

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


UO.AddUserStatic

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

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

dynamic UO.AddUserStatic(object? staticItem, object? worldNum);
int UO.AddUserStatic(object? graphic, object? x, object? y, object? z, object? hue, object? map);

๋กœ์ปฌ ์Šคํฌ๋ฆฝํŠธ ์ƒํƒœ์— ์‚ฌ์šฉ์ž ์ •์˜ ์ •์  ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž graphic๋Š” PathFinder์˜ ๋กœ์ปฌ ์žฅ์• ๋ฌผ ํ™•์ธ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ์ฒด๊ฐ€ ์„œ๋ฒ„์— ์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฒˆํ˜ธ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋œ 2๊ฐœ์˜ ์ธ์ˆ˜ ํ˜ธ์ถœ์€ ๋ ˆ๊ฑฐ์‹œ ๊ฐ’์„ ์œ ์ง€ํ•˜๊ณ  ํŒจ์ŠคํŒŒ์ธ๋”์— ์ •์ ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

  • staticItem โ€” ์ˆซ์ž graphic ๋˜๋Š” ๊ธฐ์กด ํ…์ŠคํŠธ ๊ฐ’.
  • worldNum - ๋…นํ™”์šฉ ์นด๋“œ ์ƒ‰์ธ ๋˜๋Š” ๋กœ์ปฌ ์ •์ .
  • graphic โ€” ID 0๋ถ€ํ„ฐ 65535๊นŒ์ง€ ์ •์ ์ž…๋‹ˆ๋‹ค.
  • z โ€” ๋†’์ด. ํŒจ์ŠคํŒŒ์ธ๋”์— ์ถ”๊ฐ€๋˜๋ฉด ๊ฐ’์€ byte๋กœ ํ‘œ์‹œ๋œ ๋ฒ”์œ„๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • hue - hue; ์ถ”๊ฐ€ ์‹œ 0๋ถ€ํ„ฐ 65535๊นŒ์ง€์˜ ๋ฒ”์œ„๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • map โ€” ์ง€๋„ ์ƒ‰์ธ; ๊ด€๋ฆฌ์ž ์ฒ˜๋ฆฌ์˜ ๊ฒฝ์šฐ ๋ฒ”์œ„๋Š” 0~255๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • x โ€” ์„ธ๊ณ„ X ์‚ฌ์šฉ์ž ํ†ต๊ณ„; int. ๊ด€๋ฆฌ์ž๋Š” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„ ๋‚ด์˜ ์ขŒํ‘œ๋ฅผ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค.
  • y โ€” ์„ธ๊ณ„ Y ์‚ฌ์šฉ์ž ํ†ต๊ณ„; int. ๊ด€๋ฆฌ์ž๋Š” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„ ๋‚ด์˜ ์ขŒํ‘œ๋ฅผ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์ƒ์„ฑ๋œ ํ•ญ๋ชฉ์˜ ๊ธ์ •์ ์ธ ID์ž…๋‹ˆ๋‹ค. 6๊ฐœ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ˜•์‹์˜ ๊ฒฝ์šฐ ์Œ์ˆ˜ graphic, x, y ๋˜๋Š” map๋ฟ ์•„๋‹ˆ๋ผ graphic ์œ„์˜ 65535๋„ -1๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ID๋Š” UO.UserStaticExists, UO.RemoveUserStatic์— ์ „๋‹ฌ๋˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๊ธฐ๋ก์„ ํ™•์ธ/์‚ญ์ œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ID ์ž์ฒด๋Š” ์ •์ ์ด ์„œ๋ฒ„์— ํ‘œ์‹œ๋˜๊ฑฐ๋‚˜ ์ ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

    • UO.AddUserStatic('tree', 0) - tree์€ ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋Ÿฐํƒ€์ž„ ์ƒํƒœ์—์„œ ์›๋ž˜ ๊ฐ’ ์Œ์„ ๋ ˆ๊ฑฐ์‹œ ๋ ˆ์ฝ”๋“œ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํŒจ์ŠคํŒŒ์ธ๋”๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ˆซ์ž graphic๋ฅผ ์‚ฌ์šฉํ•œ 2๊ฐœ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ˜ธ์ถœ์€ ํ•ด๋‹น graphic์˜ ์ •์ ์„ ์บ๋ฆญํ„ฐ์˜ z ๋ฐ hue 0์™€ ํ•จ๊ป˜ ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ์ขŒํ‘œ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • 6๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ˜ธ์ถœ์€ ์ฃผ์–ด์ง„ graphic, ์ขŒํ‘œ, ๊ณ ๋„, hue ๋ฐ ์ง€๋„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์ ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ธธ ์ฐพ๊ธฐ๋Š” ํ™œ์„ฑ ์ง€๋„์™€ ํด๋ผ์ด์–ธํŠธ ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ graphic ํ”Œ๋ž˜๊ทธ์— ๋”ฐ๋ผ์„œ๋งŒ ์ด๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ•ญ๋ชฉ์€ ์Šคํฌ๋ฆฝํŠธ ํด๋ผ์ด์–ธํŠธ์— ๋กœ์ปฌ์ž…๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, ๋„คํŠธ์›Œํฌ๋ฅผ ์š”์ฒญํ•˜๊ฑฐ๋‚˜, ์ƒค๋“œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.AddUserStatic(0x0CCA, UO.GetWorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ์Œ์„ ๋ ˆ๊ฑฐ์‹œ ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•˜์‹ญ์‹œ์˜ค. ํ…์ŠคํŠธ StaticItem๋Š” ํŒจ์ŠคํŒŒ์ธ๋”์— ์žฅ์• ๋ฌผ์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์Œ์„ ๋ ˆ๊ฑฐ์‹œ ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•˜์‹ญ์‹œ์˜ค. ํ…์ŠคํŠธ StaticItem๋Š” ํŒจ์ŠคํŒŒ์ธ๋”์— ์žฅ์• ๋ฌผ์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var legacyId = UO.AddUserStatic("tree", 0);
UO.Print(Convert.ToString(legacyId));

2. ํ˜„์žฌ ์ง€๋„์˜ ์บ๋ฆญํ„ฐ ์œ„์น˜์— ์ˆซ์ž graphic๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ํ˜„์žฌ ์ง€๋„์˜ ์บ๋ฆญํ„ฐ ์œ„์น˜์— ์ˆซ์ž graphic๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var staticId = UO.AddUserStatic(0x0CCA, UO.GetWorldNum());
    UO.Print(Convert.ToString(staticId));
    return null;
}

3. ์ง€์ •๋œ ์œ„์น˜์™€ ์ง€์ •๋œ ์ง€๋„์— ๋กœ์ปฌ ์ •์  graphic๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์ง€์ •๋œ ์œ„์น˜์™€ ์ง€์ •๋œ ์ง€๋„์— ๋กœ์ปฌ ์ •์  graphic๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
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 staticId = UO.AddUserStatic(0x0CCA, UO.GetX(), UO.GetY(), UO.GetZ(), 0, UO.GetWorldNum());
        UO.Print(Convert.ToString(staticId));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.AddUserStatic(staticItem, worldNum) โ€” UO.AddUserStatic(Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "adduserstatic":

                {

                    int map = Arg(1, bridge.WorldNumber);

                    if (arguments[0].Kind != InjectionValueKind.Array)

                    {

                        int graphic = 0;

                        if (arguments[0].Kind == InjectionValueKind.String &&

                            !NumberConversions.TryStr2Int(arguments[0].String, out graphic))

                        {

                            int legacyId = state.NextUserStaticId++;

                            state.UserStatics[legacyId] = Text(0) + "|" + Text(1);

                            return new InjectionValue(legacyId);

                        }

                        graphic = arguments[0].Kind == InjectionValueKind.String

                            ? graphic

                            : NumberConversions.ToInt(arguments[0]);

                        return new InjectionValue(AddUserStatic(graphic, bridge.GetX(bridge.Self), bridge.GetY(bridge.Self),

                            bridge.GetZ(bridge.Self), 0, map));

                    }

                    if (arguments[0].Array.Length < 4)

                        throw new NativeSubrutineException("AddUserStatic expects [graphic,x,y,z,color] and world number, or graphic,x,y,z,color,world.");

                    InjectionValue[] item = arguments[0].Array;

                    return new InjectionValue(AddUserStatic(

                        NumberConversions.ToInt(item[0]), NumberConversions.ToInt(item[1]), NumberConversions.ToInt(item[2]),

                        NumberConversions.ToInt(item[3]), item.Length > 4 ? NumberConversions.ToInt(item[4]) : 0, map));

                }

UO.AddUserStatic(graphic, x, y, z, hue, map) โ€” UO.AddUserStatic(Any,Any,Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

values => new InjectionValue(AddUserStatic(

                    NumberConversions.ToInt(values[0]), NumberConversions.ToInt(values[1]), NumberConversions.ToInt(values[2]),

                    NumberConversions.ToInt(values[3]), NumberConversions.ToInt(values[4]), NumberConversions.ToInt(values[5])))

UO.CheckLOS

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

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

dynamic UO.CheckLOS(object? xfrom, object? yfrom, object? zfrom, object? xto, object? yto, object? zto, object? worldNum);

CheckPortableLineOfSight๋ฅผ ํ†ตํ•ด ๋‘ ์ง€๋„ ์ง€์  ์‚ฌ์ด์˜ ์„ ์˜ ๋กœ์ปฌ ํ†ต๊ณผ ๊ฐ€๋Šฅ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

  • xfrom โ€” ์†Œ์Šค X: 0..65535.
  • yfrom โ€” ์†Œ์Šค Y: 0..65535.
  • zfrom โ€” ์ดˆ๊ธฐ Z, int.
  • xto - ๋ X: 0..65535.
  • yto - ๋ Y: 0..65535.
  • zto โ€” ์ตœ์ข… Z, int.
  • worldNum - 0..255. 0์ด ์•„๋‹Œ ๊ธธ์ด์˜ ๋น”์€ ํ˜„์žฌ ๋กœ๋“œ๋œ _world.Map/World.Map๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. CheckWorldStep์„ ํ†ตํ•ด WorldNum == _world.MapIndex ๋ฐ ๋ผ์ด๋ธŒ Player.Pathfinder๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํŒจ์‹ฏ์€ ๋กœ๋“œ๋˜๊ฑฐ๋‚˜ ์š”์ฒญ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€๋„/์บ๋ฆญํ„ฐ/ํŒจ์ŠคํŒŒ์ธ๋”๊ฐ€ ์—†๊ฑฐ๋‚˜ ํ•ด๋‹น ๋‹จ๊ณ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. - 0. ๋™์ผํ•œ X/Y์„ ์ œ์™ธํ•˜๋ฉด ์ „์ฒด ์„ธํฌ ์ฃผ๊ธฐ๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. 0..65535์˜ X/Y, 0..255์˜ WorldNum ๋ฐ abs(Zfrom-Zto)<=20๋Š” ๋กœ๋“œ๋œ ์นด๋“œ๊ฐ€ ์—†๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์นด๋“œ ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด๋„ 1๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐํ•˜ํ•™์ด๋‚˜ ๋„๋‹ฌ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•œ ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” LOS ์„œ๋ฒ„ ์†”๋ฃจ์…˜์ด ์•„๋‹Œ ๋กœ์ปฌ์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int 1 - ๋กœ์ปฌ ๊ด‘์„ ์ด X/Y์— ๋„๋‹ฌํ–ˆ์œผ๋ฉฐ ์ตœ์ข… ๋†’์ด๋Š” Zto์™€ 20 ์ด์ƒ ์ฐจ์ด๊ฐ€ ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0โ€”์ขŒํ‘œ, ์žฅ์• ๋ฌผ ๋˜๋Š” ํ™•์ธ ์ œํ•œ์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋น”์€ Bresenham ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ๋Œ€ 4096 ๋‹จ๊ณ„๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์…€์—์„œ BadLocations, CheckWorldStep ๋ฐ ๋ฐ˜ํ™˜๋œ ๋†’์ด๊ฐ€ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.
  • LosOptions != 0 ์ถ”๊ฐ€๋กœ CheckLosCell ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ; ๋น„ํŠธ 0x100๋Š” ๋Œ€๊ฐ์„ ์˜ ์–‘์ชฝ ์‚ฌ๊ฐํ˜•์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ ๊ฒ€์‚ฌ๋Š” ์„œ๋ฒ„๋ณ„ LOS ๊ทœ์น™์„ ํ™•์ธํ•˜์ง€ ์•Š์œผ๋ฉฐ ์•„๋ฌด๊ฒƒ๋„ ์ด๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์†Œํ•œ byte(๊ฐ’ & 0xFF)์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 1..4์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. CheckLosCell์˜ ๋ถ€ byte์˜ ๋‹ค๋ฅธ ๊ฐ’์€ 3 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜ 1/2๋Š” ๋ฒฝ ๋ฐ ํ†ตํ–‰ ๋ถˆ๊ฐ€๋Šฅ์„ ์ฐจ๋‹จํ•˜๊ณ , 3๋Š” ์ถ”๊ฐ€๋กœ NoShoot, 4๋Š” 0x200์—์„œ๋งŒ NoShoot๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  0x400์—์„œ๋งŒ ์ฐฝ ์žฅ์• ๋ฌผ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋น„ํŠธ 0x100๋Š” ์„ ํƒํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ๊ฐ ๋Œ€๊ฐ์„  ๋น” ๋‹จ๊ณ„์˜ ์–‘์ชฝ ์ธก๋ฉด ์…€์„ ์ถ”๊ฐ€๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. value=0๋Š” ์ถ”๊ฐ€ CheckLosCell/๋Œ€๊ฐ์„  ๊ฒ€์‚ฌ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜์ง€๋งŒ BadLocations ๋ฐ CheckWorldStep๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 4+0x100+0x200+0x400๋Š” ์„ธ ๊ฐœ์˜ ํ”Œ๋ž˜๊ทธ๋กœ ์‚ฌ์šฉ์ž ์ •์˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. setter๋Š” ์ •๊ทœํ™”๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹Œ ์›๋ณธ int์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • 0์ด ์•„๋‹Œ ๊ธธ์ด์˜ ๋น”์€ ํ˜„์žฌ ๋กœ๋“œ๋œ _world.Map/World.Map๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. CheckWorldStep๋ฅผ ํ†ตํ•ด WorldNum == _world.MapIndex ๋ฐ ๋ผ์ด๋ธŒ Player.Pathfinder๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํŒจ์‹ฏ์€ ๋กœ๋“œ๋˜๊ฑฐ๋‚˜ ์š”์ฒญ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€๋„/์บ๋ฆญํ„ฐ/ํŒจ์ŠคํŒŒ์ธ๋”๊ฐ€ ์—†๊ฑฐ๋‚˜ ํ•ด๋‹น ๋‹จ๊ณ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. - 0. ๋™์ผํ•œ X/Y๋ฅผ ์ œ์™ธํ•˜๋ฉด ์ „์ฒด ์„ธํฌ ์ฃผ๊ธฐ๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. 0..65535์˜ X/Y, 0..255์˜ WorldNum ๋ฐ abs(Zfrom-Zto)<=20๋Š” ๋กœ๋“œ๋œ ์นด๋“œ๊ฐ€ ์—†๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์นด๋“œ ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด๋„ 1๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐํ•˜ํ•™์ด๋‚˜ ๋„๋‹ฌ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•œ ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” LOS ์„œ๋ฒ„ ์†”๋ฃจ์…˜์ด ์•„๋‹Œ ๋กœ์ปฌ์ž…๋‹ˆ๋‹ค.
  • CheckLosCell๋Š” ํ•œ ์…€์˜ ๋กœ๋“œ๋œ Land/Static/Multi/Item์„ ์šฐํšŒํ•ฉ๋‹ˆ๋‹ค. ABS(rayZ-land.Z)<=20์— ์žˆ๋Š” ํ†ต๊ณผํ•  ์ˆ˜ ์—†๋Š” ํ† ์ง€ ๋ธ”๋ก. ์ •์ /๋‹ค์ค‘/ํ•ญ๋ชฉ ํ”Œ๋ž˜๊ทธ๋Š” ๋ฒ”์œ„ ํƒ€์ผ์—์„œ๋งŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.Z-2 .. ํƒ€์ผ.Z+max(1,Height)+2; ํ—ˆ์šฉ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์ฐฝ์€ Wall/Impassable/NoShoot๊ฐ€ ์„ ํƒ๋  ๋•Œ๊นŒ์ง€ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ๋น” X/Y๋Š” Bresenham์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์ตœ๋Œ€ 4096 ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. Z๋Š” ํ‘œ๋ฉด CheckWorldStep์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ Zto์— ๋ณด๊ฐ„๋˜์ง€ ์•Š๊ณ  ์ตœ์ข… ๋†’์ด ๊ณต์ฐจ๋Š” 20์ž…๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.CheckLOS(UO.X(), UO.Y(), UO.Z(), UO.X() + 1, UO.Y(), UO.Z(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ํ˜„์žฌ ์…€์˜ ์ค„ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ X/Y/๋งต ๋‚ด์—์„œ ๋™์ผํ•œ ์ง€์ ์ด ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var visible = UO.CheckLOS(x,y,z,x,y,z,UO.WorldNum());
UO.Print(Convert.ToString(visible));

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

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

  • ์ด์›ƒ ์…€์˜ ๋†’์ด์™€ ํˆฌ์ž์œจ์€ ๋กœ์ปฌ ๋งต์—์„œ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX();
    var y = UO.GetY();
    var z = UO.GetZ();
    var clear = UO.CheckLOS(x, y, z, x + 1, y, z, UO.WorldNum());
    UO.Print(Convert.ToString(clear));
    return null;
}

3. ์ž˜๋ชป๋œ ์ขŒํ‘œ โ€” ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋ถ€์ • X์€ ๋งต์„ ํ†ต๊ณผํ•˜์ง€ ์•Š๊ณ  0์˜ ๊ฒฐ๊ณผ๋กœ ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var clear = UO.CheckLOS(-1, 0, 0, 0, 0, 0, 0);
        UO.Print(Convert.ToString(clear));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.CheckLOS(xfrom, yfrom, zfrom, xto, yto, zto, worldNum) โ€” UO.CheckLOS(Any,Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: xfrom (Any), yfrom (Any), zfrom (Any), xto (Any), yto (Any), zto (Any), worldNum (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "checklos": return new InjectionValue(CheckPortableLineOfSight(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), Arg(5), Arg(6)) ? 1 : 0);

UO.ClearUserStatics

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

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

void UO.ClearUserStatics();

๋ชจ๋“  ์‚ฌ์šฉ์ž ์ •์  ๋Ÿฐํƒ€์ž„ ํ•ญ๋ชฉ๊ณผ ๋กœ์ปฌ ์ •์  ๊ด€๋ฆฌ์ž ๊ฐœ์ฒด๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

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

๋™์ž‘

  • State.UserStatics ๋ฐ ๊ด€๋ฆฌ์ž ๊ฐœ์ฒด๊ฐ€ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค. ์—…๋กœ๋“œ๋œ ๋งต ํŒŒ์ผ๊ณผ ์‹ค์ œ ์„œ๋ฒ„ ์•„์ดํ…œ์€ ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ƒํƒœ ์ง€์šฐ๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ •์  ๋Ÿฐํƒ€์ž„ ํ•ญ๋ชฉ๊ณผ ๋กœ์ปฌ ์ •์  ๊ด€๋ฆฌ์ž ๊ฐœ์ฒด๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
UO.ClearUserStatics();

2. ์„ค์ • ํ›„ ์ง€์šฐ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ํ˜„์žฌ ์…€์— ๋กœ์ปฌ ์ •์ ์„ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ •์˜ ์ •์ ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var localStatic = UO.AddUserStatic(0x0CCA, UO.GetX(), UO.GetY(), UO.GetZ(), 0, UO.WorldNum());
    UO.ClearUserStatics();
    return null;
}

3. ์žฌ์ œ๊ฑฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋นˆ ์„ธํŠธ๋ฅผ ์ง€์šฐ๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜๋ฉฐ ์ƒˆ ์„ค์ •์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.ClearUserStatics();
        UO.ClearUserStatics();
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.ClearUserStatics() โ€” UO.ClearUserStatics()

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

๊ฒฐ๊ณผ: void / Unit.

ํ˜ธ์ถœ ์‹œ:

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

case "clearuserstatics": state.UserStatics.Clear(); bridge.ClearUserStatics(); return InjectionValue.Unit;

UO.ConvertIntegerToFlags

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

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

dynamic UO.ConvertIntegerToFlags(object? group, object? value);

ํƒ€์ผ โ€‹โ€‹ํ”Œ๋ž˜๊ทธ์˜ ์ˆซ์ž ๋งˆ์Šคํฌ๋ฅผ ์—ด๊ฑฐํ˜• ์ด๋ฆ„ ๋ฐฐ์—ด TileFlag๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

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

  • group - int: 1 ๋˜๋Š” 2๋งŒ ๋ณ€ํ™˜์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ๋นˆ ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • value โ€” Arg๊ฐ€ ๋ถ€ํ˜ธ ์žˆ๋Š” 32๋น„ํŠธ int๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ ๋ธŒ๋ฆฌ์ง€ ๊ฒฐ๊ณผ๋ฅผ ulong๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋งˆ์Šคํฌ์ž…๋‹ˆ๋‹ค. ๋†’์€ 64 ๋น„ํŠธ ํ”Œ๋ž˜๊ทธ์˜ ๊ฒฝ์šฐ ์ด ํ˜•์‹์€ ์ „์ฒด ๋งˆ์Šคํฌ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

๋น„ํŠธ๊ฐ€ ๋งˆ์Šคํฌ์— ์™„์ „ํžˆ ์กด์žฌํ•˜๋Š” 0์ด ์•„๋‹Œ TileFlag๋ผ๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ๋งˆ์Šคํฌ 0๋Š” ๋นˆ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ๊ทธ๋ฃน 1 ๋ฐ 2๋Š” ๋‹ค๋ฅธ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์•„๋‹Œ ๋™์ผํ•œ Enum.GetValues์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋กœ์ปฌ ๋งˆ์Šคํฌ ๋ณ€ํ™˜์ž…๋‹ˆ๋‹ค. ํƒ€์ผ โ€‹โ€‹๋ฐ์ดํ„ฐ๋Š” ์š”์ฒญ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • API-๋“ฑ๋ก์€ object?๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ Arg(1) ๋””์ŠคํŒจ์ฒ˜๋Š” int๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์Œ์ˆ˜ int๋Š” ulong๋กœ ์บ์ŠคํŒ…๋  ๋•Œ ๋ถ€ํ˜ธ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. GetTileFlags ๋˜ํ•œ ์„œ๋ช…๋œ ํ•˜์œ„ 32 ๋น„ํŠธ๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. int: ์ด ํ˜ธํ™˜ ์Œ์€ ์ „์ฒด 64 ๋น„ํŠธ ํƒ€์ผ ๋ฐ์ดํ„ฐ ๊ณ„์•ฝ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ๋งˆ์Šคํฌ 0์—๋Š” 0์ด ์•„๋‹Œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
var flags = UO.ConvertIntegerToFlags(1,0);
UO.Print(Convert.ToString(ArrayLength(flags)));

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

2. ๋‚ฎ์€ ๋น„ํŠธ ๋งˆ์Šคํฌ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋ฐฐ์—ด์—๋Š” ์„ ํƒํ•œ ๋งˆ์Šคํฌ์˜ ์‹ค์ œ ์ด๋ฆ„ TileFlag์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var flags = UO.ConvertIntegerToFlags(2, 1);
    for (int i = (int)(0); i <= ArrayLength(flags) - 1; i += (int)(1))
    {
        UO.Print(flags[i]);
    }

    return null;
}

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

3. ์ž˜๋ชป๋œ ๊ทธ๋ฃน - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๊ทธ๋ฃน 0์€ ์ด ๋ช…๋ น์—์„œ ํ—ˆ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋นˆ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var flags = UO.ConvertIntegerToFlags(0, 1);
        UO.Print(Convert.ToString(ArrayLength(flags)));
        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.ConvertIntegerToFlags(group, value) โ€” UO.ConvertIntegerToFlags(Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "convertintegertoflags":

                    return new InjectionValue(bridge.ConvertTileFlags(Arg(0), Arg(1))

                        .Select(flag => new InjectionValue(flag)).ToArray());

UO.Dist

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

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

int UO.Dist(object? xfrom, object? yfrom, object? xto, object? yto);

๋‘ ์›”๋“œ ํฌ์ธํŠธ ์‚ฌ์ด์˜ ์…€ ๊ฑฐ๋ฆฌ(์ ˆ๋Œ€ ์ฐจ์ด X ๋ฐ Y ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’)๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

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

  • xfrom โ€” ์‹œ์ž‘์ ์˜ X ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • yfrom โ€” ์‹œ์ž‘์ ์˜ Y ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • xto โ€” X ํ• ๋‹น ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • yto โ€” Y ํ• ๋‹น ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int โ€” ์…€ ๋‚ด ๊ฑฐ๋ฆฌ, ์œ ํšจํ•œ ์ขŒํ‘œ์˜ ๊ฒฝ์šฐ ์Œ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 0๋Š” ๋™์ผํ•œ XY, 1 - ํ•˜๋‚˜์˜ ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„ฑ๊ณต์˜ ์‹ ํ˜ธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ˆ˜๋Ÿ‰์ž…๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ๋น„๊ต ๊ฑฐ๋ฆฌ <= 2๋Š” bool true ๋˜๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ ์ž์ฒด๋Š” int๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ขŒํ‘œ๋งŒ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์น˜ ์—†์Œ, ๋Œ€๊ธฐ ์—†์Œ, ์ง€๋„ ๋กœ๋“œ ์—†์Œ, ์žฅ์• ๋ฌผ ํ™•์ธ ์—†์Œ, Z ์—†์Œ, ์„ธ๊ณ„ ์ง€๋„ ์—†์Œ. ํŒ€์€ ํ†ต๊ณผ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์ง€ ์•Š์œผ๋ฉฐ ๋ชฉํ‘œ ๋‹ฌ์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ์€ ๋™์ผํ•œ ์ขŒํ‘œ๊ณ„์— ์†ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์žฅ์• ๋ฌผ์„ ํ”ผํ•˜๋ฉด ๊ฒฝ๋กœ๊ฐ€ ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋„ค ๊ฐ€์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œํ™”๋œ ๋ฒ”์œ„ 0..65535์˜ ์„ธ๊ณ„ ์ขŒํ‘œ int๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. object? ์„œ๋ช…์— ์žˆ๋Š” ํ•ญ๋ชฉ์˜ ID๊ฐ€ ์•„๋‹Œ ๋ฒ”์šฉ ์–ด๋Œ‘ํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ๊ธฐ๋ณธ๊ฐ’์ด ์—†์œผ๋ฉฐ ๊ฐ€์Šด ๋‚ด๋ถ€์˜ ์ขŒํ‘œ, ๋‹ค์„ฏ ๋ฒˆ์งธ Z ๋ฐ ํ•˜๋‚˜์˜ ๊ฐœ์ฒด๋กœ ๊ณผ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณต์‹: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). ์ ์„ ๋‹ค์‹œ ์ •๋ ฌํ•ด๋„ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ๋„ ์•„๋‹ˆ๊ณ , ์ฐจ์ด์˜ ํ•ฉ๋„ ์•„๋‹ˆ๊ณ , ์žฅ์• ๋ฌผ์„ ๋Œ ๋•Œ์˜ ๊ฑธ์Œ ์ˆ˜๋„ ์•„๋‹™๋‹ˆ๋‹ค.

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

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

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

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

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

var result = UO.Dist(100, 100, 103, 104);
UO.Print("Dist: " + Convert.ToString(result));

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

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

  • (100,100)์—์„œ (103,104)๊นŒ์ง€: ์ ˆ๋Œ€ ์ฐจ์ด๋Š” 3 ๋ฐ 4์ด๋ฉฐ ์ตœ๋Œ€ 4์ž…๋‹ˆ๋‹ค. ์ฃผ์š” ์ˆ˜์ต์€ int 4์ž…๋‹ˆ๋‹ค.
  • int โ€” ์…€ ๋‚ด ๊ฑฐ๋ฆฌ, ์œ ํšจํ•œ ์ขŒํ‘œ์˜ ๊ฒฝ์šฐ ์Œ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 0๋Š” ๋™์ผํ•œ XY, 1 - ํ•˜๋‚˜์˜ ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„ฑ๊ณต์˜ ์‹ ํ˜ธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ˆ˜๋Ÿ‰์ž…๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ๋น„๊ต ๊ฑฐ๋ฆฌ <= 2๋Š” bool true ๋˜๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ ์ž์ฒด๋Š” int๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • ๊ณต์‹: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). ์ ์„ ๋‹ค์‹œ ์ •๋ ฌํ•ด๋„ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ๋„ ์•„๋‹ˆ๊ณ , ์ฐจ์ด์˜ ํ•ฉ๋„ ์•„๋‹ˆ๊ณ , ์žฅ์• ๋ฌผ์„ ๋Œ ๋•Œ์˜ ๊ฑธ์Œ ์ˆ˜๋„ ์•„๋‹™๋‹ˆ๋‹ค.
return UO.Dist(100,100,103,104);

2. ๊ฒฐ๊ณผ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

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

  • (100,100)์—์„œ (101,99)๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋Š” 1์ž…๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ<=2๋ฅผ ๋ณ„๋„๋กœ ๋น„๊ตํ•˜๋ฉด true=1๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. Main์€ "1:1"๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋‹จ์œ„๋Š” ๊ฑฐ๋ฆฌ์ด๊ณ  ๋‘ ๋ฒˆ์งธ ๋‹จ์œ„๋Š” ๋น„๊ต์˜ ๋…ผ๋ฆฌ์  ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.
  • int โ€” ์…€ ๋‚ด ๊ฑฐ๋ฆฌ, ์œ ํšจํ•œ ์ขŒํ‘œ์˜ ๊ฒฝ์šฐ ์Œ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 0๋Š” ๋™์ผํ•œ XY, 1 - ํ•˜๋‚˜์˜ ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„ฑ๊ณต์˜ ์‹ ํ˜ธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ˆ˜๋Ÿ‰์ž…๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ๋น„๊ต ๊ฑฐ๋ฆฌ <= 2๋Š” bool true ๋˜๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ ์ž์ฒด๋Š” int๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • ๊ณต์‹: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). ์ ์„ ๋‹ค์‹œ ์ •๋ ฌํ•ด๋„ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ๋„ ์•„๋‹ˆ๊ณ , ์ฐจ์ด์˜ ํ•ฉ๋„ ์•„๋‹ˆ๊ณ , ์žฅ์• ๋ฌผ์„ ๋Œ ๋•Œ์˜ ๊ฑธ์Œ ์ˆ˜๋„ ์•„๋‹™๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var distance = UO.Dist(100, 100, 101, 99);
    var close = distance <= 2;
    return Convert.ToString(distance) + ":" + Convert.ToString(close);
    return null;
}

3. ์ „์ฒด ์Šคํฌ๋ฆฝํŠธ ๊ตฌ๋ฌธ ๋ถ„์„ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • UO.Dist๋Š” 4๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. RebuildTileDistance๋Š” Abs๋ฅผ ํ†ตํ•ด ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๋น„๊ตํ•œ ํ›„ ๋” ํฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ 4๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋ฉ”์ธ์€ "4:4"๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์กฐ์ž๋Š” ์˜ˆ์ œ์— ์™„์ „ํžˆ ํ‘œ์‹œ๋˜๋ฉฐ ๋‹ค๋ฅธ ์—”์ง„ ๋ช…๋ น์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • int โ€” ์…€ ๋‚ด ๊ฑฐ๋ฆฌ, ์œ ํšจํ•œ ์ขŒํ‘œ์˜ ๊ฒฝ์šฐ ์Œ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 0๋Š” ๋™์ผํ•œ XY, 1 - ํ•˜๋‚˜์˜ ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„ฑ๊ณต์˜ ์‹ ํ˜ธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ˆ˜๋Ÿ‰์ž…๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ๋น„๊ต ๊ฑฐ๋ฆฌ <= 2๋Š” bool true ๋˜๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ ์ž์ฒด๋Š” int๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • ๊ณต์‹: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). ์ ์„ ๋‹ค์‹œ ์ •๋ ฌํ•ด๋„ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ๋„ ์•„๋‹ˆ๊ณ , ์ฐจ์ด์˜ ํ•ฉ๋„ ์•„๋‹ˆ๊ณ , ์žฅ์• ๋ฌผ์„ ๋Œ ๋•Œ์˜ ๊ฑธ์Œ ์ˆ˜๋„ ์•„๋‹™๋‹ˆ๋‹ค.
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 actual = UO.Dist(100, 100, 103, 104);
        var rebuilt = RebuildTileDistance(100, 100, 103, 104);
        return Convert.ToString(actual) + ":" + Convert.ToString(rebuilt);
        return null;
    }

    dynamic RebuildTileDistance(dynamic Xfrom, dynamic Yfrom, dynamic Xto, dynamic Yto)
    {
        var dx = Math.Abs(Xto - Xfrom);
        var dy = Math.Abs(Yto - Yfrom);
        if (Truth(dx > dy))
        {
            return dx;
        }

        return dy;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.Dist(xfrom, yfrom, xto, yto) โ€” UO.Dist(Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: xfrom (Any), yfrom (Any), xto (Any), yto (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "dist": return new InjectionValue(arguments.Length >= 4

                    ? GetDistance(Arg(0), Arg(1), Arg(2), Arg(3))

                    : bridge.GetDistance(Arg(0)));

UO.GetDistance

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

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

int UO.GetDistance(object? id);
int UO.GetDistance(object? x, object? y);
int UO.GetDistance(object? id1, object? x2, object? y2);
int UO.GetDistance(object? x1, object? y1, object? x2, object? y2);

์ตœ๋Œ€ X/Y ์ฐจ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์…€ ๋‚ด ๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ธธ์ฐพ๊ธฐ๊ฐ€ ์—†๋Š” ๊ธฐํ•˜ํ•™์  ์ถ”์ •์ž…๋‹ˆ๋‹ค.

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

  • id โ€” ํ•˜๋‚˜์˜ ์ธ์ˆ˜: serial ๋˜๋Š” ๋กœ๋“œ๋œ ๊ฐ์ฒด์˜ ๋ณ„์นญ, ์–ป๊ณ ์ž ํ•˜๋Š” ๊ฑฐ๋ฆฌ.
  • x โ€” ๋‘ ๊ฐ€์ง€ ์ธ์ˆ˜: ์„ธ๊ณ„ ๋ชฉ์ ์ง€. ์‹œ์ž‘์€ GetX(self), GetY(self)์ž…๋‹ˆ๋‹ค.
  • y โ€” ๋‘ ๊ฐ€์ง€ ์ธ์ˆ˜: ์„ธ๊ณ„ ๋ชฉ์ ์ง€. ์‹œ์ž‘์€ GetX(self), GetY(self)์ž…๋‹ˆ๋‹ค.
  • id1 - 3๊ฐœ์˜ ์ธ์ˆ˜ ํ˜•์‹ - serial/์ขŒํ‘œ๊ฐ€ ์›์  ์—ญํ• ์„ ํ•˜๋Š” ๊ฐ์ฒด์˜ ๋ณ„์นญ์ž…๋‹ˆ๋‹ค.
  • x1 โ€” 4๊ฐœ์˜ ์ธ์ˆ˜ ํ˜•์‹์œผ๋กœ ์›์ ์˜ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. ์ด ์–‘์‹์—๋Š” ๊ฐœ์ฒด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • y1 โ€” 4๊ฐœ์˜ ์ธ์ˆ˜ ํ˜•์‹์œผ๋กœ ์›์ ์˜ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. ์ด ์–‘์‹์—๋Š” ๊ฐœ์ฒด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • x2 โ€” 3/4๊ฐœ์˜ ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” ์–‘์‹์—์„œ ๋ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๊ฐœ์ฒด์˜ serial์™€ ํ˜ผ๋™ํ•˜์ง€ ๋งˆ์„ธ์š”.
  • y2 โ€” 3/4๊ฐœ์˜ ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” ์–‘์‹์—์„œ ๋ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๊ฐœ์ฒด์˜ serial์™€ ํ˜ผ๋™ํ•˜์ง€ ๋งˆ์„ธ์š”.

๋ฐ˜ํ™˜๊ฐ’

int - max(abs(x2-x1), abs(y2-y1)): ์ธ์ ‘ํ•œ ์…€์— ๋Œ€ํ•œ ์ˆ˜ํ‰, ์ˆ˜์ง ๋ฐ ๋Œ€๊ฐ์„  ๊ฑฐ๋ฆฌ๊ฐ€ 1์ž…๋‹ˆ๋‹ค. ๋†’์ด Z ๋ฐ ์žฅ์• ๋ฌผ์€ ๊ณ ๋ ค๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” serial์˜ ๊ฒฝ์šฐ ๋‹จ์ผ ์ธ์ˆ˜ ํ˜•์‹์€ 0๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž๊ฐ€ ์—†๋Š” ๊ธฐ์กด ๊ฐœ์ฒด์˜ ๊ฒฝ์šฐ - 65535. ์•Œ ์ˆ˜ ์—†๋Š” id1์˜ ๊ฒฝ์šฐ 3์ธ์ˆ˜ ํ˜•์‹์€ (0,0)๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋จผ์ € Exists(id1)์„ ํ™•์ธํ•˜์„ธ์š”.

๋™์ž‘

  • ๋‹จ์ผ ๊ฐ์ฒด ํ˜•ํƒœ๋Š” ํ˜„์žฌ World.RangeSize ๋ฒ”์œ„ ์ค‘์‹ฌ๊ณผ ์›€์ง์ด๋Š” ๋ชน์˜ ๋‹จ๊ณ„ ๋Œ€๊ธฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋™ ์ค‘์—๋Š” GetX/GetY๋ฅผ ํ†ตํ•œ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ขŒํ‘œ ์–‘์‹์€ ์ „๋‹ฌ๋œ ์ˆซ์ž์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ขŒํ‘œ์˜ ๊ฒฝ์šฐ 0..65535 ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทน๋‹จ์ ์ธ int ๊ฐ’๊ณผ ์ฐจ์ด ์˜ค๋ฒ„ํ”Œ๋กœ๋Š” ์ขŒํ‘œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํŒ€์€ ๋ชฉํ‘œ๊ฐ€ ๋‹ฌ์„ฑ๋  ๊ฒƒ์ด๋ผ๊ณ  ์•ฝ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋™ํ•˜๋ ค๋ฉด MoveXY/NewMoveXY๊ฐ€ ํ•„์š”ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฒฝ์€ ์‹ค์ œ ๊ฒฝ๋กœ๋ฅผ ๋” ๊ธธ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ๋Œ€์ƒ ๋ฒ”์œ„ ํ™•์ธ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๋Œ€์ƒ์€ type์ด ์•„๋‹ˆ๋ผ serial์ž…๋‹ˆ๋‹ค. Exists ๊ฒ€์‚ฌ๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ๋ฌผ์ฒด์˜ ์˜์ ์ด ๊ฐ€๊นŒ์šด ๋Œ€์ƒ์œผ๋กœ ์˜ค์ธ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • distance<=2๋Š” X/Y ๋ฒ”์œ„๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์‹œ์„ฑ๊ณผ ํ†ตํ–‰์„ฑ์€ ๋ณ„๋„๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.
var target = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(target)))
{
    var distance = UO.GetDistance(target);
    if (Truth(distance <= 2))
    {
        UO.Print("Target is within two tiles");
    }
}

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

2. ๋‘ ์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • x1=100, y1=200, x2=103, y2=204. ์ฐจ์ด์ ์€ 3์™€ 4์ž…๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” 7๋„ ์•„๋‹ˆ๊ณ  ์œ ํด๋ฆฌ๋“œ 5๋„ ์•„๋‹Œ 4์ž…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var distance = UO.GetDistance(100, 200, 103, 204);
    UO.Print(Convert.ToString(distance));
    return null;
}

3. ๊ฐœ์ฒด์™€ ์บ๋ฆญํ„ฐ์—์„œ ์‹œ์ž‘ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๋‘ ๊ฐœ์˜ x/y ์ธ์ˆ˜๋Š” ํ˜„์žฌ ์œ„์น˜ self๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„ธ ๊ฐœ์˜ ์ธ์ˆ˜ id1/x2/y2๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ์ž‘ ๊ฐœ์ฒด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ผ์ •ํ•œ ์œ„์น˜์—์„œ ๋‘ ์–‘์€ ๋ชจ๋‘ 3์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ขŒํ‘œ๋Š” ์ง€๋„ ๊ฒฝ๊ณ„ ๋‚ด์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var x = UO.GetX() + 3;
        var y = UO.GetY() + 1;
        var fromSelf = UO.GetDistance(x, y);
        var fromObject = UO.GetDistance("self", x, y);
        UO.Print(Convert.ToString(fromSelf) + " / " + Convert.ToString(fromObject));
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: int / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getdistance": return new InjectionValue(bridge.GetDistance(Arg(0)));

UO.GetDistance(id) โ€” UO.GetDistance(Integer)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetDistance(int id) => bridge.GetDistance(id);

UO.GetDistance(id) โ€” UO.GetDistance(String)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetDistance(string id) => GetDistance(GetObject(id));

UO.GetDistance(x, y) โ€” UO.GetDistance(Integer,Integer)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetDistance(int x, int y) => GetDistance(bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), x, y);

UO.GetDistance(id1, x2, y2) โ€” UO.GetDistance(Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: id1 (Any), x2 (Any), y2 (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetDistance(InjectionValue id1, InjectionValue x2, InjectionValue y2)

        {

            var obj1 = GetObject(id1);

            int x1 = bridge.GetX(obj1);

            int y1 = bridge.GetY(obj1);



            return GetDistance(x1, y1, NumberConversions.ToInt(x2), NumberConversions.ToInt(y2));

        }

UO.GetDistance(x1, y1, x2, y2) โ€” UO.GetDistance(Integer,Integer,Integer,Integer)

๋งค๊ฐœ๋ณ€์ˆ˜: x1 (Integer), y1 (Integer), x2 (Integer), y2 (Integer)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetDistance(int x1, int y1, int x2, int y2)

        {

            int dx = Math.Abs(x1 - x2);

            int dy = Math.Abs(y1 - y2);



            return Math.Max(dx, dy);

        }

UO.GetLandTileAt

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

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

dynamic UO.GetLandTileAt(object? x, object? y);
dynamic UO.GetLandTileAt(object? x, object? y, object? map);

์„ ํƒํ•œ ์…€์˜ ํ™•์žฅ๋œ ํ† ์ง€ ๊ธฐ๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

  • x โ€” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„์˜ X ์…€. ๊ฒ€ํ”„ ๋‚ด๋ถ€ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • y โ€” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„์˜ Y ์…€. ๊ฒ€ํ”„ ๋‚ด๋ถ€ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • map โ€” ์นด๋“œ ๋ฒˆํ˜ธ. ์ด ์ธ์ˆ˜๊ฐ€ ์„ ํƒํ•œ ์–‘์‹์— ์—†์œผ๋ฉด ํ˜„์žฌ ๋งต์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ๋Š” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„์—์„œ๋งŒ ํƒ€์ผ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

ํ•œ ๋ ˆ์ฝ”๋“œ์˜ 11 ํ•„๋“œ ๋ฐฐ์—ด. ์ธ๋ฑ์Šค๋Š” 0๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • [0] kind โ€” string: "๋žœ๋“œ", "์ •์ " ๋˜๋Š” "object".
  • [1] serial - int: serial ๋™์  ์•„์ดํ…œ; ์œก์ƒ/์ •์ ์˜ ๊ฒฝ์šฐ 0์ž…๋‹ˆ๋‹ค.
  • [2] graphic - int: type ๊ทธ๋ž˜ํ”ฝ.
  • [3] x, [4] y - int: ์…€์˜ ์„ธ๊ณ„ ์ขŒํ‘œ.
  • [5] z - int: ์›”๋“œ์˜ ๋ฒ ์ด์Šค ๋†’์ด.
  • [6] hue - int: ์ƒ‰์ƒ, ์ง€๋ฉด ๊ทผ์ฒ˜ 0.
  • [7] flags - int: ํƒ€์ผ ๋ฐ์ดํ„ฐ ํ”Œ๋ž˜๊ทธ์˜ ๋‚ฎ์€ 32 ๋น„ํŠธ์ž…๋‹ˆ๋‹ค.
  • [8] name - string: ํƒ€์ผ๋ฐ์ดํ„ฐ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • [9] layer - int: ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ ์žฅ๋น„ ๋ ˆ์ด์–ด, ์ง€์ƒ ๊ทผ์ฒ˜ 0; ์ •์  ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • [10] height - int: ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ ๋†’์ด graphic, ์ง€๋ฉด ๊ทผ์ฒ˜ 0; ์ขŒํ‘œ Z๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋นˆ ๋ฐฐ์—ด []์€ ํ•ญ๋ชฉ์ด ์—†๊ฑฐ๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ์นด๋“œ/์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. GetStaticTileAt์˜ ๊ฒฝ์šฐ ์Œ์ˆ˜์ด๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ํฐ ์ธ๋ฑ์Šค๋Š” []๋„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค ์˜ค๋ฒ„ํ”Œ๋กœ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

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

1. type, Z ๋ฐ ๋ ˆ์ด์–ด๋ฅผ ๋ณ„๋„๋กœ ์ฝ๊ณ  - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • x/y โ€” ๋ฌธ์ž ์œ„์น˜; ์นด๋“œ๊ฐ€ ๋‚ด๋ ค์ง€๊ณ  ์ž๋™์œผ๋กœ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. GetStaticTileAt index=0์˜ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • [2], [5], [9] ํ•„๋“œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ 11์˜ ๊ธธ์ด๋ฅผ ํ™•์ธํ•œ ํ›„์—๋งŒ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.
var tile = UO.GetLandTileAt(UO.GetX(), UO.GetY());
if (Truth(ArrayLength(tile) == 11))
{
    UO.Print("Type: " + Convert.ToString(tile[2]));
    UO.Print("World Z: " + Convert.ToString(tile[5]));
    UO.Print("Equipment layer: " + Convert.ToString(tile[9]));
}
else
{
    UO.Print("Tile is unavailable");
}

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

2. ์ด๋ฆ„๊ณผ ํ‚ค ๊ฐ€์ ธ์˜ค๊ธฐ graphic - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋™์ผํ•œ ์ขŒํ‘œ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. GetStaticTileAt๋Š” ์ธ๋ฑ์Šค=0๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ํƒ€์ผ[8]์€ ์ด๋ฆ„ ๋ฌธ์ž์—ด์ด๊ณ , ํƒ€์ผ[10]์€ Z ๋ฒ ์ด์Šค๊ฐ€ ์•„๋‹Œ ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ ๋†’์ด ์น˜์ˆ˜์ž…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var tile = UO.GetLandTileAt(UO.GetX(), UO.GetY());
    if (Truth(ArrayLength(tile) == 11))
    {
        UO.Print(tile[8]);
        UO.Print("Graphic height: " + Convert.ToString(tile[10]));
    }

    return null;
}

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

3. type ๋ฐ ์ขŒํ‘œ๋ณ„ ํƒ€๊ฒŸ ์ค€๋น„ - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

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

  • WaitTargetTile๋Š” 2โ€ฆ5 ํ•„๋“œ์—์„œ graphic, x, y, z๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๊ฒƒ์€ ๋‹จ์ง€ ๋‹ค์Œ ๋ชฉํ‘œ๋ฅผ ์œ„ํ•œ ์ค€๋น„์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์ด ์˜ˆ๋Š” ๋„๊ตฌ๋‚˜ ์ฃผ๋ฌธ์„ ๋ฐœ๋™์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. statics์— ๋Œ€ํ•œ serial=0๋Š” ํ•ญ๋ชฉ์˜ ID๋กœ ์ „๋‹ฌ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var tile = UO.GetLandTileAt(UO.GetX(), UO.GetY());
        if (Truth(ArrayLength(tile) == 11))
        {
            UO.WaitTargetTile(tile[2], tile[3], tile[4], tile[5]);
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

public InjectionValue GetLandTileAt(InjectionValue x, InjectionValue y)

            => GetLandTileAt(x, y, new InjectionValue(bridge.WorldNumber));

UO.GetLandTileAt(x, y, map) โ€” UO.GetLandTileAt(Any,Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

public InjectionValue GetLandTileAt(InjectionValue x, InjectionValue y, InjectionValue map)

        {

            int cellX = NumberConversions.ToInt(x);

            int cellY = NumberConversions.ToInt(y);

            int world = NumberConversions.ToInt(map);

            int[] land = bridge.GetLandscapeTile(cellX, cellY, world) ?? Array.Empty<int>();

            return land.Length >= 2

                ? BuildWorldTileRecord("land", 0, land[0], cellX, cellY, land[1], 0, 0)

                : new InjectionValue(Array.Empty<InjectionValue>());

        }

UO.GetLandTileData

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

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

dynamic UO.GetLandTileData(object? tile);

ํƒ€์ผ๋ฐ์ดํ„ฐ์—์„œ ํ™•์žฅ๋œ ํ† ์ง€ ์ฐธ์กฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • tile๋Š” serial๊ฐ€ ์•„๋‹Œ ๊ทธ๋ž˜ํ”ฝ/type ํ•ญ๋ชฉ์ด๋ฉฐ ์…€ ๋‚ด์˜ ์ธ๋ฑ์Šค๋„ ์•„๋‹™๋‹ˆ๋‹ค. ๋žœ๋“œ ํ…Œ์ด๋ธ”์€ ํŒ€ ์ด๋ฆ„ ์ž์ฒด๋กœ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์œ ํšจํ•œ graphic์— ๋Œ€ํ•œ 7 ํ•„๋“œ ๋ฐฐ์—ด. ์ด๋ฆ„(string)์„ ์ œ์™ธํ•œ ๋ชจ๋“  ํ•„๋“œ int:

  • [0] graphic โ€” graphic/type ๊ธฐ๋ก.
  • [1] flags โ€” ํ•˜์œ„ 32 ํ”Œ๋ž˜๊ทธ ๋น„ํŠธ.
  • [2] name - ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ ์ด๋ฆ„(string).
  • [3] texId - ID ์ง€์ƒ ํ…์Šค์ฒ˜.
  • [4] wet โ€” 1 ์Šต์‹ ์„ค์น˜์ธ ๊ฒฝ์šฐ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ 0.
  • [5] impassable โ€” ํ†ต๊ณผํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ 1, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ 0.
  • [6] noDiagonal โ€” 1์ด๋ฉด noDiagonal์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0์ž…๋‹ˆ๋‹ค.

์ž˜๋ชป๋œ graphic์˜ ๊ฒฝ์šฐ ์ฐธ์กฐ ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ์งง์€ ๋ฐฐ์—ด [ะฟะตั€ะตะดะฐะฝะฝั‹ะน graphic, 0, ""]์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์†์„ฑ์„ ์ฝ๊ธฐ ์ „์— ์ „์ฒด ๊ธธ์ด๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ์ด๊ฒƒ์€ ํŒŒ์Šค์นผ ๋ ˆ์ฝ”๋“œ๋‚˜ ๊ฐ์ฒด ๋ชฉ๋ก์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ํƒ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์„ธ๊ณ„์—์„œ graphic๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์ „์ฒด ๊ฒฝ๋กœ ํ™•์ธ์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ํƒ€์ผ์€ ์„ ํƒํ•œ ํ…Œ์ด๋ธ”์˜ ์ˆซ์ž graphic์ž…๋‹ˆ๋‹ค.
  • data[2]์—๋Š” ์ด๋ฆ„์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ธธ์ด ํ™•์ธ์€ ์œ ํšจํ•˜์ง€ ์•Š์€ graphic์˜ ์งง์€ ํ•ญ๋ชฉ๊ณผ ์ „์ฒด ํ•ญ๋ชฉ์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
var data = UO.GetLandTileData(0x0003);
if (Truth(ArrayLength(data) == 7))
{
    UO.Print(data[2]);
}
else
{
    UO.Print("Tiledata entry is unavailable");
}

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

2. ๊ฐœ๋ณ„ ๋ถ€์šธ ํ”Œ๋ž˜๊ทธ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • data[5]๋Š” ๋ณ„๋„์˜ ์ „๋‹ฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ํ•„๋“œ์ž…๋‹ˆ๋‹ค: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ๋˜์ง€ ์•Š์Œ).
  • ์ด ๊ฒ€์‚ฌ๋Š” ์…€์˜ ๋‹ค๋ฅธ ๊ฐœ์ฒด๋‚˜ ์บ๋ฆญํ„ฐ์˜ ๋Šฅ๋ ฅ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var data = UO.GetLandTileData(0x0003);
    if (Truth(ArrayLength(data) == 7))
    {
        if (Truth(data[5]))
        {
            UO.Print("Impassable flag is set");
        }
        else
        {
            UO.Print("Impassable flag is not set");
        }
    }

    return null;
}

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

3. graphic ๋ฐ ์ผ๋ฐ˜ ํ”Œ๋ž˜๊ทธ ๋งˆ์Šคํฌ ์ธ์‡„ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • data[0]๋Š” ์ „์†ก๋œ graphic๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉฐ, data[1]๋Š” ์ผ๋ฐ˜ ํ”Œ๋ž˜๊ทธ ๋งˆ์Šคํฌ์ž…๋‹ˆ๋‹ค.
  • ๋งˆ์Šคํฌ์—๋Š” ๋™์‹œ์— ์—ฌ๋Ÿฌ ๋น„ํŠธ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ˆ˜์น˜๋Š” serial๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
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 data = UO.GetLandTileData(0x0003);
        if (Truth(ArrayLength(data) == 7))
        {
            UO.Print("Graphic: " + Convert.ToString(data[0]));
            UO.Print("Flags: " + Convert.ToString(data[1]));
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetLandTileData(tile) โ€” UO.GetLandTileData(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getlandtiledata":

                    return BuildTileData(0, Arg(0));

UO.GetLandTilesArray

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

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

dynamic UO.GetLandTilesArray(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileType);

์ง์‚ฌ๊ฐํ˜•์˜ graphic/type์— ์žˆ๋Š” ์œก์ง€ ํƒ€์ผ์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

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

  • xmin โ€” ๋‘ ๊ฐ๋„๋ฅผ ํฌํ•จํ•œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. 0..65535. ์žฌ๋ฐฐ์—ด๋œ ๊ฐ๋„๋Š” ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค. ์˜์—ญ์€ 1 000 000 ์…€ ์ดํ•˜์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒฝ๊ณ„๋กœ ์ธํ•ด ์ง€๋„๋ฅผ ์ฝ๊ธฐ ์ „์— ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ymin โ€” ๋‘ ๊ฐ๋„๋ฅผ ํฌํ•จํ•œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. 0..65535. ์žฌ๋ฐฐ์—ด๋œ ๊ฐ๋„๋Š” ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค. ์˜์—ญ์€ 1 000 000 ์…€ ์ดํ•˜์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒฝ๊ณ„๋กœ ์ธํ•ด ์ง€๋„๋ฅผ ์ฝ๊ธฐ ์ „์— ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • xmax โ€” ๋‘ ๊ฐ๋„๋ฅผ ํฌํ•จํ•œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. 0..65535. ์žฌ๋ฐฐ์—ด๋œ ๊ฐ๋„๋Š” ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค. ์˜์—ญ์€ 1 000 000 ์…€ ์ดํ•˜์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒฝ๊ณ„๋กœ ์ธํ•ด ์ง€๋„๋ฅผ ์ฝ๊ธฐ ์ „์— ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ymax โ€” ๋‘ ๊ฐ๋„๋ฅผ ํฌํ•จํ•œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. 0..65535. ์žฌ๋ฐฐ์—ด๋œ ๊ฐ๋„๋Š” ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค. ์˜์—ญ์€ 1 000 000 ์…€ ์ดํ•˜์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒฝ๊ณ„๋กœ ์ธํ•ด ์ง€๋„๋ฅผ ์ฝ๊ธฐ ์ „์— ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • worldNum โ€” ์ง€๋„/ํŒจ์‹ฏ 0..255; UO.WorldNum()๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋˜ ๋‹ค๋ฅธ ๋งต์€ ๋นˆ ๋ฐฐ์—ด์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฒญํฌ ๊ฐ„์— ๋งต์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ถ€๋ถ„ ๊ฒฐ๊ณผ๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
  • tileType - ํ•˜๋‚˜์˜ graphic/type ํƒ€์ผ, ์ผ๋ฐ˜์ ์œผ๋กœ 0..65535; ์ด๊ฑด serial๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 0๋Š” ์ •ํ™•ํ•œ graphic 0์ด๊ณ , -1๋Š” type๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” type๋Š” ๋นˆ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

ํ•ญ๋ชฉ ๋ฐฐ์—ด [graphic, X, Y, Z]; ๋ชจ๋“  ๋ถ„์•ผ int. graphic - ์ง€๊ตฌ์˜ type, Z - ๊ธฐ์ดˆ. ์ผ์น˜ ํ•ญ๋ชฉ ์—†์Œ: ๋นˆ ๋ฐฐ์—ด. ์ˆ˜๋Ÿ‰์€ ๊ฒฐ๊ณผ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ArrayLength(๊ฒฐ๊ณผ)์ž…๋‹ˆ๋‹ค. ์ƒ‰์ธ์€ 0๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” bool, serial ๋˜๋Š” Pascal ๋ ˆ์ฝ”๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๊ณฑ ๋ฒˆ์งธ ์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰์€ FindItem/FindCount์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ด๋™, ๋Œ€์ƒ ๋˜๋Š” ๋„คํŠธ์›Œํฌ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ˆœ์„œ: X ์˜ค๋ฆ„์ฐจ์ˆœ, X - Y ์˜ค๋ฆ„์ฐจ์ˆœ. ํ•œ ์…€์˜ ๊ธฐ๋ก์€ ๋ธŒ๋ฆฌ์ง€์˜ ์ˆœ์„œ๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ๋‚˜ ๋†’์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒ€์ƒ‰์€ ์•ฝ 1ms์˜ ์†Œํ”„ํŠธ ์˜ˆ์‚ฐ์œผ๋กœ ์ตœ๋Œ€ 32 ์…€ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ทจ์†Œ๋Š” ์„œ๋น™ ์‚ฌ์ด์— ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์…€์ด๋‚˜ ์ฝœ๋“œ ์ฝ๊ธฐ๋Š” ์˜ˆ์‚ฐ์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„“์€ ์˜์—ญ์„ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ฑ…์„ ์ฝ๋Š” ๋™์•ˆ ์„ธ์ƒ์€ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค.

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

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

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

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

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

object? result = UO.GetLandTilesArray(UO.GetX(), UO.GetY(), UO.GetX() + 2, UO.GetY() + 2, UO.WorldNum(), 0x0003);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ๋ฌธ์ž ๊ทผ์ฒ˜ ๊ฒ€์ƒ‰ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • x/y โ€” ์œ„์น˜ self, ์ง€๋„ โ€” ํ˜„์žฌ ์ง€๋„. 3ร—3 ์˜์—ญ์—๋Š” ๊ฒฝ๊ณ„๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. Ex 2์—์„œ๋Š” type๊ฐ€ ์ผ๋ฐ˜ ํ˜•์‹ 1๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋ฆฌ์†Œ์Šค์— ๋งž๊ฒŒ ์ƒ˜ํ”Œ์„ ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ID ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ graphic ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetLandTilesArray(x, y, x + 2, y + 2, map, 0x0003);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));

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

2. ์žฌ๋ฐฐ์น˜๋œ ๊ฐ๋„ ๋ฐ ๋ชจ๋“  ํ•„๋“œ ์ถœ๋ ฅ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 2ร—2 ์˜์—ญ์€ ํฐ ๊ฐ๋„์—์„œ ์ž‘์€ ๊ฐ๋„๋กœ ์ด๋™๋ฉ๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด๋Š” ๊ฒฝ๊ณ„๋ฅผ ์ •๊ทœํ™”ํ•ฉ๋‹ˆ๋‹ค. ํ–‰ - ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ; PrintTile๋Š” ์ „์ฒด์ ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ์œผ๋ฉฐ ์•„๋ฌด๊ฒƒ๋„ ์ด๋™ํ•˜์ง€ ์•Š๊ณ  ์ˆซ์ž ํ˜•์‹๋งŒ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. graphic - type, x/y - ์ขŒํ‘œ, z - ๋†’์ด, hue - ์ƒ‰์ƒ. ํ† ์ง€์˜ ๊ฒฝ์šฐ ์กฐ๊ฑด๋ถ€ hue=0๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ํ† ์ง€ ๊ธฐ๋ก์— ์ƒ‰์ƒ ํ•„๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX();
    var y = UO.GetY();
    var map = UO.WorldNum();
    var rows = UO.GetLandTilesArray(x + 1, y + 1, x, y, map, 0x0003);
    var i = 0;
    while (Truth(i < ArrayLength(rows)))
    {
        var row = rows[i];
        PrintTile(row[0], row[1], row[2], row[3], 0);
        i = i + 1;
    }

    return null;
}

void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
    UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
    UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}

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

3. ์žฌ์‹œ๋„ ์ œํ•œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์‹œ ํด๋ง - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ํ•˜๋‚˜์˜ ์…€์— ๋Œ€ํ•ด ์ตœ๋Œ€ 3๋ฒˆ์˜ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋„ ์‚ฌ์ด WaitAsync(250). ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฒฐ๊ณผ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ธธ์ด๊ฐ€ 0์ธ ๊ฒƒ์€ ๊ฐ์ฒด๊ฐ€ ์„œ๋ฒ„์—์„œ ์˜๊ตฌ์ ์œผ๋กœ ๋ˆ„๋ฝ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ˜„์žฌ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
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 x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var attempt = 0;
        while (Truth(attempt < 3))
        {
            var rows = UO.GetLandTilesArray(x, y, x, y, map, 0x0003);
            UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
            attempt = attempt + 1;
            await Delay(250);
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetLandTilesArray(xmin, ymin, xmax, ymax, worldNum, tileType) โ€” UO.GetLandTilesArray(Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileType (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getlandtilesarray":

                    return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, false);

UO.GetLandTilesArrayEx

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

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

dynamic UO.GetLandTilesArrayEx(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileTypes);

์ง์‚ฌ๊ฐํ˜•์˜ graphic/type์— ์žˆ๋Š” ์œก์ง€ ํƒ€์ผ์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

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

  • xmin โ€” ๋‘ ๊ฐ๋„๋ฅผ ํฌํ•จํ•œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. 0..65535. ์žฌ๋ฐฐ์—ด๋œ ๊ฐ๋„๋Š” ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค. ์˜์—ญ์€ 1 000 000 ์…€ ์ดํ•˜์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒฝ๊ณ„๋กœ ์ธํ•ด ์ง€๋„๋ฅผ ์ฝ๊ธฐ ์ „์— ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ymin โ€” ๋‘ ๊ฐ๋„๋ฅผ ํฌํ•จํ•œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. 0..65535. ์žฌ๋ฐฐ์—ด๋œ ๊ฐ๋„๋Š” ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค. ์˜์—ญ์€ 1 000 000 ์…€ ์ดํ•˜์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒฝ๊ณ„๋กœ ์ธํ•ด ์ง€๋„๋ฅผ ์ฝ๊ธฐ ์ „์— ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • xmax โ€” ๋‘ ๊ฐ๋„๋ฅผ ํฌํ•จํ•œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. 0..65535. ์žฌ๋ฐฐ์—ด๋œ ๊ฐ๋„๋Š” ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค. ์˜์—ญ์€ 1 000 000 ์…€ ์ดํ•˜์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒฝ๊ณ„๋กœ ์ธํ•ด ์ง€๋„๋ฅผ ์ฝ๊ธฐ ์ „์— ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ymax โ€” ๋‘ ๊ฐ๋„๋ฅผ ํฌํ•จํ•œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. 0..65535. ์žฌ๋ฐฐ์—ด๋œ ๊ฐ๋„๋Š” ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค. ์˜์—ญ์€ 1 000 000 ์…€ ์ดํ•˜์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒฝ๊ณ„๋กœ ์ธํ•ด ์ง€๋„๋ฅผ ์ฝ๊ธฐ ์ „์— ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • worldNum โ€” ์ง€๋„/ํŒจ์‹ฏ 0..255; UO.WorldNum()๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋˜ ๋‹ค๋ฅธ ๋งต์€ ๋นˆ ๋ฐฐ์—ด์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฒญํฌ ๊ฐ„์— ๋งต์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ถ€๋ถ„ ๊ฒฐ๊ณผ๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
  • tileTypes โ€” ์ˆซ์ž ๋ฐฐ์—ด graphic/type; ์ผ์น˜ํ•˜๋Š” ๊ฐ type๊ฐ€ ์ผœ์ง‘๋‹ˆ๋‹ค. type๋ฅผ ๋ฐ˜๋ณตํ•ด๋„ ํ•ญ๋ชฉ์ด ์ค‘๋ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šค์นผ๋ผ๋„ ํ•˜๋‚˜์˜ type๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๋นˆ ๋ฐฐ์—ด์€ ๋ชจ๋“  ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค type; ํ•˜๋‚˜์˜ 0 ๋ฐฐ์—ด์€ 0๋งŒ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

ํ•ญ๋ชฉ ๋ฐฐ์—ด [graphic, X, Y, Z]; ๋ชจ๋“  ๋ถ„์•ผ int. graphic - ์ง€๊ตฌ์˜ type, Z - ๊ธฐ์ดˆ. ์ผ์น˜ ํ•ญ๋ชฉ ์—†์Œ: ๋นˆ ๋ฐฐ์—ด. ์ˆ˜๋Ÿ‰์€ ๊ฒฐ๊ณผ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ArrayLength(๊ฒฐ๊ณผ)์ž…๋‹ˆ๋‹ค. ์ƒ‰์ธ์€ 0๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” bool, serial ๋˜๋Š” Pascal ๋ ˆ์ฝ”๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๊ณฑ ๋ฒˆ์งธ ์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰์€ FindItem/FindCount์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ด๋™, ๋Œ€์ƒ ๋˜๋Š” ๋„คํŠธ์›Œํฌ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ˆœ์„œ: X ์˜ค๋ฆ„์ฐจ์ˆœ, X - Y ์˜ค๋ฆ„์ฐจ์ˆœ. ํ•œ ์…€์˜ ๊ธฐ๋ก์€ ๋ธŒ๋ฆฌ์ง€์˜ ์ˆœ์„œ๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ๋‚˜ ๋†’์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒ€์ƒ‰์€ ์•ฝ 1ms์˜ ์†Œํ”„ํŠธ ์˜ˆ์‚ฐ์œผ๋กœ ์ตœ๋Œ€ 32 ์…€ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ทจ์†Œ๋Š” ์„œ๋น™ ์‚ฌ์ด์— ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์…€์ด๋‚˜ ์ฝœ๋“œ ์ฝ๊ธฐ๋Š” ์˜ˆ์‚ฐ์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„“์€ ์˜์—ญ์„ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ฑ…์„ ์ฝ๋Š” ๋™์•ˆ ์„ธ์ƒ์€ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค.

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

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

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

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

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

object? result = UO.GetLandTilesArrayEx(UO.X(), UO.Y(), UO.X() + 1, UO.Y() + 1, UO.WorldNum(), new[] { 0x0003 });
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ๋ฌธ์ž ๊ทผ์ฒ˜ ๊ฒ€์ƒ‰ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • x/y โ€” ์œ„์น˜ self, ์ง€๋„ โ€” ํ˜„์žฌ ์ง€๋„. 3ร—3 ์˜์—ญ์—๋Š” ๊ฒฝ๊ณ„๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. Ex 2์—์„œ๋Š” type๊ฐ€ ์ผ๋ฐ˜ ํ˜•์‹ 1๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋ฆฌ์†Œ์Šค์— ๋งž๊ฒŒ ์ƒ˜ํ”Œ์„ ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ID ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ graphic ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
dynamic[] types = new dynamic[checked((int)(1) + 1)];
types[0] = 0x0003;
types[1] = 0x0004;
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetLandTilesArrayEx(x, y, x + 2, y + 2, map, types);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));

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

2. ์žฌ๋ฐฐ์น˜๋œ ๊ฐ๋„ ๋ฐ ๋ชจ๋“  ํ•„๋“œ ์ถœ๋ ฅ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 2ร—2 ์˜์—ญ์€ ํฐ ๊ฐ๋„์—์„œ ์ž‘์€ ๊ฐ๋„๋กœ ์ด๋™๋ฉ๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด๋Š” ๊ฒฝ๊ณ„๋ฅผ ์ •๊ทœํ™”ํ•ฉ๋‹ˆ๋‹ค. ํ–‰ - ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ; PrintTile๋Š” ์ „์ฒด์ ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ์œผ๋ฉฐ ์•„๋ฌด๊ฒƒ๋„ ์ด๋™ํ•˜์ง€ ์•Š๊ณ  ์ˆซ์ž ํ˜•์‹๋งŒ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. graphic - type, x/y - ์ขŒํ‘œ, z - ๋†’์ด, hue - ์ƒ‰์ƒ. ํ† ์ง€์˜ ๊ฒฝ์šฐ ์กฐ๊ฑด๋ถ€ hue=0๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ํ† ์ง€ ๊ธฐ๋ก์— ์ƒ‰์ƒ ํ•„๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    dynamic[] types = new dynamic[checked((int)(1) + 1)];
    types[0] = 0x0003;
    types[1] = 0x0004;
    var x = UO.GetX();
    var y = UO.GetY();
    var map = UO.WorldNum();
    var rows = UO.GetLandTilesArrayEx(x + 1, y + 1, x, y, map, types);
    var i = 0;
    while (Truth(i < ArrayLength(rows)))
    {
        var row = rows[i];
        PrintTile(row[0], row[1], row[2], row[3], 0);
        i = i + 1;
    }

    return null;
}

void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
    UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
    UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}

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

3. ์žฌ์‹œ๋„ ์ œํ•œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์‹œ ํด๋ง - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ํ•˜๋‚˜์˜ ์…€์— ๋Œ€ํ•ด ์ตœ๋Œ€ 3๋ฒˆ์˜ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋„ ์‚ฌ์ด WaitAsync(250). ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฒฐ๊ณผ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ธธ์ด๊ฐ€ 0์ธ ๊ฒƒ์€ ๊ฐ์ฒด๊ฐ€ ์„œ๋ฒ„์—์„œ ์˜๊ตฌ์ ์œผ๋กœ ๋ˆ„๋ฝ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ˜„์žฌ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
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()
    {
        dynamic[] types = new dynamic[checked((int)(1) + 1)];
        types[0] = 0x0003;
        types[1] = 0x0004;
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var attempt = 0;
        while (Truth(attempt < 3))
        {
            var rows = UO.GetLandTilesArrayEx(x, y, x, y, map, types);
            UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
            attempt = attempt + 1;
            await Delay(250);
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetLandTilesArrayEx(xmin, ymin, xmax, ymax, worldNum, tileTypes) โ€” UO.GetLandTilesArrayEx(Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileTypes (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getlandtilesarrayex":

                    return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), false);

UO.GetLandscapeTile

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

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

dynamic UO.GetLandscapeTile(object? x, object? y, object? map);

ํ˜„์žฌ ์นด๋“œ์˜ ํ•œ ์…€์˜ ํ† ์ง€๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • x โ€” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„์˜ X ์…€. ๊ฒ€ํ”„ ๋‚ด๋ถ€ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • y โ€” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„์˜ Y ์…€. ๊ฒ€ํ”„ ๋‚ด๋ถ€ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • map โ€” ์นด๋“œ ๋ฒˆํ˜ธ. ์ด ์ธ์ˆ˜๊ฐ€ ์„ ํƒํ•œ ์–‘์‹์— ์—†์œผ๋ฉด ํ˜„์žฌ ๋งต์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ๋Š” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„์—์„œ๋งŒ ํƒ€์ผ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

3๊ฐœ์˜ ๋ฐฐ์—ด int: [0] graphic - type ํ† ์ง€; [1] z โ€” ์ง€๊ตฌ์˜ ์„ธ๊ณ„ ๊ณ ๋„; [2] flags โ€” ํƒ€์ผ ๋ฐ์ดํ„ฐ ํ”Œ๋ž˜๊ทธ์˜ ๋‚ฎ์€ 32 ๋น„ํŠธ. ์นด๋“œ/ํƒ€์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ํ† ์ง€๊ฐ€ ์—†์œผ๋ฉด ๋นˆ ๋ฐฐ์—ด []์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„ธ ๊ฐœ์˜ ํƒ€์ผ ๋ชฉ๋ก์ด ์•„๋‹Œ ๋‹จ์ˆœํ•œ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

object? result = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ์บ๋ฆญํ„ฐ ์•„๋ž˜์˜ ๋•…์„ ๋ณด์—ฌ์ฃผ์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • x/y๋Š” ์บ๋ฆญํ„ฐ์˜ ์œ„์น˜์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. map=WorldNum() ํ˜„์žฌ ์ง€๋„๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ๋ฑ์‹ฑํ•˜๊ธฐ ์ „์— ์„ธ ๊ฐœ์˜ ํ•„๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ† ์ง€[0] - graphic, ํ† ์ง€[1] - Z.
var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(land) >= 3))
{
    UO.Print("Graphic: " + Convert.ToString(land[0]));
    UO.Print("Ground Z: " + Convert.ToString(land[1]));
}
else
{
    UO.Print("Land is unavailable");
}

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

2. ์ธ์ ‘ํ•œ ์…€์˜ ๋†’์ด ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • x+1๋Š” ์ด์›ƒ ์…€์ด๊ณ , y์™€ ์ง€๋„๋Š” ๋ณด์กด๋ฉ๋‹ˆ๋‹ค.
  • deltaZ ํ† ์ง€์™€ ์บ๋ฆญํ„ฐ๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ†ต๊ณผ์„ฑ ํ…Œ์ŠคํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ธŒ๋ฆฌ์ง€์™€ ์ •์  ์žฅ์น˜๋Š” ๋ณ„๋„๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var land = UO.GetLandscapeTile(UO.GetX() + 1, UO.GetY(), UO.WorldNum());
    if (Truth(ArrayLength(land) >= 3))
    {
        var deltaZ = land[1] - UO.GetZ();
        UO.Print("Ground height difference: " + Convert.ToString(deltaZ));
    }

    return null;
}

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

3. ๋ฐœ๊ฒฌํ•œ ๋•…์˜ ์ด๋ฆ„ ์ฝ๊ธฐ - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

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

  • group=0 ํ† ์ง€๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋•…[0] โ€” graphic.
  • GetTileName๋Š” ํ…์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  GetLandscapeTile๋Š” ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
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 land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var name = UO.GetTileName(0, land[0]);
            UO.Print(name);
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetLandscapeTile(x, y, map) โ€” UO.GetLandscapeTile(Any,Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

public InjectionValue GetLandscapeTile(InjectionValue x, InjectionValue y, InjectionValue map)

            => ToArray(bridge.GetLandscapeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)));

UO.GetLayerCount

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

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

dynamic UO.GetLayerCount(object? x, object? y, object? worldNum);

ํ•˜๋‚˜์˜ ์…€์— ์žˆ๋Š” ๋น„์ง€๊ตฌ ๊ธฐํ•˜ํ•™ ๊ธฐ๋ก์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

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

  • x โ€” ๊ฒ€ํ”„์˜ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ํ˜„์žฌ ์ง€๋„ ์…€์˜ ์„ธ๊ณ„ ์ขŒํ‘œ X์ž…๋‹ˆ๋‹ค.
  • y โ€” ํ˜„์žฌ ์ง€๋„ ์…€์˜ ์›”๋“œ Y ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • worldNum โ€” ์นด๋“œ/ํŒจ์‹ฏ ๋ฒˆํ˜ธ; UO.WorldNum()๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ํ˜„์žฌ ๋กœ๋“œ๋œ ์นด๋“œ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int โ€” GetStaticTiles๊ฐ€ ์ˆ˜์‹ ํ•œ ํŠธ๋ฆฌํ”Œ graphic/Z/hue ์ˆ˜. ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” Static, Multi ๋ฐ Item์ด ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋†’์ด์˜ ์—ฌ๋Ÿฌ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ณ„๋„๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ๋นˆ ์‚ฌ๊ฐํ˜•/๋‹ค๋ฅธ ์นด๋“œ๋Š” 0์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์žฅ๋น„ ๋ ˆ์ด์–ด ๋ฒˆํ˜ธ, ์ธต์ˆ˜, ๊ณ ์œ  ๋†’์ด ์ˆ˜, bool๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ๋กœ์ปฌ ์ง€๋„๋ฅผ ์ฝ๊ณ  ์ด๋™์ด๋‚˜ ๋Œ€์ƒ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งต ํฌ๊ธฐ๋ฅผ ๋ฒ—์–ด๋‚œ ์…€์€ ์ธ์ ‘ํ•œ ์—ด์˜ ์…€๋กœ ๋Œ€์ฒด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Z, graphic/type์˜ ๋†’์ด, hue์˜ ์ƒ‰์ƒ, ๊นƒ๋ฐœ ๋ฐ ์žฅ๋น„ ๋ ˆ์ด์–ด๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. Null graphic ๋˜๋Š” Z=0๋Š” ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ์–‘์‹์„ ํ™•์ธํ•˜์„ธ์š”.
  • ๊ตฌ์„ฑ์€ GetLayer ๋˜๋Š” ObjAtLayer๊ฐ€ ์•„๋‹Œ ReadStaticsXY์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด ํด๋ผ์ด์–ธํŠธ์—๋Š” ๋™์  ํ•ญ๋ชฉ๊ณผ ๋‹ค์ค‘ ๋ถ€ํ’ˆ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.GetLayerCount(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ๋ฌธ์ž ์•„๋ž˜์˜ ๋ ˆ์ฝ”๋“œ ์ˆ˜ ๊ณ„์‚ฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ๊ฐœ์ˆ˜ - ์…€ ๋ ˆ์ฝ”๋“œ ์ˆ˜ 1๋Š” ๋…ผ๋ฆฌ์ ์ธ ์„ฑ๊ณต์ด ์•„๋‹ˆ๋ผ ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
var count = UO.GetLayerCount(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print("Tile records: " + Convert.ToString(count));

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

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

  • ๊ธฐ๋ก์ด ์—†๋‹ค๊ณ  ํ•ด์„œ ํ† ์ง€์˜ ํ†ตํ–‰์ด ์ฆ๋ช…๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋…น์Œ์ด ์žˆ๋‹ค๊ณ  ํ•ด์„œ ๊ทธ๊ฒƒ์ด ๋ฒฝ์ด๋ผ๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX() + 1;
    var y = UO.GetY();
    var count = UO.GetLayerCount(x, y, UO.WorldNum());
    if (Truth(count > 0))
    {
        UO.Print("Non-land geometry exists: " + Convert.ToString(count));
    }
    else
    {
        UO.Print("No loaded non-land records");
    }

    return null;
}

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

3. ๋‘ ๋งต ๋ ˆ์ด์–ด์˜ ์ฝ˜ํ…์ธ  ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ๊ฐ™์€ ์›”๋“œ์— ์žˆ๋Š” ํ˜„์žฌ ์…€๊ณผ ์ฃผ๋ณ€ ์…€์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด ์ˆ˜๋Š” ๋†’์ด๋‚˜ graphic๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        int x = UO.GetX();
        int y = UO.GetY();
        int world = UO.WorldNum();
        int land = UO.GetLayerCount(x, y, world);
        int nearby = UO.GetLayerCount(x + 1, y, world);
        UO.Print($"Layers here: {land}; adjacent tile: {nearby}");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetLayerCount(x, y, worldNum) โ€” UO.GetLayerCount(Any,Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getlayercount":

                    // Stealth's deprecated GetLayerCount(X,Y,WorldNum) is the

                    // number of static records at a map cell.  The portable

                    // bridge returns each record as Graphic/Z/Hue triples.

                    return new InjectionValue(bridge.GetStaticTiles(Arg(0), Arg(1), Arg(2)).Length / 3);

UO.GetMapCell

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

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

dynamic UO.GetMapCell(object? x, object? y, object? worldNum);

ํ•˜๋‚˜์˜ ์ง€๋„ ์‚ฌ๊ฐํ˜•์—์„œ graphic, ๋†’์ด ๋ฐ ํ† ์ง€ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • x โ€” ๊ฒ€ํ”„์˜ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ํ˜„์žฌ ์ง€๋„ ์…€์˜ ์„ธ๊ณ„ ์ขŒํ‘œ X์ž…๋‹ˆ๋‹ค.
  • y โ€” ํ˜„์žฌ ์ง€๋„ ์…€์˜ ์›”๋“œ Y ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • worldNum โ€” ์นด๋“œ/ํŒจ์‹ฏ ๋ฒˆํ˜ธ; UO.WorldNum()๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ํ˜„์žฌ ๋กœ๋“œ๋œ ์นด๋“œ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

3๊ฐœ์˜ int ๋ฐฐ์—ด: [0] graphic/type ํ† ์ง€, [1] ์„ธ๊ณ„ Z ๊ธฐ์ง€ ํ† ์ง€, [2] ๋ณด์กฐ 32 ํƒ€์ผ๋ฐ์ดํ„ฐ ํ”Œ๋ž˜๊ทธ ๋น„ํŠธ. ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š” ์…€์ด๋‚˜ ๋‹ค๋ฅธ ์นด๋“œ๋กœ ์ธํ•ด ๋นˆ ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” serial, bool ๋˜๋Š” Pascal ๋ ˆ์ฝ”๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. .Tile/.Z ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ํ•„๋“œ ์ˆ˜๋Š” ArrayLength(cell)์„ ํ˜ธ์ถœํ•˜์„ธ์š”.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ๋กœ์ปฌ ์ง€๋„๋ฅผ ์ฝ๊ณ  ์ด๋™์ด๋‚˜ ๋Œ€์ƒ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งต ํฌ๊ธฐ๋ฅผ ๋ฒ—์–ด๋‚œ ์…€์€ ์ธ์ ‘ํ•œ ์—ด์˜ ์…€๋กœ ๋Œ€์ฒด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Z, graphic/type์˜ ๋†’์ด, hue์˜ ์ƒ‰์ƒ, ๊นƒ๋ฐœ ๋ฐ ์žฅ๋น„ ๋ ˆ์ด์–ด๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. Null graphic ๋˜๋Š” Z=0๋Š” ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ์–‘์‹์„ ํ™•์ธํ•˜์„ธ์š”.

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

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

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

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

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

object? result = UO.GetMapCell(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ์บ๋ฆญํ„ฐ์˜ ๋ฐ‘๋ฐ”๋‹ฅ์„ ์ฝ์–ด๋ณด์„ธ์š” - ์ง์ ‘ ๋Œ€๋ณธ

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

  • X/Y๋Š” self์—์„œ ๊ฐ€์ ธ์˜ค๊ณ , WorldNum๋Š” ํ˜„์žฌ ์นด๋“œ์ž…๋‹ˆ๋‹ค. cell์€ ํ•œ ํ˜ธ์ถœ์˜ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ๋ฑ์Šค๋Š” 0๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. cell[1]์€ ์„ฑ๊ณต์ ์ธ ๊ฒ€์ƒ‰์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋†’์ด์ž…๋‹ˆ๋‹ค. ์ธ๋ฑ์‹ฑํ•˜๊ธฐ ์ „์— ๋นˆ ๋ฐฐ์—ด์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
var cell = UO.GetMapCell(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(cell) == 3))
{
    UO.Print("Type: " + Convert.ToString(cell[0]));
    UO.Print("Land Z: " + Convert.ToString(cell[1]));
    UO.Print("Flags: " + Convert.ToString(cell[2]));
}
else
{
    UO.Print("Map cell unavailable");
}

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

2. ์ธ์ ‘ํ•œ ๋‘ ์…€ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ์€ ๋ชจ๋‘ ๋™์ผํ•œ ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ชฝ์˜ ์‚ฌ๊ฐํ˜•์„ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ์ง€๋ฉด ๋†’์ด์˜ ์ฐจ์ด๋Š” ํ†ตํ–‰ ๊ฐ€๋Šฅ์„ฑ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฒฝ, ์ •์ฒด ์žฅ์น˜ ๋ฐ ๊ธฐํƒ€ ๋ฌผ์ฒด๋ฅผ ๋ณ„๋„๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX();
    var y = UO.GetY();
    var map = UO.WorldNum();
    var here = UO.GetMapCell(x, y, map);
    var east = UO.GetMapCell(x + 1, y, map);
    if (Truth(ArrayLength(here) == 3) && Truth(ArrayLength(east) == 3))
    {
        UO.Print("Land difference: " + Convert.ToString(east[1] - here[1]));
    }

    return null;
}

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

3. ์ง€๊ตฌ์˜ ๋ฐ”๋‹ฅ๊ณผ ํ‰๊ท  ํ‘œ๋ฉด ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • GetMapCell๋Š” Land๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.Z; GetSurfaceZ์€ Land.AverageZ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ๋‘ ๊ฐ’ ๋ชจ๋‘ ๋†’์ด์ž…๋‹ˆ๋‹ค. ๊ฒฝ์‚ฌ์ง„ ๊ณณ์—์„œ๋Š” ๋‹ค์–‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ง‘ ๋ฐ”๋‹ฅ์˜ ๋†’์ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
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 x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var cell = UO.GetMapCell(x, y, map);
        if (Truth(ArrayLength(cell) == 3))
        {
            var average = UO.GetSurfaceZ(x, y, map);
            UO.Print("Base: " + Convert.ToString(cell[1]) + ", average: " + Convert.ToString(average));
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetMapCell(x, y, worldNum) โ€” UO.GetMapCell(Any,Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getmapcell":

                    return new InjectionValue(bridge.GetLandscapeTile(Arg(0), Arg(1), Arg(2))

                        .Select(value => new InjectionValue(value)).ToArray());

UO.GetNextStepZ

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

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

int UO.GetNextStepZ(object? currX, object? currY, object? destX, object? destY, object? worldNum, object? currZ);

์ง€์ •๋œ ๋ฐฉํ–ฅ์—์„œ ๋‹ค์Œ ๋‹จ๊ณ„์˜ ์˜ˆ์ƒ ๋†’์ด๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

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

  • currX โ€” ์ดˆ๊ธฐ ์„ธ๊ณ„ X, ์ผ๋ฐ˜์ ์œผ๋กœ UO.GetX().
  • currY โ€” ์ดˆ๊ธฐ ์„ธ๊ณ„ Y, ์ผ๋ฐ˜์ ์œผ๋กœ UO.GetY().
  • destX โ€” X ๋ชฉ์ ์ง€. ํŠน์ • ๋‹จ๊ณ„ ํ•˜๋‚˜๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ์ธ์ ‘ํ•œ ์…€์„ ์ „๋‹ฌํ•˜์„ธ์š”.
  • destY โ€” Y ๋ชฉ์ ์ง€; DestX์™€ ํ•จ๊ป˜ ์ „์ฒด ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹Œ ํ•œ ๊ฑธ์Œ์˜ ๋ฐฉํ–ฅ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • worldNum โ€” ์นด๋“œ/ํŒจ์‹ฏ ๋ฒˆํ˜ธ; UO.WorldNum()๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ํ˜„์žฌ ๋กœ๋“œ๋œ ์นด๋“œ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.
  • currZ โ€” ์ดˆ๊ธฐ ๋†’์ด Z, ์ผ๋ฐ˜์ ์œผ๋กœ UO.GetZ(); ๊ธฐํ•˜ํ•™์  ๊ณ„์‚ฐ์—์„œ๋Š” -128..127 ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int โ€” ๋‹ค์Œ ๋‹จ๊ณ„์˜ Z๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. 0 ๋ฐ ์Œ์ˆ˜๋Š” ์œ ํšจํ•œ ๋†’์ด์ž…๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ๋‚˜ ๋‹ค๋ฅธ ์นด๋“œ๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ 0. ์ด ๋ฉ”์†Œ๋“œ๋Š” ์‹คํŒจํ•˜๋”๋ผ๋„ Z ๊ฒ€์‚ฌ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฒˆํ˜ธ ์ž์ฒด๋Š” ํ†ต๊ณผ ํ™•์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ์™€ ๋†’์ด๋ฅผ ํ•จ๊ป˜ ๋ณด๋ ค๋ฉด IsWorldCellPassable๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  [0]/[1]๋ฅผ ์ฝ์œผ์„ธ์š”.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ๋กœ์ปฌ ์ง€๋„๋ฅผ ์ฝ๊ณ  ์ด๋™์ด๋‚˜ ๋Œ€์ƒ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งต ํฌ๊ธฐ๋ฅผ ๋ฒ—์–ด๋‚œ ์…€์€ ์ธ์ ‘ํ•œ ์—ด์˜ ์…€๋กœ ๋Œ€์ฒด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Z, graphic/type์˜ ๋†’์ด, hue์˜ ์ƒ‰์ƒ, ๊นƒ๋ฐœ ๋ฐ ์žฅ๋น„ ๋ ˆ์ด์–ด๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. Null graphic ๋˜๋Š” Z=0๋Š” ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ์–‘์‹์„ ํ™•์ธํ•˜์„ธ์š”.
  • ๊ณ„์‚ฐ์€ ํ•œ ๊ฑธ์Œ๋„ ๋–ผ์ง€ ์•Š๊ณ  ๋ฌธ์„ ์—ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์‹ค์ œ ์ด๋™์„ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ฆฌ์ง€๊ฐ€ Z๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด CurrZ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

var result = UO.GetNextStepZ(UO.GetX(), UO.GetY(), UO.GetX() + 1, UO.GetY(), UO.WorldNum(), UO.GetZ());
UO.Print("GetNextStepZ: " + Convert.ToString(result));

1. ๋™์ชฝ ๊ณ„๋‹จ์˜ ์˜ˆ์ƒ ๋†’์ด ์•Œ์•„๋ณด๊ธฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • 6๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜: ์›๋ณธ X/Y, ์ธ์ ‘ X/Y, ์ง€๋„ ๋ฐ ์›๋ณธ Z. nextZ๋Š” ๋†’์ด์ด๋ฉฐ true/false์ด ์•„๋‹™๋‹ˆ๋‹ค.
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var nextZ = UO.GetNextStepZ(x, y, x + 1, y, UO.WorldNum(), z);
UO.Print("Candidate Z: " + Convert.ToString(nextZ));

2. ์‹ค์ œ ๊ณ ๋„์™€ ๋ณ„๋„์˜ ์—ฌํ–‰ 0 - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์—ฐ๊ฒฐ์ด ์•Œ๋ ค์ง„ ๊ฒฝ์šฐ์—๋งŒ ํ˜ธ์ถœ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ํ™•์ธ๊ณผ ์ฝ๊ธฐ ์‚ฌ์ด์— ์—ฐ๊ฒฐ์ด ๋Š์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Z=0๋Š” ์•„์ง ์„ฑ๊ณต ์ฝ”๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(Truth(UO.Connected()) == true))
    {
        var x = UO.GetX();
        var y = UO.GetY();
        var z = UO.GetNextStepZ(x, y, x, y + 1, UO.WorldNum(), UO.GetZ());
        UO.Print("South candidate Z: " + Convert.ToString(z));
    }
    else
    {
        UO.Print("Character disconnected");
    }

    return null;
}

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

3. ํ˜„์žฌ ๋†’์ด์—์„œ ๋‹ค์Œ ๋‹จ๊ณ„ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ์†Œ์Šค ์…€๊ณผ ํƒ€๊ฒŸ ์…€์˜ ์ขŒํ‘œ๋Š” ๋ณ„๋„๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์žฅ์• ๋ฌผ์ด ์žˆ๋”๋ผ๋„ ์˜ˆ์ƒ ๋†’์ด์ž…๋‹ˆ๋‹ค. ํ†ต๊ณผ ํ”Œ๋ž˜๊ทธ๋Š” ๋ณ„๋„๋กœ IsWorldCellPassable๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        int x = UO.GetX();
        int y = UO.GetY();
        int z = UO.GetZ();
        int nextZ = UO.GetNextStepZ(x, y, x + 1, y, UO.WorldNum(), z);
        UO.Print($"Current height: {z}; next-step result: {nextZ}");
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetNextStepZ(currX, currY, destX, destY, worldNum, currZ) โ€” UO.GetNextStepZ(Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: currX (Any), currY (Any), destX (Any), destY (Any), worldNum (Any), currZ (Any)

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

case "getnextstepz":

                {

                    if (bridge.IsOnline() == 0 || Arg(4) != bridge.WorldNumber)

                        return new InjectionValue(0);

                    int[] step = bridge.CheckWorldStep(Arg(0), Arg(1), Arg(5), Arg(2), Arg(3), Arg(4));

                    return new InjectionValue(step.Length > 1 ? step[1] : Arg(5));

                }

UO.GetStaticArt

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

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

dynamic UO.GetStaticArt(object? objType, object? hue);

์„ค์น˜๋œ Ultima Online ๊ทธ๋ž˜ํ”ฝ ํŒŒ์ผ์—์„œ ๋‹จ์ผ ๊ทธ๋ž˜ํ”ฝ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์™€ BMP ํ˜•์‹์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ๋ฆฌ์†Œ์Šค, ์•„์ด์ฝ˜ ํฌ๊ธฐ๋ฅผ ํ™•์ธํ•˜๊ณ , ํ”ฝ์…€ ์ƒ‰์ƒ์„ ์ฝ๊ณ , ํ•ญ๋ชฉ์˜ ์ƒ‰์ƒ ๋ฒ„์ „์„ ๋น„๊ตํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์–ด ์ž์ฒด๋กœ๋Š” ์ฐฝ์„ ์—ด๊ฑฐ๋‚˜, ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ฑฐ๋‚˜, ์›”๋“œ์— ์žˆ๋Š” ์•„์ดํ…œ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์—†์Šต๋‹ˆ๋‹ค.

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

  • objType โ€” ์ •์  ์•„ํŠธ ์„น์…˜์˜ ํ•„์ˆ˜ ๊ทธ๋ž˜ํ”ฝ/type: ์ •์ˆ˜ 0..65535, ํ•ด๋‹น ์ˆซ์ž๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์ž์—ด ๋˜๋Š” ์ €์žฅ๋œ ์ด๋ฆ„ AddType. ์˜ˆ๋ฅผ ๋“ค์–ด, 0x0EED๋Š” ๊ธˆ ๋”๋ฏธ๋ฅผ ์œ„ํ•œ ์˜ˆ์ˆ  ์ž‘ํ’ˆ์ž…๋‹ˆ๋‹ค. ์•„์ดํ…œ์˜ serial, ์ง€๋„/ํƒ€์ผ ์ขŒํ‘œ, ์‹ ์ฒด ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋กœ๋“œ๋œ ํ•ญ๋ชฉ์˜ ์•„ํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด UO.GetType(item)๋ฅผ ์ „๋‹ฌํ•˜์„ธ์š”. ์—ฌ๊ธฐ์„œ ํ•ญ๋ชฉ์€ serial์ž…๋‹ˆ๋‹ค. ์ˆซ์ž type๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ๊ฒฐ๊ณผ๋Š” ๋นˆ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ๋ฌธ์ž์—ด ์ด๋ฆ„์œผ๋กœ ์ธํ•ด ๋ณ€ํ™˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • hue โ€” ํ•„์ˆ˜ ์ •์ˆ˜ ์ƒ‰์ƒ ๊ฐ’: 0 โ€” ์˜ˆ์ˆ ์˜ ์›๋ž˜ ์ƒ‰์ƒ. ์–‘์ˆ˜ ๊ฐ’์€ ํด๋ผ์ด์–ธํŠธ ํŒŒ์ผ์˜ hue์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ UO.GetColor(item)๋ฅผ ํฌํ•จํ•˜์—ฌ ์ˆซ์ž ๋ฌธ์ž์—ด์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ 0..65535 ๋ฒ”์œ„๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ์Œ์ˆ˜๋Š” 0๊ฐ€ ๋˜๊ณ  ๋„ˆ๋ฌด ํฌ๋ฉด 65535๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ -1๋Š” ์–ด๋–ค ์ƒ‰์ƒ๋„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. PartialHue ํ”Œ๋ž˜๊ทธ ์•„ํŠธ๋Š” ๋ถ€๋ถ„ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด - ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • hue์˜ ๊ฒฐ๊ณผ๋Š” ๋กœ๋“œ๋œ ์ƒ‰์ƒํ‘œ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

๋ฐฐ์—ด์€ 1์ฐจ์› ๋ฐฐ์—ด int์ด๋ฉฐ, ๊ฐ ์š”์†Œ 0..255๋Š” ํ—ค๋”๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์ „์ฒด BMP ํŒŒ์ผ์˜ 1๋ฐ”์ดํŠธ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. 0๋กœ ์ƒ‰์ธ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. bool๋„, ID๋„, ๊ฒฝ๋กœ๋„, ๋น„ํŠธ๋งต ๊ฐ์ฒด๋„, ์ƒ‰์ƒ ๋ฐฐ์—ด RGB๋„ ์•„๋‹™๋‹ˆ๋‹ค. ๋นˆ ๋ฐฐ์—ด์€ ์ˆซ์ž type๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ์•„ํŠธ๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ๊ฑฐ๋‚˜, ํ•„์š”ํ•œ ๊ฒŒ์ž„ ํŒŒ์ผ์ด ๋กœ๋“œ๋˜์ง€ ์•Š์•˜์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ œ๋ชฉ์„ ์ฝ๊ธฐ ์ „์— ArrayLength๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๋นˆ ๋ฐฐ์—ด์€ ์ˆซ์ž 0์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ •ํ™•ํžˆ ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ ์—†์ด ํด๋ผ์ด์–ธํŠธ์˜ ๋กœ์ปฌ ๋ฆฌ์†Œ์Šค์—์„œ ์ฝ๊ธฐ๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์„ธ๊ณ„์— ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. mobile์˜ ๊ฒฝ์šฐ GetType์˜ ์ˆซ์ž๋Š” body๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋™์ผํ•œ ๋ฒˆํ˜ธ๋Š” ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค ์„น์…˜์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์บ๋ฆญํ„ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ ํ˜•์‹: ๋น„์••์ถ• 24๋น„ํŠธ BMP. ๋ฐ”์ดํŠธ [0]=66 ๋ฐ [1]=77 - BM; [2..5] - ์ „์ฒด ํŒŒ์ผ ํฌ๊ธฐ; [10..13] - ํ”ฝ์…€์˜ ์‹œ์ž‘, ์ด์ œ 54; [14..17] - DIB ํ—ค๋” ํฌ๊ธฐ, ์ด์ œ 40; [18..21] - ๋„ˆ๋น„; [22..25] - ์–‘์ˆ˜ ๋†’์ด; [26..27] - 1 ๋น„ํ–‰๊ธฐ; [28..29] - 24 ๋น„ํŠธ. ๋ฉ€ํ‹ฐ๋ฐ”์ดํŠธ ์ˆซ์ž๋Š” ๋ฆฌํ‹€ ์—”๋””์•ˆ์œผ๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ํ”ฝ์…€์€ B, G, R ์ˆœ์„œ๋กœ 3๋ฐ”์ดํŠธ๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์„ ์€ ์•„๋ž˜์—์„œ ์œ„๋กœ ์ด๋™ํ•˜๋ฉฐ ์ตœ๋Œ€ 4์˜ ๋ฐฐ์ˆ˜๊นŒ์ง€ 0๋ฐ”์ดํŠธ๋กœ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ๊ธธ์ด = Int((๋„ˆ๋น„ * 3 + 3) / 4) * 4. ์™ผ์ชฝ ์œ„ ๋ชจ์„œ๋ฆฌ๋ถ€ํ„ฐ x,y ์ขŒํ‘œ์˜ ๊ฒฝ์šฐ ์˜คํ”„์…‹ = 54 + (๋†’์ด - 1 - y) * ๋ณดํญ + x * 3์ž…๋‹ˆ๋‹ค. ์•ก์„ธ์Šคํ•˜๊ธฐ ์ „์— ๋ฐฐ์—ด์˜ ๊ฒฝ๊ณ„์™€ ํฌ๊ธฐ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • ์›๋ณธ ์•„ํŠธ์˜ ํˆฌ๋ช…์„ฑ์€ ์œ ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. BMP์—๋Š” ์—ฌ๊ธฐ์— ์•ŒํŒŒ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํˆฌ๋ช…ํ•œ ๋ฐฐ๊ฒฝ์ด ๊ฒ€๊ฒŒ ๋ณ€ํ•˜๋ฉฐ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ์›๋ž˜์˜ ๊ฒ€์€์ƒ‰ ํ”ฝ์…€๊ณผ ๊ตฌ๋ณ„์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฐ์ƒท, ๊ฒŒ์ž„ ์ฐฝ ํฌ๊ธฐ ์กฐ์ •, ์กฐ๋ช…, ๊ฐ€์‹œ ๋ฒ”์œ„ ๋ฐ ๊ฐœ์ฒด ์ขŒํ‘œ๋Š” ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ด๋ฏธ์ง€ ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์•„ํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ  ๋‹ค์‹œ ์ฒ˜๋ฆฌํ•˜์‹ญ์‹œ์˜ค. ๋ฃจํ”„ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ํ”ฝ์…€์— ๋Œ€ํ•ด ๋กœ๋”ฉ/์ฑ„์ƒ‰์„ ํ˜ธ์ถœํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋™์ผํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ํŒŒ์ผ์€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ hue๋Š” ๋ชจ๋“  ํ”ฝ์…€์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํŠนํžˆ PartialHue์˜ ๊ฒฝ์šฐ์—๋Š” ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.
  • ์‹ค์ œ .bmp์—๋Š” ํ…์ŠคํŠธ ์ธ์ฝ”๋”ฉ ์—†์ด ์ •ํ™•ํ•œ ๋ฐ”์ดํŠธ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ถœ๋ ฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ File.WriteLine ๋˜๋Š” JsonSave๋Š” BMP๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐฐ์—ด์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์กด์žฌํ•˜์ง€ ์•Š๋Š” File.WriteBytes์˜ ์กด์žฌ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

1. ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ์•„์ด์ฝ˜ ํฌ๊ธฐ๋ฅผ ํ™•์ธํ•˜์„ธ์š” - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ObjType=0x0EED๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•˜๊ณ , Hue=0๋Š” ์›๋ž˜ ์ƒ‰์ƒ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์˜คํ”„์…‹ 18 ๋ฐ 22๋ฅผ ์ฝ๊ธฐ ์ „์— ๋ฐฐ์—ด์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. 64๋Š” ๋ช…๋ น ์ œํ•œ์ด ์•„๋‹Œ ์˜ˆ์ œ ์ž์ฒด์˜ ์ œํ•œ์ž…๋‹ˆ๋‹ค.
  • ArtSizeField๋Š” UO ๋ช…๋ น์ด ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ C#์ž…๋‹ˆ๋‹ค. ๊ฐ€์ค‘์น˜๊ฐ€ 1, 256, 65536, 16777216์ธ 4๋ฐ”์ดํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋Š” ์…€ ํฌ๊ธฐ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๊ฒ€ํ”„๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var bmp = UO.GetStaticArt(0x0EED, 0);
if (Truth(ArrayLength(bmp) < 54))
{
    UO.Print("Gold art is unavailable");
    return null;
}
var width = ArtSizeField(bmp, 18);
var height = ArtSizeField(bmp, 22);
if (Truth(width > 64) || Truth(height > 64))
{
    UO.Print("Use a larger cell for this icon");
    return null;
}
UO.Print("Icon fits: " + Convert.ToString(width) + " x " + Convert.ToString(height));

dynamic ArtSizeField(dynamic bytes, dynamic offset)
{
    return bytes[offset] + bytes[offset+1]*256 + bytes[offset+2]*65536 + bytes[offset+3]*16777216;
}

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

2. ๋ฐ˜์ „๋œ ์„  BMP์„ ๊ณ ๋ คํ•˜์—ฌ ํ”ฝ์…€์˜ RGB ๊ณ„์‚ฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • GetStaticArt๋Š” BMP์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ArtPixelRGB๋Š” ์ด ํ˜•์‹์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ์˜ˆ์ œ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. x=0,y=0๋Š” ์„ธ๊ณ„ ์ขŒํ‘œ๊ฐ€ ์•„๋‹Œ ์ด๋ฏธ์ง€์˜ ์™ผ์ชฝ ์ƒ๋‹จ ํ”ฝ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ์œ„๋กœ ์„ ์˜ ์ˆœ์„œ ๋•Œ๋ฌธ์— ๊ต์ฒด ๋†’์ด-1-y๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ํ•จ์ˆ˜๋Š” RGB int 0..16777215๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  -1๋ฅผ ํ”ฝ์…€์ด ์—†๋‹ค๋Š” ํ‘œ์‹œ๋กœ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์ •์ƒ‰ 0์€ false๊ฐ€ ์•„๋‹Œ ์œ ํšจํ•œ ์ƒ‰์ƒ์ด๋ฉฐ ์˜ค๋ฅ˜๋„ ์•„๋‹™๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ rgb < 0์ธ์ง€์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” rgb = 0์ธ ๊ฒฝ์šฐ์™€ ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var bmp = UO.GetStaticArt(0x0EED, 0);
    var rgb = ArtPixelRGB(bmp, 0, 0);
    if (Truth(rgb < 0))
    {
        UO.Print("No pixel at this position");
        return null;
    }

    if (Truth(rgb == 0))
    {
        UO.Print("Black pixel: may also be the original transparent background");
    }

    return null;
}

dynamic ArtPixelRGB(dynamic bmp, dynamic x, dynamic y)
{
    if (Truth(ArrayLength(bmp) < 54))
    {
        return -1;
    }

    var width = bmp[18] + bmp[19] * 256 + bmp[20] * 65536 + bmp[21] * 16777216;
    var height = bmp[22] + bmp[23] * 256 + bmp[24] * 65536 + bmp[25] * 16777216;
    if (Truth(x < 0) || Truth(y < 0) || Truth(x >= width) || Truth(y >= height))
    {
        return -1;
    }

    var stride = Math.Floor((width * 3 + 3) / 4) * 4;
    var offset = 54 + (height - 1 - y) * stride + x * 3;
    if (Truth(offset + 2 >= ArrayLength(bmp)))
    {
        return -1;
    }

    return bmp[offset + 2] * 65536 + bmp[offset + 1] * 256 + bmp[offset];
}

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

3. ๋™์ผํ•œ ์•„ํŠธ์˜ ์›๋ณธ ๋ฒ„์ „๊ณผ ์ปฌ๋Ÿฌ ๋ฒ„์ „ ๋น„๊ต - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • 0x1F03 โ€” ๊ทธ๋ž˜ํ”ฝ ๋กœ๋ธŒ; 0 ๋ฐ 0x0044๋Š” ์›๋ณธ์ด๊ณ  ์„ ํƒ๋œ hue์ž…๋‹ˆ๋‹ค. ๋™์ผํ•œ ๊ทธ๋ž˜ํ”ฝ์€ ๋™์ผํ•œ ์น˜์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด ๋น„๊ต๊ฐ€ ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ณ€๊ฒฝ๋จ์€ ๊ฐ์ฒด๋‚˜ ํ”ฝ์…€ ์ˆ˜๊ฐ€ ์•„๋‹Œ ๋‹ค์–‘ํ•œ ๋ฐ”์ดํŠธ์˜ ์ƒ‰์ƒ ์ฑ„๋„์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. 1ํ”ฝ์…€์€ ์ตœ๋Œ€ 3๋ฐ”์ดํŠธ๊นŒ์ง€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PartialHue, ์ƒ‰์ƒํ‘œ ๋ฐ ์›๋ณธ ์ƒ‰์ƒ์€ ์ด๋ฏธ์ง€์˜ ์ผ๋ถ€ ๋˜๋Š” ์ „์ฒด๊ฐ€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํŒ€ ์˜ค๋ฅ˜์˜ ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
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 original = UO.GetStaticArt(0x1F03, 0);
        var colored = UO.GetStaticArt(0x1F03, 0x0044);
        var size = ArrayLength(original);
        if (Truth(size < 54) || Truth(size != ArrayLength(colored)))
        {
            UO.Print("Cannot compare these art resources");
            return null;
        }

        var changed = 0;
        for (int offset = (int)(54); offset <= size - 1; offset += (int)(1))
        {
            if (Truth(original[offset] != colored[offset]))
            {
                changed = changed + 1;
            }
        }

        if (Truth(changed == 0))
        {
            UO.Print("This hue did not change the exported bytes");
        }
        else
        {
            UO.Print("Changed color bytes: " + Convert.ToString(changed));
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetStaticArt(objType, hue) โ€” UO.GetStaticArt(Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getstaticart":

                    return new InjectionValue(bridge.GetStaticArt(ResolveType(arguments[0]), Arg(1)).Select(value => new InjectionValue(value)).ToArray());

UO.GetStaticTileAt

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

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

dynamic UO.GetStaticTileAt(object? x, object? y, object? index);
dynamic UO.GetStaticTileAt(object? x, object? y, object? map, object? index);

์„ ํƒํ•œ ์…€์˜ ์ง€๋ฉด ์œ„ ํ•œ ๋ ˆ์ฝ”๋“œ์˜ ํ™•์žฅ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

  • x โ€” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„์˜ X ์…€. ๊ฒ€ํ”„ ๋‚ด๋ถ€ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • y โ€” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„์˜ Y ์…€. ๊ฒ€ํ”„ ๋‚ด๋ถ€ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • map โ€” ์นด๋“œ ๋ฒˆํ˜ธ. ์ด ์ธ์ˆ˜๊ฐ€ ์„ ํƒํ•œ ์–‘์‹์— ์—†์œผ๋ฉด ํ˜„์žฌ ๋งต์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ๋Š” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„์—์„œ๋งŒ ํƒ€์ผ์„ ์ฝ์Šต๋‹ˆ๋‹ค.
  • index โ€” 0๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฐ๊ณผ GetStaticTiles ๋ ˆ์ฝ”๋“œ์˜ ์‹œํ€€์Šค ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ graphic๋„ ์•„๋‹ˆ๊ณ  Z๋„ ์•„๋‹ˆ๊ณ  ์žฅ๋น„ ๋ ˆ์ด์–ด๋„ ์•„๋‹™๋‹ˆ๋‹ค. 3 ์ธ์ˆ˜ ํ˜•์‹์—์„œ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์„ธ ๋ฒˆ์งธ๋กœ ์˜ต๋‹ˆ๋‹ค. 4 ์ธ์ˆ˜ ๋งต ์„ธ ๋ฒˆ์งธ, ์ธ๋ฑ์Šค ๋„ค ๋ฒˆ์งธ ํ˜•์‹์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

ํ•œ ๋ ˆ์ฝ”๋“œ์˜ 11 ํ•„๋“œ ๋ฐฐ์—ด. ์ธ๋ฑ์Šค๋Š” 0๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • [0] kind โ€” string: "๋žœ๋“œ", "์ •์ " ๋˜๋Š” "object".
  • [1] serial - int: serial ๋™์  ์•„์ดํ…œ; ์œก์ƒ/์ •์ ์˜ ๊ฒฝ์šฐ 0์ž…๋‹ˆ๋‹ค.
  • [2] graphic - int: type ๊ทธ๋ž˜ํ”ฝ.
  • [3] x, [4] y - int: ์…€์˜ ์„ธ๊ณ„ ์ขŒํ‘œ.
  • [5] z - int: ์›”๋“œ์˜ ๋ฒ ์ด์Šค ๋†’์ด.
  • [6] hue - int: ์ƒ‰์ƒ, ์ง€๋ฉด ๊ทผ์ฒ˜ 0.
  • [7] flags - int: ํƒ€์ผ ๋ฐ์ดํ„ฐ ํ”Œ๋ž˜๊ทธ์˜ ๋‚ฎ์€ 32 ๋น„ํŠธ์ž…๋‹ˆ๋‹ค.
  • [8] name - string: ํƒ€์ผ๋ฐ์ดํ„ฐ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • [9] layer - int: ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ ์žฅ๋น„ ๋ ˆ์ด์–ด, ์ง€์ƒ ๊ทผ์ฒ˜ 0; ์ •์  ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • [10] height - int: ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ ๋†’์ด graphic, ์ง€๋ฉด ๊ทผ์ฒ˜ 0; ์ขŒํ‘œ Z๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋นˆ ๋ฐฐ์—ด []์€ ํ•ญ๋ชฉ์ด ์—†๊ฑฐ๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ์นด๋“œ/์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. GetStaticTileAt์˜ ๊ฒฝ์šฐ ์Œ์ˆ˜์ด๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ํฐ ์ธ๋ฑ์Šค๋Š” []๋„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค ์˜ค๋ฒ„ํ”Œ๋กœ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

object? result = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. type, Z ๋ฐ ๋ ˆ์ด์–ด๋ฅผ ๋ณ„๋„๋กœ ์ฝ๊ณ  - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • x/y โ€” ๋ฌธ์ž ์œ„์น˜; ์นด๋“œ๊ฐ€ ๋‚ด๋ ค์ง€๊ณ  ์ž๋™์œผ๋กœ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. GetStaticTileAt index=0์˜ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • [2], [5], [9] ํ•„๋“œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ 11์˜ ๊ธธ์ด๋ฅผ ํ™•์ธํ•œ ํ›„์—๋งŒ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.
var tile = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
if (Truth(ArrayLength(tile) == 11))
{
    UO.Print("Type: " + Convert.ToString(tile[2]));
    UO.Print("World Z: " + Convert.ToString(tile[5]));
    UO.Print("Equipment layer: " + Convert.ToString(tile[9]));
}
else
{
    UO.Print("Tile is unavailable");
}

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

2. ์ด๋ฆ„๊ณผ ํ‚ค ๊ฐ€์ ธ์˜ค๊ธฐ graphic - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ๋™์ผํ•œ ์ขŒํ‘œ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. GetStaticTileAt๋Š” ์ธ๋ฑ์Šค=0๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ํƒ€์ผ[8]์€ ์ด๋ฆ„ ๋ฌธ์ž์—ด์ด๊ณ , ํƒ€์ผ[10]์€ Z ๋ฒ ์ด์Šค๊ฐ€ ์•„๋‹Œ ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ ๋†’์ด ์น˜์ˆ˜์ž…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var tile = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
    if (Truth(ArrayLength(tile) == 11))
    {
        UO.Print(tile[8]);
        UO.Print("Graphic height: " + Convert.ToString(tile[10]));
    }

    return null;
}

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

3. type ๋ฐ ์ขŒํ‘œ๋ณ„ ํƒ€๊ฒŸ ์ค€๋น„ - ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆ˜์—…

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

  • WaitTargetTile๋Š” 2โ€ฆ5 ํ•„๋“œ์—์„œ graphic, x, y, z๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๊ฒƒ์€ ๋‹จ์ง€ ๋‹ค์Œ ๋ชฉํ‘œ๋ฅผ ์œ„ํ•œ ์ค€๋น„์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์ด ์˜ˆ๋Š” ๋„๊ตฌ๋‚˜ ์ฃผ๋ฌธ์„ ๋ฐœ๋™์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. statics์— ๋Œ€ํ•œ serial=0๋Š” ํ•ญ๋ชฉ์˜ ID๋กœ ์ „๋‹ฌ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var tile = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
        if (Truth(ArrayLength(tile) == 11))
        {
            UO.WaitTargetTile(tile[2], tile[3], tile[4], tile[5]);
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetStaticTileAt(x, y, index) โ€” UO.GetStaticTileAt(Any,Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

public InjectionValue GetStaticTileAt(InjectionValue x, InjectionValue y, InjectionValue index)

            => GetStaticTileAt(x, y, new InjectionValue(bridge.WorldNumber), index);

UO.GetStaticTileAt(x, y, map, index) โ€” UO.GetStaticTileAt(Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

public InjectionValue GetStaticTileAt(InjectionValue x, InjectionValue y, InjectionValue map, InjectionValue index)

        {

            int cellX = NumberConversions.ToInt(x);

            int cellY = NumberConversions.ToInt(y);

            int[] statics = bridge.GetStaticTiles(cellX, cellY, NumberConversions.ToInt(map)) ?? Array.Empty<int>();

            int tileIndex = NumberConversions.ToInt(index);

            if (tileIndex < 0 || tileIndex >= statics.Length / 3)

                return new InjectionValue(Array.Empty<InjectionValue>());

            int offset = tileIndex * 3;

            return offset + 2 < statics.Length

                ? BuildWorldTileRecord("static", 0, statics[offset], cellX, cellY, statics[offset + 1], statics[offset + 2], 1)

                : new InjectionValue(Array.Empty<InjectionValue>());

        }

UO.GetStaticTileData

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

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

dynamic UO.GetStaticTileData(object? tile);

ํƒ€์ผ๋ฐ์ดํ„ฐ์—์„œ ์ •์  ํ™•์žฅ ์ฐธ์กฐ ํ•ญ๋ชฉ graphic๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • tile๋Š” serial๊ฐ€ ์•„๋‹Œ ๊ทธ๋ž˜ํ”ฝ/type ํ•ญ๋ชฉ์ด๋ฉฐ ์…€ ๋‚ด์˜ ์ธ๋ฑ์Šค๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์ •์  ํ…Œ์ด๋ธ”์€ ๋ช…๋ น ์ด๋ฆ„ ์ž์ฒด๋กœ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

์œ ํšจํ•œ graphic์— ๋Œ€ํ•œ 17 ํ•„๋“œ ๋ฐฐ์—ด. ์ด๋ฆ„(string)์„ ์ œ์™ธํ•œ ๋ชจ๋“  ํ•„๋“œ int:

  • [0] graphic โ€” graphic/type ๊ธฐ๋ก.
  • [1] flags โ€” ํ•˜์œ„ 32 ํ”Œ๋ž˜๊ทธ ๋น„ํŠธ.
  • [2] name - ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ ์ด๋ฆ„(string).
  • [3] weight โ€” ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ ๊ฐ€์ค‘์น˜.
  • [4] layer โ€” ์žฅ๋น„ ๋ ˆ์ด์–ด ๋ฒˆํ˜ธ.
  • [5] count๋Š” ํƒ€์ผ๋ฐ์ดํ„ฐ์˜ Count ํ•„๋“œ์ด๋ฉฐ ์ „ ์„ธ๊ณ„์˜ ํ•ญ๋ชฉ ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • [6] animId - ID ์• ๋‹ˆ๋ฉ”์ด์…˜.
  • [7] hue โ€” ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ hue.
  • [8] lightIndex โ€” ๊ด‘์›์˜ ์ธ๋ฑ์Šค.
  • [9] height โ€” ๋†’์ด graphic, ์„ธ๊ณ„ ๋†’์ด Z๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • [10] wet โ€” 1 ์Šต์‹ ์„ค์น˜์ธ ๊ฒฝ์šฐ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ 0.
  • [11] impassable โ€” ํ†ต๊ณผํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ 1, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ 0.
  • [12] surface โ€” ํ‘œ๋ฉด์ธ ๊ฒฝ์šฐ 1, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ 0.
  • [13] foliage โ€” ๋‚˜๋ญ‡์žŽ์ด๋ฉด 1, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0.
  • [14] door โ€” ๋ฌธ์ธ ๊ฒฝ์šฐ 1, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ 0.
  • [15] wall โ€” ๋ฒฝ์ธ ๊ฒฝ์šฐ 1, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ 0.
  • [16] container โ€” ์ปจํ…Œ์ด๋„ˆ์ธ ๊ฒฝ์šฐ 1, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ 0.

์ž˜๋ชป๋œ graphic์˜ ๊ฒฝ์šฐ ์ฐธ์กฐ ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ์งง์€ ๋ฐฐ์—ด [ะฟะตั€ะตะดะฐะฝะฝั‹ะน graphic, 0, ""]์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์†์„ฑ์„ ์ฝ๊ธฐ ์ „์— ์ „์ฒด ๊ธธ์ด๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ์ด๊ฒƒ์€ ํŒŒ์Šค์นผ ๋ ˆ์ฝ”๋“œ๋‚˜ ๊ฐ์ฒด ๋ชฉ๋ก์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ํƒ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์„ธ๊ณ„์—์„œ graphic๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์ „์ฒด ๊ฒฝ๋กœ ํ™•์ธ์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ํƒ€์ผ์€ ์„ ํƒํ•œ ํ…Œ์ด๋ธ”์˜ ์ˆซ์ž graphic์ž…๋‹ˆ๋‹ค.
  • data[2]์—๋Š” ์ด๋ฆ„์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ธธ์ด ํ™•์ธ์€ ์œ ํšจํ•˜์ง€ ์•Š์€ graphic์˜ ์งง์€ ํ•ญ๋ชฉ๊ณผ ์ „์ฒด ํ•ญ๋ชฉ์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
var data = UO.GetStaticTileData(0x0CCA);
if (Truth(ArrayLength(data) == 17))
{
    UO.Print(data[2]);
}
else
{
    UO.Print("Tiledata entry is unavailable");
}

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

2. ๊ฐœ๋ณ„ ๋ถ€์šธ ํ”Œ๋ž˜๊ทธ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • data[11]๋Š” ๋ณ„๋„์˜ ์ „๋‹ฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ํ•„๋“œ์ž…๋‹ˆ๋‹ค: 1(์กฐ๊ฑด ์ถฉ์กฑ), 0(์กฐ๊ฑด ์ถฉ์กฑ๋˜์ง€ ์•Š์Œ).
  • ์ด ๊ฒ€์‚ฌ๋Š” ์…€์˜ ๋‹ค๋ฅธ ๊ฐœ์ฒด๋‚˜ ์บ๋ฆญํ„ฐ์˜ ๋Šฅ๋ ฅ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var data = UO.GetStaticTileData(0x0CCA);
    if (Truth(ArrayLength(data) == 17))
    {
        if (Truth(data[11]))
        {
            UO.Print("Impassable flag is set");
        }
        else
        {
            UO.Print("Impassable flag is not set");
        }
    }

    return null;
}

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

3. graphic ๋ฐ ์ผ๋ฐ˜ ํ”Œ๋ž˜๊ทธ ๋งˆ์Šคํฌ ์ธ์‡„ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • data[0]๋Š” ์ „์†ก๋œ graphic๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉฐ, data[1]๋Š” ์ผ๋ฐ˜ ํ”Œ๋ž˜๊ทธ ๋งˆ์Šคํฌ์ž…๋‹ˆ๋‹ค.
  • ๋งˆ์Šคํฌ์—๋Š” ๋™์‹œ์— ์—ฌ๋Ÿฌ ๋น„ํŠธ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ˆ˜์น˜๋Š” serial๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
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 data = UO.GetStaticTileData(0x0CCA);
        if (Truth(ArrayLength(data) == 17))
        {
            UO.Print("Graphic: " + Convert.ToString(data[0]));
            UO.Print("Flags: " + Convert.ToString(data[1]));
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetStaticTileData(tile) โ€” UO.GetStaticTileData(Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getstatictiledata":

                    return BuildTileData(1, Arg(0));

UO.GetStaticTiles

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

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

dynamic UO.GetStaticTiles(object? x, object? y, object? map);

ํ˜„์žฌ ์ง€๋„์˜ ํ•œ ์…€์— ์žˆ๋Š” ์ง€์ƒ ํ•ญ๋ชฉ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • x โ€” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„์˜ X ์…€. ๊ฒ€ํ”„ ๋‚ด๋ถ€ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • y โ€” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„์˜ Y ์…€. ๊ฒ€ํ”„ ๋‚ด๋ถ€ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • map โ€” ์นด๋“œ ๋ฒˆํ˜ธ. ์ด ์ธ์ˆ˜๊ฐ€ ์„ ํƒํ•œ ์–‘์‹์— ์—†์œผ๋ฉด ํ˜„์žฌ ๋งต์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ๋Š” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„์—์„œ๋งŒ ํƒ€์ผ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

๋ฐฐ์—ด์€ int-์‚ผ์ค‘ [graphic0, z0, hue0, graphic1, z1, hue1, โ€ฆ]์˜ ํ‰๋ฉด ์‹œํ€€์Šค์ž…๋‹ˆ๋‹ค. ํ•ญ๋ชฉ ์ˆ˜๋Š” ๋ฐฐ์—ด ๊ธธ์ด / 3์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. i ํ‘œ๊ธฐ๋ฒ•์˜ ๊ฒฝ์šฐ graphic๋Š” [i*3]์— ์žˆ๊ณ , Z๋Š” [i*3+1]์— ์žˆ๊ณ , hue์€ [i*3+2]์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋นˆ ๋ฐฐ์—ด์€ ํ•ญ๋ชฉ์ด ์—†๊ฑฐ๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ์นด๋“œ/์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ จ๋ฒˆํ˜ธ์™€ ๋ ˆ์ด์–ด ๋ฒˆํ˜ธ๋Š” ์—ฌ๊ธฐ์— ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋ฐ์ดํ„ฐ๋Š” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์นด๋“œ๋‚˜ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์…€์€ ๋นˆ ๋ฐฐ์—ด์ด ๋ฉ๋‹ˆ๋‹ค. ์ง์ ‘ ํƒ€์ผ ์ฟผ๋ฆฌ๋Š” ์ง€๋„ ๋ถˆ์ผ์น˜๋ฅผ ์ถ”๊ฐ€๋กœ ๋ณด๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GetWorldCell ๋ฐ GetWorldTilesArray๋Š” ์ด๋Ÿฌํ•œ ๋ฉ”์‹œ์ง€ ์—†์ด ์ฆ‰์‹œ ๋นˆ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋Š” 0๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ๋ฅผ ์ฝ๊ธฐ ์ „์— ArrayLength๋ฅผ ํ™•์ธํ•˜์„ธ์š”. Z์€ ์„ธ๊ณ„ ๊ณ ๋„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด๋Š” ํƒ€์ผ๋ฐ์ดํ„ฐ์˜ ์žฅ๋น„ ์†์„ฑ์ด๊ณ  ์ธ๋ฑ์Šค๋Š” ์…€ ํ•ญ๋ชฉ์˜ ์ผ๋ จ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ๋ธŒ๋ฆฌ์ง€๋Š” ์…€ ์ฒด์ธ์˜ ์ •์ , ๋‹ค์ค‘ ๋ฐ ์„ธ๊ณ„ ํ•ญ๋ชฉ์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น ์ด๋ฆ„์€ ๊ฒฐ๊ณผ๋ฅผ statics.mul ํ•ญ๋ชฉ์—๋งŒ ์ œํ•œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฒด์ธ ์ˆœ์„œ๋Š” Z ์ •๋ ฌ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.GetStaticTiles(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ์…€ ๋ ˆ์ฝ”๋“œ ์ˆ˜ ๊ณ„์‚ฐ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • x/y/map์€ ํ˜„์žฌ ์…€์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด์˜ ๊ธธ์ด๋Š” ํ•„๋“œ ์ˆ˜์ž…๋‹ˆ๋‹ค. 3๋กœ ๋‚˜๋ˆ„๋ฉด ํ•ญ๋ชฉ ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
var tiles = UO.GetStaticTiles(UO.GetX(), UO.GetY(), UO.WorldNum());
var count = ArrayLength(tiles) / 3;
UO.Print("Tile records: " + Convert.ToString(count));

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

2. graphic ๋ฐ ๋ชจ๋“  ํ•ญ๋ชฉ์˜ ๋†’์ด๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์˜คํ”„์…‹์€ 3๋งŒํผ ์ฆ๊ฐ€๋œ ๋‹ค์Œ ํŠธ๋ฆฌํ”Œ์˜ ์ฒซ ๋ฒˆ์งธ ํ•„๋“œ ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค.
  • ์˜คํ”„์…‹+2 ๊ฒ€์‚ฌ๋Š” ์ „์ฒด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ฝํžˆ์ง€ ์•Š๋„๋ก ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var tiles = UO.GetStaticTiles(UO.GetX(), UO.GetY(), UO.WorldNum());
    var offset = 0;
    while (Truth(offset + 2 < ArrayLength(tiles)))
    {
        UO.Print("Type: " + Convert.ToString(tiles[offset]) + ", Z: " + Convert.ToString(tiles[offset + 1]));
        offset = offset + 3;
    }

    return null;
}

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

3. ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์˜ hue ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • x+1๋Š” ์ธ์ ‘ํ•œ ์…€์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ํƒ€์ผ[2] โ€” ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์˜ ์ƒ‰์ƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„ธ ๋ฒˆ์งธ ํƒ€์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.
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 tiles = UO.GetStaticTiles(UO.GetX() + 1, UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(tiles) >= 3))
        {
            var hue = tiles[2];
            UO.Print("First tile hue: " + Convert.ToString(hue));
        }
        else
        {
            UO.Print("No tile records");
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetStaticTiles(x, y, map) โ€” UO.GetStaticTiles(Any,Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

public InjectionValue GetStaticTiles(InjectionValue x, InjectionValue y, InjectionValue map)

            => ToArray(bridge.GetStaticTiles(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)));

UO.GetStaticTilesArray

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

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

dynamic UO.GetStaticTilesArray(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileType);

์ง์‚ฌ๊ฐํ˜• ๋‚ด์—์„œ graphic/type๋กœ ์ •์ /๋‹ค์ค‘/ํ•ญ๋ชฉ ํ•ญ๋ชฉ์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

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

  • xmin โ€” ๋‘ ๊ฐ๋„๋ฅผ ํฌํ•จํ•œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. 0..65535. ์žฌ๋ฐฐ์—ด๋œ ๊ฐ๋„๋Š” ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค. ์˜์—ญ์€ 1 000 000 ์…€ ์ดํ•˜์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒฝ๊ณ„๋กœ ์ธํ•ด ์ง€๋„๋ฅผ ์ฝ๊ธฐ ์ „์— ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ymin โ€” ๋‘ ๊ฐ๋„๋ฅผ ํฌํ•จํ•œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. 0..65535. ์žฌ๋ฐฐ์—ด๋œ ๊ฐ๋„๋Š” ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค. ์˜์—ญ์€ 1 000 000 ์…€ ์ดํ•˜์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒฝ๊ณ„๋กœ ์ธํ•ด ์ง€๋„๋ฅผ ์ฝ๊ธฐ ์ „์— ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • xmax โ€” ๋‘ ๊ฐ๋„๋ฅผ ํฌํ•จํ•œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. 0..65535. ์žฌ๋ฐฐ์—ด๋œ ๊ฐ๋„๋Š” ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค. ์˜์—ญ์€ 1 000 000 ์…€ ์ดํ•˜์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒฝ๊ณ„๋กœ ์ธํ•ด ์ง€๋„๋ฅผ ์ฝ๊ธฐ ์ „์— ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ymax โ€” ๋‘ ๊ฐ๋„๋ฅผ ํฌํ•จํ•œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. 0..65535. ์žฌ๋ฐฐ์—ด๋œ ๊ฐ๋„๋Š” ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค. ์˜์—ญ์€ 1 000 000 ์…€ ์ดํ•˜์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒฝ๊ณ„๋กœ ์ธํ•ด ์ง€๋„๋ฅผ ์ฝ๊ธฐ ์ „์— ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • worldNum โ€” ์ง€๋„/ํŒจ์‹ฏ 0..255; UO.WorldNum()๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋˜ ๋‹ค๋ฅธ ๋งต์€ ๋นˆ ๋ฐฐ์—ด์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฒญํฌ ๊ฐ„์— ๋งต์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ถ€๋ถ„ ๊ฒฐ๊ณผ๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
  • tileType - ํ•˜๋‚˜์˜ graphic/type ํƒ€์ผ, ์ผ๋ฐ˜์ ์œผ๋กœ 0..65535; ์ด๊ฑด serial๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 0๋Š” ์ •ํ™•ํ•œ graphic 0์ด๊ณ , -1๋Š” type๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” type๋Š” ๋นˆ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

๋ฐฐ์—ด ํ•ญ๋ชฉ [graphic, X, Y, Z, hue]; ๋ชจ๋“  ๋ถ„์•ผ int. graphic - type, Z - ๋ฒ ์ด์Šค, hue - ์ปฌ๋Ÿฌ. ์—ฌ๋Ÿฌ ์…€ ํ•ญ๋ชฉ์€ ๋ณ„๋„๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ผ์น˜ ํ•ญ๋ชฉ ์—†์Œ: ๋นˆ ๋ฐฐ์—ด. ์ˆ˜๋Ÿ‰์€ ๊ฒฐ๊ณผ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ArrayLength(๊ฒฐ๊ณผ)์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฒจ์ž๋Š” 0๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” bool, serial ๋˜๋Š” Pascal ๋ ˆ์ฝ”๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๊ณฑ ๋ฒˆ์งธ ์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰์€ FindItem/FindCount์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ด๋™, ๋Œ€์ƒ ๋˜๋Š” ๋„คํŠธ์›Œํฌ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ˆœ์„œ: X ์˜ค๋ฆ„์ฐจ์ˆœ, X - Y ์˜ค๋ฆ„์ฐจ์ˆœ. ํ•œ ์…€์˜ ๊ธฐ๋ก์€ ๋ธŒ๋ฆฌ์ง€์˜ ์ˆœ์„œ๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ๋‚˜ ๋†’์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒ€์ƒ‰์€ ์•ฝ 1ms์˜ ์†Œํ”„ํŠธ ์˜ˆ์‚ฐ์œผ๋กœ ์ตœ๋Œ€ 32 ์…€ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ทจ์†Œ๋Š” ์„œ๋น™ ์‚ฌ์ด์— ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์…€์ด๋‚˜ ์ฝœ๋“œ ์ฝ๊ธฐ๋Š” ์˜ˆ์‚ฐ์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„“์€ ์˜์—ญ์„ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ฑ…์„ ์ฝ๋Š” ๋™์•ˆ ์„ธ์ƒ์€ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค.
  • ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ์˜ Static ๋ถ„๊ธฐ์—๋Š” ์ง€์ƒ์— ๋กœ๋“œ๋œ ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜์—ฌ ์…€์˜ Static, Multi ๋ฐ Item์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์œก์ƒ ๋ฐ ๋ชจ๋ฐ”์ผ์€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ •์  ํŒŒ์ผ๋งŒ ์„ ํƒํ•˜๋Š” ๊ณ ์ „์ ์ธ ์„ ํƒ๋ณด๋‹ค ๋” ๋„“์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.GetStaticTilesArray(UO.GetX(), UO.GetY(), UO.GetX() + 2, UO.GetY() + 2, UO.WorldNum(), 0x0CCA);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ๋ฌธ์ž ๊ทผ์ฒ˜ ๊ฒ€์ƒ‰ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • x/y โ€” ์œ„์น˜ self, ์ง€๋„ โ€” ํ˜„์žฌ ์ง€๋„. 3ร—3 ์˜์—ญ์—๋Š” ๊ฒฝ๊ณ„๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. Ex 2์—์„œ๋Š” type๊ฐ€ ์ผ๋ฐ˜ ํ˜•์‹ 1๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋ฆฌ์†Œ์Šค์— ๋งž๊ฒŒ ์ƒ˜ํ”Œ์„ ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ID ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ graphic ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetStaticTilesArray(x, y, x + 2, y + 2, map, 0x0CCA);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));

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

2. ์žฌ๋ฐฐ์น˜๋œ ๊ฐ๋„ ๋ฐ ๋ชจ๋“  ํ•„๋“œ ์ถœ๋ ฅ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 2ร—2 ์˜์—ญ์€ ํฐ ๊ฐ๋„์—์„œ ์ž‘์€ ๊ฐ๋„๋กœ ์ด๋™๋ฉ๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด๋Š” ๊ฒฝ๊ณ„๋ฅผ ์ •๊ทœํ™”ํ•ฉ๋‹ˆ๋‹ค. ํ–‰ - ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ; PrintTile๋Š” ์ „์ฒด์ ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ์œผ๋ฉฐ ์•„๋ฌด๊ฒƒ๋„ ์ด๋™ํ•˜์ง€ ์•Š๊ณ  ์ˆซ์ž ํ˜•์‹๋งŒ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. graphic - type, x/y - ์ขŒํ‘œ, z - ๋†’์ด, hue - ์ƒ‰์ƒ. ํ† ์ง€์˜ ๊ฒฝ์šฐ ์กฐ๊ฑด๋ถ€ hue=0๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ํ† ์ง€ ๊ธฐ๋ก์— ์ƒ‰์ƒ ํ•„๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX();
    var y = UO.GetY();
    var map = UO.WorldNum();
    var rows = UO.GetStaticTilesArray(x + 1, y + 1, x, y, map, 0x0CCA);
    var i = 0;
    while (Truth(i < ArrayLength(rows)))
    {
        var row = rows[i];
        PrintTile(row[0], row[1], row[2], row[3], row[4]);
        i = i + 1;
    }

    return null;
}

void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
    UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
    UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}

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

3. ์žฌ์‹œ๋„ ์ œํ•œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์‹œ ํด๋ง - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ํ•˜๋‚˜์˜ ์…€์— ๋Œ€ํ•ด ์ตœ๋Œ€ 3๋ฒˆ์˜ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋„ ์‚ฌ์ด WaitAsync(250). ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฒฐ๊ณผ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ธธ์ด๊ฐ€ 0์ธ ๊ฒƒ์€ ๊ฐ์ฒด๊ฐ€ ์„œ๋ฒ„์—์„œ ์˜๊ตฌ์ ์œผ๋กœ ๋ˆ„๋ฝ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ˜„์žฌ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
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 x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var attempt = 0;
        while (Truth(attempt < 3))
        {
            var rows = UO.GetStaticTilesArray(x, y, x, y, map, 0x0CCA);
            UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
            attempt = attempt + 1;
            await Delay(250);
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetStaticTilesArray(xmin, ymin, xmax, ymax, worldNum, tileType) โ€” UO.GetStaticTilesArray(Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileType (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getstatictilesarray":

                    return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, true);

UO.GetStaticTilesArrayEx

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

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

dynamic UO.GetStaticTilesArrayEx(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileTypes);

์ง์‚ฌ๊ฐํ˜• ๋‚ด์—์„œ graphic/type๋กœ ์ •์ /๋‹ค์ค‘/ํ•ญ๋ชฉ ํ•ญ๋ชฉ์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

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

  • xmin โ€” ๋‘ ๊ฐ๋„๋ฅผ ํฌํ•จํ•œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. 0..65535. ์žฌ๋ฐฐ์—ด๋œ ๊ฐ๋„๋Š” ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค. ์˜์—ญ์€ 1 000 000 ์…€ ์ดํ•˜์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒฝ๊ณ„๋กœ ์ธํ•ด ์ง€๋„๋ฅผ ์ฝ๊ธฐ ์ „์— ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ymin โ€” ๋‘ ๊ฐ๋„๋ฅผ ํฌํ•จํ•œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. 0..65535. ์žฌ๋ฐฐ์—ด๋œ ๊ฐ๋„๋Š” ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค. ์˜์—ญ์€ 1 000 000 ์…€ ์ดํ•˜์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒฝ๊ณ„๋กœ ์ธํ•ด ์ง€๋„๋ฅผ ์ฝ๊ธฐ ์ „์— ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • xmax โ€” ๋‘ ๊ฐ๋„๋ฅผ ํฌํ•จํ•œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. 0..65535. ์žฌ๋ฐฐ์—ด๋œ ๊ฐ๋„๋Š” ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค. ์˜์—ญ์€ 1 000 000 ์…€ ์ดํ•˜์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒฝ๊ณ„๋กœ ์ธํ•ด ์ง€๋„๋ฅผ ์ฝ๊ธฐ ์ „์— ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ymax โ€” ๋‘ ๊ฐ๋„๋ฅผ ํฌํ•จํ•œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. 0..65535. ์žฌ๋ฐฐ์—ด๋œ ๊ฐ๋„๋Š” ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค. ์˜์—ญ์€ 1 000 000 ์…€ ์ดํ•˜์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒฝ๊ณ„๋กœ ์ธํ•ด ์ง€๋„๋ฅผ ์ฝ๊ธฐ ์ „์— ์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • worldNum โ€” ์ง€๋„/ํŒจ์‹ฏ 0..255; UO.WorldNum()๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋˜ ๋‹ค๋ฅธ ๋งต์€ ๋นˆ ๋ฐฐ์—ด์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฒญํฌ ๊ฐ„์— ๋งต์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ถ€๋ถ„ ๊ฒฐ๊ณผ๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
  • tileTypes โ€” ์ˆซ์ž ๋ฐฐ์—ด graphic/type; ์ผ์น˜ํ•˜๋Š” ๊ฐ type๊ฐ€ ์ผœ์ง‘๋‹ˆ๋‹ค. type๋ฅผ ๋ฐ˜๋ณตํ•ด๋„ ํ•ญ๋ชฉ์ด ์ค‘๋ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šค์นผ๋ผ๋„ ํ•˜๋‚˜์˜ type๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๋นˆ ๋ฐฐ์—ด์€ ๋ชจ๋“  ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค type; ํ•˜๋‚˜์˜ 0 ๋ฐฐ์—ด์€ 0๋งŒ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

๋ฐฐ์—ด ํ•ญ๋ชฉ [graphic, X, Y, Z, hue]; ๋ชจ๋“  ๋ถ„์•ผ int. graphic - type, Z - ๋ฒ ์ด์Šค, hue - ์ปฌ๋Ÿฌ. ์—ฌ๋Ÿฌ ์…€ ํ•ญ๋ชฉ์€ ๋ณ„๋„๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ผ์น˜ ํ•ญ๋ชฉ ์—†์Œ: ๋นˆ ๋ฐฐ์—ด. ์ˆ˜๋Ÿ‰์€ ๊ฒฐ๊ณผ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ArrayLength(๊ฒฐ๊ณผ)์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฒจ์ž๋Š” 0๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” bool, serial ๋˜๋Š” Pascal ๋ ˆ์ฝ”๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๊ณฑ ๋ฒˆ์งธ ์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰์€ FindItem/FindCount์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ด๋™, ๋Œ€์ƒ ๋˜๋Š” ๋„คํŠธ์›Œํฌ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ˆœ์„œ: X ์˜ค๋ฆ„์ฐจ์ˆœ, X - Y ์˜ค๋ฆ„์ฐจ์ˆœ. ํ•œ ์…€์˜ ๊ธฐ๋ก์€ ๋ธŒ๋ฆฌ์ง€์˜ ์ˆœ์„œ๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ๋‚˜ ๋†’์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒ€์ƒ‰์€ ์•ฝ 1ms์˜ ์†Œํ”„ํŠธ ์˜ˆ์‚ฐ์œผ๋กœ ์ตœ๋Œ€ 32 ์…€ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ทจ์†Œ๋Š” ์„œ๋น™ ์‚ฌ์ด์— ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์…€์ด๋‚˜ ์ฝœ๋“œ ์ฝ๊ธฐ๋Š” ์˜ˆ์‚ฐ์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„“์€ ์˜์—ญ์„ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ฑ…์„ ์ฝ๋Š” ๋™์•ˆ ์„ธ์ƒ์€ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค.
  • ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ์˜ Static ๋ถ„๊ธฐ์—๋Š” ์ง€์ƒ์— ๋กœ๋“œ๋œ ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜์—ฌ ์…€์˜ Static, Multi ๋ฐ Item์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์œก์ƒ ๋ฐ ๋ชจ๋ฐ”์ผ์€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ •์  ํŒŒ์ผ๋งŒ ์„ ํƒํ•˜๋Š” ๊ณ ์ „์ ์ธ ์„ ํƒ๋ณด๋‹ค ๋” ๋„“์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.GetStaticTilesArrayEx(UO.X(), UO.Y(), UO.X() + 1, UO.Y() + 1, UO.WorldNum(), new[] { 0x0CCA });
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ๋ฌธ์ž ๊ทผ์ฒ˜ ๊ฒ€์ƒ‰ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • x/y โ€” ์œ„์น˜ self, ์ง€๋„ โ€” ํ˜„์žฌ ์ง€๋„. 3ร—3 ์˜์—ญ์—๋Š” ๊ฒฝ๊ณ„๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. Ex 2์—์„œ๋Š” type๊ฐ€ ์ผ๋ฐ˜ ํ˜•์‹ 1๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋ฆฌ์†Œ์Šค์— ๋งž๊ฒŒ ์ƒ˜ํ”Œ์„ ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ID ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ graphic ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
dynamic[] types = new dynamic[checked((int)(1) + 1)];
types[0] = 0x0CCA;
types[1] = 0x0CCB;
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetStaticTilesArrayEx(x, y, x + 2, y + 2, map, types);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));

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

2. ์žฌ๋ฐฐ์น˜๋œ ๊ฐ๋„ ๋ฐ ๋ชจ๋“  ํ•„๋“œ ์ถœ๋ ฅ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • 2ร—2 ์˜์—ญ์€ ํฐ ๊ฐ๋„์—์„œ ์ž‘์€ ๊ฐ๋„๋กœ ์ด๋™๋ฉ๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด๋Š” ๊ฒฝ๊ณ„๋ฅผ ์ •๊ทœํ™”ํ•ฉ๋‹ˆ๋‹ค. ํ–‰ - ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ; PrintTile๋Š” ์ „์ฒด์ ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ์œผ๋ฉฐ ์•„๋ฌด๊ฒƒ๋„ ์ด๋™ํ•˜์ง€ ์•Š๊ณ  ์ˆซ์ž ํ˜•์‹๋งŒ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. graphic - type, x/y - ์ขŒํ‘œ, z - ๋†’์ด, hue - ์ƒ‰์ƒ. ํ† ์ง€์˜ ๊ฒฝ์šฐ ์กฐ๊ฑด๋ถ€ hue=0๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ํ† ์ง€ ๊ธฐ๋ก์— ์ƒ‰์ƒ ํ•„๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    dynamic[] types = new dynamic[checked((int)(1) + 1)];
    types[0] = 0x0CCA;
    types[1] = 0x0CCB;
    var x = UO.GetX();
    var y = UO.GetY();
    var map = UO.WorldNum();
    var rows = UO.GetStaticTilesArrayEx(x + 1, y + 1, x, y, map, types);
    var i = 0;
    while (Truth(i < ArrayLength(rows)))
    {
        var row = rows[i];
        PrintTile(row[0], row[1], row[2], row[3], row[4]);
        i = i + 1;
    }

    return null;
}

void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
    UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
    UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}

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

3. ์žฌ์‹œ๋„ ์ œํ•œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์‹œ ํด๋ง - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • ํ•˜๋‚˜์˜ ์…€์— ๋Œ€ํ•ด ์ตœ๋Œ€ 3๋ฒˆ์˜ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋„ ์‚ฌ์ด WaitAsync(250). ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฒฐ๊ณผ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ธธ์ด๊ฐ€ 0์ธ ๊ฒƒ์€ ๊ฐ์ฒด๊ฐ€ ์„œ๋ฒ„์—์„œ ์˜๊ตฌ์ ์œผ๋กœ ๋ˆ„๋ฝ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ˜„์žฌ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
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()
    {
        dynamic[] types = new dynamic[checked((int)(1) + 1)];
        types[0] = 0x0CCA;
        types[1] = 0x0CCB;
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var attempt = 0;
        while (Truth(attempt < 3))
        {
            var rows = UO.GetStaticTilesArrayEx(x, y, x, y, map, types);
            UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
            attempt = attempt + 1;
            await Delay(250);
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetStaticTilesArrayEx(xmin, ymin, xmax, ymax, worldNum, tileTypes) โ€” UO.GetStaticTilesArrayEx(Any,Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileTypes (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getstatictilesarrayex":

                    return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), true);

UO.GetSurfaceZ

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

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

dynamic UO.GetSurfaceZ(object? x, object? y, object? worldNum);

์…€ ๋‚ด ์ง€ํ‘œ๋ฉด์˜ ํ‰๊ท  ๋†’์ด๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • x โ€” ๊ฒ€ํ”„์˜ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ํ˜„์žฌ ์ง€๋„ ์…€์˜ ์„ธ๊ณ„ ์ขŒํ‘œ X์ž…๋‹ˆ๋‹ค.
  • y โ€” ํ˜„์žฌ ์ง€๋„ ์…€์˜ ์›”๋“œ Y ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • worldNum โ€” ์นด๋“œ/ํŒจ์‹ฏ ๋ฒˆํ˜ธ; UO.WorldNum()๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ํ˜„์žฌ ๋กœ๋“œ๋œ ์นด๋“œ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int - Land.AverageZ(์Œ์ˆ˜ ๋†’์ด ๋ฐ 0 ํฌํ•จ). ์ง€๋„/์ง€๋ฉด์ด ์—†๊ฑฐ๋‚˜ ์ง€๋„ ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ 0๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฏ€๋กœ ์ด ๊ฐ’์€ ๋ˆ„๋ฝ๋œ ๋ฐ์ดํ„ฐ์™€ ์‹ค์ œ ๋†’์ด 0๋ฅผ ๊ตฌ๋ณ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. bool, ๋ฐ”๋‹ฅ์ด๋‚˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ •์ ์˜ ๋†’์ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ๋กœ์ปฌ ์ง€๋„๋ฅผ ์ฝ๊ณ  ์ด๋™์ด๋‚˜ ๋Œ€์ƒ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งต ํฌ๊ธฐ๋ฅผ ๋ฒ—์–ด๋‚œ ์…€์€ ์ธ์ ‘ํ•œ ์—ด์˜ ์…€๋กœ ๋Œ€์ฒด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Z, graphic/type์˜ ๋†’์ด, hue์˜ ์ƒ‰์ƒ, ๊นƒ๋ฐœ ๋ฐ ์žฅ๋น„ ๋ ˆ์ด์–ด๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. Null graphic ๋˜๋Š” Z=0๋Š” ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ์–‘์‹์„ ํ™•์ธํ•˜์„ธ์š”.

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

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

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

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

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

object? result = UO.GetSurfaceZ(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ์บ๋ฆญํ„ฐ ์•„๋ž˜ ํ‰๊ท  ๋†’์ด - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์„ธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ชจ๋‘ ์ง€๋„์˜ ํ˜„์žฌ ์…€๊ณผ ๊ด€๋ จ๋ฉ๋‹ˆ๋‹ค. z๋Š” ์ด๋™์˜ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹Œ ์ˆซ์ž ๋†’์ด์ž…๋‹ˆ๋‹ค.
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var z = UO.GetSurfaceZ(x, y, map);
UO.Print("Average land Z: " + Convert.ToString(z));

2. ์ฝ๊ธฐ ์ „์— ์ง€์ƒ ๊ฐ€์šฉ์„ฑ ํ™•์ธ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • GetMapCell๋Š” ๋ˆ„๋ฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋†’์ด 0์™€ ๊ตฌ๋ณ„ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ง€๋„๋Š” ๋‘ ๋ฒˆ์˜ ํ˜ธ์ถœ ์‚ฌ์ด์— ๊ณ„์† ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX() + 1;
    var y = UO.GetY();
    var map = UO.WorldNum();
    var cell = UO.GetMapCell(x, y, map);
    if (Truth(ArrayLength(cell) == 3))
    {
        UO.Print("Average: " + Convert.ToString(UO.GetSurfaceZ(x, y, map)));
    }
    else
    {
        UO.Print("No land data");
    }

    return null;
}

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

3. ๋™์ชฝ ํ‰๊ท  ๋†’์ด์˜ ๋ณ€ํ™” ํ‘œ์‹œ - ์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค

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

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

     public object? RunScenario()
    {
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var a = UO.GetMapCell(x, y, map);
        var b = UO.GetMapCell(x + 1, y, map);
        if (Truth(ArrayLength(a) == 3) && Truth(ArrayLength(b) == 3))
        {
            var difference = UO.GetSurfaceZ(x + 1, y, map) - UO.GetSurfaceZ(x, y, map);
            UO.Print("Average difference: " + Convert.ToString(difference));
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetSurfaceZ(x, y, worldNum) โ€” UO.GetSurfaceZ(Any,Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getsurfacez":

                    return new InjectionValue(bridge.GetSurfaceZ(Arg(0), Arg(1), Arg(2)));

UO.GetTileFlags

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

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

dynamic UO.GetTileFlags(object? group, object? tileId);

ํƒ€์ผ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์—์„œ ๋น„ํŠธ๋งˆ์Šคํฌ graphic ์†์„ฑ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • group - 0 - ๋žœ๋“œ ํ…Œ์ด๋ธ”; 1 โ€” ์ •์  graphic ํ…Œ์ด๋ธ”. ๊ตฌํ˜„์—์„œ๋Š” null์ด ์•„๋‹Œ ๊ทธ๋ฃน์„ ๋‘ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค. 0 ๋˜๋Š” 1๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • tileId โ€” ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ ๊ทธ๋ž˜ํ”ฝ/type ํ•ญ๋ชฉ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ •์ˆ˜ 0โ€ฆ65535์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ์ฒด์˜ serial๋„ ์•„๋‹ˆ๊ณ  ์…€ ๋‚ด๋ถ€์˜ ์ •์  ์ธ๋ฑ์Šค๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int โ€” ํƒ€์ผ ๋ฐ์ดํ„ฐ ํ”Œ๋ž˜๊ทธ์˜ ๋‚ฎ์€ 32 ๋น„ํŠธ. ์ตœ์ƒ์œ„ ๋น„ํŠธ ์„ธํŠธ๋Š” ์Œ์ˆ˜ ๋ถ€ํ˜ธ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. 0๋Š” ์ด๋Ÿฌํ•œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†๊ฑฐ๋‚˜ ์œ ํšจํ•˜์ง€ ์•Š์€ tileId๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์˜ค๋ฅ˜์˜ ๋…๋ฆฝ์ ์ธ ์‹ ํ˜ธ๊ฐ€ ์•„๋‹ˆ๋ฉฐ bool๋„ ์•„๋‹™๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์†์„ฑ์„ ๋™์‹œ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ฐธ์กฐ ํ•ญ๋ชฉ graphic์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์„ธ๊ณ„ ์ขŒํ‘œ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. group=0 ๋ฐ group=1 tileId๊ฐ€ ๋™์ผํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ์†์„ฑ์€ ํŠน์ • ํ•ญ๋ชฉ์˜ ํ˜„์žฌ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ graphic ๋ฐ์ดํ„ฐ์—์„œ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.GetTileFlags(1, 0x0CCA);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

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

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

  • group=1๋Š” ์ •์  ํƒ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. tileId=0x0CCA - graphic ํŠธ๋ฆฌ.
  • value์—๋Š” ๋ฐ˜ํ’ˆ ์„น์…˜์— ์„ค๋ช…๋œ ๊ฒฐ๊ณผ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์˜๋ฏธ๋Š” serial์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var value = UO.GetTileFlags(1, 0x0CCA);
if (Truth((Convert.ToUInt64(value) & 0x40UL) != 0))
{
    UO.Print("Impassable flag is set");
}

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

2. ์ฐพ์€ ํ•ญ๋ชฉ์˜ ์†์„ฑ graphic ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • FindType๋Š” serial๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. GetType๋Š” ์ˆซ์ž graphic๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • group=1๋Š” ํ•ญ๋ชฉ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. tileId graphic์—์„œ๋Š” ํ•ญ๋ชฉ์ด ์•„๋‹Œ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(item != ""))
    {
        var graphic = UO.GetType(item);
        var value = UO.GetTileFlags(1, graphic);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

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

3. ์บ๋ฆญํ„ฐ-์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค ์•„๋ž˜ ๋•…์˜ ์†์„ฑ์„ ์ฝ์–ด๋ณด์„ธ์š”.

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

  • ์ฒ˜์Œ ๋‘ ์ธ์ˆ˜ GetLandscapeTile๋Š” ํ˜„์žฌ ์„ธ๊ณ„ X/Y์ž…๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ๋Š” ํ˜„์žฌ ์ง€๋„์ž…๋‹ˆ๋‹ค.
  • ํ† ์ง€[0]์—๋Š” graphic ํ† ์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. group=0๋Š” ํ† ์ง€ ํƒ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. GetTileLayer/GetTileHeight์˜ ๊ฒฝ์šฐ ์ง€๋ฉด์€ 0๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var graphic = land[0];
            var value = UO.GetTileFlags(0, graphic);
            UO.Print(Convert.ToString(value));
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetTileFlags(group, tileId) โ€” UO.GetTileFlags(Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

public InjectionValue GetTileFlags(InjectionValue group, InjectionValue tileId)

            => new InjectionValue(unchecked((int)bridge.GetTileFlags(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId))));

UO.GetTileHeight

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

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

int UO.GetTileHeight(object? group, object? tileId);

ํƒ€์ผ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์—์„œ ๋†’์ด graphic๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • group - 0 - ๋žœ๋“œ ํ…Œ์ด๋ธ”; 1 โ€” ์ •์  graphic ํ…Œ์ด๋ธ”. ๊ตฌํ˜„์—์„œ๋Š” null์ด ์•„๋‹Œ ๊ทธ๋ฃน์„ ๋‘ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค. 0 ๋˜๋Š” 1๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • tileId โ€” ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ ๊ทธ๋ž˜ํ”ฝ/type ํ•ญ๋ชฉ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ •์ˆ˜ 0โ€ฆ65535์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ์ฒด์˜ serial๋„ ์•„๋‹ˆ๊ณ  ์…€ ๋‚ด๋ถ€์˜ ์ •์  ์ธ๋ฑ์Šค๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int๋Š” ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ Z ๋‹จ์œ„ ๊ทธ๋ž˜ํ”ฝ ๋†’์ด์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ทธ๋ž˜ํ”ฝ์˜ ๋†’์ด ํฌ๊ธฐ์ด๋ฉฐ ๊ธฐ๋ณธ Z์˜ ์„ธ๊ณ„ ์ขŒํ‘œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ง€์ƒ, ์ง„์ž… ๋ˆ„๋ฝ ๋˜๋Š” ๊ณ ๋„ 0์˜ ๊ฒฝ์šฐ 0๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ํ‚ค ์ž์ฒด๊ฐ€ ํฌ๋กœ์Šค์ปจํŠธ๋ฆฌ ๋Šฅ๋ ฅ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ฐธ์กฐ ํ•ญ๋ชฉ graphic์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์„ธ๊ณ„ ์ขŒํ‘œ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. group=0 ๋ฐ group=1 tileId๊ฐ€ ๋™์ผํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ์†์„ฑ์€ ํŠน์ • ํ•ญ๋ชฉ์˜ ํ˜„์žฌ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ graphic ๋ฐ์ดํ„ฐ์—์„œ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • group=1๋Š” ์ •์  ํƒ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. tileId=0x0CCA - graphic ํŠธ๋ฆฌ.
  • value์—๋Š” ๋ฐ˜ํ’ˆ ์„น์…˜์— ์„ค๋ช…๋œ ๊ฒฐ๊ณผ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์˜๋ฏธ๋Š” serial์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var value = UO.GetTileHeight(1, 0x0CCA);
UO.Print("Tiledata height: " + Convert.ToString(value));

2. ์ฐพ์€ ํ•ญ๋ชฉ์˜ ์†์„ฑ graphic ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • FindType๋Š” serial๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. GetType๋Š” ์ˆซ์ž graphic๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • group=1๋Š” ํ•ญ๋ชฉ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. tileId graphic์—์„œ๋Š” ํ•ญ๋ชฉ์ด ์•„๋‹Œ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(item != ""))
    {
        var graphic = UO.GetType(item);
        var value = UO.GetTileHeight(1, graphic);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

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

3. ์บ๋ฆญํ„ฐ-์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค ์•„๋ž˜ ๋•…์˜ ์†์„ฑ์„ ์ฝ์–ด๋ณด์„ธ์š”.

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

  • ์ฒ˜์Œ ๋‘ ์ธ์ˆ˜ GetLandscapeTile๋Š” ํ˜„์žฌ ์„ธ๊ณ„ X/Y์ž…๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ๋Š” ํ˜„์žฌ ์ง€๋„์ž…๋‹ˆ๋‹ค.
  • ํ† ์ง€[0]์—๋Š” graphic ํ† ์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. group=0๋Š” ํ† ์ง€ ํƒ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. GetTileLayer/GetTileHeight์˜ ๊ฒฝ์šฐ ์ง€๋ฉด์€ 0๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var graphic = land[0];
            var value = UO.GetTileHeight(0, graphic);
            UO.Print(Convert.ToString(value));
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetTileHeight(group, tileId) โ€” UO.GetTileHeight(Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetTileHeight(InjectionValue group, InjectionValue tileId)

        {

            int tileGroup = NumberConversions.ToInt(group);

            int[] properties = bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)) ?? Array.Empty<int>();

            return tileGroup == 0 || properties.Length < 7 ? 0 : properties[6];

        }

UO.GetTileLayer

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

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

int UO.GetTileLayer(object? group, object? tileId);

ํƒ€์ผ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์—์„œ ์žฅ๋น„ ๋ ˆ์ด์–ด ๋ฒˆํ˜ธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • group - 0 - ๋žœ๋“œ ํ…Œ์ด๋ธ”; 1 โ€” ์ •์  graphic ํ…Œ์ด๋ธ”. ๊ตฌํ˜„์—์„œ๋Š” null์ด ์•„๋‹Œ ๊ทธ๋ฃน์„ ๋‘ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค. 0 ๋˜๋Š” 1๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • tileId โ€” ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ ๊ทธ๋ž˜ํ”ฝ/type ํ•ญ๋ชฉ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ •์ˆ˜ 0โ€ฆ65535์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ์ฒด์˜ serial๋„ ์•„๋‹ˆ๊ณ  ์…€ ๋‚ด๋ถ€์˜ ์ •์  ์ธ๋ฑ์Šค๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int โ€” ์žฅ๋น„ ๋ ˆ์ด์–ด ๋ฒˆํ˜ธ graphic: ์˜ˆ: 1=Rhand, 2=Lhand, 21=Backpack. ์ ‘์ง€, ํ•ญ๋ชฉ ๋ˆ„๋ฝ ๋˜๋Š” null ๋ ˆ์ด์–ด์˜ ๊ฒฝ์šฐ 0๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฐ”๋‹ฅ๋„ ์•„๋‹ˆ๊ณ  Z๋„ ์•„๋‹Œ ์…€์˜ ์ •์  ์ˆœ์„œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ฐธ์กฐ ํ•ญ๋ชฉ graphic์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์„ธ๊ณ„ ์ขŒํ‘œ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. group=0 ๋ฐ group=1 tileId๊ฐ€ ๋™์ผํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ์†์„ฑ์€ ํŠน์ • ํ•ญ๋ชฉ์˜ ํ˜„์žฌ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ graphic ๋ฐ์ดํ„ฐ์—์„œ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • group=1๋Š” ์ •์  ํƒ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. tileId=0x0CCA - graphic ํŠธ๋ฆฌ.
  • value์—๋Š” ๋ฐ˜ํ’ˆ ์„น์…˜์— ์„ค๋ช…๋œ ๊ฒฐ๊ณผ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์˜๋ฏธ๋Š” serial์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var value = UO.GetTileLayer(1, 0x0CCA);
if (Truth(value == 1))
{
    UO.Print("Right-hand graphic");
}

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

2. ์ฐพ์€ ํ•ญ๋ชฉ์˜ ์†์„ฑ graphic ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • FindType๋Š” serial๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. GetType๋Š” ์ˆซ์ž graphic๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • group=1๋Š” ํ•ญ๋ชฉ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. tileId graphic์—์„œ๋Š” ํ•ญ๋ชฉ์ด ์•„๋‹Œ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(item != ""))
    {
        var graphic = UO.GetType(item);
        var value = UO.GetTileLayer(1, graphic);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

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

3. ์บ๋ฆญํ„ฐ-์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค ์•„๋ž˜ ๋•…์˜ ์†์„ฑ์„ ์ฝ์–ด๋ณด์„ธ์š”.

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

  • ์ฒ˜์Œ ๋‘ ์ธ์ˆ˜ GetLandscapeTile๋Š” ํ˜„์žฌ ์„ธ๊ณ„ X/Y์ž…๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ๋Š” ํ˜„์žฌ ์ง€๋„์ž…๋‹ˆ๋‹ค.
  • ํ† ์ง€[0]์—๋Š” graphic ํ† ์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. group=0๋Š” ํ† ์ง€ ํƒ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. GetTileLayer/GetTileHeight์˜ ๊ฒฝ์šฐ ์ง€๋ฉด์€ 0๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var graphic = land[0];
            var value = UO.GetTileLayer(0, graphic);
            UO.Print(Convert.ToString(value));
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetTileLayer(group, tileId) โ€” UO.GetTileLayer(Any,Any)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetTileLayer(InjectionValue group, InjectionValue tileId)

        {

            int tileGroup = NumberConversions.ToInt(group);

            int[] properties = bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)) ?? Array.Empty<int>();

            return tileGroup == 0 || properties.Length < 2 ? 0 : properties[1];

        }

UO.GetTileName

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

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

string UO.GetTileName(object? group, object? tileId);

ํƒ€์ผ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์—์„œ ์ด๋ฆ„ graphic์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • group - 0 - ๋žœ๋“œ ํ…Œ์ด๋ธ”; 1 โ€” ์ •์  graphic ํ…Œ์ด๋ธ”. ๊ตฌํ˜„์—์„œ๋Š” null์ด ์•„๋‹Œ ๊ทธ๋ฃน์„ ๋‘ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค. 0 ๋˜๋Š” 1๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • tileId โ€” ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ ๊ทธ๋ž˜ํ”ฝ/type ํ•ญ๋ชฉ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ •์ˆ˜ 0โ€ฆ65535์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ์ฒด์˜ serial๋„ ์•„๋‹ˆ๊ณ  ์…€ ๋‚ด๋ถ€์˜ ์ •์  ์ธ๋ฑ์Šค๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string - ๊ฒŒ์ž„ ํƒ€์ผ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋นˆ ๋ฌธ์ž์—ด์€ ๋นˆ ์ด๋ฆ„ ๋˜๋Š” ์ž˜๋ชป๋œ tileId์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ๊ฒŒ์ž„ ๋ฆฌ์†Œ์Šค์—์„œ ๋”ฐ์˜จ ๊ฒƒ์ด๋ฉฐ ์ธํ„ฐํŽ˜์ด์Šค ์–ธ์–ด IDE๋กœ ์ž๋™ ๋ฒˆ์—ญ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์„œ๋ฒ„์˜ ํŠน์ • ํ•ญ๋ชฉ ์ด๋ฆ„์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ด ๋ช…๋ น์€ ์ฐธ์กฐ ํ•ญ๋ชฉ graphic์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์„ธ๊ณ„ ์ขŒํ‘œ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. group=0 ๋ฐ group=1 tileId๊ฐ€ ๋™์ผํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ์†์„ฑ์€ ํŠน์ • ํ•ญ๋ชฉ์˜ ํ˜„์žฌ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ graphic ๋ฐ์ดํ„ฐ์—์„œ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • group=1๋Š” ์ •์  ํƒ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. tileId=0x0CCA - graphic ํŠธ๋ฆฌ.
  • value์—๋Š” ๋ฐ˜ํ’ˆ ์„น์…˜์— ์„ค๋ช…๋œ ๊ฒฐ๊ณผ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์˜๋ฏธ๋Š” serial์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var value = UO.GetTileName(1, 0x0CCA);
if (Truth(value != ""))
{
    UO.Print(value);
}
else
{
    UO.Print("No tiledata name");
}

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

2. ์ฐพ์€ ํ•ญ๋ชฉ์˜ ์†์„ฑ graphic ์ฝ๊ธฐ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • FindType๋Š” serial๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. GetType๋Š” ์ˆซ์ž graphic๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • group=1๋Š” ํ•ญ๋ชฉ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. tileId graphic์—์„œ๋Š” ํ•ญ๋ชฉ์ด ์•„๋‹Œ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(item != ""))
    {
        var graphic = UO.GetType(item);
        var value = UO.GetTileName(1, graphic);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

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

3. ์บ๋ฆญํ„ฐ-์‹œ๋‚˜๋ฆฌ์˜ค ํด๋ž˜์Šค ์•„๋ž˜ ๋•…์˜ ์†์„ฑ์„ ์ฝ์–ด๋ณด์„ธ์š”.

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

  • ์ฒ˜์Œ ๋‘ ์ธ์ˆ˜ GetLandscapeTile๋Š” ํ˜„์žฌ ์„ธ๊ณ„ X/Y์ž…๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ๋Š” ํ˜„์žฌ ์ง€๋„์ž…๋‹ˆ๋‹ค.
  • ํ† ์ง€[0]์—๋Š” graphic ํ† ์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. group=0๋Š” ํ† ์ง€ ํƒ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. GetTileLayer/GetTileHeight์˜ ๊ฒฝ์šฐ ์ง€๋ฉด์€ 0๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var graphic = land[0];
            var value = UO.GetTileName(0, graphic);
            UO.Print(Convert.ToString(value));
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetTileName(group, tileId) โ€” UO.GetTileName(Any,Any)

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string GetTileName(InjectionValue group, InjectionValue tileId)

            => bridge.GetTileDataName(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId));

UO.GetTileXYM

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

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

dynamic UO.GetTileXYM(object? x, object? y, object? map, object? tileStart, object? tileEnd, object? uoPath);

ํ˜„์žฌ ๋กœ๋“œ๋œ ๊ฒŒ์ž„ ์นด๋“œ ์…€์˜ ๊ฐœ์ฒด ์ฒด์ธ์—์„œ ์ผ์น˜ํ•˜๋Š” graphic ID๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • x โ€” ์ขŒํ‘œ X ์…€, int.
  • y โ€” ์ขŒํ‘œ Y ์…€, int.
  • map โ€” ์นด๋“œ ๋ฒˆํ˜ธ; World.MapIndex์™€ ์ผ์น˜ํ•ด์•ผ ํ•˜๋ฉฐ, World.Map์ด ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • tileStart โ€” ํ™œ์„ฑํ™”๋œ ๊ทธ๋ž˜ํ”ฝ ํ…Œ๋‘๋ฆฌ๊ฐ€ ๋‚ฎ์•„์กŒ์Šต๋‹ˆ๋‹ค.
  • tileEnd โ€” ๊ทธ๋ž˜ํ”ฝ์˜ ์œ„์ชฝ ํฌํ•จ ํ…Œ๋‘๋ฆฌ์ž…๋‹ˆ๋‹ค. ์—ญ๋ฐฉํ–ฅ ๋ฒ”์œ„๋Š” ์žฌ๋ฐฐ์—ด๋˜์ง€ ์•Š์œผ๋ฉฐ ์ผ์น˜ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • uoPath - ํ˜ธํ™˜์„ฑ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ string๋กœ ๋ณ€ํ™˜๋˜์—ˆ์œผ๋‚˜ ํ˜„์žฌ ๋ธŒ๋ฆฌ์ง€์—์„œ๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ํŒŒ์ผ ํด๋”์ธ UO์„ ๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

ํ‰๋ฉด ์ฟผ๋“œ [graphic,x,y,z,graphic,x,y,z,...]๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด int. ์ง€๋„ ์˜ค๋ฅ˜๋Š” ๋นˆ ๋ฐฐ์—ด๊ณผ ๋ฉ”์‹œ์ง€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†์œผ๋ฉด ๋นˆ ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • World.Map.GetTile(x,y).TNext๋ฅผ ๋”ฐ๋ฅด๊ณ  tileStart<=Graphic<=tileEnd์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ฒด ์œ ํ˜•์€ ๋ณ„๋„๋กœ ํ•„ํ„ฐ๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ˆœํ•œ ์ •์  ํ•ญ๋ชฉ์ด ์•„๋‹ˆ๋ผ ์…€ ์ฒด์ธ์ž…๋‹ˆ๋‹ค.
  • ์ด ๋ช…๋ น์€ ํด๋ผ์ด์–ธํŠธ์— ๋กœ๋“œ๋œ ํ˜•์ƒ์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ง€๋„/ํŒจ์‹ฏ์˜ ๋ฐ์ดํ„ฐ๋Š” ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. uoPath ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ญ๋ชฉ ์ˆ˜๋Š” ๋ฐฐ์—ด/4์˜ ๊ธธ์ด์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

object? result = UO.GetTileXYM(UO.GetX(), UO.GetY(), UO.WorldNum(), 0, 65535, "");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ํ˜„์žฌ ์…€์˜ ๋ชจ๋“  ๊ทธ๋ž˜ํ”„๋Š” ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

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

  • ๊ฐ ํ•ญ๋ชฉ์€ 4๊ฐœ์˜ int๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค.
var tiles = UO.GetTileXYM(UO.GetX(),UO.GetY(),UO.WorldNum(),0,65535,"");
UO.Print(Convert.ToString(ArrayLength(tiles)/4));

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

2. graphic ๋ฐ ๋†’์ด ์ธ์‡„ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ธ๋ฑ์Šค i์™€ i+3๋Š” ๋™์ผํ•œ ๋ ˆ์ฝ”๋“œ์˜ graphic ๋ฐ z์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var tiles = UO.GetTileXYM(UO.GetX(), UO.GetY(), UO.WorldNum(), 0, 65535, "");
    for (int i = (int)(0); i <= ArrayLength(tiles) - 1; i += (int)(4))
    {
        UO.Print(Convert.ToString(tiles[i]) + " " + Convert.ToString(tiles[i + 3]));
    }

    return null;
}

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

3. ์—ญ๋ฐฉํ–ฅ ๋ฒ”์œ„ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • 100..99 ๋ฒ”์œ„์—๋Š” graphic๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋นˆ ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
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 tiles = UO.GetTileXYM(UO.GetX(), UO.GetY(), UO.WorldNum(), 100, 99, "");
        UO.Print(Convert.ToString(ArrayLength(tiles)));
        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetTileXYM(x, y, map, tileStart, tileEnd, uoPath) โ€” UO.GetTileXYM(Any,Any,Any,Any,Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

public InjectionValue GetTileXYM(InjectionValue x, InjectionValue y, InjectionValue map, InjectionValue tileStart, InjectionValue tileEnd, InjectionValue uoPath)

            => ToArray(bridge.GetTileXYM(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), NumberConversions.ToInt(tileStart), NumberConversions.ToInt(tileEnd), uoPath.ToString()));

UO.GetUserStatic

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

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

string UO.GetUserStatic(object? id);

์ €์žฅ๋œ ์‚ฌ์šฉ์ž ์ •์  ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • id - int ID, AddUserStatic๋กœ ํš๋“; ์„ธ์ƒ์˜ graphic/type๋„ ์•„๋‹ˆ๊ณ  serial๋„ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

string โ€” ์ €์žฅ๋œ ์ง๋ ฌ ๋ ˆ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†์Œ ID๋Š” ๋นˆ ๋ฌธ์ž์—ด์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • state.UserStatics.TryGetValue๋Š” ๋ฌธ์ž์—ด์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์ง€ ์•Š๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐํ•˜ํ•™์  ํ‘œ๊ธฐ๋ฒ• - "graphic|x|y|z|hue|map"; ์ด์ „ ํ…์ŠคํŠธ ํ•ญ๋ชฉ์€ ๋‹ค๋ฅธ ํ…์ŠคํŠธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€, ๋Œ€์ƒ ๋˜๋Š” ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ์ƒํƒœ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์ €์žฅ๋œ ์‚ฌ์šฉ์ž ์ •์  ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
UO.Print(UO.GetUserStatic(1));

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

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

  • state.UserStatics.TryGetValue๋Š” ๋ฌธ์ž์—ด์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์ง€ ์•Š๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐํ•˜ํ•™์  ํ‘œ๊ธฐ๋ฒ• - "graphic|x|y|z|hue|map"; ์ด์ „ ํ…์ŠคํŠธ ํ•ญ๋ชฉ์€ ๋‹ค๋ฅธ ํ…์ŠคํŠธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.UserStaticExists(1)))
    {
        UO.Print(UO.GetUserStatic(1));
    }

    return null;
}

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

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

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

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

     public object? RunScenario()
    {
        var records = UO.GetUserStatics();
        if (Truth(UO.GetArrayLength(records) > 0))
        {
            UO.Print(UO.GetUserStatic(records[0][0]));
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: string / String.

ํ˜ธ์ถœ ์‹œ:

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

public string GetUserStatic(InjectionValue id)

            => state.UserStatics.TryGetValue(NumberConversions.ToInt(id), out string value) ? value : string.Empty;

UO.GetUserStatics

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

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

dynamic UO.GetUserStatics();

์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.UserStatics.

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

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

๋ฐ˜ํ™˜๊ฐ’

ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋œ ๋ฌธ์ž์—ด ๋ฐฐ์—ด [id, serializedText]. ๊ฐ ID๋Š” int, serializedText - string์ž…๋‹ˆ๋‹ค. ๋นˆ ์‚ฌ์ „์€ ๋นˆ ๋ฐฐ์—ด์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.UserStatics. ๊ธฐํ•˜ํ•™์  ํ‘œ๊ธฐ๋ฒ•์€ "graphic|x|y|z|hue|map"์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด์ „ ํ…์ŠคํŠธ ํ•ญ๋ชฉ AddUserStatic์€ ํ˜•์‹์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ์ •์  ๋งต์ด ์•„๋‹Œ ๋กœ์ปฌ ์‚ฌ์šฉ์ž ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€, ๋Œ€์ƒ ๋˜๋Š” ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ๊ธฐ์—์„œ๋Š” ๋‹ค๋ฅธ ์ƒํƒœ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ ํ˜ธ์ŠคํŠธ์—์„œ ์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋Š” GetPersistentState ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋™์ผํ•œ ์›”๋“œ/ํ”„๋กœํ•„์˜ ์Šคํฌ๋ฆฝํŠธ/์ฑ„ํŒ…/๋งคํฌ๋กœ์— ๊ณตํ†ต๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช…๋ฐฑํžˆ ๋ณ„๋„์˜ InjectionRuntimeState๊ฐ€ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ•„์„ ๋กœ๋“œ/์‚ญ์ œํ•˜๋ฉด ํ”„๋กœํ•„์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ๋œ serial๋Š” ์—ฌ์ „ํžˆ ๋กœ๋“œ๋œ ์„ธ๊ณ„์™€ ๋น„๊ตํ•˜์—ฌ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

  • ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.UserStatics.
var records = UO.GetUserStatics();
UO.Print(UO.GetArrayLength(records));

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

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

  • ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.UserStatics. ๊ธฐํ•˜ํ•™์  ํ‘œ๊ธฐ๋ฒ•์€ "graphic|x|y|z|hue|map"์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด์ „ ํ…์ŠคํŠธ ํ•ญ๋ชฉ AddUserStatic์€ ํ˜•์‹์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ์ •์  ๋งต์ด ์•„๋‹Œ ๋กœ์ปฌ ์‚ฌ์šฉ์ž ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var records = UO.GetUserStatics();
    if (Truth(UO.GetArrayLength(records) > 0))
    {
        UO.Print(records[0][0]);
        UO.Print(records[0][1]);
    }

    return null;
}

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

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

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

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

     public object? RunScenario()
    {
        var before = UO.GetUserStatics();
        UO.Wait(500);
        var after = UO.GetUserStatics();
        UO.Print(before);
        UO.Print(after);
        return null;
    }
}

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetUserStatics() โ€” UO.GetUserStatics()

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

public InjectionValue GetUserStatics()

            => new InjectionValue(state.UserStatics.OrderBy(pair => pair.Key)

                .Select(pair => new InjectionValue(new[] { new InjectionValue(pair.Key), new InjectionValue(pair.Value) }))

                .ToArray());

UO.GetWorldCell

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

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

dynamic UO.GetWorldCell(object? x, object? y);
dynamic UO.GetWorldCell(object? x, object? y, object? map);

์„ ํƒํ•œ ์ง€์—ญ์— ํ™•์žฅ๋œ ์ง€์ƒ ๊ธฐ๋ก, ์ง€์ƒ ๊ธฐ๋ก, ๋กœ๋“œ๋œ ์›”๋“œ ์•„์ดํ…œ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • x โ€” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„์˜ X ์…€. ๊ฒ€ํ”„ ๋‚ด๋ถ€ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • y โ€” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„์˜ Y ์…€. ๊ฒ€ํ”„ ๋‚ด๋ถ€ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • map โ€” ์นด๋“œ ๋ฒˆํ˜ธ. ์ด ์ธ์ˆ˜๊ฐ€ ์„ ํƒํ•œ ์–‘์‹์— ์—†์œผ๋ฉด ํ˜„์žฌ ๋งต์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ๋Š” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„์—์„œ๋งŒ ํƒ€์ผ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

๋ ˆ์ฝ”๋“œ ๋ฐฐ์—ด. ๊ฐ ๊ฒฐ๊ณผ[i] ์š”์†Œ์˜ ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ•œ ๋ ˆ์ฝ”๋“œ์˜ 11 ํ•„๋“œ ๋ฐฐ์—ด. ์ธ๋ฑ์Šค๋Š” 0๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • [0] kind โ€” string: "๋žœ๋“œ", "์ •์ " ๋˜๋Š” "object".
  • [1] serial - int: serial ๋™์  ์•„์ดํ…œ; ์œก์ƒ/์ •์ ์˜ ๊ฒฝ์šฐ 0์ž…๋‹ˆ๋‹ค.
  • [2] graphic - int: type ๊ทธ๋ž˜ํ”ฝ.
  • [3] x, [4] y - int: ์…€์˜ ์„ธ๊ณ„ ์ขŒํ‘œ.
  • [5] z - int: ์›”๋“œ์˜ ๋ฒ ์ด์Šค ๋†’์ด.
  • [6] hue - int: ์ƒ‰์ƒ, ์ง€๋ฉด ๊ทผ์ฒ˜ 0.
  • [7] flags - int: ํƒ€์ผ ๋ฐ์ดํ„ฐ ํ”Œ๋ž˜๊ทธ์˜ ๋‚ฎ์€ 32 ๋น„ํŠธ์ž…๋‹ˆ๋‹ค.
  • [8] name - string: ํƒ€์ผ๋ฐ์ดํ„ฐ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • [9] layer - int: ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ ์žฅ๋น„ ๋ ˆ์ด์–ด, ์ง€์ƒ ๊ทผ์ฒ˜ 0; ์ •์  ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • [10] height - int: ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ ๋†’์ด graphic, ์ง€๋ฉด ๊ทผ์ฒ˜ 0; ์ขŒํ‘œ Z๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

ArrayLength(๊ฒฐ๊ณผ) - ์…€ ์ˆ˜๋‚˜ ๊ฒฝ๋กœ ๋‹จ๊ณ„ ์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ ˆ์ฝ”๋“œ ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ ๋น„์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ x/y์—๋Š” Z๊ฐ€ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ํ•ญ๋ชฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "object" ํ•ญ๋ชฉ์—๋Š” serial์ด ์žˆ์Šต๋‹ˆ๋‹ค. "์ •์ " ํ•ญ๋ชฉ์—๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ serial์ด ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋ฐ์ดํ„ฐ๋Š” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์นด๋“œ๋‚˜ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์…€์€ ๋นˆ ๋ฐฐ์—ด์ด ๋ฉ๋‹ˆ๋‹ค. ์ง์ ‘ ํƒ€์ผ ์ฟผ๋ฆฌ๋Š” ์ง€๋„ ๋ถˆ์ผ์น˜๋ฅผ ์ถ”๊ฐ€๋กœ ๋ณด๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GetWorldCell ๋ฐ GetWorldTilesArray๋Š” ์ด๋Ÿฌํ•œ ๋ฉ”์‹œ์ง€ ์—†์ด ์ฆ‰์‹œ ๋นˆ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋Š” 0๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ๋ฅผ ์ฝ๊ธฐ ์ „์— ArrayLength๋ฅผ ํ™•์ธํ•˜์„ธ์š”. Z์€ ์„ธ๊ณ„ ๊ณ ๋„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด๋Š” ํƒ€์ผ๋ฐ์ดํ„ฐ์˜ ์žฅ๋น„ ์†์„ฑ์ด๊ณ  ์ธ๋ฑ์Šค๋Š” ์…€ ํ•ญ๋ชฉ์˜ ์ผ๋ จ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.
  • ์ •์  ๋ถ€๋ถ„์€ GetStaticTiles๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์„ ํƒ์—๋Š” ๋‹ค์ค‘/ํ•ญ๋ชฉ๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์›”๋“œ ์•„์ดํ…œ์€ serial์™€ ํ•จ๊ป˜ "object"๋กœ ์ถ”๊ฐ€๋กœ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํ•ญ๋ชฉ์„ ๊ณ ์œ ํ•œ ํ•ญ๋ชฉ์œผ๋กœ ์ทจ๊ธ‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  • GetWorldTilesArray๋Š” 1 000 000 ์…€์˜ ์˜์—ญ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. 0โ€ฆ65535/์ง€๋„ ์™ธ๋ถ€ 0โ€ฆ255์„ ์ดˆ๊ณผํ•˜๊ฑฐ๋‚˜ ์ขŒํ‘œ๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋ถ€๋ถ„ ๋ฐฐ์—ด์ด ์•„๋‹Œ ๋ช…๋ น ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋นˆ๋ฒˆํ•œ ํด๋ง์„ ์œ„ํ•ด์„œ๋Š” ์ž‘์€ ์˜์—ญ์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.

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

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

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

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

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

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

1. ๋ ˆ์ฝ”๋“œ ์ˆ˜ ๊ณ„์‚ฐ ๋ฐ ๋‚˜์—ด - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • GetWorldCell๋Š” ํ•˜๋‚˜์˜ ์…€์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ GetWorldTilesArray๋Š” ํ…Œ๋‘๋ฆฌ๊ฐ€ ํ™œ์„ฑํ™”๋œ ์ •์‚ฌ๊ฐํ˜• 3ร—3๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ์„ธํฌ[i]๋Š” ์ค‘์ฒฉ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ํƒ€์ผ[0] - ์นดํ…Œ๊ณ ๋ฆฌ, [2] - graphic, [5] - Z.
var cells = UO.GetWorldCell(UO.GetX(), UO.GetY());
var i = 0;
while (Truth(i < ArrayLength(cells)))
{
    var tile = cells[i];
    UO.Print(tile[0] + ": " + Convert.ToString(tile[2]) + ", Z=" + Convert.ToString(tile[5]));
    i = i + 1;
}

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

2. serial ํ•ญ๋ชฉ์ด ์žˆ๋Š” ํ•ญ๋ชฉ๋งŒ ํ‘œ์‹œ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์˜์—ญ์€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•„๋‹Œ ์ขŒํ‘œ๋กœ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.
  • kind="object" ๊ฒ€์‚ฌ๋Š” ์ง๋ ฌ ํ•ญ๋ชฉ์„ ์ง€์ƒ/๊ณ ์ • ํ•ญ๋ชฉ๊ณผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. [1]์—๋Š” serial์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var cells = UO.GetWorldCell(UO.GetX(), UO.GetY());
    var i = 0;
    while (Truth(i < ArrayLength(cells)))
    {
        var tile = cells[i];
        if (Truth(tile[0] == "object"))
        {
            UO.Print("Object serial: " + Convert.ToString(tile[1]));
        }

        i = i + 1;
    }

    return null;
}

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

3. ๋ฌธ์ž ๋†’์ด์—์„œ ๋ ˆ์ฝ”๋“œ ์„ ํƒ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • Tile[5] ๋ฐ GetZ()๋Š” ๋™์ผํ•œ ํ‘œ์ค€ ๋†’์ด ๋‹จ์œ„๋กœ ๋น„๊ต๋ฉ๋‹ˆ๋‹ค.
  • ๋™๋“ฑ Z๋Š” ๊ธฐ๋ฐ˜์„ ํ•„ํ„ฐ๋งํ•˜์ง€๋งŒ ์ „์ฒด ์ธต์˜ ๊ฐœํ†ต์„ฑ์ด๋‚˜ ์šฐ์—ฐ์˜ ์ผ์น˜๋ฅผ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
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 cells = UO.GetWorldCell(UO.GetX(), UO.GetY());
        var i = 0;
        while (Truth(i < ArrayLength(cells)))
        {
            var tile = cells[i];
            if (Truth(tile[5] == UO.GetZ()))
            {
                UO.Print(tile[8]);
            }

            i = i + 1;
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

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

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

public InjectionValue GetWorldCell(InjectionValue x, InjectionValue y)

            => GetWorldCell(x, y, new InjectionValue(bridge.WorldNumber));

UO.GetWorldCell(x, y, map) โ€” UO.GetWorldCell(Any,Any,Any)

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

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

public InjectionValue GetWorldCell(InjectionValue x, InjectionValue y, InjectionValue map)

            => BuildWorldCell(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), true);

UO.GetWorldNum

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

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

int UO.GetWorldNum();

ํด๋ผ์ด์–ธํŠธ ๋ชจ๋ธ์—์„œ ํ˜„์žฌ ์นด๋“œ ๋ฒˆํ˜ธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜ํ™˜๊ฐ’

int โ€” ํด๋ผ์ด์–ธํŠธ์˜ ํ˜„์žฌ ์นด๋“œ ์ƒ‰์ธ, ์ผ๋ฐ˜์ ์œผ๋กœ 0=Felucca, 1=Trammel, 2=Ilshenar, 3=Malas, 4=Tokuno, 5=Ter Mur. ์‚ฌ์šฉ์ž ์„œ๋ฒ„๋Š” ๋‹ค๋ฅธ ์นด๋“œ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0๋Š” ์˜ค๋ฅ˜ ์ง•ํ›„๊ฐ€ ์•„๋‹Œ ๋ณธ๊ฒฉ์ ์ธ ์ง€๋„์ž…๋‹ˆ๋‹ค.

๋™์ž‘

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

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

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

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

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

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

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

1. ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ๊ฐ’ ํ‘œ์‹œ - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜ธ์ถœ์€ self๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์นด๋“œ ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ’์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • Convert.ToString๋Š” ์ถœ๋ ฅํ•  ์ˆซ์ž๋ฅผ ๋ณ€ํ™˜ํ•˜๋ฉฐ ๊ฒฐ๊ณผ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
var value = UO.GetWorldNum();
UO.Print("GetWorldNum: " + Convert.ToString(value));

2. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ๊ฐ’ ์‚ฌ์šฉ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์ธ์ˆ˜ ์—†์ด ๊ฐ’์„ ํ•œ ๋ฒˆ ์ฝ์Šต๋‹ˆ๋‹ค. ํ‘œ์‹œ๋œ ๊ณ„์‚ฐ์ด๋‚˜ ์กฐ๊ฑด์—๋Š” ํ˜„์žฌ ์นด๋“œ ๋ฒˆํ˜ธ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ˆซ์ž ์ž„๊ณ„๊ฐ’์€ ์Šคํฌ๋ฆฝํŠธ ์กฐ๊ฑด์˜ ์˜ˆ์ด๋ฉฐ ์ƒˆ๋กœ์šด ํด๋ผ์ด์–ธํŠธ ์ œํ•œ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•„๋“œ์—๋Š” ์œ„์— ์„ค๋ช…๋œ ์„œ๋ฒ„ ๋‹จ์œ„ ๋ฐ ์ œํ•œ ์‚ฌํ•ญ์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetWorldNum();
    var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), value);
    UO.Print("Land record length: " + Convert.ToString(ArrayLength(land)));
    return null;
}

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

3. 1์ดˆ๋งŒ์— ๋ณ€ํ™”๋ฅผ ์ง€์ผœ๋ณด์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.GetWorldNum();
        await Delay(1000);
        var after = UO.GetWorldNum();
        if (Truth(before != after))
        {
            UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetWorldNum() โ€” UO.GetWorldNum()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

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

() => bridge.WorldNumber

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


UO.GetWorldTilesArray

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

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

dynamic UO.GetWorldTilesArray(object? minX, object? minY, object? maxX, object? maxY, object? map);

์„ ํƒํ•œ ์ง€์—ญ์— ํ™•์žฅ๋œ ์ง€์ƒ ๊ธฐ๋ก, ์ง€์ƒ ๊ธฐ๋ก, ๋กœ๋“œ๋œ ์›”๋“œ ์•„์ดํ…œ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • minX โ€” ํฌํ•จ๋œ ์ง์‚ฌ๊ฐํ˜•์˜ ์ฒซ ๋ฒˆ์งธ X ํ…Œ๋‘๋ฆฌ์ž…๋‹ˆ๋‹ค. 0โ€ฆ65535.
  • minY โ€” ํฌํ•จ๋œ ์ง์‚ฌ๊ฐํ˜•์˜ ์ฒซ ๋ฒˆ์งธ Y ํ…Œ๋‘๋ฆฌ์ž…๋‹ˆ๋‹ค. 0โ€ฆ65535.
  • maxX โ€” ๋‘ ๋ฒˆ์งธ ํฌํ•จ๋œ ๊ฒฝ๊ณ„ X; ๋‘ ๊ฐœ์˜ X ์ค‘ ๋” ์ž‘์€/ํฐ ๊ฒƒ์ด ์ž๋™์œผ๋กœ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.
  • maxY โ€” ๋‘ ๋ฒˆ์งธ ํฌํ•จ๋œ ๊ฒฝ๊ณ„ Y; ๋‘ ๊ฐœ์˜ Y ์ค‘ ๋” ์ž‘์€/ํฐ ๊ฒƒ์ด ์ž๋™์œผ๋กœ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.
  • map โ€” ์นด๋“œ ๋ฒˆํ˜ธ. ์ด ์ธ์ˆ˜๊ฐ€ ์„ ํƒํ•œ ์–‘์‹์— ์—†์œผ๋ฉด ํ˜„์žฌ ๋งต์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ๋Š” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„์—์„œ๋งŒ ํƒ€์ผ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

๋ ˆ์ฝ”๋“œ ๋ฐฐ์—ด. ๊ฐ ๊ฒฐ๊ณผ[i] ์š”์†Œ์˜ ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ•œ ๋ ˆ์ฝ”๋“œ์˜ 11 ํ•„๋“œ ๋ฐฐ์—ด. ์ธ๋ฑ์Šค๋Š” 0๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • [0] kind โ€” string: "๋žœ๋“œ", "์ •์ " ๋˜๋Š” "object".
  • [1] serial - int: serial ๋™์  ์•„์ดํ…œ; ์œก์ƒ/์ •์ ์˜ ๊ฒฝ์šฐ 0์ž…๋‹ˆ๋‹ค.
  • [2] graphic - int: type ๊ทธ๋ž˜ํ”ฝ.
  • [3] x, [4] y - int: ์…€์˜ ์„ธ๊ณ„ ์ขŒํ‘œ.
  • [5] z - int: ์›”๋“œ์˜ ๋ฒ ์ด์Šค ๋†’์ด.
  • [6] hue - int: ์ƒ‰์ƒ, ์ง€๋ฉด ๊ทผ์ฒ˜ 0.
  • [7] flags - int: ํƒ€์ผ ๋ฐ์ดํ„ฐ ํ”Œ๋ž˜๊ทธ์˜ ๋‚ฎ์€ 32 ๋น„ํŠธ์ž…๋‹ˆ๋‹ค.
  • [8] name - string: ํƒ€์ผ๋ฐ์ดํ„ฐ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • [9] layer - int: ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ ์žฅ๋น„ ๋ ˆ์ด์–ด, ์ง€์ƒ ๊ทผ์ฒ˜ 0; ์ •์  ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • [10] height - int: ํƒ€์ผ ๋ฐ์ดํ„ฐ์˜ ๋†’์ด graphic, ์ง€๋ฉด ๊ทผ์ฒ˜ 0; ์ขŒํ‘œ Z๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

ArrayLength(๊ฒฐ๊ณผ) - ์…€ ์ˆ˜๋‚˜ ๊ฒฝ๋กœ ๋‹จ๊ณ„ ์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ ˆ์ฝ”๋“œ ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ ๋น„์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ x/y์—๋Š” Z๊ฐ€ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ํ•ญ๋ชฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "object" ํ•ญ๋ชฉ์—๋Š” serial์ด ์žˆ์Šต๋‹ˆ๋‹ค. "์ •์ " ํ•ญ๋ชฉ์—๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ serial์ด ์—†์Šต๋‹ˆ๋‹ค.

๋™์ž‘

  • ๋ฐ์ดํ„ฐ๋Š” ํ˜„์žฌ ๋กœ๋“œ๋œ ์ง€๋„๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์นด๋“œ๋‚˜ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์…€์€ ๋นˆ ๋ฐฐ์—ด์ด ๋ฉ๋‹ˆ๋‹ค. ์ง์ ‘ ํƒ€์ผ ์ฟผ๋ฆฌ๋Š” ์ง€๋„ ๋ถˆ์ผ์น˜๋ฅผ ์ถ”๊ฐ€๋กœ ๋ณด๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GetWorldCell ๋ฐ GetWorldTilesArray๋Š” ์ด๋Ÿฌํ•œ ๋ฉ”์‹œ์ง€ ์—†์ด ์ฆ‰์‹œ ๋นˆ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋Š” 0๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ๋ฅผ ์ฝ๊ธฐ ์ „์— ArrayLength๋ฅผ ํ™•์ธํ•˜์„ธ์š”. Z์€ ์„ธ๊ณ„ ๊ณ ๋„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด๋Š” ํƒ€์ผ๋ฐ์ดํ„ฐ์˜ ์žฅ๋น„ ์†์„ฑ์ด๊ณ  ์ธ๋ฑ์Šค๋Š” ์…€ ํ•ญ๋ชฉ์˜ ์ผ๋ จ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.
  • ์ •์  ๋ถ€๋ถ„์€ GetStaticTiles๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์„ ํƒ์—๋Š” ๋‹ค์ค‘/ํ•ญ๋ชฉ๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์›”๋“œ ์•„์ดํ…œ์€ serial์™€ ํ•จ๊ป˜ "object"๋กœ ์ถ”๊ฐ€๋กœ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํ•ญ๋ชฉ์„ ๊ณ ์œ ํ•œ ํ•ญ๋ชฉ์œผ๋กœ ์ทจ๊ธ‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  • GetWorldTilesArray๋Š” 1 000 000 ์…€์˜ ์˜์—ญ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. 0โ€ฆ65535/์ง€๋„ ์™ธ๋ถ€ 0โ€ฆ255์„ ์ดˆ๊ณผํ•˜๊ฑฐ๋‚˜ ์ขŒํ‘œ๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋ถ€๋ถ„ ๋ฐฐ์—ด์ด ์•„๋‹Œ ๋ช…๋ น ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋นˆ๋ฒˆํ•œ ํด๋ง์„ ์œ„ํ•ด์„œ๋Š” ์ž‘์€ ์˜์—ญ์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.

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

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

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

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

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

object? result = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. ๋ ˆ์ฝ”๋“œ ์ˆ˜ ๊ณ„์‚ฐ ๋ฐ ๋‚˜์—ด - ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ

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

  • GetWorldCell๋Š” ํ•˜๋‚˜์˜ ์…€์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ GetWorldTilesArray๋Š” ํ…Œ๋‘๋ฆฌ๊ฐ€ ํ™œ์„ฑํ™”๋œ ์ •์‚ฌ๊ฐํ˜• 3ร—3๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ์„ธํฌ[i]๋Š” ์ค‘์ฒฉ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ํƒ€์ผ[0] - ์นดํ…Œ๊ณ ๋ฆฌ, [2] - graphic, [5] - Z.
var cells = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
var i = 0;
while (Truth(i < ArrayLength(cells)))
{
    var tile = cells[i];
    UO.Print(tile[0] + ": " + Convert.ToString(tile[2]) + ", Z=" + Convert.ToString(tile[5]));
    i = i + 1;
}

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

2. serial ํ•ญ๋ชฉ์ด ์žˆ๋Š” ํ•ญ๋ชฉ๋งŒ ํ‘œ์‹œ - ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ

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

  • ์˜์—ญ์€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•„๋‹Œ ์ขŒํ‘œ๋กœ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.
  • kind="object" ๊ฒ€์‚ฌ๋Š” ์ง๋ ฌ ํ•ญ๋ชฉ์„ ์ง€์ƒ/๊ณ ์ • ํ•ญ๋ชฉ๊ณผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. [1]์—๋Š” serial์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var cells = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
    var i = 0;
    while (Truth(i < ArrayLength(cells)))
    {
        var tile = cells[i];
        if (Truth(tile[0] == "object"))
        {
            UO.Print("Object serial: " + Convert.ToString(tile[1]));
        }

        i = i + 1;
    }

    return null;
}

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

3. ๋ฌธ์ž ๋†’์ด์—์„œ ๋ ˆ์ฝ”๋“œ ์„ ํƒ - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

  • Tile[5] ๋ฐ GetZ()๋Š” ๋™์ผํ•œ ํ‘œ์ค€ ๋†’์ด ๋‹จ์œ„๋กœ ๋น„๊ต๋ฉ๋‹ˆ๋‹ค.
  • ๋™๋“ฑ Z๋Š” ๊ธฐ๋ฐ˜์„ ํ•„ํ„ฐ๋งํ•˜์ง€๋งŒ ์ „์ฒด ์ธต์˜ ๊ฐœํ†ต์„ฑ์ด๋‚˜ ์šฐ์—ฐ์˜ ์ผ์น˜๋ฅผ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
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 cells = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
        var i = 0;
        while (Truth(i < ArrayLength(cells)))
        {
            var tile = cells[i];
            if (Truth(tile[5] == UO.GetZ()))
            {
                UO.Print(tile[8]);
            }

            i = i + 1;
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetWorldTilesArray(minX, minY, maxX, maxY, map) โ€” UO.GetWorldTilesArray(Any,Any,Any,Any,Any)

๋งค๊ฐœ๋ณ€์ˆ˜: minX (Any), minY (Any), maxX (Any), maxY (Any), map (Any)

๊ฒฐ๊ณผ: dynamic / Any.

ํ˜ธ์ถœ ์‹œ:

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

public InjectionValue GetWorldTilesArray(InjectionValue minX, InjectionValue minY, InjectionValue maxX, InjectionValue maxY, InjectionValue map)

        {

            int firstX = Math.Min(NumberConversions.ToInt(minX), NumberConversions.ToInt(maxX));

            int lastX = Math.Max(NumberConversions.ToInt(minX), NumberConversions.ToInt(maxX));

            int firstY = Math.Min(NumberConversions.ToInt(minY), NumberConversions.ToInt(maxY));

            int lastY = Math.Max(NumberConversions.ToInt(minY), NumberConversions.ToInt(maxY));

            int world = NumberConversions.ToInt(map);

            if (firstX < 0 || firstY < 0 || lastX > ushort.MaxValue || lastY > ushort.MaxValue

                || world < 0 || world > byte.MaxValue)

                throw new NativeSubrutineException("World tile coordinates must be 0..65535 and the map must be 0..255.");

            if (((long)lastX - firstX + 1) * ((long)lastY - firstY + 1) > 1_000_000L)

                throw new NativeSubrutineException("World tile array is limited to 1,000,000 cells per call.");

            // Live world items have no per-result map field. Never combine the

            // current world's items with a request for a different map, or scan

            // every cell only to report the same unloaded-map failure repeatedly.

            if (world != bridge.WorldNumber)

                return new InjectionValue(Array.Empty<InjectionValue>());



            var result = new List<InjectionValue>();

            for (int cellX = firstX; cellX <= lastX; cellX++)

            for (int cellY = firstY; cellY <= lastY; cellY++)

            {

                InjectionValue cell = BuildWorldCell(cellX, cellY, world, false);

                if (cell.Kind == InjectionValueKind.Array)

                    result.AddRange(cell.Array);

            }



            foreach (int serial in bridge.GetWorldItems() ?? Array.Empty<int>())

            {

                int objectX = bridge.GetX(serial);

                int objectY = bridge.GetY(serial);

                if (objectX >= firstX && objectX <= lastX && objectY >= firstY && objectY <= lastY)

                    result.Add(BuildWorldTileRecord("object", serial, bridge.GetGraphics(serial), objectX, objectY,

                        bridge.GetZ(serial), bridge.GetColor(serial), 1));

            }

            return new InjectionValue(result.ToArray());

        }

UO.GetX

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

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

int UO.GetX();
int UO.GetX(object? id);

๋กœ๋“œ๋œ ๊ฐœ์ฒด ๋˜๋Š” ํ˜„์žฌ ๋ฌธ์ž์˜ X ํ•„๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • id๋Š” graphic/type๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ์ฒด์˜ Serial/ID์ž…๋‹ˆ๋‹ค. ์ˆซ์ž, 16์ง„์ˆ˜ ๋ฌธ์ž์—ด, ํ‘œ์ค€ ์ด๋ฆ„ self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse ๋˜๋Š” ์ด๋ฆ„ AddObject. ๋ณ„์นญ์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์กด์žฌ ์—ฌ๋ถ€๋Š” Exists๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๋“ฑ๋ก ์–‘์‹์€ self์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int โ€” ์ขŒํ‘œ X. ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ 0๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. 0๋„ ์œ ํšจํ•œ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. ์›”๋“œ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ ์…€ ๋‹จ์œ„๋กœ ์ธก์ •๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ™”๋ฉด ํ”ฝ์…€์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ํด๋ผ์ด์–ธํŠธ์— ์ด๋ฏธ ์•Œ๋ ค์ง„ ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ์š”์ฒญ์ด ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด์™€ ์•„์ง ๊ฒ€์ƒ‰๋˜์ง€ ์•Š์€ ์†์„ฑ์€ null/๋นˆ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Exists์™€ ํŠน์ • ๋™์ž‘์˜ ์กฐ๊ฑด์„ ํ™•์ธํ•˜์„ธ์š”.
  • ์ง€์ƒ์— ์žˆ๋Š” ์บ๋ฆญํ„ฐ๋‚˜ ๋ฌผ์ฒด์˜ ๊ฒฝ์šฐ ์ด๋Š” ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ํ•ญ๋ชฉ์€ ๊ฒ€ํ”„ ๋‚ด๋ถ€์˜ X/Y ์œ„์น˜๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋ช…๋ น์€ ์ด๋ฅผ ์†Œ์œ ์ž์˜ ์„ธ๊ณ„ ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฌผ์ฒด์˜ ํ˜„์žฌ ์ขŒํ‘œ๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค. ๋ณด๋ฅ˜ ์ค‘์ธ ๋‹จ๊ณ„๋Š” ์ด ๋ช…๋ น์— ์˜ํ•ด ๊ฒฝ๋กœ ๊ณ„์‚ฐ์œผ๋กœ ๋ณ€ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ .csx

int x = UO.GetX();
UO.Print($"X = {x}");

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

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

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

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

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

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

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

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜•์‹์€ ํ˜„์žฌ ๋ฌธ์ž์ธ self๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ์œ„์น˜์— serial์ด ์•„๋‹Œ X ์ขŒํ‘œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
var position = UO.GetX();
UO.Print("X: " + Convert.ToString(position));

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

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

  • lasttarget๋Š” ์ง€๋ฉด์— ๋กœ๋“œ๋œ ์บ๋ฆญํ„ฐ๋‚˜ ์•„์ดํ…œ์„ ๋‚˜ํƒ€๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ธํƒ€ - ํ•œ ์ถ•์„ ๋”ฐ๋ฅธ ์ฐจ์ด์ž…๋‹ˆ๋‹ค. ๊ฒฝ๋กœ์˜ ๊ธธ์ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ’์€ ์Œ์ˆ˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var other = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(other)))
    {
        var delta = UO.GetX(other) - UO.GetX();
        UO.Print("Difference: " + Convert.ToString(delta));
    }

    return null;
}

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

3. ํฌ์ธํŠธ๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ๋‚˜์ค‘์— ๋น„๊ตํ•˜์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.GetX("self");
        await Delay(500);
        var after = UO.GetX("self");
        if (Truth(before != after))
        {
            UO.Print("Coordinate changed");
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetX() โ€” UO.GetX()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetX() => GetX("self");

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

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

๊ฒฐ๊ณผ: int / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "getx": return new InjectionValue(bridge.GetX(Arg(0, bridge.Self)));

UO.GetX(id) โ€” UO.GetX(Integer)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetX(int id) => bridge.GetX(id);

UO.GetX(id) โ€” UO.GetX(String)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetX(string id) => GetX(GetObject(id));

UO.GetY

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

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

int UO.GetY();
int UO.GetY(object? id);

๋กœ๋“œ๋œ ๊ฐœ์ฒด ๋˜๋Š” ํ˜„์žฌ ๋ฌธ์ž์˜ Y ํ•„๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

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

  • id๋Š” graphic/type๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ์ฒด์˜ Serial/ID์ž…๋‹ˆ๋‹ค. ์ˆซ์ž, 16์ง„์ˆ˜ ๋ฌธ์ž์—ด, ํ‘œ์ค€ ์ด๋ฆ„ self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse ๋˜๋Š” ์ด๋ฆ„ AddObject. ๋ณ„์นญ์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์กด์žฌ ์—ฌ๋ถ€๋Š” Exists๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๋“ฑ๋ก ์–‘์‹์€ self์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

int โ€” ์ขŒํ‘œ Y. ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ 0๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. 0๋„ ์œ ํšจํ•œ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. ์›”๋“œ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ ์…€ ๋‹จ์œ„๋กœ ์ธก์ •๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ™”๋ฉด ํ”ฝ์…€์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ž‘

  • ํด๋ผ์ด์–ธํŠธ์— ์ด๋ฏธ ์•Œ๋ ค์ง„ ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ์š”์ฒญ์ด ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด์™€ ์•„์ง ๊ฒ€์ƒ‰๋˜์ง€ ์•Š์€ ์†์„ฑ์€ null/๋นˆ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Exists์™€ ํŠน์ • ๋™์ž‘์˜ ์กฐ๊ฑด์„ ํ™•์ธํ•˜์„ธ์š”.
  • ์ง€์ƒ์— ์žˆ๋Š” ์บ๋ฆญํ„ฐ๋‚˜ ๋ฌผ์ฒด์˜ ๊ฒฝ์šฐ ์ด๋Š” ์„ธ๊ณ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ํ•ญ๋ชฉ์€ ๊ฒ€ํ”„ ๋‚ด๋ถ€์˜ X/Y ์œ„์น˜๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋ช…๋ น์€ ์ด๋ฅผ ์†Œ์œ ์ž์˜ ์„ธ๊ณ„ ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฌผ์ฒด์˜ ํ˜„์žฌ ์ขŒํ‘œ๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค. ๋ณด๋ฅ˜ ์ค‘์ธ ๋‹จ๊ณ„๋Š” ์ด ๋ช…๋ น์— ์˜ํ•ด ๊ฒฝ๋กœ ๊ณ„์‚ฐ์œผ๋กœ ๋ณ€ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ .csx

int y = UO.GetY();
UO.Print($"Y = {y}");

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

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

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

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

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

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

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

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

  • ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ํ˜•์‹์€ ํ˜„์žฌ ๋ฌธ์ž์ธ self๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ์œ„์น˜์— serial์ด ์•„๋‹Œ Y ์ขŒํ‘œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
var position = UO.GetY();
UO.Print("Y: " + Convert.ToString(position));

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

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

  • lasttarget๋Š” ์ง€๋ฉด์— ๋กœ๋“œ๋œ ์บ๋ฆญํ„ฐ๋‚˜ ์•„์ดํ…œ์„ ๋‚˜ํƒ€๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ธํƒ€ - ํ•œ ์ถ•์„ ๋”ฐ๋ฅธ ์ฐจ์ด์ž…๋‹ˆ๋‹ค. ๊ฒฝ๋กœ์˜ ๊ธธ์ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ’์€ ์Œ์ˆ˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return  RunScenario();
 object? RunScenario()
{
    var other = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(other)))
    {
        var delta = UO.GetY(other) - UO.GetY();
        UO.Print("Difference: " + Convert.ToString(delta));
    }

    return null;
}

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

3. ํฌ์ธํŠธ๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ๋‚˜์ค‘์— ๋น„๊ตํ•˜์„ธ์š” - ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค

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

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

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.GetY("self");
        await Delay(500);
        var after = UO.GetY("self");
        if (Truth(before != after))
        {
            UO.Print("Coordinate changed");
        }

        return null;
    }

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

๋ช…๋ น ๊ตฌํ˜„

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

UO.GetY() โ€” UO.GetY()

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetY() => GetY("self");

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

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

๊ฒฐ๊ณผ: int / Any.

ํ˜ธ์ถœ ์‹œ:

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

case "gety": return new InjectionValue(bridge.GetY(Arg(0, bridge.Self)));

UO.GetY(id) โ€” UO.GetY(Integer)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetY(int id) => bridge.GetY(id);

UO.GetY(id) โ€” UO.GetY(String)

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

๊ฒฐ๊ณผ: int / Integer.

ํ˜ธ์ถœ ์‹œ:

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

public int GetY(string id) => GetY(GetObject(id));
โš ๏ธ **GitHub.com Fallback** โš ๏ธ