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 |
UO.X ยท UO.Y ยท UO.Z ยท UO.GetX ยท UO.GetY ยท UO.GetZ
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
๊ฐ ๋ช ๋ น ์นด๋์๋ ์ง์ ์ฝ๋, ํจ์ ๋ฐ ํด๋์ค ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ๋ค์์ ์ ํ๋ ์งง์ ์๋๋ฆฌ์ค์ ๋๋ค. ์ ํ์ฌํญ๊ณผ ์ ์ฒด ๋ถ์์ด ์นด๋์ ํฌํจ๋์ด ์์ต๋๋ค.
๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
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;๋งค๊ฐ๋ณ์, ๊ฒฐ๊ณผ ๋ฐ ๋ชจ๋ ์๋๋ฆฌ์ค
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;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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โ ID0๋ถํฐ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๋ฐ hue0์ ํจ๊ป ์บ๋ฆญํฐ์ ํ์ฌ ์ขํ์ ์ถ๊ฐํฉ๋๋ค. - 6๊ฐ์ ๋งค๊ฐ๋ณ์ ํธ์ถ์ ์ฃผ์ด์ง graphic, ์ขํ, ๊ณ ๋, hue ๋ฐ ์ง๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ์ ์ถ๊ฐํฉ๋๋ค. ๊ธธ ์ฐพ๊ธฐ๋ ํ์ฑ ์ง๋์ ํด๋ผ์ด์ธํธ ํ์ผ ๋ฐ์ดํฐ์ graphic ํ๋๊ทธ์ ๋ฐ๋ผ์๋ง ์ด๋ฅผ ๊ณ ๋ คํฉ๋๋ค.
์ด๋ฌํ ํญ๋ชฉ์ ์คํฌ๋ฆฝํธ ํด๋ผ์ด์ธํธ์ ๋ก์ปฌ์ ๋๋ค. ๊ฒ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฑฐ๋, ๋คํธ์ํฌ๋ฅผ ์์ฒญํ๊ฑฐ๋, ์ค๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ์ง๋์ ์บ๋ฆญํฐ ์์น์ ์ซ์ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: staticItem (Any), worldNum (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1, bridge.WorldNumber). -
InjectionScript.Runtime.NumberConversions.TryStr2Int:NumberConversions.TryStr2Int(arguments[0].String, out graphic). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.AddUserStatic:AddUserStatic(graphic, bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), bridge.GetZ(bridge.Self), 0, map). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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));
}๋งค๊ฐ๋ณ์: graphic (Any), x (Any), y (Any), z (Any), hue (Any), map (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.Register [AddUserStatic]. -
InjectionScript.Runtime.InjectionApiUO.AddUserStatic: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])). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[0]).
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ 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])))ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฉ ๊ฐ๋ฅํ 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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ด์ ์ ์ ๋์ด์ ํฌ์์จ์ ๋ก์ปฌ ๋งต์์ ์ฝํ์ง๋๋ค.
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;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ถ์ 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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.CheckPortableLineOfSight:CheckPortableLineOfSight(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), Arg(5), Arg(6)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "checklos": return new InjectionValue(CheckPortableLineOfSight(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), Arg(5), Arg(6)) ? 1 : 0);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
void UO.ClearUserStatics();๋ชจ๋ ์ฌ์ฉ์ ์ ์ ๋ฐํ์ ํญ๋ชฉ๊ณผ ๋ก์ปฌ ์ ์ ๊ด๋ฆฌ์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
void - ๋ฐํ ๊ฐ์ด ์์ต๋๋ค.
- State.UserStatics ๋ฐ ๊ด๋ฆฌ์ ๊ฐ์ฒด๊ฐ ์ง์์ง๋๋ค. ์ ๋ก๋๋ ๋งต ํ์ผ๊ณผ ์ค์ ์๋ฒ ์์ดํ ์ ์ญ์ ๋์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
๋ช ๋ น์ ๋ ๋ฆฝ๋ ๋ฌธ์ ๋๋ค. ์์ ๋ฉ์์ง๋ ํธ์ถ ์์์ ๋ํ๋ด๋ฉฐ ์๋ฒ ๋์์ ์๋ฃ๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
UO.Print("Calling UO.ClearUserStatics");
UO.ClearUserStatics();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ชจ๋ ์ฌ์ฉ์ ์ ์ ๋ฐํ์ ํญ๋ชฉ๊ณผ ๋ก์ปฌ ์ ์ ๊ด๋ฆฌ์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
UO.ClearUserStatics();๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ์ ์ ๋ก์ปฌ ์ ์ ์ ์ถ๊ฐํ ๋ค์ ๋ชจ๋ ์ฌ์ฉ์ ์ ์ ์ ์ ์ ์ ๊ฑฐํฉ๋๋ค.
return RunScenario();
object? RunScenario()
{
var localStatic = UO.AddUserStatic(0x0CCA, UO.GetX(), UO.GetY(), UO.GetZ(), 0, UO.WorldNum());
UO.ClearUserStatics();
return null;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋น ์ธํธ๋ฅผ ์ง์ฐ๋ ๊ฒ์ ํ์ฉ๋๋ฉฐ ์ ์ค์ ์ ์์ฑํ์ง ์์ต๋๋ค.
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: void / Unit.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClearUserStatics:bridge.ClearUserStatics().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "clearuserstatics": state.UserStatics.Clear(); bridge.ClearUserStatics(); return InjectionValue.Unit;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ๋นํธ ํ์ผ ๋ฐ์ดํฐ ๊ณ์ฝ์ ์ ๊ณตํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ง์คํฌ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ฐฐ์ด์๋ ์ ํํ ๋ง์คํฌ์ ์ค์ ์ด๋ฆ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ทธ๋ฃน 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: group (Any), value (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ConvertTileFlags:bridge.ConvertTileFlags(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "convertintegertoflags":
return new InjectionValue(bridge.ConvertTileFlags(Arg(0), Arg(1))
.Select(flag => new InjectionValue(flag)).ToArray());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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)). ์ ์ ๋ค์ ์ ๋ ฌํด๋ ๊ฒฐ๊ณผ๋ ๋์ผํฉ๋๋ค. ์ด๊ฒ์ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ๋ ์๋๊ณ , ์ฐจ์ด์ ํฉ๋ ์๋๊ณ , ์ฅ์ ๋ฌผ์ ๋ ๋์ ๊ฑธ์ ์๋ ์๋๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.Dist(100, 100, 103, 104);
UO.Print("Dist: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- (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);๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- (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;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: xfrom (Any), yfrom (Any), xto (Any), yto (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.GetDistance:GetDistance(Arg(0), Arg(1), Arg(2), Arg(3)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDistance:bridge.GetDistance(Arg(0)).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "dist": return new InjectionValue(arguments.Length >= 4
? GetDistance(Arg(0), Arg(1), Arg(2), Arg(3))
: bridge.GetDistance(Arg(0)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๊ฐ ํ์ํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค. ๋ฒฝ์ ์ค์ ๊ฒฝ๋ก๋ฅผ ๋ ๊ธธ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetDistance("lasttarget");
UO.Print("GetDistance: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์์ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;
}๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ๊ฐ์ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDistance:bridge.GetDistance(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getdistance": return new InjectionValue(bridge.GetDistance(Arg(0)));๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDistance:bridge.GetDistance(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetDistance(int id) => bridge.GetDistance(id);๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
InjectionScript.Runtime.InjectionApiUO.GetDistance:GetDistance(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetDistance(string id) => GetDistance(GetObject(id));๋งค๊ฐ๋ณ์: x (Integer), y (Integer)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
InjectionScript.Runtime.InjectionApiUO.GetDistance:GetDistance(bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), x, y). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetDistance(int x, int y) => GetDistance(bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), x, y);๋งค๊ฐ๋ณ์: id1 (Any), x2 (Any), y2 (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(obj1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(obj1). -
InjectionScript.Runtime.InjectionApiUO.GetDistance:GetDistance(x1, y1, NumberConversions.ToInt(x2), NumberConversions.ToInt(y2)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x2).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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));
}๋งค๊ฐ๋ณ์: 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);
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ์ธ๊ณ ๊ณ ๋๋ฅผ ์๋ฏธํฉ๋๋ค. ๋ ์ด์ด๋ ํ์ผ๋ฐ์ดํฐ์ ์ฅ๋น ์์ฑ์ด๊ณ ์ธ๋ฑ์ค๋ ์ ํญ๋ชฉ์ ์ผ๋ จ๋ฒํธ์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์ผํ ์ขํ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: x (Any), y (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetLandTileAt. -
InjectionScript.Runtime.InjectionApiUO.GetLandTileAt:GetLandTileAt(x, y, new InjectionValue(bridge.WorldNumber)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public InjectionValue GetLandTileAt(InjectionValue x, InjectionValue y)
=> GetLandTileAt(x, y, new InjectionValue(bridge.WorldNumber));๋งค๊ฐ๋ณ์: x (Any), y (Any), map (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetLandTileAt. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLandscapeTile:bridge.GetLandscapeTile(cellX, cellY, world). -
InjectionScript.Runtime.InjectionApiUO.BuildWorldTileRecord:BuildWorldTileRecord("land", 0, land[0], cellX, cellY, land[1], 0, 0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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>());
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๊ฐ ์๋ ํญ๋ชฉ์ด ํ์ํ์ง ์์ต๋๋ค. ํ๋๊ทธ๋ ๋ฆฌ์์ค๋ฅผ ์ค๋ช ํฉ๋๋ค. ๊ฒฐ๊ณผ๋ ์ ์ฒด ๊ฒฝ๋ก ํ์ธ์ ๋์ฒดํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetLandTileData(0x0003);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ผ์ ์ ํํ ํ ์ด๋ธ์ ์ซ์ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: tile (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.BuildTileData:BuildTileData(0, Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getlandtiledata":
return BuildTileData(0, Arg(0));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ์ ๋จ์๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ทจ์๋ ์๋น ์ฌ์ด์ ํ์ธ๋ฉ๋๋ค. ๋ณต์กํ ์ ์ด๋ ์ฝ๋ ์ฝ๊ธฐ๋ ์์ฐ์ ์ด๊ณผํ ์ ์์ต๋๋ค. ๋์ ์์ญ์ ๋๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฑ ์ ์ฝ๋ ๋์ ์ธ์์ ๋ฐ๋ ์ ์๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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 ์์ญ์ ํฐ ๊ฐ๋์์ ์์ ๊ฐ๋๋ก ์ด๋๋ฉ๋๋ค. ์๊ณ ๋ฆฌ์ฆ ์์ฒด๋ ๊ฒฝ๊ณ๋ฅผ ์ ๊ทํํฉ๋๋ค. ํ - ํ๋์ ๋ ์ฝ๋; 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๋ฒ์ ๊ฒ์์ด ๊ฐ๋ฅํฉ๋๋ค. ์๋ ์ฌ์ด 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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.FindPortableTiles:FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, false). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getlandtilesarray":
return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, false);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ์ ๋จ์๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ทจ์๋ ์๋น ์ฌ์ด์ ํ์ธ๋ฉ๋๋ค. ๋ณต์กํ ์ ์ด๋ ์ฝ๋ ์ฝ๊ธฐ๋ ์์ฐ์ ์ด๊ณผํ ์ ์์ต๋๋ค. ๋์ ์์ญ์ ๋๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฑ ์ ์ฝ๋ ๋์ ์ธ์์ ๋ฐ๋ ์ ์๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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 ์์ญ์ ํฐ ๊ฐ๋์์ ์์ ๊ฐ๋๋ก ์ด๋๋ฉ๋๋ค. ์๊ณ ๋ฆฌ์ฆ ์์ฒด๋ ๊ฒฝ๊ณ๋ฅผ ์ ๊ทํํฉ๋๋ค. ํ - ํ๋์ ๋ ์ฝ๋; 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๋ฒ์ ๊ฒ์์ด ๊ฐ๋ฅํฉ๋๋ค. ์๋ ์ฌ์ด 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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.FindPortableTiles:FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), false). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::ArrayArg:ArrayArg(5).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getlandtilesarrayex":
return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), false);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ์ธ๊ณ ๊ณ ๋๋ฅผ ์๋ฏธํฉ๋๋ค. ๋ ์ด์ด๋ ํ์ผ๋ฐ์ดํฐ์ ์ฅ๋น ์์ฑ์ด๊ณ ์ธ๋ฑ์ค๋ ์ ํญ๋ชฉ์ ์ผ๋ จ๋ฒํธ์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: x (Any), y (Any), map (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetLandscapeTile. -
InjectionScript.Runtime.InjectionApiUO.ToArray:ToArray(bridge.GetLandscapeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map))). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLandscapeTile:bridge.GetLandscapeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public InjectionValue GetLandscapeTile(InjectionValue x, InjectionValue y, InjectionValue map)
=> ToArray(bridge.GetLandscapeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ํด๋นํฉ๋๋ค. ์ด ํด๋ผ์ด์ธํธ์๋ ๋์ ํญ๋ชฉ๊ณผ ๋ค์ค ๋ถํ์ด ํฌํจ๋์ด ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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๋ ๋ ผ๋ฆฌ์ ์ธ ์ฑ๊ณต์ด ์๋๋ผ ํ๋์ ํญ๋ชฉ์ ์๋ฏธํฉ๋๋ค.
var count = UO.GetLayerCount(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print("Tile records: " + Convert.ToString(count));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ธฐ๋ก์ด ์๋ค๊ณ ํด์ ํ ์ง์ ํตํ์ด ์ฆ๋ช ๋๋ ๊ฒ์ ์๋๋๋ค. ๋ น์์ด ์๋ค๊ณ ํด์ ๊ทธ๊ฒ์ด ๋ฒฝ์ด๋ผ๋ ๊ฒ์ ์ฆ๋ช ํ๋ ๊ฒ๋ ์๋๋ค.
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ์ ์๋์ ์๋ ํ์ฌ ์ ๊ณผ ์ฃผ๋ณ ์ ์ ํ์ธํฉ๋๋ค. ๋ ์ด์ด ์๋ ๋์ด๋ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: x (Any), y (Any), worldNum (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticTiles:bridge.GetStaticTiles(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๋ ์ ํจํ ๋ฐ์ดํฐ์ผ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ ์์์ ํ์ธํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋ ๋ฒ์งธ ํธ์ถ์ ๋ชจ๋ ๋์ผํ ์นด๋๋ฅผ ์ฌ์ฉํ์ฌ ๋์ชฝ์ ์ฌ๊ฐํ์ ์ฝ์ต๋๋ค.
- ์ง๋ฉด ๋์ด์ ์ฐจ์ด๋ ํตํ ๊ฐ๋ฅ์ฑ์ ์ฆ๋ช ํ์ง ์์ต๋๋ค. ๋ฒฝ, ์ ์ฒด ์ฅ์น ๋ฐ ๊ธฐํ ๋ฌผ์ฒด๋ฅผ ๋ณ๋๋ก ํ์ธํฉ๋๋ค.
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: x (Any), y (Any), worldNum (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLandscapeTile:bridge.GetLandscapeTile(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getmapcell":
return new InjectionValue(bridge.GetLandscapeTile(Arg(0), Arg(1), Arg(2))
.Select(value => new InjectionValue(value)).ToArray());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฐ๊ฒฐ์ด ์๋ ค์ง ๊ฒฝ์ฐ์๋ง ํธ์ถ์ด ์ด๋ฃจ์ด์ง๋๋ค. ํ์ธ๊ณผ ์ฝ๊ธฐ ์ฌ์ด์ ์ฐ๊ฒฐ์ด ๋์ด์ง ์ ์์ต๋๋ค. 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ค ์ ๊ณผ ํ๊ฒ ์ ์ ์ขํ๋ ๋ณ๋๋ก ์ ์ก๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ ์ฅ์ ๋ฌผ์ด ์๋๋ผ๋ ์์ ๋์ด์ ๋๋ค. ํต๊ณผ ํ๋๊ทธ๋ ๋ณ๋๋ก 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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsOnline:bridge.IsOnline(). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(4). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CheckWorldStep:bridge.CheckWorldStep(Arg(0), Arg(1), Arg(5), Arg(2), Arg(3), Arg(4)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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));
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ์กด์ฌ๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: objType (Any), hue (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticArt:bridge.GetStaticArt(ResolveType(arguments[0]), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getstaticart":
return new InjectionValue(bridge.GetStaticArt(ResolveType(arguments[0]), Arg(1)).Select(value => new InjectionValue(value)).ToArray());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ์ธ๊ณ ๊ณ ๋๋ฅผ ์๋ฏธํฉ๋๋ค. ๋ ์ด์ด๋ ํ์ผ๋ฐ์ดํฐ์ ์ฅ๋น ์์ฑ์ด๊ณ ์ธ๋ฑ์ค๋ ์ ํญ๋ชฉ์ ์ผ๋ จ๋ฒํธ์ ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๋์ผํ ์ขํ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: x (Any), y (Any), index (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetStaticTileAt. -
InjectionScript.Runtime.InjectionApiUO.GetStaticTileAt:GetStaticTileAt(x, y, new InjectionValue(bridge.WorldNumber), index). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public InjectionValue GetStaticTileAt(InjectionValue x, InjectionValue y, InjectionValue index)
=> GetStaticTileAt(x, y, new InjectionValue(bridge.WorldNumber), index);๋งค๊ฐ๋ณ์: x (Any), y (Any), map (Any), index (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetStaticTileAt. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticTiles:bridge.GetStaticTiles(cellX, cellY, NumberConversions.ToInt(map)). -
InjectionScript.Runtime.InjectionApiUO.BuildWorldTileRecord:BuildWorldTileRecord("static", 0, statics[offset], cellX, cellY, statics[offset + 1], statics[offset + 2], 1).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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>());
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๊ฐ ์๋ ํญ๋ชฉ์ด ํ์ํ์ง ์์ต๋๋ค. ํ๋๊ทธ๋ ๋ฆฌ์์ค๋ฅผ ์ค๋ช ํฉ๋๋ค. ๊ฒฐ๊ณผ๋ ์ ์ฒด ๊ฒฝ๋ก ํ์ธ์ ๋์ฒดํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetStaticTileData(0x0CCA);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ผ์ ์ ํํ ํ ์ด๋ธ์ ์ซ์ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: tile (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.BuildTileData:BuildTileData(1, Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getstatictiledata":
return BuildTileData(1, Arg(0));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ์ ๋ ฌ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์คํ์ ์ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: x (Any), y (Any), map (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetStaticTiles. -
InjectionScript.Runtime.InjectionApiUO.ToArray:ToArray(bridge.GetStaticTiles(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map))). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticTiles:bridge.GetStaticTiles(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public InjectionValue GetStaticTiles(InjectionValue x, InjectionValue y, InjectionValue map)
=> ToArray(bridge.GetStaticTiles(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ด ํฌํจ๋ฉ๋๋ค. ์ก์ ๋ฐ ๋ชจ๋ฐ์ผ์ ํฌํจ๋์ง ์์ต๋๋ค. ์ด๋ ์ ์ ํ์ผ๋ง ์ ํํ๋ ๊ณ ์ ์ ์ธ ์ ํ๋ณด๋ค ๋ ๋์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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 ์์ญ์ ํฐ ๊ฐ๋์์ ์์ ๊ฐ๋๋ก ์ด๋๋ฉ๋๋ค. ์๊ณ ๋ฆฌ์ฆ ์์ฒด๋ ๊ฒฝ๊ณ๋ฅผ ์ ๊ทํํฉ๋๋ค. ํ - ํ๋์ ๋ ์ฝ๋; 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๋ฒ์ ๊ฒ์์ด ๊ฐ๋ฅํฉ๋๋ค. ์๋ ์ฌ์ด 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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.FindPortableTiles:FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, true). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getstatictilesarray":
return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, true);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ด ํฌํจ๋ฉ๋๋ค. ์ก์ ๋ฐ ๋ชจ๋ฐ์ผ์ ํฌํจ๋์ง ์์ต๋๋ค. ์ด๋ ์ ์ ํ์ผ๋ง ์ ํํ๋ ๊ณ ์ ์ ์ธ ์ ํ๋ณด๋ค ๋ ๋์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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 ์์ญ์ ํฐ ๊ฐ๋์์ ์์ ๊ฐ๋๋ก ์ด๋๋ฉ๋๋ค. ์๊ณ ๋ฆฌ์ฆ ์์ฒด๋ ๊ฒฝ๊ณ๋ฅผ ์ ๊ทํํฉ๋๋ค. ํ - ํ๋์ ๋ ์ฝ๋; 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๋ฒ์ ๊ฒ์์ด ๊ฐ๋ฅํฉ๋๋ค. ์๋ ์ฌ์ด 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.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.FindPortableTiles:FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), true). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::ArrayArg:ArrayArg(5).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getstatictilesarrayex":
return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), true);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๋ ์ ํจํ ๋ฐ์ดํฐ์ผ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ ์์์ ํ์ธํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ ๋งค๊ฐ๋ณ์๋ ๋ชจ๋ ์ง๋์ ํ์ฌ ์ ๊ณผ ๊ด๋ จ๋ฉ๋๋ค. 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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฐจ์ด๋ ์ง๊ตฌ์ ๊ฒฝ์ฌ๋ฅผ ๋ํ๋ ๋๋ค. ์ด ์์์๋ ์๋ฌด๊ฒ๋ ์ด๋ํ์ง ์์ผ๋ฉฐ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ์ง๋ ์์ต๋๋ค.
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: x (Any), y (Any), worldNum (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetSurfaceZ:bridge.GetSurfaceZ(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getsurfacez":
return new InjectionValue(bridge.GetSurfaceZ(Arg(0), Arg(1), Arg(2)));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ๋ฐ์ดํฐ์์ ์ฝํ์ง๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒ์ ๋ ์ธ์ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: group (Any), tileId (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetTileFlags. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileFlags:bridge.GetTileFlags(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public InjectionValue GetTileFlags(InjectionValue group, InjectionValue tileId)
=> new InjectionValue(unchecked((int)bridge.GetTileFlags(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId))));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ๋ฐ์ดํฐ์์ ์ฝํ์ง๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetTileHeight(1, 0x0CCA);
UO.Print("GetTileHeight: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- group=1๋ ์ ์ ํ์ผ ๋ฐ์ดํฐ๋ฅผ ์ ํํฉ๋๋ค. tileId=0x0CCA - graphic ํธ๋ฆฌ.
- value์๋ ๋ฐํ ์น์ ์ ์ค๋ช ๋ ๊ฒฐ๊ณผ๊ฐ ํฌํจ๋ฉ๋๋ค. ๊ทธ ์๋ฏธ๋ serial์ ์ผ์นํ์ง ์์ต๋๋ค.
var value = UO.GetTileHeight(1, 0x0CCA);
UO.Print("Tiledata height: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒ์ ๋ ์ธ์ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: group (Any), tileId (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetTileHeight. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileDataProperties:bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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];
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ๋ฐ์ดํฐ์์ ์ฝํ์ง๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetTileLayer(1, 0x0CCA);
UO.Print("GetTileLayer: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒ์ ๋ ์ธ์ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: group (Any), tileId (Any)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetTileLayer. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileDataProperties:bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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];
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ๋ฐ์ดํฐ์์ ์ฝํ์ง๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetTileName(1, 0x0CCA);
UO.Print("GetTileName: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ฒ์ ๋ ์ธ์ 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: group (Any), tileId (Any)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetTileName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileDataName:bridge.GetTileDataName(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetTileName(InjectionValue group, InjectionValue tileId)
=> bridge.GetTileDataName(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ๊ธธ์ด์ ๊ฐ์ต๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ๊ฐ ํญ๋ชฉ์ 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ๋ฑ์ค 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: x (Any), y (Any), map (Any), tileStart (Any), tileEnd (Any), uoPath (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetTileXYM. -
InjectionScript.Runtime.InjectionApiUO.ToArray:ToArray(bridge.GetTileXYM(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), NumberConversions.ToInt(tileStart), NumberConversions.ToInt(tileEnd), uoPath.ToString())). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileXYM:bridge.GetTileXYM(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), NumberConversions.ToInt(tileStart), NumberConversions.ToInt(tileEnd), uoPath.ToString()). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x). -
InjectionScript.Runtime.InjectionValue.ToString:uoPath.ToString().
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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()));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetUserStatic(1);
UO.Print("GetUserStatic: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ ์ฅ๋ ์ฌ์ฉ์ ์ ์ ๋ ์ฝ๋๋ฅผ ์ฝ์ต๋๋ค.
UO.Print(UO.GetUserStatic(1));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: id (Any)
๊ฒฐ๊ณผ: string / String.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetUserStatic. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public string GetUserStatic(InjectionValue id)
=> state.UserStatics.TryGetValue(NumberConversions.ToInt(id), out string value) ? value : string.Empty;ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
dynamic UO.GetUserStatics();์ํ๋ฅผ ์ฝ์ต๋๋ค.UserStatics.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
ID๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋ ๋ฌธ์์ด ๋ฐฐ์ด [id, serializedText]. ๊ฐ ID๋ int, serializedText - string์ ๋๋ค. ๋น ์ฌ์ ์ ๋น ๋ฐฐ์ด์ ์ ๊ณตํฉ๋๋ค.
- ์ํ๋ฅผ ์ฝ์ต๋๋ค.UserStatics. ๊ธฐํํ์ ํ๊ธฐ๋ฒ์ "graphic|x|y|z|hue|map"์ผ๋ก ์ ์ฅ๋ฉ๋๋ค. ์ด์ ํ ์คํธ ํญ๋ชฉ AddUserStatic์ ํ์์ด ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ด๋ ๋ชจ๋ ์ ์ ๋งต์ด ์๋ ๋ก์ปฌ ์ฌ์ฉ์ ํญ๋ชฉ์ ๋๋ค.
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
- ์ผ๋ฐ ํด๋ผ์ด์ธํธ ํธ์คํธ์์ ์ด ์ํ ๋ฐ์ดํฐ๋ GetPersistentState ๊ด๋ฆฌ์์์ ๊ฐ์ ธ์ค๋ฉฐ ๋์ผํ ์๋/ํ๋กํ์ ์คํฌ๋ฆฝํธ/์ฑํ /๋งคํฌ๋ก์ ๊ณตํต๋๋ฉฐ ํ๋์ ์คํฌ๋ฆฝํธ์ ์ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค ๋๋ ๋ช ๋ฐฑํ ๋ณ๋์ InjectionRuntimeState๊ฐ ๋ค๋ฅธ ์ํ๋ฅผ ๊ฐ์ต๋๋ค. ํ๋กํ์ ๋ก๋/์ญ์ ํ๋ฉด ํ๋กํ์ ๋์ฒดํ ์ ์์ต๋๋ค. ์ ์ฅ๋ serial๋ ์ฌ์ ํ ๋ก๋๋ ์ธ๊ณ์ ๋น๊ตํ์ฌ ํ์ธ๋ฉ๋๋ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
object? result = UO.GetUserStatics();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ํ๋ฅผ ์ฝ์ต๋๋ค.UserStatics.
var records = UO.GetUserStatics();
UO.Print(UO.GetArrayLength(records));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ํ๋ฅผ ์ฝ์ต๋๋ค.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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ํ์ฌ ๋ก์ปฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ํจํค์ง, ๋์ ๋๋ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ๊ฐ๋ณ ์ฝ๊ธฐ์์๋ ๋ค๋ฅธ ์ํ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: 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());ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ์ด๊ณผํ๊ฑฐ๋ ์ขํ๋ฅผ ์ง์ ํ๋ฉด ๋ถ๋ถ ๋ฐฐ์ด์ด ์๋ ๋ช ๋ น ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋น๋ฒํ ํด๋ง์ ์ํด์๋ ์์ ์์ญ์ ์ ํํ์ญ์์ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ญ์ ์ปจํ ์ด๋๊ฐ ์๋ ์ขํ๋ก ์ ํ๋ฉ๋๋ค.
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: x (Any), y (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetWorldCell. -
InjectionScript.Runtime.InjectionApiUO.GetWorldCell:GetWorldCell(x, y, new InjectionValue(bridge.WorldNumber)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public InjectionValue GetWorldCell(InjectionValue x, InjectionValue y)
=> GetWorldCell(x, y, new InjectionValue(bridge.WorldNumber));๋งค๊ฐ๋ณ์: x (Any), y (Any), map (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetWorldCell. -
InjectionScript.Runtime.InjectionApiUO.BuildWorldCell:BuildWorldCell(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), true). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public InjectionValue GetWorldCell(InjectionValue x, InjectionValue y, InjectionValue map)
=> BuildWorldCell(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), true);ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
int UO.GetWorldNum();ํด๋ผ์ด์ธํธ ๋ชจ๋ธ์์ ํ์ฌ ์นด๋ ๋ฒํธ๋ฅผ ์ฝ์ต๋๋ค.
๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
int โ ํด๋ผ์ด์ธํธ์ ํ์ฌ ์นด๋ ์์ธ, ์ผ๋ฐ์ ์ผ๋ก 0=Felucca, 1=Trammel, 2=Ilshenar, 3=Malas, 4=Tokuno, 5=Ter Mur. ์ฌ์ฉ์ ์๋ฒ๋ ๋ค๋ฅธ ์นด๋ ์ธํธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. 0๋ ์ค๋ฅ ์งํ๊ฐ ์๋ ๋ณธ๊ฒฉ์ ์ธ ์ง๋์ ๋๋ค.
- ์ด๋ฏธ ์์ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์์ฒญ์ ๊ณต๊ฐ ์ํ๊ฐ ์๋๋ฉฐ ์๋ฒ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ด๋๋ก ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ฌ๋ง, ๋งต ์ ํ ๋๋ ๊ฐ์ฒด ์ญ์ ํ ๋ ํธ์ถ ์ฌ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
- C#์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. ์ ํํ UO ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ซ์ ํ๋๊ทธ๋ 0๊ณผ ๋น๊ตํ๊ณ ๋ฐํ ํ์์ด bool์ผ ๋๋ง bool์ ์ฌ์ฉํ์ธ์.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetWorldNum();
UO.Print("GetWorldNum: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํธ์ถ์ self๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ํ์ฌ ์นด๋ ๋ฒํธ๊ฐ ๊ฐ์ ์ ์ฅ๋ฉ๋๋ค.
- Convert.ToString๋ ์ถ๋ ฅํ ์ซ์๋ฅผ ๋ณํํ๋ฉฐ ๊ฒฐ๊ณผ์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
var value = UO.GetWorldNum();
UO.Print("GetWorldNum: " + Convert.ToString(value));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์ ์์ด ๊ฐ์ ํ ๋ฒ ์ฝ์ต๋๋ค. ํ์๋ ๊ณ์ฐ์ด๋ ์กฐ๊ฑด์๋ ํ์ฌ ์นด๋ ๋ฒํธ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ซ์ ์๊ณ๊ฐ์ ์คํฌ๋ฆฝํธ ์กฐ๊ฑด์ ์์ด๋ฉฐ ์๋ก์ด ํด๋ผ์ด์ธํธ ์ ํ์ด ์๋๋๋ค. ํ๋์๋ ์์ ์ค๋ช ๋ ์๋ฒ ๋จ์ ๋ฐ ์ ํ ์ฌํญ์ด ์ ์ฅ๋ฉ๋๋ค.
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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ๋ ํธ์ถ ๋ชจ๋ ํ์ฌ ๊ฐ์ ์ฝ์ต๋๋ค. 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [GetWorldNum]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
ํธ์ถ ์ ์ ์ฅ๋ ์ฒ๋ฆฌ๊ธฐ delegate๋ฅผ ์คํํฉ๋๋ค. ๋ฑ๋ก ๋ฉ์๋๋ API๋ฅผ ๊ตฌ์ฑํ ๋ ์ด delegate๋ฅผ ๋ง๋ญ๋๋ค.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
() => bridge.WorldNumberAPI ์์ฑ: ์ด ํจ์๋ค์ API๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ช ๋ น์ ํธ์ถํ ๋๋ง๋ค ๋ค์ ์คํ๋์ง ์์ต๋๋ค.
ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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์ ์ด๊ณผํ๊ฑฐ๋ ์ขํ๋ฅผ ์ง์ ํ๋ฉด ๋ถ๋ถ ๋ฐฐ์ด์ด ์๋ ๋ช ๋ น ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋น๋ฒํ ํด๋ง์ ์ํด์๋ ์์ ์์ญ์ ์ ํํ์ญ์์ค.
๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .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));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์์ญ์ ์ปจํ ์ด๋๊ฐ ์๋ ์ขํ๋ก ์ ํ๋ฉ๋๋ค.
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: minX (Any), minY (Any), maxX (Any), maxY (Any), map (Any)
๊ฒฐ๊ณผ: dynamic / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetWorldTilesArray. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(minX). -
InjectionScript.Runtime.InjectionApiUO.BuildWorldCell:BuildWorldCell(cellX, cellY, world, false). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetWorldItems:bridge.GetWorldItems(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(serial). -
InjectionScript.Runtime.InjectionApiUO.BuildWorldTileRecord:BuildWorldTileRecord("object", serial, bridge.GetGraphics(serial), objectX, objectY, bridge.GetZ(serial), bridge.GetColor(serial), 1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetGraphics:bridge.GetGraphics(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetColor:bridge.GetColor(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
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());
}ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ์์น๋ฅผ ๊ฐ์ง๋๋ค. ๋ช ๋ น์ ์ด๋ฅผ ์์ ์์ ์ธ๊ณ ์ขํ๋ก ๋ณํํ์ง ์์ต๋๋ค.
- ๋ฌผ์ฒด์ ํ์ฌ ์ขํ๋ฅผ ์ฝ์ด์ต๋๋ค. ๋ณด๋ฅ ์ค์ธ ๋จ๊ณ๋ ์ด ๋ช ๋ น์ ์ํด ๊ฒฝ๋ก ๊ณ์ฐ์ผ๋ก ๋ณํ๋์ง ์์ต๋๋ค.
int x = UO.GetX();
UO.Print($"X = {x}");๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetX();
UO.Print("GetX: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํ์์ ํ์ฌ ๋ฌธ์์ธ self๋ฅผ ์ ํํฉ๋๋ค.
- ์์น์ serial์ด ์๋ X ์ขํ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
var position = UO.GetX();
UO.Print("X: " + Convert.ToString(position));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetX. -
InjectionScript.Runtime.InjectionApiUO.GetX:GetX("self").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetX() => GetX("self");๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "getx": return new InjectionValue(bridge.GetX(Arg(0, bridge.Self)));๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetX. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetX(int id) => bridge.GetX(id);๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetX. -
InjectionScript.Runtime.InjectionApiUO.GetX:GetX(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetX(string id) => GetX(GetObject(id));ะฃะบัะฐัะฝััะบะฐ ยท ะ ัััะบะธะน ยท English ยท Deutsch ยท Franรงais ยท Italiano ยท Espaรฑol ยท ็น้ซไธญๆ ยท ๆฅๆฌ่ช ยท ํ๊ตญ์ด
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 ์์น๋ฅผ ๊ฐ์ง๋๋ค. ๋ช ๋ น์ ์ด๋ฅผ ์์ ์์ ์ธ๊ณ ์ขํ๋ก ๋ณํํ์ง ์์ต๋๋ค.
- ๋ฌผ์ฒด์ ํ์ฌ ์ขํ๋ฅผ ์ฝ์ด์ต๋๋ค. ๋ณด๋ฅ ์ค์ธ ๋จ๊ณ๋ ์ด ๋ช ๋ น์ ์ํด ๊ฒฝ๋ก ๊ณ์ฐ์ผ๋ก ๋ณํ๋์ง ์์ต๋๋ค.
int y = UO.GetY();
UO.Print($"Y = {y}");๊ฐ ์์ ๋ ๋ณ๋์ ํ์ผ .csx๋ก ์ ์ฅํ๊ณ IDE์์ ์คํํ ์ ์์ต๋๋ค. UO ๊ฐ์ฒด์ ๋๊ธฐ ๊ธฐ๋ฅ์ ํ์ฌ ๊ฒ์ ์ธ์
์ ํธ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ชจ serial ์ด๋ฆ, ์ขํ, ์ฃผ์๋ฅผ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ธ์.
์ด ์ฝ๋๋ฅผ ๋ณ๋์ .csx ํ์ผ๋ก ์คํํ์ธ์. ์ธ์๋ ํธ์ถ์ ์ง์ ํ์๋ฉ๋๋ค. ์์ ์ ์ด๋ฆ, serial, ์ฃผ์๋ฅผ ์์ ์ ๊ฐ์ผ๋ก ๋ฐ๊พธ์ธ์.
ํ ๋ฒ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๋์ ํ์ํฉ๋๋ค. ์ซ์๋ฅผ bool๋ก ๋ณํํ์ง ์์ผ๋ฉฐ, ๋ฐฐ์ด์ด๋ฉด ์์ ์๋ฅผ ํ์ํฉ๋๋ค.
var result = UO.GetY();
UO.Print("GetY: " + Convert.ToString(result));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- ์ธ์๊ฐ ์๋ ํ์์ ํ์ฌ ๋ฌธ์์ธ self๋ฅผ ์ ํํฉ๋๋ค.
- ์์น์ serial์ด ์๋ Y ์ขํ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
var position = UO.GetY();
UO.Print("Y: " + Convert.ToString(position));๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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;๋งค๊ฐ๋ณ์์ ์คํ ํ๋ฆ:
- 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์ ์ฌ์ฉํ์ธ์.
๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetY. -
InjectionScript.Runtime.InjectionApiUO.GetY:GetY("self").
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetY() => GetY("self");๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Any.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
case "gety": return new InjectionValue(bridge.GetY(Arg(0, bridge.Self)));๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetY. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetY(int id) => bridge.GetY(id);๋งค๊ฐ๋ณ์: id (Any/Integer/String)
๊ฒฐ๊ณผ: int / Integer.
ํธ์ถ ์:
-
InjectionScript.Runtime.InjectionApiUO.GetY. -
InjectionScript.Runtime.InjectionApiUO.GetY:GetY(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
๋ด๋ถ ๊ตฌํ ์ฝ๋์ด๋ฉฐ ๋ ๋ฆฝ ์คํฌ๋ฆฝํธ๋ก ์คํํ ์ ์์ต๋๋ค.
public int GetY(string id) => GetY(GetObject(id));