DE UO Topic world geometry - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Home · C# · IDE · UO API · A–Z · Beispiele · Sprachen
Koordinaten, Entfernungen, Sichtlinie, Geländegängigkeit und Kartendaten. Das Abrufen einer Route wird separat in Bewegung beschrieben.
| Thema | Befehle und Erklärungen |
|---|---|
| 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
Jede Befehlskarte verfügt über mehrere unabhängige Szenarien: Direktcode, Funktionen und Klassen. Nachfolgend finden Sie ausgewählte kurze Szenarien; Einschränkungen und eine vollständige Analyse sind geplant.
Parameter, Ergebnis und alle Szenarien
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;Parameter, Ergebnis und alle Szenarien
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);Fügt einen benutzerdefinierten statischen Eintrag zum lokalen Skriptstatus hinzu. Numerisch graphic wird für die lokale Hindernisprüfung durch den Pathfinder verwendet; Das Objekt wird nicht auf dem Server erstellt. Ein Aufruf mit zwei Argumenten und nicht nummeriertem Text behält alte Werte bei und fügt dem Pathfinder keine statische Aufladung hinzu.
-
staticItem– numerischer graphic oder alter Textwert. -
worldNum– Index der Karte für die Aufzeichnung oder lokale Statik. -
graphic- ID Statik von0bis65535. -
z– Höhe. Beim Hinzufügen zum Pathfinder ist der Wert auf den mit byte gekennzeichneten Bereich begrenzt. -
hue- hue; wenn hinzugefügt, begrenzt auf den Bereich von0bis65535. -
map– Kartenindex; Für die Managerverarbeitung ist der Bereich auf0–255begrenzt. -
x– Benutzerdefinierte Statistiken für World X; int. Der Manager akzeptiert Koordinaten innerhalb der aktuell geladenen Karte. -
y– Benutzerdefinierte Statistiken für World Y; int. Der Manager akzeptiert Koordinaten innerhalb der aktuell geladenen Karte.
Positives ID des erstellten Eintrags. Für die Sechs-Parameter-Form führen negative graphic, x, y oder map sowie graphic über 65535 zu -1. ID kann an UO.UserStaticExists, UO.RemoveUserStatic übergeben oder zum Überprüfen/Löschen eines Legacy-Datensatzes verwendet werden. Das zurückgegebene ID allein bestätigt nicht, dass die statische Aufladung sichtbar ist oder auf dem Server angewendet wird.
-
-
UO.AddUserStatic('tree', 0)– datreekeine Zahl ist, speichert ein Paar Originalwerte als Legacy-Datensatz im Laufzeitstatus; Pathfinder verwendet es nicht.
-
- Ein Zwei-Parameter-Aufruf mit dem numerischen graphic fügt die Statik dieses graphic zu den aktuellen Koordinaten des Zeichens hinzu, wobei
zund hue des Zeichens0sind. - Der Sechs-Parameter-Aufruf fügt eine Statik mit dem angegebenen graphic, den Koordinaten, der Höhe, hue und der Karte hinzu. Pathfinding berücksichtigt dies nur auf der aktiven Karte und gemäß den graphic-Flags in den Client-Kacheldaten.
Diese Einträge sind lokal für den Skript-Client: Sie erstellen kein Spielobjekt, stellen keine Netzwerkanfrage und ändern keine Shard-Daten.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.AddUserStatic(0x0CCA, UO.GetWorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));1. Speichern Sie das Paar als Legacy-Daten. Text StaticItem stellt kein Hindernis für den Pfadfinder dar. - direktes Drehbuch
Parameter und Ablauf:
- Speichern Sie das Paar als Legacy-Daten. Text StaticItem stellt kein Hindernis für den Pfadfinder dar.
var legacyId = UO.AddUserStatic("tree", 0);
UO.Print(Convert.ToString(legacyId));2. Der numerische Wert graphic wird zur Position des Zeichens auf der aktuellen Karte hinzugefügt. - Skriptfunktion
Parameter und Ablauf:
- Der numerische Wert graphic wird zur Position des Zeichens auf der aktuellen Karte hinzugefügt.
return RunScenario();
object? RunScenario()
{
var staticId = UO.AddUserStatic(0x0CCA, UO.GetWorldNum());
UO.Print(Convert.ToString(staticId));
return null;
}3. Fügen Sie der angegebenen Position und der angegebenen Karte explizit lokales statisches graphic hinzu. - Skriptklasse
Parameter und Ablauf:
- Fügen Sie der angegebenen Position und der angegebenen Karte explizit lokales statisches graphic hinzu.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: staticItem (Any), worldNum (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
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.
Interner Implementierungscode; kein eigenständiges Skript.
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));
}Parameter: graphic (Any), x (Any), y (Any), z (Any), hue (Any), map (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
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]).
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
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);Überprüft die lokale Passierbarkeit einer Linie zwischen zwei Kartenpunkten über CheckPortableLineOfSight.
-
xfrom– Quelle X: 0..65535. -
yfrom– Quelle Y: 0..65535. -
zfrom– Anfangs-Z, int. -
xto- Ende X: 0..65535. -
yto- Ende Y: 0..65535. -
zto– Finales Z, int. -
worldNum— 0..255. Ein Balken mit einer Länge ungleich Null liest nur die aktuell geladene _world.Map/World.Map: via CheckWorldStep benötigt WorldNum == _world.MapIndex und Live Player.Pathfinder. Eine andere Facette ist nicht geladen oder angefordert; Es gibt keine Karte/Charakter/Pfadfinder oder der Schritt ist nicht verfügbar - 0. Durch das Ausschließen von identischem X/Y wird der gesamte Zellzyklus übersprungen: mit X/Y in 0..65535, WorldNum V 0..255 und abs(Zvon-Zto)<=20 kehrt zurück 1 auch ohne geladene Karte oder mit einer anderen Kartennummer. Dies ist kein Beweis für die Geometrie oder Erreichbarkeit. Das Ergebnis ist lokal, keine Lösung LOS Server.
int 1 – der lokale Strahl hat X/Y erreicht und die endgültige Höhe weicht von Zto um nicht mehr als 20 ab; 0 – ungültige Koordinaten, Hindernisse oder Prüfgrenze.
- Der Strahl bewegt sich nach dem Bresenham-Algorithmus mit maximal 4096 Schritten. In jeder Zelle werden BadLocations, CheckWorldStep und die zurückgegebene Höhe berücksichtigt.
- Bei LosOptions != 0 wird zusätzlich CheckLosCell verwendet; Bit 0x100 prüft beide Seitenquadrate der Diagonale. Die lokale Geometrieprüfung validiert keine serverspezifischen LOS-Regeln und verschiebt nichts.
- Minor byte (Wert & 0xFF) wählt Algorithmus 1..4; andere Werte des Moll-byte in CheckLosCell verwenden den 3-Algorithmus. Die Algorithmen 1/2 blockieren Mauer und unpassierbar, 3 zusätzlich NoShoot und 4 aktiviert NoShoot nur mit 0x200 und erlaubt Fensterhindernisse nur mit 0x400. Bit 0x100 überprüft zusätzlich beide Seitenzellen jedes diagonalen Strahlschritts für jeden ausgewählten Algorithmus. value=0 deaktiviert die zusätzlichen CheckLosCell/Diagonalprüfungen, BadLocations und CheckWorldStep bleiben jedoch bestehen. Zum Beispiel wählt 4+0x100+0x200+0x400 Benutzerdefiniert mit drei Flags aus; Setter behält den ursprünglichen int bei, nicht den normalisierten Algorithmus.
- Ein Balken mit einer Länge ungleich Null liest nur die aktuell geladene _world.Map/World.Map: via CheckWorldStep benötigt WorldNum == _world.MapIndex und Live Player.Pathfinder. Eine andere Facette ist nicht geladen oder angefordert; Es gibt keine Karte/Charakter/Pfadfinder oder der Schritt ist nicht verfügbar - 0. Durch das Ausschließen von identischem X/Y wird der gesamte Zellzyklus übersprungen: mit X/Y in 0..65535, WorldNum V 0..255 und abs(Zvon-Zto)<=20 kehrt zurück 1 auch ohne geladene Karte oder mit einer anderen Kartennummer. Dies ist kein Beweis für die Geometrie oder Erreichbarkeit. Das Ergebnis ist lokal, keine Lösung LOS Server.
- CheckLosCell umgeht das geladene Land/Static/Multi/Item einer Zelle. Unpassierbare Landblöcke mit abs(rayZ-land.Z)<=20. Die Static/Multi/Item-Flags sind nur im Bereich Tile.Z-2 . gültig. Tile.Z+max(1,Height)+2; Das zulässige benutzerdefinierte Fenster wird übersprungen, bis „Wand/Unpassierbar/NoShoot“ aktiviert ist. X/Y-Strahl verwendet Bresenham, maximale 4096 Schritte; Z wird von Flächen CheckWorldStep genommen, nicht auf Zto interpoliert, die endgültige Höhentoleranz beträgt 20.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
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));Parameter und Ablauf:
- Identische Punkte verlaufen innerhalb akzeptabler X/Y/Karte.
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));Parameter und Ablauf:
- Die Höhe und Durchlässigkeit der Nachbarzelle werden aus der lokalen Karte abgelesen.
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;
}Parameter und Ablauf:
- Ein negatives X wird mit dem Ergebnis 0 abgelehnt, ohne die Karte zu durchlaufen.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
UO.CheckLOS(xfrom, yfrom, zfrom, xto, yto, zto, worldNum) — UO.CheckLOS(Any,Any,Any,Any,Any,Any,Any)
Parameter: xfrom (Any), yfrom (Any), zfrom (Any), xto (Any), yto (Any), zto (Any), worldNum (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
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).
Interner Implementierungscode; kein eigenständiges Skript.
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();Entfernt alle statischen Benutzerlaufzeiteinträge und lokalen statischen Managerobjekte.
Es gibt keine Parameter.
void – kein Rückgabewert.
- State.UserStatics und Managerobjekte werden gelöscht. Hochgeladene Kartendateien und echte Serverelemente werden nicht gelöscht.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Der Befehl steht in einer eigenen Anweisung. Die Meldung davor zeigt den Beginn des Aufrufs und bestätigt keine Serveraktion.
UO.Print("Calling UO.ClearUserStatics");
UO.ClearUserStatics();Parameter und Ablauf:
- Entfernt alle statischen Benutzerlaufzeiteinträge und lokalen statischen Managerobjekte.
UO.ClearUserStatics();Parameter und Ablauf:
- Fügen Sie der aktuellen Zelle eine lokale Statik hinzu und entfernen Sie dann alle benutzerdefinierten Statiken.
return RunScenario();
object? RunScenario()
{
var localStatic = UO.AddUserStatic(0x0CCA, UO.GetX(), UO.GetY(), UO.GetZ(), 0, UO.WorldNum());
UO.ClearUserStatics();
return null;
}Parameter und Ablauf:
- Das Löschen eines leeren Satzes ist akzeptabel und erstellt keine neue Einstellung.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: void / Unit.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClearUserStatics:bridge.ClearUserStatics().
Interner Implementierungscode; kein eigenständiges Skript.
case "clearuserstatics": state.UserStatics.Clear(); bridge.ClearUserStatics(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.ConvertIntegerToFlags(object? group, object? value);Analysiert eine numerische Maske von Kachelflags in ein Array von Aufzählungsnamen TileFlag.
-
group– int: nur 1 oder 2 ermöglichen die Konvertierung; Jeder andere Wert führt zu einem leeren Array. -
value– Eine Maske, die Arg in ein vorzeichenbehaftetes 32-Bit int umwandelt, dann führt die Brücke zu ulong. Für Flags mit hohem 64-Bit behält diese Form nicht die vollständige Maske bei.
Array von Zeichenfolgen mit dem Namen ungleich Null TileFlag, deren Bits vollständig in der Maske vorhanden sind. Die Maske 0 erzeugt ein leeres Array.
- Die Gruppen 1 und 2 verwenden dieselbe Enum.GetValues und nicht unterschiedliche Verzeichnisse. Dies ist eine lokale Maskentransformation; Kacheldaten werden nicht angefordert.
- Die API-Registrierung verwendet object?, aber der Arg(1)-Dispatcher sendet int. Das negative int-Zeichen wird erweitert, wenn es in ulong umgewandelt wird. GetTileFlags gibt außerdem nur die niedrigen 32-Bits mit Vorzeichen zurück. int: Dieses kompatible Paar stellt nicht den vollständigen 64-Bit-Kacheldatenvertrag bereit.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.ConvertIntegerToFlags(1, 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- In der Maske 0 ist kein Flag ungleich Null vorhanden.
var flags = UO.ConvertIntegerToFlags(1,0);
UO.Print(Convert.ToString(ArrayLength(flags)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Parameter und Ablauf:
- Das Array enthält die echten Namen TileFlag der ausgewählten Maske.
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;Parameter und Ablauf:
- Gruppe 0 wird von diesem Befehl nicht akzeptiert und gibt ein leeres Array zurück.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: group (Any), value (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ConvertTileFlags:bridge.ConvertTileFlags(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
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);Berechnet den Abstand in Zellen zwischen zwei Weltpunkten: der größte der absoluten Unterschiede zwischen X und Y.
-
xfrom— X-Koordinate des Startpunkts. -
yfrom— Y-Koordinate des Startpunkts. -
xto– X-Koordinate des Ziels. -
yto– Y-Koordinate des Ziels.
int – Abstand in Zellen, nicht negativ für gültige Koordinaten. 0 bedeutet dasselbe XY, 1 – eine Zelle. Dies ist eine Menge, kein Zeichen für Erfolg. Ein separater Vergleichsabstand <= 2 gibt bool true oder false zurück; der Abstand selbst bleibt int.
- Nur Koordinaten berechnen: keine Stapel, kein Warten, kein Laden der Karte, keine Hindernisprüfung, kein Z, keine Weltkarte. Das Team sucht nicht nach einer passierbaren Route und übernimmt keine Garantie für das Erreichen des Ziels. Die Punkte müssen zum selben Koordinatensystem gehören; Das Vermeiden von Hindernissen kann den Weg verlängern.
- Alle vier Parameter werden benötigt. Senden Sie Weltkoordinaten int im dokumentierten Bereich 0..65535. object? in der Signatur weist auf einen Universaladapter hin, nicht auf den ID des Artikels. Diese Befehle haben keine Standardwerte, keine Koordinaten innerhalb der Truhe, kein fünftes Z und keine Überladung mit einem Objekt.
- Formel: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). Wenn Sie die Punkte neu anordnen, ist das Ergebnis dasselbe. Dabei handelt es sich nicht um die euklidische Distanz, nicht um die Summe der Differenzen und nicht um die Anzahl der Schritte beim Umgehen eines Hindernisses.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.Dist(100, 100, 103, 104);
UO.Print("Dist: " + Convert.ToString(result));Parameter und Ablauf:
- Von (100,100) bis (103,104): Die absoluten Unterschiede betragen 3 und 4, mit einem Maximum von 4. Main gibt int 4 zurück.
- int – Abstand in Zellen, nicht negativ für gültige Koordinaten. 0 bedeutet dasselbe XY, 1 – eine Zelle. Dies ist eine Menge, kein Zeichen für Erfolg. Ein separater Vergleichsabstand <= 2 gibt bool true oder false zurück; der Abstand selbst bleibt int.
- Formel: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). Wenn Sie die Punkte neu anordnen, ist das Ergebnis dasselbe. Dabei handelt es sich nicht um die euklidische Distanz, nicht um die Summe der Differenzen und nicht um die Anzahl der Schritte beim Umgehen eines Hindernisses.
return UO.Dist(100,100,103,104);Parameter und Ablauf:
- Von (100,100) bis (101,99) beträgt der Abstand 1. Ein separater Vergleich der Distanz<=2 ergibt true=1. Main gibt „1:1“ zurück: Die erste Einheit ist die Distanz, die zweite das logische Ergebnis des Vergleichs.
- int – Abstand in Zellen, nicht negativ für gültige Koordinaten. 0 bedeutet dasselbe XY, 1 – eine Zelle. Dies ist eine Menge, kein Zeichen für Erfolg. Ein separater Vergleichsabstand <= 2 gibt bool true oder false zurück; der Abstand selbst bleibt int.
- Formel: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). Wenn Sie die Punkte neu anordnen, ist das Ergebnis dasselbe. Dabei handelt es sich nicht um die euklidische Distanz, nicht um die Summe der Differenzen und nicht um die Anzahl der Schritte beim Umgehen eines Hindernisses.
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;
}Parameter und Ablauf:
- UO.Dist gibt 4 zurück. RebuildTileDistance berechnet die Differenzen über Abs, vergleicht sie und gibt den größeren zurück, ebenso 4. Main gibt „4:4“ zurück. Der Assistent wird im Beispiel vollständig dargestellt und ist kein weiterer Motorbefehl.
- int – Abstand in Zellen, nicht negativ für gültige Koordinaten. 0 bedeutet dasselbe XY, 1 – eine Zelle. Dies ist eine Menge, kein Zeichen für Erfolg. Ein separater Vergleichsabstand <= 2 gibt bool true oder false zurück; der Abstand selbst bleibt int.
- Formel: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). Wenn Sie die Punkte neu anordnen, ist das Ergebnis dasselbe. Dabei handelt es sich nicht um die euklidische Distanz, nicht um die Summe der Differenzen und nicht um die Anzahl der Schritte beim Umgehen eines Hindernisses.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: xfrom (Any), yfrom (Any), xto (Any), yto (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
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)).
Interner Implementierungscode; kein eigenständiges Skript.
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);Misst den Abstand in Zellen basierend auf den maximalen X/Y-Unterschieden. Dies ist eine geometrische Schätzung ohne Wegfindung.
-
id– Ein Argument: serial oder der Alias des geladenen Objekts, die Entfernung, die Sie erreichen möchten. -
x– Zwei Argumente: Weltziel. Der Anfang ist GetX(self), GetY(self). -
y– Zwei Argumente: Weltziel. Der Anfang ist GetX(self), GetY(self). -
id1– In Form mit drei Argumenten – serial/Alias des Objekts, dessen Koordinaten als Ursprung dienen. -
x1– In Form von vier Argumenten die Koordinaten des Ursprungs. Für dieses Formular wird kein Objekt benötigt. -
y1– In Form von vier Argumenten die Koordinaten des Ursprungs. Für dieses Formular wird kein Objekt benötigt. -
x2– In Formularen mit drei/vier Argumenten die Endkoordinaten. Verwechseln Sie sie nicht mit serial des zweiten Objekts. -
y2– In Formularen mit drei/vier Argumenten die Endkoordinaten. Verwechseln Sie sie nicht mit serial des zweiten Objekts.
int - max(abs(x2-x1), abs(y2-y1)): Horizontal, vertikal und diagonal zu einer benachbarten Zelle haben einen Abstand 1. Höhe Z und Hindernisse werden nicht berücksichtigt. Für das unbekannte serial gibt die Ein-Argument-Form 0 zurück; für ein vorhandenes Objekt ohne Zeichen - 65535. Für die unbekannte ID1 verwendet das Formular mit drei Argumenten (0,0). Überprüfen Sie daher zuerst Exists(id1).
- Die Einzelobjektform verwendet das aktuelle World.RangeSize-Bereichszentrum und die letzte Position in der Schrittwarteschlange des sich bewegenden Mobs. Während der Bewegung kann das Ergebnis von der Berechnung über GetX/GetY abweichen.
- Koordinatenformulare funktionieren mit übergebenen Zahlen. Verwenden Sie für Spielkoordinaten den Bereich 0..65535; Extremwerte von int und Differenzüberlauf sind keine unterstützten Koordinaten.
- Das Team verspricht nicht, dass das Ziel erreichbar sein wird. Zum Bewegen benötigen Sie MoveXY/NewMoveXY und die Überprüfung des Ergebnisses; Wände können den eigentlichen Weg verlängern.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.GetDistance("lasttarget");
UO.Print("GetDistance: " + Convert.ToString(result));Parameter und Ablauf:
- Ziel ist serial, nicht type. Die Exists-Prüfung verhindert, dass der Nullpunkt eines unbekannten Objekts mit einem nahen Ziel verwechselt wird.
- distance<=2 prüft den X/Y-Abstand. Sichtbarkeit und Passierbarkeit werden separat geprüft.
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;Parameter und Ablauf:
- x1=100, y1=200, x2=103, y2=204. Die Unterschiede sind 3 und 4.
- Das Ergebnis ist 4, nicht 7 und nicht das euklidische 5.
return RunScenario();
object? RunScenario()
{
var distance = UO.GetDistance(100, 200, 103, 204);
UO.Print(Convert.ToString(distance));
return null;
}Parameter und Ablauf:
- Die beiden x/y-Argumente verwenden die aktuelle Position von self. Mit den drei Argumenten id1/x2/y2 können Sie das Startobjekt explizit angeben.
- Bei konstanter Position sind beide Größen gleich 3. Die Koordinaten müssen innerhalb der Grenzen der Karte bleiben.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: id (Any/Integer/String)
Ergebnis: int / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDistance:bridge.GetDistance(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
case "getdistance": return new InjectionValue(bridge.GetDistance(Arg(0)));Parameter: id (Any/Integer/String)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDistance:bridge.GetDistance(id).
Interner Implementierungscode; kein eigenständiges Skript.
public int GetDistance(int id) => bridge.GetDistance(id);Parameter: id (Any/Integer/String)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
InjectionScript.Runtime.InjectionApiUO.GetDistance:GetDistance(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Interner Implementierungscode; kein eigenständiges Skript.
public int GetDistance(string id) => GetDistance(GetObject(id));Parameter: x (Integer), y (Integer)
Ergebnis: int / Integer.
Beim Aufruf:
-
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.
Interner Implementierungscode; kein eigenständiges Skript.
public int GetDistance(int x, int y) => GetDistance(bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), x, y);Parameter: id1 (Any), x2 (Any), y2 (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
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).
Interner Implementierungscode; kein eigenständiges Skript.
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));
}Parameter: x1 (Integer), y1 (Integer), x2 (Integer), y2 (Integer)
Ergebnis: int / Integer.
Beim Aufruf:
Interner Implementierungscode; kein eigenständiges Skript.
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);Gibt den erweiterten Grundbucheintrag der ausgewählten Zelle zurück.
-
x– X-Zelle der aktuell geladenen Karte; Weltkoordinate, nicht Position innerhalb des Gumps. -
y– Y-Zelle der aktuell geladenen Karte; Weltkoordinate, nicht Position innerhalb des Gumps. -
map– Kartennummer. Wenn dieses Argument im ausgewählten Formular nicht vorhanden ist, wird die aktuelle Karte verwendet. Der echte Client liest nur Kacheln aus der aktuell geladenen Karte.
Array von 11-Feldern eines Datensatzes; Indizes beginnen mit 0:
-
[0] kind— string: „land“, „static“ oder „object“. -
[1] serial- int: serial dynamisches Element; für Land/statisch ist 0. -
[2] graphic- int: type Grafiken. -
[3] x,[4] y- int: Weltkoordinaten der Zelle. -
[5] z- int: die Höhe der Basis in der Welt. -
[6] hue- int: Farbe, in Bodennähe 0. -
[7] flags– int: niedrige 32 Bits der Tiledata-Flags. -
[8] name- string: Name aus Kacheldaten. -
[9] layer- int: Ausrüstungsschicht aus Tiledata, in Bodennähe 0; kein statischer Index. -
[10] height- int: Höhe graphic aus Kacheldaten, bodennah 0; nicht die Koordinate Z.
Ein leeres Array [] bedeutet keinen Eintrag oder eine unzugängliche Karte/Zelle. Für GetStaticTileAt erzeugt ein negativer/zu großer Index auch []; Der Indexüberlauf wählt nicht den Eintrag einer anderen Person aus.
- Die Daten beziehen sich auf die aktuell geladene Karte. Eine weitere Karte oder nicht erreichbare Zelle führt zu einem leeren Array. Bei direkten Kachelabfragen können zusätzlich Karteninkongruenzen gemeldet werden. GetWorldCell und GetWorldTilesArray geben sofort ein leeres Array ohne eine solche Meldung zurück.
- Array-Indizes beginnen mit 0. Überprüfen Sie ArrayLength, bevor Sie das Feld lesen. Z steht für Welthöhe; Layer ist die Geräteeigenschaft aus Tiledata und Index ist die Seriennummer des Zelleneintrags.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetLandTileAt(UO.GetX(), UO.GetY());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- x/y – Zeichenposition; Die Karte wird automatisch abgesenkt und ausgewählt. Für GetStaticTileAt bedeutet index=0 den ersten Eintrag.
- Die Felder [2], [5], [9] haben unterschiedliche Bedeutungen; Alle sind schreibgeschützt, nachdem die Länge von 11 überprüft wurde.
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;Parameter und Ablauf:
- Es werden die gleichen Koordinaten verwendet; GetStaticTileAt liest index=0.
- Tile[8] ist die Titelzeichenfolge, Tile[10] ist die Höhendimension aus Tiledata, nicht die Z-Basis.
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;Parameter und Ablauf:
- WaitTargetTile empfängt graphic, x, y, z aus den Feldern 2…5.
- Dies ist nur eine Vorbereitung für das nächste Ziel. Das Beispiel löst kein Werkzeug oder Zauber aus. serial=0 für Statik sollte nicht als ID des Elements übergeben werden.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: x (Any), y (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetLandTileAt. -
InjectionScript.Runtime.InjectionApiUO.GetLandTileAt:GetLandTileAt(x, y, new InjectionValue(bridge.WorldNumber)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
Interner Implementierungscode; kein eigenständiges Skript.
public InjectionValue GetLandTileAt(InjectionValue x, InjectionValue y)
=> GetLandTileAt(x, y, new InjectionValue(bridge.WorldNumber));Parameter: x (Any), y (Any), map (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
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).
Interner Implementierungscode; kein eigenständiges Skript.
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);Liest den erweiterten Landreferenzdatensatz aus Tiledata.
-
tileist ein Grafik-/type-Eintrag, nicht serial und kein Index innerhalb einer Zelle. Die Ländertabelle wird durch den Teamnamen selbst ausgewählt.
Array von 7-Feldern für gültiges graphic. Alle Felder int außer Name (string):
-
[0] graphic— graphic/type Datensätze. -
[1] flags– niederwertige 32 Flag-Bits. -
[2] name– Name aus Kacheldaten (string). -
[3] texId- ID Bodentexturen. -
[4] wet— 1 bei Nasseinbau, sonst 0. -
[5] impassable— 1 wenn unpassierbar, sonst 0. -
[6] noDiagonal— 1 wenn noDiagonal, sonst 0.
Für ein ungültiges graphic gibt es keine Referenzeigenschaften: Es wird ein kurzes Array [переданный graphic, 0, ""] zurückgegeben. Überprüfen Sie die vollständige Länge, bevor Sie die Eigenschaften lesen. Dies ist kein Pascal-Datensatz oder eine Liste von Objekten.
- Der Befehl liest Kacheldaten und erfordert kein Element mit diesem graphic in der Welt. Flags beschreiben die Ressource; Das Ergebnis ersetzt keine vollständige Routenprüfung.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetLandTileData(0x0003);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- Tile ist der numerische graphic der ausgewählten Tabelle.
- data[2] enthält den Namen. Die Längenprüfung trennt einen vollständigen Eintrag von einem kurzen Eintrag eines ungültigen 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;Parameter und Ablauf:
- data[5] ist ein separates unpassierbares Feld: 1 (Bedingung erfüllt), 0 (Bedingung nicht erfüllt).
- Bei dieser Prüfung werden andere Objekte in der Zelle oder die Fähigkeiten des Charakters nicht berücksichtigt.
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;Parameter und Ablauf:
- data[0] wiederholt das übertragene graphic, data[1] ist eine allgemeine Flag-Maske.
- Die Maske kann mehrere Bits gleichzeitig enthalten; sein numerischer Wert ist nicht 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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: tile (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.BuildTileData:BuildTileData(0, Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
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);Sucht nach Landplättchen bei graphic/type in einem Rechteck.
-
xmin– Weltkoordinaten von zwei Winkeln, einschließlich; 0..65535. Die neu angeordneten Winkel werden normalisiert. Fläche nicht größer als 1 000 000 Zellen; Ungültige Grenzen verursachen einen Skriptfehler, bevor die Karte gelesen wird. -
ymin– Weltkoordinaten von zwei Winkeln, einschließlich; 0..65535. Die neu angeordneten Winkel werden normalisiert. Fläche nicht größer als 1 000 000 Zellen; Ungültige Grenzen verursachen einen Skriptfehler, bevor die Karte gelesen wird. -
xmax– Weltkoordinaten von zwei Winkeln, einschließlich; 0..65535. Die neu angeordneten Winkel werden normalisiert. Fläche nicht größer als 1 000 000 Zellen; Ungültige Grenzen verursachen einen Skriptfehler, bevor die Karte gelesen wird. -
ymax– Weltkoordinaten von zwei Winkeln, einschließlich; 0..65535. Die neu angeordneten Winkel werden normalisiert. Fläche nicht größer als 1 000 000 Zellen; Ungültige Grenzen verursachen einen Skriptfehler, bevor die Karte gelesen wird. -
worldNum– Karte/Facette 0..255; Verwenden Sie UO.WorldNum(). Eine andere Karte ergibt ein leeres Array. Wenn sich die Karte zwischen den Blöcken ändert, wird das Teilergebnis verworfen. -
tileType– Eine graphic/type-Kachel, normalerweise 0..65535; das ist nicht serial. 0 ist das genaue graphic 0, -1 bedeutet kein type. Ein nicht übereinstimmendes type führt zu einem leeren Ergebnis.
Array von Einträgen [graphic, X, Y, Z]; alle Felder int. graphic – type der Erde, Z – ihr Fundament. Keine Übereinstimmungen: leeres Array. Die Menge ist ArrayLength(Ergebnis), nicht das Ergebnis selbst. Die Indizes beginnen mit 0. Dies ist kein bool-, serial- oder Pascal-Datensatz; Es gibt keinen siebten Ausgabeparameter.
- Lokale Daten werden gelesen. Die Suche ändert FindItem/FindCount nicht und führt keinen Verschiebungs-, Ziel- oder Netzwerkbefehl aus.
- Reihenfolge: X aufsteigend, innerhalb von X - Y aufsteigend. Aufzeichnungen einer Zelle bewahren die Reihenfolge der Brücke; Es ist nicht nach Entfernung oder Höhe sortiert.
- Die Suche wird in Blöcken von bis zu 32 Zellen mit einem Softbudget von etwa 1 ms verarbeitet. Die Stornierung wird zwischen den Portionen überprüft. Eine komplexe Zellen- oder Kaltablesung kann das Budget sprengen. Es ist besser, eine große Fläche zu unterteilen; Beim Lesen kann sich die Welt verändern.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
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));Parameter und Ablauf:
- x/y – Position self, Karte – aktuelle Karte. Die Region 3×3 umfasst die Grenzen. In Ex werden zwei type übertragen, in Normalform eines. Ändern Sie die Beispiele entsprechend Ihren Ressourcen. Dies ist ein graphic-Objekt, kein ID-Objekt.
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;Parameter und Ablauf:
- Der Bereich 2×2 wird vom größeren Winkel auf den kleineren übertragen. Der Algorithmus selbst normalisiert die Grenzen. Zeile – ein Datensatz; PrintTile wird vollständig deklariert und formatiert nur Zahlen, ohne etwas zu verschieben. graphic - type, x/y – Koordinaten, z – Höhe, hue – Farbe. Für Grundstücke wird eine Bedingung hue=0 übergeben: Es gibt kein Farbfeld im Grundstücksdatensatz.
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;Parameter und Ablauf:
- Nicht mehr als drei Suchvorgänge für eine Zelle; zwischen Versuchen WaitAsync(250). Jeder Aufruf erzeugt ein neues Ergebnis. Die Länge Null bedeutet, dass es jetzt keine Übereinstimmungen gibt und dass das Objekt nicht dauerhaft auf dem Server fehlt.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
UO.GetLandTilesArray(xmin, ymin, xmax, ymax, worldNum, tileType) — UO.GetLandTilesArray(Any,Any,Any,Any,Any,Any)
Parameter: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileType (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
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).
Interner Implementierungscode; kein eigenständiges Skript.
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);Sucht nach Landplättchen bei graphic/type in einem Rechteck.
-
xmin– Weltkoordinaten von zwei Winkeln, einschließlich; 0..65535. Die neu angeordneten Winkel werden normalisiert. Fläche nicht größer als 1 000 000 Zellen; Ungültige Grenzen verursachen einen Skriptfehler, bevor die Karte gelesen wird. -
ymin– Weltkoordinaten von zwei Winkeln, einschließlich; 0..65535. Die neu angeordneten Winkel werden normalisiert. Fläche nicht größer als 1 000 000 Zellen; Ungültige Grenzen verursachen einen Skriptfehler, bevor die Karte gelesen wird. -
xmax– Weltkoordinaten von zwei Winkeln, einschließlich; 0..65535. Die neu angeordneten Winkel werden normalisiert. Fläche nicht größer als 1 000 000 Zellen; Ungültige Grenzen verursachen einen Skriptfehler, bevor die Karte gelesen wird. -
ymax– Weltkoordinaten von zwei Winkeln, einschließlich; 0..65535. Die neu angeordneten Winkel werden normalisiert. Fläche nicht größer als 1 000 000 Zellen; Ungültige Grenzen verursachen einen Skriptfehler, bevor die Karte gelesen wird. -
worldNum– Karte/Facette 0..255; Verwenden Sie UO.WorldNum(). Eine andere Karte ergibt ein leeres Array. Wenn sich die Karte zwischen den Blöcken ändert, wird das Teilergebnis verworfen. -
tileTypes– Array aus numerischen graphic/type; jedes passende type wird eingeschaltet. Durch das Wiederholen von type werden keine Einträge dupliziert. Der Skalar wird auch als eins type angenommen. Leeres Array bedeutet alles type; Ein Array von einem 0 durchsucht nur 0.
Array von Einträgen [graphic, X, Y, Z]; alle Felder int. graphic – type der Erde, Z – ihr Fundament. Keine Übereinstimmungen: leeres Array. Die Menge ist ArrayLength(Ergebnis), nicht das Ergebnis selbst. Die Indizes beginnen mit 0. Dies ist kein bool-, serial- oder Pascal-Datensatz; Es gibt keinen siebten Ausgabeparameter.
- Lokale Daten werden gelesen. Die Suche ändert FindItem/FindCount nicht und führt keinen Verschiebungs-, Ziel- oder Netzwerkbefehl aus.
- Reihenfolge: X aufsteigend, innerhalb von X - Y aufsteigend. Aufzeichnungen einer Zelle bewahren die Reihenfolge der Brücke; Es ist nicht nach Entfernung oder Höhe sortiert.
- Die Suche wird in Blöcken von bis zu 32 Zellen mit einem Softbudget von etwa 1 ms verarbeitet. Die Stornierung wird zwischen den Portionen überprüft. Eine komplexe Zellen- oder Kaltablesung kann das Budget sprengen. Es ist besser, eine große Fläche zu unterteilen; Beim Lesen kann sich die Welt verändern.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
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));Parameter und Ablauf:
- x/y – Position self, Karte – aktuelle Karte. Die Region 3×3 umfasst die Grenzen. In Ex werden zwei type übertragen, in Normalform eines. Ändern Sie die Beispiele entsprechend Ihren Ressourcen. Dies ist ein graphic-Objekt, kein ID-Objekt.
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;Parameter und Ablauf:
- Der Bereich 2×2 wird vom größeren Winkel auf den kleineren übertragen. Der Algorithmus selbst normalisiert die Grenzen. Zeile – ein Datensatz; PrintTile wird vollständig deklariert und formatiert nur Zahlen, ohne etwas zu verschieben. graphic - type, x/y – Koordinaten, z – Höhe, hue – Farbe. Für Grundstücke wird eine Bedingung hue=0 übergeben: Es gibt kein Farbfeld im Grundstücksdatensatz.
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;Parameter und Ablauf:
- Nicht mehr als drei Suchvorgänge für eine Zelle; zwischen Versuchen WaitAsync(250). Jeder Aufruf erzeugt ein neues Ergebnis. Die Länge Null bedeutet, dass es jetzt keine Übereinstimmungen gibt und dass das Objekt nicht dauerhaft auf dem Server fehlt.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
UO.GetLandTilesArrayEx(xmin, ymin, xmax, ymax, worldNum, tileTypes) — UO.GetLandTilesArrayEx(Any,Any,Any,Any,Any,Any)
Parameter: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileTypes (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
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).
Interner Implementierungscode; kein eigenständiges Skript.
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);Liest das Land einer Zelle der aktuellen Karte.
-
x– X-Zelle der aktuell geladenen Karte; Weltkoordinate, nicht Position innerhalb des Gumps. -
y– Y-Zelle der aktuell geladenen Karte; Weltkoordinate, nicht Position innerhalb des Gumps. -
map– Kartennummer. Wenn dieses Argument im ausgewählten Formular nicht vorhanden ist, wird die aktuelle Karte verwendet. Der echte Client liest nur Kacheln aus der aktuell geladenen Karte.
Array aus drei int: [0] graphic - type-Ländern; [1] z — Welthöhe der Erde; [2] flags – niedrige 32 Bits der Tiledata-Flags. Wenn die Karte/das Plättchen nicht verfügbar ist oder kein Land vorhanden ist, wird ein leeres Array [] zurückgegeben. Dies ist eine flache Aufzeichnung, keine Liste mit drei Kacheln.
- Die Daten beziehen sich auf die aktuell geladene Karte. Eine weitere Karte oder nicht erreichbare Zelle führt zu einem leeren Array. Bei direkten Kachelabfragen können zusätzlich Karteninkongruenzen gemeldet werden. GetWorldCell und GetWorldTilesArray geben sofort ein leeres Array ohne eine solche Meldung zurück.
- Array-Indizes beginnen mit 0. Überprüfen Sie ArrayLength, bevor Sie das Feld lesen. Z steht für Welthöhe; Layer ist die Geräteeigenschaft aus Tiledata und Index ist die Seriennummer des Zelleneintrags.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- x/y werden von der Position des Zeichens übernommen; map=WorldNum() wählt die aktuelle Karte aus.
- Vor der Indizierung wird das Vorhandensein von drei Feldern überprüft; land[0] - graphic, land[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;Parameter und Ablauf:
- x+1 ist eine Nachbarzelle, y und Karte bleiben erhalten.
- deltaZ vergleicht Land und Charakter. Hierbei handelt es sich nicht um eine Bestehensprüfung: Brücken und Statik werden getrennt gezählt.
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;Parameter und Ablauf:
- group=0 wählt Land aus; Land[0] – graphic.
- GetTileName gibt Text zurück, während GetLandscapeTile ein Array zurückgibt.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: x (Any), y (Any), map (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
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).
Interner Implementierungscode; kein eigenständiges Skript.
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);Zählt Nicht-Erdgeometrie-Datensätze in einer Zelle.
-
x– Weltkoordinate X der Zelle der aktuellen Karte, nicht die Position im Gump. -
y— Welt-Y-Koordinate der aktuellen Kartenzelle. -
worldNum– Karten-/Facettennummer; Verwenden Sie UO.WorldNum(). Es wird nur die aktuell geladene Karte gelesen.
int – Anzahl der von GetStaticTiles empfangenen Tripel graphic/Z/hue. Im aktuellen Client werden Static, Multi und Item berücksichtigt: Mehrere Datensätze gleicher Höhe werden separat gezählt. Ein leeres Feld/eine andere Karte ergibt 0. Dabei handelt es sich nicht um die Nummer der Ausstattungsschicht, die Anzahl der Stockwerke, die Anzahl der eindeutigen Höhen oder bool.
- Der Befehl liest die lokale Karte und löst keine Bewegung oder ein Ziel aus. Eine Zelle außerhalb der Kartengröße wird nicht durch eine Zelle in einer angrenzenden Spalte ersetzt.
- Die Höhe von Z, graphic/type, die Farbe von hue, Flaggen und Ausrüstungsebene haben unterschiedliche Bedeutungen. Null graphic oder Z=0 können gültige Daten sein; Überprüfen Sie das Ergebnisformular.
- Die Zusammensetzung entspricht ReadStaticsXY, nicht GetLayer oder ObjAtLayer. Dieser Client umfasst dynamische Elemente und mehrere Teile.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetLayerCount(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- count – Anzahl der Zelldatensätze; 1 bedeutet einen Eintrag, keinen logischen Erfolg.
var count = UO.GetLayerCount(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print("Tile records: " + Convert.ToString(count));Parameter und Ablauf:
- Das Fehlen von Aufzeichnungen ist kein Beweis für den Landübergang. Auch das Vorhandensein einer Aufnahme beweist nicht, dass es sich um eine Wand handelt.
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;Parameter und Ablauf:
- Die aktuellen und benachbarten Zellen in derselben Welt werden überprüft. Die Anzahl der Schichten ist nicht ihre Höhe oder 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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: x (Any), y (Any), worldNum (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticTiles:bridge.GetStaticTiles(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
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);Liest graphic, Höhe und Landflaggen in einem Kartenquadrat.
-
x– Weltkoordinate X der Zelle der aktuellen Karte, nicht die Position im Gump. -
y— Welt-Y-Koordinate der aktuellen Kartenzelle. -
worldNum– Karten-/Facettennummer; Verwenden Sie UO.WorldNum(). Es wird nur die aktuell geladene Karte gelesen.
Array aus drei int: [0] graphic/type Ländern, [1] Welt Z Basenland, [2] kleinere 32 Bits von Tiledata-Flags. Eine nicht zugängliche Zelle oder andere Karte führt zu einem leeren Array. Dies ist kein serial-, bool- oder Pascal-Datensatz; Verwenden Sie keine .Tile/.Z-Felder. Für die Anzahl der Felder rufen Sie ArrayLength(Zelle) auf.
- Der Befehl liest die lokale Karte und löst keine Bewegung oder ein Ziel aus. Eine Zelle außerhalb der Kartengröße wird nicht durch eine Zelle in einer angrenzenden Spalte ersetzt.
- Die Höhe von Z, graphic/type, die Farbe von hue, Flaggen und Ausrüstungsebene haben unterschiedliche Bedeutungen. Null graphic oder Z=0 können gültige Daten sein; Überprüfen Sie das Ergebnisformular.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetMapCell(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- X/Y werden von self übernommen, WorldNum ist die aktuelle Karte. Zelle speichert alle Felder eines Anrufs.
- Die Indizes beginnen mit 0. Zelle[1] ist die Höhe, kein Zeichen einer erfolgreichen Suche; Ein leeres Array wird vor der Indizierung überprüft.
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;Parameter und Ablauf:
- Der zweite Anruf liest das Quadrat im Osten vor, beide verwenden dieselbe Karte.
- Der Bodenhöhenunterschied ist kein Beweis für die Passierbarkeit: Wände, Statik und andere Objekte werden gesondert geprüft.
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;Parameter und Ablauf:
- GetMapCell liest Land.Z; GetSurfaceZ lautet Land.AverageZ.
- Beide Werte sind Höhe. Auf abschüssigem Gelände können sie variieren; Dies ist nicht die Höhe des Bodens des Hauses.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: x (Any), y (Any), worldNum (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLandscapeTile:bridge.GetLandscapeTile(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
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);Berechnet die geschätzte Höhe der nächsten Stufe in der angegebenen Richtung.
-
currX– Anfangswelt X, normalerweise UO.GetX(). -
currY– Anfangswelt Y, normalerweise UO.GetY(). -
destX– X-Ziel. Um einen bestimmten Schritt zu überprüfen, übergeben Sie eine angrenzende Zelle. -
destY– Y-Ziel; Zusammen mit DestX legt es die Richtung eines Schritts fest und nicht die gesamte Route. -
worldNum– Karten-/Facettennummer; Verwenden Sie UO.WorldNum(). Es wird nur die aktuell geladene Karte gelesen. -
currZ– Anfangshöhe Z, normalerweise UO.GetZ(); Die geometrische Berechnung verwendet den Bereich -128..127.
int – berechnetes Z des nächsten Schritts; 0 und negative Zahlen sind gültige Höhen. Wenn ein Charakter oder eine andere Karte 0 deaktiviert ist. Die Methode gibt die Z-Komponente der Prüfung zurück, auch wenn diese fehlschlägt; Die Nummer selbst ist keine Bestätigung der Passage. Für Flagge und Höhe zusammen verwenden Sie IsWorldCellPassable und lesen Sie [0]/[1].
- Der Befehl liest die lokale Karte und löst keine Bewegung oder ein Ziel aus. Eine Zelle außerhalb der Kartengröße wird nicht durch eine Zelle in einer angrenzenden Spalte ersetzt.
- Die Höhe von Z, graphic/type, die Farbe von hue, Flaggen und Ausrüstungsebene haben unterschiedliche Bedeutungen. Null graphic oder Z=0 können gültige Daten sein; Überprüfen Sie das Ergebnisformular.
- Die Berechnung macht keinen Schritt und öffnet keine Tür. Es prüft die lokale Geometrie; Der Server kann die tatsächliche Bewegung ablehnen. Wenn die Brücke Z nicht zurückgibt, wird CurrZ verwendet.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.GetNextStepZ(UO.GetX(), UO.GetY(), UO.GetX() + 1, UO.GetY(), UO.WorldNum(), UO.GetZ());
UO.Print("GetNextStepZ: " + Convert.ToString(result));Parameter und Ablauf:
- Sechs Parameter: Original X/Y, angrenzendes X/Y, Karte und Original Z. nextZ ist die Höhe, nicht 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));Parameter und Ablauf:
- Der Anruf erfolgt nur, wenn eine bekannte Verbindung besteht. Zwischen Prüfen und Lesen kann die Verbindung verloren gehen; Z=0 ist immer noch kein Erfolgscode.
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;Parameter und Ablauf:
- Die Koordinaten der Quell- und Zielzellen werden getrennt übertragen. Das Ergebnis ist die erwartete Höhe, auch bei Hindernissen; Das Pass-Flag ergibt separat 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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
UO.GetNextStepZ(currX, currY, destX, destY, worldNum, currZ) — UO.GetNextStepZ(Any,Any,Any,Any,Any,Any)
Parameter: currX (Any), currY (Any), destX (Any), destY (Any), worldNum (Any), currZ (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
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.
Interner Implementierungscode; kein eigenständiges Skript.
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);Ruft ein einzelnes Grafikbild aus den installierten Ultima Online-Grafikdateien ab und gibt es im BMP-Format im Speicher zurück. Nützlich, um Ihre Spielressourcen und Symbolgrößen zu überprüfen, die Pixelfarbe zu lesen und farbige Versionen eines Gegenstands zu vergleichen. Der Befehl selbst öffnet kein Fenster, speichert keine Datei und sucht nicht nach Elementen in der Welt.
-
objType– Obligatorische Grafik/type aus dem Abschnitt „Statische Kunst“: Ganzzahl 0..65535, eine Zeichenfolge mit dieser Nummer oder ein gespeicherter Name AddType. Zum Beispiel ist 0x0EED eine Kunst für einen Stapel Gold. Dabei handelt es sich nicht um die serial, die Karten-/Kachelkoordinate oder die Körperanimationsnummer des Elements. Um die Grafik eines geladenen Elements zu erhalten, übergeben Sie UO.GetType(item), wobei das Element sein serial ist. Wenn der numerische Wert type außerhalb des Bereichs liegt, ist das Ergebnis ein leeres Array. Ein unbekannter String-Name führt zu einem Konvertierungsfehler. -
hue– Obligatorischer ganzzahliger Farbwert: 0 – Originalfarben des Kunstwerks; Ein positiver Wert ist hue aus den Client-Dateien. Numerische Zeichenfolgen sind akzeptabel, einschließlich des Ergebnisses UO.GetColor(item). Der Wert ist auf den Bereich 0..65535 begrenzt: negativ wird zu 0, zu groß wird zu 65535. Hier bedeutet -1 KEINE Farbe. Die PartialHue-Flaggengrafik verwendet teilweise Farbgebung; für andere - vollständig. Das Ergebnis eines bestimmten hue hängt von der geladenen Farbtabelle ab.
Array ist ein eindimensionales Array int, jedes Element 0..255 repräsentiert ein Byte der vollständigen BMP-Datei, beginnend mit dem Header. Indizierung mit 0. Es ist nicht bool, nicht ID, kein Pfad, kein Bitmap-Objekt und kein Farbarray RGB. Ein leeres Array bedeutet, dass die Zahl type ungültig ist, die Grafik fehlt oder die erforderlichen Spieldateien nicht geladen sind. Bevor Sie den Titel lesen, überprüfen Sie ArrayLength; Das leere Array ist nicht gleich der Zahl 0.
- Es sind genau zwei Argumente erforderlich. Das Lesen erfolgt aus den lokalen Ressourcen des Clients, ohne dass eine Anfrage an den Server gestellt wird. Die Existenz eines Objekts in der Welt ist nicht erforderlich. Für mobile bedeutet eine Zahl aus GetType body; Hier adressiert dieselbe Nummer einen anderen Ressourcenabschnitt und liefert kein Bild der Charakteranimation.
- Ergebnisformat: unkomprimiertes 24-Bit BMP. Bytes [0]=66 und [1]=77 - BM; [2..5] – Größe der gesamten Datei; [10..13] – der Anfang der Pixel, jetzt 54; [14..17] – Größe des DIB-Headers, jetzt 40; [18..21] – Breite; [22..25] – positive Höhe; [26..27] - 1 Ebene; [28..29] - 24 Bit. Multibyte-Zahlen werden in Little-Endian geschrieben.
- Jedes Pixel belegt drei Bytes in der Reihenfolge B, G, R. Die Zeilen verlaufen von unten nach oben und werden mit null Bytes bis zu einem Vielfachen von 4 aufgefüllt. Stringlänge = Int((width * 3 + 3) / 4) * 4. Für XY-Koordinaten von der oberen linken Ecke aus gilt: Versatz = 54 + (Höhe – 1 – y) * Schritt + x * 3. Überprüfen Sie vor dem Zugriff die Grenzen und die Größe des Arrays.
- Die Transparenz der Originalgrafik bleibt nicht erhalten: BMP enthält hier kein Alpha. Der transparente Hintergrund wird schwarz und kann durch das Ergebnis nicht mehr vom ursprünglichen schwarzen Pixel unterschieden werden. Screenshot, Skalierung des Spielfensters, Licht, Sichtweite und Objektkoordinaten sind nicht beteiligt.
- Für jeden Aufruf wird ein Bildarray generiert. Wenn Sie Grafiken mehrmals benötigen, speichern Sie das Ergebnis in einer Variablen und verarbeiten Sie es erneut. Rufen Sie nicht das Laden/Färben für jedes Pixel innerhalb der Schleife auf. Die gleichen Parameter und unveränderten Dateien führen zum gleichen Ergebnis; Verschiedene hue sind nicht erforderlich, um jedes Pixel zu ändern, insbesondere bei PartialHue.
- Eine echte .bmp-Datei benötigt eine binäre Ausgabe der genauen Bytes ohne Textkodierung. Eine reguläre Datei.WriteLine oder JsonSave erstellt kein BMP. Die folgenden Beispiele verarbeiten das Array im Speicher und versprechen nicht das Vorhandensein einer nicht vorhandenen Datei.WriteBytes.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetStaticArt(0x0EED, 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- ObjType=0x0EED wählt die Ressource aus, Hue=0 belässt die Originalfarben. Das Array wird überprüft, bevor die Offsets 18 und 22 gelesen werden. 64 ist die eigene Grenze des Beispiels, keine Befehlsgrenze.
- ArtSizeField ist eine benutzerdefinierte Funktion C#, kein UO-Befehl. Fügt vier Bytes mit den Gewichtungen 1, 256, 65536, 16777216 hinzu. Das Skript hilft Ihnen bei der Auswahl der Größe Ihrer Zelle. Erzeugt nicht automatisch ein Kaugummi.
var bmp = UO.GetStaticArt(0x0EED, 0);
if (Truth(ArrayLength(bmp) < 54))
{
UO.Print("Gold art is unavailable");
return null;
}
var width = ArtSizeField(bmp, 18);
var height = ArtSizeField(bmp, 22);
if (Truth(width > 64) || Truth(height > 64))
{
UO.Print("Use a larger cell for this icon");
return null;
}
UO.Print("Icon fits: " + Convert.ToString(width) + " x " + Convert.ToString(height));
dynamic ArtSizeField(dynamic bytes, dynamic offset)
{
return bytes[offset] + bytes[offset+1]*256 + bytes[offset+2]*65536 + bytes[offset+3]*16777216;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;2. Berechnen Sie RGB eines Pixels unter Berücksichtigung der invertierten Linien BMP – Skriptfunktion
Parameter und Ablauf:
- GetStaticArt gibt BMP zurück; ArtPixelRGB ist eine separate Beispielfunktion für dieses Format. x=0,y=0 bedeutet das obere linke Pixel des Bildes, nicht die Weltkoordinaten. Der Ersatz height-1-y ist aufgrund der Reihenfolge der Zeilen von unten nach oben erforderlich.
- Die Funktion gibt RGB int 0..16777215 zurück und verwendet -1 nur als Indikator für das Fehlen eines Pixels. Schwarz 0 ist eine gültige Farbe, nicht false und kein Fehler. Daher ist der Test für rgb < 0 getrennt vom Test für 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;Parameter und Ablauf:
- 0x1F03 – Grafische Roben; 0 und 0x0044 sind die ursprünglichen und ausgewählten hue. Die gleiche Grafik ergibt die gleichen Abmessungen. Wenn das Ergebnis leer ist, beginnt der Vergleich nicht.
- Geändert zählt verschiedene Bytes von Farbkanälen, nicht Objekte oder die Anzahl der Pixel. Ein Pixel kann bis zu drei Bytes verändern. PartialHue, Farbtabelle und Originalfarben können Teile oder das gesamte Bild gleich lassen; Dies ist kein Beweis für einen Teamfehler.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: objType (Any), hue (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
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).
Interner Implementierungscode; kein eigenständiges Skript.
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);Gibt einen erweiterten Datensatz eines Datensatzes über dem Boden der ausgewählten Zelle zurück.
-
x– X-Zelle der aktuell geladenen Karte; Weltkoordinate, nicht Position innerhalb des Gumps. -
y– Y-Zelle der aktuell geladenen Karte; Weltkoordinate, nicht Position innerhalb des Gumps. -
map– Kartennummer. Wenn dieses Argument im ausgewählten Formular nicht vorhanden ist, wird die aktuelle Karte verwendet. Der echte Client liest nur Kacheln aus der aktuell geladenen Karte. -
index– Die Sequenznummer des Datensatzes in den Ergebnissen GetStaticTiles, beginnend mit 0. Dies ist nicht graphic, nicht Z und keine Ausrüstungsschicht. In der Form von 3-Argumenten kommt der Index an dritter Stelle; in Form von 4 Argumenten, drittes Map, vierter Index.
Array von 11-Feldern eines Datensatzes; Indizes beginnen mit 0:
-
[0] kind— string: „land“, „static“ oder „object“. -
[1] serial- int: serial dynamisches Element; für Land/statisch ist 0. -
[2] graphic- int: type Grafiken. -
[3] x,[4] y- int: Weltkoordinaten der Zelle. -
[5] z- int: die Höhe der Basis in der Welt. -
[6] hue- int: Farbe, in Bodennähe 0. -
[7] flags– int: niedrige 32 Bits der Tiledata-Flags. -
[8] name- string: Name aus Kacheldaten. -
[9] layer- int: Ausrüstungsschicht aus Tiledata, in Bodennähe 0; kein statischer Index. -
[10] height- int: Höhe graphic aus Kacheldaten, bodennah 0; nicht die Koordinate Z.
Ein leeres Array [] bedeutet keinen Eintrag oder eine unzugängliche Karte/Zelle. Für GetStaticTileAt erzeugt ein negativer/zu großer Index auch []; Der Indexüberlauf wählt nicht den Eintrag einer anderen Person aus.
- Die Daten beziehen sich auf die aktuell geladene Karte. Eine weitere Karte oder nicht erreichbare Zelle führt zu einem leeren Array. Bei direkten Kachelabfragen können zusätzlich Karteninkongruenzen gemeldet werden. GetWorldCell und GetWorldTilesArray geben sofort ein leeres Array ohne eine solche Meldung zurück.
- Array-Indizes beginnen mit 0. Überprüfen Sie ArrayLength, bevor Sie das Feld lesen. Z steht für Welthöhe; Layer ist die Geräteeigenschaft aus Tiledata und Index ist die Seriennummer des Zelleneintrags.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- x/y – Zeichenposition; Die Karte wird automatisch abgesenkt und ausgewählt. Für GetStaticTileAt bedeutet index=0 den ersten Eintrag.
- Die Felder [2], [5], [9] haben unterschiedliche Bedeutungen; Alle sind schreibgeschützt, nachdem die Länge von 11 überprüft wurde.
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;Parameter und Ablauf:
- Es werden die gleichen Koordinaten verwendet; GetStaticTileAt liest index=0.
- Tile[8] ist die Titelzeichenfolge, Tile[10] ist die Höhendimension aus Tiledata, nicht die Z-Basis.
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;Parameter und Ablauf:
- WaitTargetTile empfängt graphic, x, y, z aus den Feldern 2…5.
- Dies ist nur eine Vorbereitung für das nächste Ziel. Das Beispiel löst kein Werkzeug oder Zauber aus. serial=0 für Statik sollte nicht als ID des Elements übergeben werden.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: x (Any), y (Any), index (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetStaticTileAt. -
InjectionScript.Runtime.InjectionApiUO.GetStaticTileAt:GetStaticTileAt(x, y, new InjectionValue(bridge.WorldNumber), index). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
Interner Implementierungscode; kein eigenständiges Skript.
public InjectionValue GetStaticTileAt(InjectionValue x, InjectionValue y, InjectionValue index)
=> GetStaticTileAt(x, y, new InjectionValue(bridge.WorldNumber), index);Parameter: x (Any), y (Any), map (Any), index (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
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).
Interner Implementierungscode; kein eigenständiges Skript.
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);Liest den statischen erweiterten Referenzeintrag graphic aus Tiledata.
-
tileist ein Grafik-/type-Eintrag, nicht serial und kein Index innerhalb einer Zelle. Die statische Tabelle wird durch den Befehlsnamen selbst ausgewählt.
Array von 17-Feldern für gültiges graphic. Alle Felder int außer Name (string):
-
[0] graphic— graphic/type Datensätze. -
[1] flags– niederwertige 32 Flag-Bits. -
[2] name– Name aus Kacheldaten (string). -
[3] weight– Gewichtung aus Kacheldaten. -
[4] layer– Nummer der Ausrüstungsebene. -
[5] countist das Count-Feld aus Tiledata, nicht die Anzahl der Artikel auf der Welt. -
[6] animId- ID Animationen. -
[7] hue— hue aus Kacheldaten. -
[8] lightIndex— Index der Lichtquelle. -
[9] height– Höhe graphic, nicht Welthöhe Z. -
[10] wet— 1 bei Nasseinbau, sonst 0. -
[11] impassable— 1 wenn unpassierbar, sonst 0. -
[12] surface— 1 wenn Oberfläche, sonst 0. -
[13] foliage— 1 wenn Laub, sonst 0. -
[14] door— 1 wenn Tür, sonst 0. -
[15] wall— 1 wenn Wand, sonst 0. -
[16] container— 1 wenn Container, sonst 0.
Für ein ungültiges graphic gibt es keine Referenzeigenschaften: Es wird ein kurzes Array [переданный graphic, 0, ""] zurückgegeben. Überprüfen Sie die vollständige Länge, bevor Sie die Eigenschaften lesen. Dies ist kein Pascal-Datensatz oder eine Liste von Objekten.
- Der Befehl liest Kacheldaten und erfordert kein Element mit diesem graphic in der Welt. Flags beschreiben die Ressource; Das Ergebnis ersetzt keine vollständige Routenprüfung.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetStaticTileData(0x0CCA);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- Tile ist der numerische graphic der ausgewählten Tabelle.
- data[2] enthält den Namen. Die Längenprüfung trennt einen vollständigen Eintrag von einem kurzen Eintrag eines ungültigen 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;Parameter und Ablauf:
- data[11] ist ein separates unpassierbares Feld: 1 (Bedingung erfüllt), 0 (Bedingung nicht erfüllt).
- Bei dieser Prüfung werden andere Objekte in der Zelle oder die Fähigkeiten des Charakters nicht berücksichtigt.
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;Parameter und Ablauf:
- data[0] wiederholt das übertragene graphic, data[1] ist eine allgemeine Flag-Maske.
- Die Maske kann mehrere Bits gleichzeitig enthalten; sein numerischer Wert ist nicht 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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: tile (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.BuildTileData:BuildTileData(1, Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
case "getstatictiledata":
return BuildTileData(1, Arg(0));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetStaticTiles(object? x, object? y, object? map);Liest Einträge über dem Boden in einer Zelle der aktuellen Karte.
-
x– X-Zelle der aktuell geladenen Karte; Weltkoordinate, nicht Position innerhalb des Gumps. -
y– Y-Zelle der aktuell geladenen Karte; Weltkoordinate, nicht Position innerhalb des Gumps. -
map– Kartennummer. Wenn dieses Argument im ausgewählten Formular nicht vorhanden ist, wird die aktuelle Karte verwendet. Der echte Client liest nur Kacheln aus der aktuell geladenen Karte.
Array ist eine flache Folge von int-Tripeln [graphic0, z0, hue0, graphic1, z1, hue1, …]. Die Anzahl der Einträge entspricht der Länge des Arrays / 3. Für die i-Notation steht graphic in [i*3], Z in [i*3+1], hue in [i*3+2]. Ein leeres Array bedeutet keine Einträge oder eine unzugängliche Karte/Zelle. Seriennummer und Layernummer werden hier nicht zurückgegeben.
- Die Daten beziehen sich auf die aktuell geladene Karte. Eine weitere Karte oder nicht erreichbare Zelle führt zu einem leeren Array. Bei direkten Kachelabfragen können zusätzlich Karteninkongruenzen gemeldet werden. GetWorldCell und GetWorldTilesArray geben sofort ein leeres Array ohne eine solche Meldung zurück.
- Array-Indizes beginnen mit 0. Überprüfen Sie ArrayLength, bevor Sie das Feld lesen. Z steht für Welthöhe; Layer ist die Geräteeigenschaft aus Tiledata und Index ist die Seriennummer des Zelleneintrags.
- Die aktuelle Bridge listet statische, Multi- und Weltelemente in der Zellkette auf. Der Name des Befehls beschränkt das Ergebnis nicht ausschließlich auf statics.mul-Einträge. Die Kettenreihenfolge garantiert keine Z-Sortierung.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetStaticTiles(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- x/y/map wählt die aktuelle Zelle aus.
- Die Länge des Arrays ist die Anzahl der Felder. Die Division durch 3 ergibt die Anzahl der Einträge.
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;Parameter und Ablauf:
- Offset ist der Index des ersten Feldes des nächsten Tripels, erhöht um 3.
- Die Offset+2-Prüfung schützt den gesamten Datensatz vor dem Lesen.
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;Parameter und Ablauf:
- x+1 wählt eine benachbarte Zelle aus.
- Tiles[2] – Farbe des ersten Eintrags; Dies ist nicht die dritte Kachel.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: x (Any), y (Any), map (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
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).
Interner Implementierungscode; kein eigenständiges Skript.
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);Sucht nach statischen/Multi-/Item-Einträgen nach graphic/type in einem Rechteck.
-
xmin– Weltkoordinaten von zwei Winkeln, einschließlich; 0..65535. Die neu angeordneten Winkel werden normalisiert. Fläche nicht größer als 1 000 000 Zellen; Ungültige Grenzen verursachen einen Skriptfehler, bevor die Karte gelesen wird. -
ymin– Weltkoordinaten von zwei Winkeln, einschließlich; 0..65535. Die neu angeordneten Winkel werden normalisiert. Fläche nicht größer als 1 000 000 Zellen; Ungültige Grenzen verursachen einen Skriptfehler, bevor die Karte gelesen wird. -
xmax– Weltkoordinaten von zwei Winkeln, einschließlich; 0..65535. Die neu angeordneten Winkel werden normalisiert. Fläche nicht größer als 1 000 000 Zellen; Ungültige Grenzen verursachen einen Skriptfehler, bevor die Karte gelesen wird. -
ymax– Weltkoordinaten von zwei Winkeln, einschließlich; 0..65535. Die neu angeordneten Winkel werden normalisiert. Fläche nicht größer als 1 000 000 Zellen; Ungültige Grenzen verursachen einen Skriptfehler, bevor die Karte gelesen wird. -
worldNum– Karte/Facette 0..255; Verwenden Sie UO.WorldNum(). Eine andere Karte ergibt ein leeres Array. Wenn sich die Karte zwischen den Blöcken ändert, wird das Teilergebnis verworfen. -
tileType– Eine graphic/type-Kachel, normalerweise 0..65535; das ist nicht serial. 0 ist das genaue graphic 0, -1 bedeutet kein type. Ein nicht übereinstimmendes type führt zu einem leeren Ergebnis.
Array-Einträge [graphic, X, Y, Z, hue]; alle Felder int. graphic – type, Z – Basis, hue – Farbe. Mehrere Zelleneinträge bleiben getrennt. Keine Übereinstimmungen: leeres Array. Die Menge ist ArrayLength(Ergebnis), nicht das Ergebnis selbst. Indizes beginnen mit 0. Dies ist kein bool-, serial- oder Pascal-Datensatz; Es gibt keinen siebten Ausgabeparameter.
- Lokale Daten werden gelesen. Die Suche ändert FindItem/FindCount nicht und führt keinen Verschiebungs-, Ziel- oder Netzwerkbefehl aus.
- Reihenfolge: X aufsteigend, innerhalb von X - Y aufsteigend. Aufzeichnungen einer Zelle bewahren die Reihenfolge der Brücke; Es ist nicht nach Entfernung oder Höhe sortiert.
- Die Suche wird in Blöcken von bis zu 32 Zellen mit einem Softbudget von etwa 1 ms verarbeitet. Die Stornierung wird zwischen den Portionen überprüft. Eine komplexe Zellen- oder Kaltablesung kann das Budget sprengen. Es ist besser, eine große Fläche zu unterteilen; Beim Lesen kann sich die Welt verändern.
- Der Static-Zweig des aktuellen Kunden umfasst Static, Multi und Item aus der Zelle, einschließlich geladener Items auf dem Boden; Land und Mobil sind nicht enthalten. Es ist umfangreicher als die klassische Auswahl nur statischer Dateien.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
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));Parameter und Ablauf:
- x/y – Position self, Karte – aktuelle Karte. Die Region 3×3 umfasst die Grenzen. In Ex werden zwei type übertragen, in Normalform eines. Ändern Sie die Beispiele entsprechend Ihren Ressourcen. Dies ist ein graphic-Objekt, kein ID-Objekt.
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;Parameter und Ablauf:
- Der Bereich 2×2 wird vom größeren Winkel auf den kleineren übertragen. Der Algorithmus selbst normalisiert die Grenzen. Zeile – ein Datensatz; PrintTile wird vollständig deklariert und formatiert nur Zahlen, ohne etwas zu verschieben. graphic - type, x/y – Koordinaten, z – Höhe, hue – Farbe. Für Grundstücke wird eine Bedingung hue=0 übergeben: Es gibt kein Farbfeld im Grundstücksdatensatz.
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;Parameter und Ablauf:
- Nicht mehr als drei Suchvorgänge für eine Zelle; zwischen Versuchen WaitAsync(250). Jeder Aufruf erzeugt ein neues Ergebnis. Die Länge Null bedeutet, dass es jetzt keine Übereinstimmungen gibt und dass das Objekt nicht dauerhaft auf dem Server fehlt.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
UO.GetStaticTilesArray(xmin, ymin, xmax, ymax, worldNum, tileType) — UO.GetStaticTilesArray(Any,Any,Any,Any,Any,Any)
Parameter: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileType (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
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).
Interner Implementierungscode; kein eigenständiges Skript.
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);Sucht nach statischen/Multi-/Item-Einträgen nach graphic/type in einem Rechteck.
-
xmin– Weltkoordinaten von zwei Winkeln, einschließlich; 0..65535. Die neu angeordneten Winkel werden normalisiert. Fläche nicht größer als 1 000 000 Zellen; Ungültige Grenzen verursachen einen Skriptfehler, bevor die Karte gelesen wird. -
ymin– Weltkoordinaten von zwei Winkeln, einschließlich; 0..65535. Die neu angeordneten Winkel werden normalisiert. Fläche nicht größer als 1 000 000 Zellen; Ungültige Grenzen verursachen einen Skriptfehler, bevor die Karte gelesen wird. -
xmax– Weltkoordinaten von zwei Winkeln, einschließlich; 0..65535. Die neu angeordneten Winkel werden normalisiert. Fläche nicht größer als 1 000 000 Zellen; Ungültige Grenzen verursachen einen Skriptfehler, bevor die Karte gelesen wird. -
ymax– Weltkoordinaten von zwei Winkeln, einschließlich; 0..65535. Die neu angeordneten Winkel werden normalisiert. Fläche nicht größer als 1 000 000 Zellen; Ungültige Grenzen verursachen einen Skriptfehler, bevor die Karte gelesen wird. -
worldNum– Karte/Facette 0..255; Verwenden Sie UO.WorldNum(). Eine andere Karte ergibt ein leeres Array. Wenn sich die Karte zwischen den Blöcken ändert, wird das Teilergebnis verworfen. -
tileTypes– Array aus numerischen graphic/type; jedes passende type wird eingeschaltet. Durch das Wiederholen von type werden keine Einträge dupliziert. Der Skalar wird auch als eins type angenommen. Leeres Array bedeutet alles type; Ein Array von einem 0 durchsucht nur 0.
Array-Einträge [graphic, X, Y, Z, hue]; alle Felder int. graphic – type, Z – Basis, hue – Farbe. Mehrere Zelleneinträge bleiben getrennt. Keine Übereinstimmungen: leeres Array. Die Menge ist ArrayLength(Ergebnis), nicht das Ergebnis selbst. Indizes beginnen mit 0. Dies ist kein bool-, serial- oder Pascal-Datensatz; Es gibt keinen siebten Ausgabeparameter.
- Lokale Daten werden gelesen. Die Suche ändert FindItem/FindCount nicht und führt keinen Verschiebungs-, Ziel- oder Netzwerkbefehl aus.
- Reihenfolge: X aufsteigend, innerhalb von X - Y aufsteigend. Aufzeichnungen einer Zelle bewahren die Reihenfolge der Brücke; Es ist nicht nach Entfernung oder Höhe sortiert.
- Die Suche wird in Blöcken von bis zu 32 Zellen mit einem Softbudget von etwa 1 ms verarbeitet. Die Stornierung wird zwischen den Portionen überprüft. Eine komplexe Zellen- oder Kaltablesung kann das Budget sprengen. Es ist besser, eine große Fläche zu unterteilen; Beim Lesen kann sich die Welt verändern.
- Der Static-Zweig des aktuellen Kunden umfasst Static, Multi und Item aus der Zelle, einschließlich geladener Items auf dem Boden; Land und Mobil sind nicht enthalten. Es ist umfangreicher als die klassische Auswahl nur statischer Dateien.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
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));Parameter und Ablauf:
- x/y – Position self, Karte – aktuelle Karte. Die Region 3×3 umfasst die Grenzen. In Ex werden zwei type übertragen, in Normalform eines. Ändern Sie die Beispiele entsprechend Ihren Ressourcen. Dies ist ein graphic-Objekt, kein ID-Objekt.
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;Parameter und Ablauf:
- Der Bereich 2×2 wird vom größeren Winkel auf den kleineren übertragen. Der Algorithmus selbst normalisiert die Grenzen. Zeile – ein Datensatz; PrintTile wird vollständig deklariert und formatiert nur Zahlen, ohne etwas zu verschieben. graphic - type, x/y – Koordinaten, z – Höhe, hue – Farbe. Für Grundstücke wird eine Bedingung hue=0 übergeben: Es gibt kein Farbfeld im Grundstücksdatensatz.
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;Parameter und Ablauf:
- Nicht mehr als drei Suchvorgänge für eine Zelle; zwischen Versuchen WaitAsync(250). Jeder Aufruf erzeugt ein neues Ergebnis. Die Länge Null bedeutet, dass es jetzt keine Übereinstimmungen gibt und dass das Objekt nicht dauerhaft auf dem Server fehlt.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
UO.GetStaticTilesArrayEx(xmin, ymin, xmax, ymax, worldNum, tileTypes) — UO.GetStaticTilesArrayEx(Any,Any,Any,Any,Any,Any)
Parameter: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileTypes (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
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).
Interner Implementierungscode; kein eigenständiges Skript.
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);Liest die durchschnittliche Höhe der Bodenoberfläche in einer Zelle.
-
x– Weltkoordinate X der Zelle der aktuellen Karte, nicht die Position im Gump. -
y— Welt-Y-Koordinate der aktuellen Kartenzelle. -
worldNum– Karten-/Facettennummer; Verwenden Sie UO.WorldNum(). Es wird nur die aktuell geladene Karte gelesen.
int – Land.AverageZ, einschließlich negativer Höhe und 0. Wenn keine Karte/Boden vorhanden ist oder die Karte nicht übereinstimmt, wird 0 zurückgegeben, sodass dieser Wert fehlende Daten nicht von der wahren Höhe 0 unterscheidet. Es handelt sich nicht um bool, den Boden oder die Höhe der nächstgelegenen Statik.
- Der Befehl liest die lokale Karte und löst keine Bewegung oder ein Ziel aus. Eine Zelle außerhalb der Kartengröße wird nicht durch eine Zelle in einer angrenzenden Spalte ersetzt.
- Die Höhe von Z, graphic/type, die Farbe von hue, Flaggen und Ausrüstungsebene haben unterschiedliche Bedeutungen. Null graphic oder Z=0 können gültige Daten sein; Überprüfen Sie das Ergebnisformular.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetSurfaceZ(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- Alle drei Parameter beziehen sich auf die aktuelle Zelle der Karte. z ist eine numerische Höhe, nicht das Ergebnis einer Bewegung.
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));Parameter und Ablauf:
- GetMapCell wird benötigt, um fehlende Daten von der Höhe 0 zu unterscheiden. Die Karte kann sich zwischen zwei Anrufen noch ändern.
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;Parameter und Ablauf:
- Der Unterschied zeigt die Neigung der Erde. In diesem Beispiel wird nichts verschoben und die Route wird nicht berechnet.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: x (Any), y (Any), worldNum (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetSurfaceZ:bridge.GetSurfaceZ(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Interner Implementierungscode; kein eigenständiges Skript.
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);Liest die Eigenschaftsbitmaske graphic aus dem Tiledata-Eintrag.
-
group- 0 - Landtabelle; 1 – Tabelle der statischen graphic. Die Implementierung betrachtet jede Gruppe ungleich Null als zweite Tabelle; Verwenden Sie 0 oder 1. -
tileId– Grafik-/type-Einträge in Kacheldaten, normalerweise die ganze Zahl 0…65535. Dies ist nicht das serial eines Objekts oder ein Index der Statik innerhalb einer Zelle.
int – niedrige 32 Bits der Tiledata-Flags. Das höchstwertige gesetzte Bit führt zu einer Zahl mit negativem Vorzeichen. 0 bedeutet das Fehlen dieser Flags oder ungültiges tileId; Dies ist kein eigenständiges Fehlerzeichen und kein bool. Es können mehrere Eigenschaften gleichzeitig festgelegt werden.
- Dieser Befehl liest den Referenzeintrag graphic; Weltkoordinaten werden nicht benötigt. group=0 und group=1 wählen verschiedene Tabellen aus, auch wenn tileId gleich ist.
- Die Eigenschaft wird aus den graphic-Daten gelesen, nicht aus dem aktuellen Status eines bestimmten Elements.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetTileFlags(1, 0x0CCA);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- group=1 wählt statische Kacheldaten aus; tileId=0x0CCA - graphic Baum.
- Der Wert enthält das im Abschnitt „Rückgaben“ beschriebene Ergebnis. seine Bedeutung stimmt nicht mit serial überein.
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;Parameter und Ablauf:
- FindType gibt serial zurück. GetType wandelt es in numerisches graphic um.
- group=1 wird für Elemente verwendet; in tileId graphic wird übertragen, nicht Artikel.
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;Parameter und Ablauf:
- Die ersten beiden Argumente GetLandscapeTile sind die aktuelle Welt X/Y; Die dritte ist die aktuelle Karte.
- land[0] enthält graphic Länder. group=0 wählt Landkacheldaten aus. Für GetTileLayer/GetTileHeight gibt der Boden 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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: group (Any), tileId (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetTileFlags. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileFlags:bridge.GetTileFlags(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group).
Interner Implementierungscode; kein eigenständiges Skript.
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);Liest die Höhe graphic aus dem Tiledata-Eintrag.
-
group- 0 - Landtabelle; 1 – Tabelle der statischen graphic. Die Implementierung betrachtet jede Gruppe ungleich Null als zweite Tabelle; Verwenden Sie 0 oder 1. -
tileId– Grafik-/type-Einträge in Kacheldaten, normalerweise die ganze Zahl 0…65535. Dies ist nicht das serial eines Objekts oder ein Index der Statik innerhalb einer Zelle.
int ist die Höhe der Grafik in Z-Einheiten aus Tiledata. Dies ist die Höhengröße der Grafik, nicht die Weltkoordinate ihrer Basis Z. Für Boden, fehlende Eingabe oder Nullhöhe wird 0 zurückgegeben. Die Höhe allein beweist noch nicht die Geländegängigkeit.
- Dieser Befehl liest den Referenzeintrag graphic; Weltkoordinaten werden nicht benötigt. group=0 und group=1 wählen verschiedene Tabellen aus, auch wenn tileId gleich ist.
- Die Eigenschaft wird aus den graphic-Daten gelesen, nicht aus dem aktuellen Status eines bestimmten Elements.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.GetTileHeight(1, 0x0CCA);
UO.Print("GetTileHeight: " + Convert.ToString(result));Parameter und Ablauf:
- group=1 wählt statische Kacheldaten aus; tileId=0x0CCA - graphic Baum.
- Der Wert enthält das im Abschnitt „Rückgaben“ beschriebene Ergebnis. seine Bedeutung stimmt nicht mit serial überein.
var value = UO.GetTileHeight(1, 0x0CCA);
UO.Print("Tiledata height: " + Convert.ToString(value));Parameter und Ablauf:
- FindType gibt serial zurück. GetType wandelt es in numerisches graphic um.
- group=1 wird für Elemente verwendet; in tileId graphic wird übertragen, nicht Artikel.
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;Parameter und Ablauf:
- Die ersten beiden Argumente GetLandscapeTile sind die aktuelle Welt X/Y; Die dritte ist die aktuelle Karte.
- land[0] enthält graphic Länder. group=0 wählt Landkacheldaten aus. Für GetTileLayer/GetTileHeight gibt der Boden 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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: group (Any), tileId (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetTileHeight. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileDataProperties:bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)).
Interner Implementierungscode; kein eigenständiges Skript.
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);Liest die Equipment-Layer-Nummer aus dem Tiledata-Eintrag.
-
group- 0 - Landtabelle; 1 – Tabelle der statischen graphic. Die Implementierung betrachtet jede Gruppe ungleich Null als zweite Tabelle; Verwenden Sie 0 oder 1. -
tileId– Grafik-/type-Einträge in Kacheldaten, normalerweise die ganze Zahl 0…65535. Dies ist nicht das serial eines Objekts oder ein Index der Statik innerhalb einer Zelle.
int — Nummer der Ausrüstungsschicht graphic: zum Beispiel 1=Rhand, 2=Lhand, 21=Backpack. Für einen Boden, einen fehlenden Eintrag oder eine Nullschicht wird 0 zurückgegeben. Dies ist nicht die Reihenfolge der Statik in einer Zelle, nicht in einem Boden und nicht Z.
- Dieser Befehl liest den Referenzeintrag graphic; Weltkoordinaten werden nicht benötigt. group=0 und group=1 wählen verschiedene Tabellen aus, auch wenn tileId gleich ist.
- Die Eigenschaft wird aus den graphic-Daten gelesen, nicht aus dem aktuellen Status eines bestimmten Elements.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.GetTileLayer(1, 0x0CCA);
UO.Print("GetTileLayer: " + Convert.ToString(result));Parameter und Ablauf:
- group=1 wählt statische Kacheldaten aus; tileId=0x0CCA - graphic Baum.
- Der Wert enthält das im Abschnitt „Rückgaben“ beschriebene Ergebnis. seine Bedeutung stimmt nicht mit serial überein.
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;Parameter und Ablauf:
- FindType gibt serial zurück. GetType wandelt es in numerisches graphic um.
- group=1 wird für Elemente verwendet; in tileId graphic wird übertragen, nicht Artikel.
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;Parameter und Ablauf:
- Die ersten beiden Argumente GetLandscapeTile sind die aktuelle Welt X/Y; Die dritte ist die aktuelle Karte.
- land[0] enthält graphic Länder. group=0 wählt Landkacheldaten aus. Für GetTileLayer/GetTileHeight gibt der Boden 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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: group (Any), tileId (Any)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetTileLayer. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileDataProperties:bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)).
Interner Implementierungscode; kein eigenständiges Skript.
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);Liest den Namen graphic aus dem Tiledata-Eintrag.
-
group- 0 - Landtabelle; 1 – Tabelle der statischen graphic. Die Implementierung betrachtet jede Gruppe ungleich Null als zweite Tabelle; Verwenden Sie 0 oder 1. -
tileId– Grafik-/type-Einträge in Kacheldaten, normalerweise die ganze Zahl 0…65535. Dies ist nicht das serial eines Objekts oder ein Index der Statik innerhalb einer Zelle.
string – Name aus Spieldateien, Tiledata. Eine leere Zeichenfolge bedeutet einen leeren Namen oder ein ungültiges tileId. Der Name stammt aus den Spielressourcen und wird nicht automatisch in die Oberflächensprache IDE übersetzt. Dies ist nicht der Name eines bestimmten Elements vom Server.
- Dieser Befehl liest den Referenzeintrag graphic; Weltkoordinaten werden nicht benötigt. group=0 und group=1 wählen verschiedene Tabellen aus, auch wenn tileId gleich ist.
- Die Eigenschaft wird aus den graphic-Daten gelesen, nicht aus dem aktuellen Status eines bestimmten Elements.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.GetTileName(1, 0x0CCA);
UO.Print("GetTileName: " + Convert.ToString(result));Parameter und Ablauf:
- group=1 wählt statische Kacheldaten aus; tileId=0x0CCA - graphic Baum.
- Der Wert enthält das im Abschnitt „Rückgaben“ beschriebene Ergebnis. seine Bedeutung stimmt nicht mit serial überein.
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;Parameter und Ablauf:
- FindType gibt serial zurück. GetType wandelt es in numerisches graphic um.
- group=1 wird für Elemente verwendet; in tileId graphic wird übertragen, nicht Artikel.
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;Parameter und Ablauf:
- Die ersten beiden Argumente GetLandscapeTile sind die aktuelle Welt X/Y; Die dritte ist die aktuelle Karte.
- land[0] enthält graphic Länder. group=0 wählt Landkacheldaten aus. Für GetTileLayer/GetTileHeight gibt der Boden 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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: group (Any), tileId (Any)
Ergebnis: string / String.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetTileName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileDataName:bridge.GetTileDataName(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group).
Interner Implementierungscode; kein eigenständiges Skript.
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);Liest das übereinstimmende graphic ID aus der Objektkette der Zelle der aktuell geladenen Spielkarte.
-
x– X-Zellenkoordinate, int. -
y– Y-Zellenkoordinate, int. -
map– Kartennummer; muss mit World.MapIndex übereinstimmen und World.Map muss vorhanden sein. -
tileStart– Unterer aktivierter Grafikrand. -
tileEnd– Der obere eingeschlossene Rand der Grafik. Der umgekehrte Bereich wird nicht neu angeordnet und erzeugt keine Übereinstimmungen. -
uoPath– Der Kompatibilitätsparameter wird in string umgewandelt, aber die aktuelle Bridge verwendet ihn nicht und lädt den anderen Dateiordner UO nicht.
Array int mit flachen Quadern [graphic,x,y,z,graphic,x,y,z,...]. Der Kartenfehler gibt ein leeres Array und eine Meldung aus; Keine Übereinstimmungen führen ebenfalls zu einem leeren Array.
- Folgt World.Map.GetTile(x,y).TNext und prüft tileStart<=Graphic<=tileEnd. Objekttypen werden nicht separat gefiltert: Es handelt sich um eine Zellkette, nicht nur um statische Elemente.
- Der Befehl liest die geladene Geometrie des Clients. Daten von einer anderen Karte/Facette werden nicht geladen. Der Parameter uoPath wird nicht zum Herunterladen von Dateien verwendet; Die Anzahl der Einträge entspricht der Länge des Arrays/4.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetTileXYM(UO.GetX(), UO.GetY(), UO.WorldNum(), 0, 65535, "");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- Jeder Eintrag belegt vier 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;Parameter und Ablauf:
- Die Indizes i und i+3 entsprechen graphic und z desselben Datensatzes.
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;Parameter und Ablauf:
- Der Bereich 100..99 enthält kein graphic und erzeugt ein leeres Array.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: x (Any), y (Any), map (Any), tileStart (Any), tileEnd (Any), uoPath (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
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().
Interner Implementierungscode; kein eigenständiges Skript.
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);Liest einen gespeicherten statischen Benutzerdatensatz.
-
id- int ID, erhalten durch AddUserStatic; nicht das graphic/type und nicht das serial der Welt.
string – gespeicherter serialisierter Datensatz; unbekannt ID ergibt eine leere Zeichenfolge.
- state.UserStatics.TryGetValue gibt die Zeichenfolge zurück, ohne sie zu analysieren. Geometrische Notation - „graphic|x|y|z|hue|map“; Bei alten Texteinträgen kann es sich um einen anderen Text handeln.
- Liest den aktuellen lokalen Status. Es gibt kein Paket, Ziel oder automatische Aktualisierung; Einzelne Lesevorgänge können unterschiedliche Zustände aufweisen.
- In einem regulären Client-Host werden diese Statusdaten vom GetPersistentState-Manager übernommen und gelten für Skripte/Chat/Makros derselben Welt/dieselben Profils und gehören nicht zu einem einzigen Skript. Ein anderer Prozess oder ein scheinbar separater InjectionRuntimeState hat einen anderen Zustand. Das Laden/Löschen eines Profils kann es ersetzen; Die gespeicherten serial werden weiterhin mit der geladenen Welt verglichen.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.GetUserStatic(1);
UO.Print("GetUserStatic: " + Convert.ToString(result));Parameter und Ablauf:
- Liest einen gespeicherten statischen Benutzerdatensatz.
UO.Print(UO.GetUserStatic(1));Parameter und Ablauf:
- state.UserStatics.TryGetValue gibt die Zeichenfolge zurück, ohne sie zu analysieren. Geometrische Notation - „graphic|x|y|z|hue|map“; Bei alten Texteinträgen kann es sich um einen anderen Text handeln.
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;Parameter und Ablauf:
- Liest den aktuellen lokalen Status. Es gibt kein Paket, Ziel oder automatische Aktualisierung; Einzelne Lesevorgänge können unterschiedliche Zustände aufweisen.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: id (Any)
Ergebnis: string / String.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetUserStatic. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(id).
Interner Implementierungscode; kein eigenständiges Skript.
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();Liest den Status.UserStatics.
Es gibt keine Parameter.
Array von Strings [id, serializedText], sortiert nach ID. Jede ID ist int, serializedText - string; Ein leeres Wörterbuch ergibt ein leeres Array.
- Liest den Status.UserStatics. Die geometrische Notation wird als „graphic|x|y|z|hue|map“ gespeichert; Ältere Texteinträge AddUserStatic können ein anderes Format haben. Dabei handelt es sich um lokale Benutzereinträge, nicht nur um statische Karten.
- Liest den aktuellen lokalen Status. Es gibt kein Paket, Ziel oder automatische Aktualisierung; Einzelne Lesevorgänge können unterschiedliche Zustände aufweisen.
- In einem regulären Client-Host werden diese Statusdaten vom GetPersistentState-Manager übernommen und gelten für Skripte/Chat/Makros derselben Welt/dieselben Profils und gehören nicht zu einem einzigen Skript. Ein anderer Prozess oder ein scheinbar separater InjectionRuntimeState hat einen anderen Zustand. Das Laden/Löschen eines Profils kann es ersetzen; Die gespeicherten serial werden weiterhin mit der geladenen Welt verglichen.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetUserStatics();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- Liest den Status.UserStatics.
var records = UO.GetUserStatics();
UO.Print(UO.GetArrayLength(records));Parameter und Ablauf:
- Liest den Status.UserStatics. Die geometrische Notation wird als „graphic|x|y|z|hue|map“ gespeichert; Ältere Texteinträge AddUserStatic können ein anderes Format haben. Dabei handelt es sich um lokale Benutzereinträge, nicht nur um statische Karten.
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;Parameter und Ablauf:
- Liest den aktuellen lokalen Status. Es gibt kein Paket, Ziel oder automatische Aktualisierung; Einzelne Lesevorgänge können unterschiedliche Zustände aufweisen.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: dynamic / Any.
Beim Aufruf:
Interner Implementierungscode; kein eigenständiges Skript.
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);Liest erweiterte Bodenaufzeichnungen, oberirdische Aufzeichnungen und geladene Weltelemente im ausgewählten Bereich.
-
x– X-Zelle der aktuell geladenen Karte; Weltkoordinate, nicht Position innerhalb des Gumps. -
y– Y-Zelle der aktuell geladenen Karte; Weltkoordinate, nicht Position innerhalb des Gumps. -
map– Kartennummer. Wenn dieses Argument im ausgewählten Formular nicht vorhanden ist, wird die aktuelle Karte verwendet. Der echte Client liest nur Kacheln aus der aktuell geladenen Karte.
Array von Datensätzen. Jedes result[i]-Element hat das folgende Format:
Array von 11-Feldern eines Datensatzes; Indizes beginnen mit 0:
-
[0] kind— string: „land“, „static“ oder „object“. -
[1] serial- int: serial dynamisches Element; für Land/statisch ist 0. -
[2] graphic- int: type Grafiken. -
[3] x,[4] y- int: Weltkoordinaten der Zelle. -
[5] z- int: die Höhe der Basis in der Welt. -
[6] hue- int: Farbe, in Bodennähe 0. -
[7] flags– int: niedrige 32 Bits der Tiledata-Flags. -
[8] name- string: Name aus Kacheldaten. -
[9] layer- int: Ausrüstungsschicht aus Tiledata, in Bodennähe 0; kein statischer Index. -
[10] height- int: Höhe graphic aus Kacheldaten, bodennah 0; nicht die Koordinate Z.
ArrayLength(Ergebnis) – die Anzahl der Datensätze, nicht die Anzahl der Zellen und nicht die Anzahl der Routenschritte. Das Ergebnis kann leer sein. Ein x/y kann mehrere Einträge mit unterschiedlichen Z haben. Der Eintrag „object“ hat serial; der Eintrag „statisch“ hat kein verwendbares serial.
- Die Daten beziehen sich auf die aktuell geladene Karte. Eine weitere Karte oder nicht erreichbare Zelle führt zu einem leeren Array. Bei direkten Kachelabfragen können zusätzlich Karteninkongruenzen gemeldet werden. GetWorldCell und GetWorldTilesArray geben sofort ein leeres Array ohne eine solche Meldung zurück.
- Array-Indizes beginnen mit 0. Überprüfen Sie ArrayLength, bevor Sie das Feld lesen. Z steht für Welthöhe; Layer ist die Geräteeigenschaft aus Tiledata und Index ist die Seriennummer des Zelleneintrags.
- Der statische Teil verwendet GetStaticTiles: Seine aktuelle Auswahl umfasst auch Multi/Item. Ein Weltgegenstand kann zusätzlich als „object“ mit serial erscheinen; Behandeln Sie nicht jeden Eintrag als Einzelstück.
- GetWorldTilesArray begrenzt den Bereich der 1 000 000 Zellen. Das Überschreiten von Koordinaten außerhalb von 0…65535/Karte außerhalb von 0…255 führt zu einem Befehlsfehler und nicht zu einem Teilarray. Wählen Sie für häufige Umfragen einen kleinen Bereich.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
object? result = UO.GetWorldCell(UO.GetX(), UO.GetY());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parameter und Ablauf:
- GetWorldCell liest eine Zelle; GetWorldTilesArray liest in diesem Beispiel das Quadrat 3×3 mit aktivierten Rändern.
- Zellen[i] ist ein verschachteltes Array. Kachel[0] – Kategorie, [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;Parameter und Ablauf:
- Der Bereich wird anhand der Koordinaten und nicht anhand des Containers ausgewählt.
- Die kind="object"-Prüfung trennt Serienartikel von geerdeten/statischen Artikeln; [1] enthält 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;Parameter und Ablauf:
- Tile[5] und GetZ() werden in den gleichen Welthöheneinheiten verglichen.
- Gleichheit Z filtert die Basis, bedeutet aber nicht die Passierbarkeit oder Anpassung des gesamten Bodens.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: x (Any), y (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetWorldCell. -
InjectionScript.Runtime.InjectionApiUO.GetWorldCell:GetWorldCell(x, y, new InjectionValue(bridge.WorldNumber)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
Interner Implementierungscode; kein eigenständiges Skript.
public InjectionValue GetWorldCell(InjectionValue x, InjectionValue y)
=> GetWorldCell(x, y, new InjectionValue(bridge.WorldNumber));Parameter: x (Any), y (Any), map (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
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).
Interner Implementierungscode; kein eigenständiges Skript.
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();Liest die aktuelle Kartennummer vom Client-Modell.
Es gibt keine Parameter.
int – Index der aktuellen Karte des Kunden, normalerweise 0=Felucca, 1=Trammel, 2=Ilshenar, 3=Malas, 4=Tokuno, 5=Ter Mur. Der Benutzerserver verwendet möglicherweise einen anderen Kartensatz. 0 ist eine vollwertige Karte, kein Anzeichen eines Fehlers.
- Bereits empfangene lokale Daten werden gelesen. Die Anfrage öffnet den Status nicht und zwingt den Server nicht, ein Update zu senden. Nach einem Tod, einem Kartenübergang oder einer Objektlöschung können sich die Werte zwischen zwei Aufrufen ändern.
- C# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.GetWorldNum();
UO.Print("GetWorldNum: " + Convert.ToString(result));Parameter und Ablauf:
- Der Aufruf ohne Argumente bezieht sich auf self. Im Wert wird die aktuelle Kartennummer gespeichert.
- Convert.ToString wandelt die auszugebende Zahl um und ändert die Bedeutung des Ergebnisses nicht.
var value = UO.GetWorldNum();
UO.Print("GetWorldNum: " + Convert.ToString(value));Parameter und Ablauf:
- Der Wert wird einmal ohne Argumente gelesen. Die aktuelle Kartennummer wird in der angezeigten Berechnung bzw. Bedingung verwendet.
- Numerische Schwellenwerte sind Beispiele für Skriptbedingungen und keine neuen Client-Grenzwerte. Das Feld speichert die oben beschriebenen Servereinheiten und Einschränkungen.
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;Parameter und Ablauf:
- Beide Aufrufe ohne Argument lesen ihren aktuellen Wert. UO.Wait(1000) gibt eine Pause in Millisekunden zwischen den Aufnahmen.
- Die verglichene Änderung ist die Nummer der aktuellen Karte. Ein Beispiel ändert nichts auf der Welt und wartet nicht endlos. Ereignisse innerhalb dieser Sekunde können übersehen werden.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [GetWorldNum]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
Der Aufruf führt den gespeicherten Handler-Delegate aus. Die Registrierungsmethode erzeugt ihn beim Aufbau der API.
Interner Implementierungscode; kein eigenständiges Skript.
() => bridge.WorldNumberAPI-Erstellung: Diese Funktionen registrieren die API. Sie werden nicht bei jedem Befehlsaufruf erneut ausgeführt.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetWorldTilesArray(object? minX, object? minY, object? maxX, object? maxY, object? map);Liest erweiterte Bodenaufzeichnungen, oberirdische Aufzeichnungen und geladene Weltelemente im ausgewählten Bereich.
-
minX– Der erste X-Rand des Rechtecks, einschließlich; 0…65535. -
minY– Der erste Y-Rand des Rechtecks, einschließlich; 0…65535. -
maxX– Zweite eingeschlossene Grenze X; das kleinere/größere der beiden X wird automatisch ausgewählt. -
maxY– Zweite eingeschlossene Grenze Y; das kleinere/größere der beiden Y wird automatisch ausgewählt. -
map– Kartennummer. Wenn dieses Argument im ausgewählten Formular nicht vorhanden ist, wird die aktuelle Karte verwendet. Der echte Client liest nur Kacheln aus der aktuell geladenen Karte.
Array von Datensätzen. Jedes result[i]-Element hat das folgende Format:
Array von 11-Feldern eines Datensatzes; Indizes beginnen mit 0:
-
[0] kind— string: „land“, „static“ oder „object“. -
[1] serial- int: serial dynamisches Element; für Land/statisch ist 0. -
[2] graphic- int: type Grafiken. -
[3] x,[4] y- int: Weltkoordinaten der Zelle. -
[5] z- int: die Höhe der Basis in der Welt. -
[6] hue- int: Farbe, in Bodennähe 0. -
[7] flags– int: niedrige 32 Bits der Tiledata-Flags. -
[8] name- string: Name aus Kacheldaten. -
[9] layer- int: Ausrüstungsschicht aus Tiledata, in Bodennähe 0; kein statischer Index. -
[10] height- int: Höhe graphic aus Kacheldaten, bodennah 0; nicht die Koordinate Z.
ArrayLength(Ergebnis) – die Anzahl der Datensätze, nicht die Anzahl der Zellen und nicht die Anzahl der Routenschritte. Das Ergebnis kann leer sein. Ein x/y kann mehrere Einträge mit unterschiedlichen Z haben. Der Eintrag „object“ hat serial; der Eintrag „statisch“ hat kein verwendbares serial.
- Die Daten beziehen sich auf die aktuell geladene Karte. Eine weitere Karte oder nicht erreichbare Zelle führt zu einem leeren Array. Bei direkten Kachelabfragen können zusätzlich Karteninkongruenzen gemeldet werden. GetWorldCell und GetWorldTilesArray geben sofort ein leeres Array ohne eine solche Meldung zurück.
- Array-Indizes beginnen mit 0. Überprüfen Sie ArrayLength, bevor Sie das Feld lesen. Z steht für Welthöhe; Layer ist die Geräteeigenschaft aus Tiledata und Index ist die Seriennummer des Zelleneintrags.
- Der statische Teil verwendet GetStaticTiles: Seine aktuelle Auswahl umfasst auch Multi/Item. Ein Weltgegenstand kann zusätzlich als „object“ mit serial erscheinen; Behandeln Sie nicht jeden Eintrag als Einzelstück.
- GetWorldTilesArray begrenzt den Bereich der 1 000 000 Zellen. Das Überschreiten von Koordinaten außerhalb von 0…65535/Karte außerhalb von 0…255 führt zu einem Befehlsfehler und nicht zu einem Teilarray. Wählen Sie für häufige Umfragen einen kleinen Bereich.
Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
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));Parameter und Ablauf:
- GetWorldCell liest eine Zelle; GetWorldTilesArray liest in diesem Beispiel das Quadrat 3×3 mit aktivierten Rändern.
- Zellen[i] ist ein verschachteltes Array. Kachel[0] – Kategorie, [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;Parameter und Ablauf:
- Der Bereich wird anhand der Koordinaten und nicht anhand des Containers ausgewählt.
- Die kind="object"-Prüfung trennt Serienartikel von geerdeten/statischen Artikeln; [1] enthält 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;Parameter und Ablauf:
- Tile[5] und GetZ() werden in den gleichen Welthöheneinheiten verglichen.
- Gleichheit Z filtert die Basis, bedeutet aber nicht die Passierbarkeit oder Anpassung des gesamten Bodens.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: minX (Any), minY (Any), maxX (Any), maxY (Any), map (Any)
Ergebnis: dynamic / Any.
Beim Aufruf:
-
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.
Interner Implementierungscode; kein eigenständiges Skript.
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);Liest das X-Feld des geladenen Objekts oder des aktuellen Zeichens.
-
idist die Seriennummer/ID des Objekts, nicht graphic/type. Zahl, Hex-String, Standardname self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse oder Name AddObject. Der Alias muss festgelegt werden; Die Existenz wird durch Exists überprüft. Das registrierte Formular ohne Argumente verwendet self.
int ist die X-Koordinate. Für ein unbekanntes Objekt wird 0 zurückgegeben. Null ist auch eine gültige Koordinate. Gemessen in Zellen für Weltobjekte; Dies sind keine Bildschirmpixel.
- Es werden die aktuellsten, dem Client bereits bekannten Daten gelesen; Die Update-Anfrage wird nicht an den Server gesendet.
- Ein unbekanntes Objekt und eine Eigenschaft, die noch nicht abgerufen wurde, können einen Null-/leeren Wert haben. Überprüfen Sie Exists und die Bedingungen einer bestimmten Aktion.
- Für eine Figur oder ein Objekt auf dem Boden ist dies die Weltkoordinate. Der Gegenstand im Behälter hat eine X/Y-Position innerhalb des Gummis; Der Befehl übersetzt sie nicht in die Weltkoordinaten des Besitzers.
- Die aktuelle Koordinate des Objekts wird gelesen. Ausstehende Schritte werden durch diesen Befehl nicht in Routenberechnungen umgewandelt.
int x = UO.GetX();
UO.Print($"X = {x}");Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.GetX();
UO.Print("GetX: " + Convert.ToString(result));Parameter und Ablauf:
- Das Formular ohne Argument wählt self, das aktuelle Zeichen.
- Position enthält die Koordinate X, nicht serial.
var position = UO.GetX();
UO.Print("X: " + Convert.ToString(position));Parameter und Ablauf:
- lasttarget sollte auf den geladenen Charakter oder Gegenstand auf dem Boden zeigen.
- Delta – Differenz entlang einer Achse. Es kommt nicht auf die Länge der Strecke an; Der Wert kann negativ sein.
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;Parameter und Ablauf:
- id="self" ist eine explizite Form der Zeichenauswahl. UO.Wait=500 Millisekunden.
- Der Vergleich zeigt nur die Änderung in der X-Achse. Änderungen in der anderen Achse oder Drehung werden hier nicht berücksichtigt.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetX. -
InjectionScript.Runtime.InjectionApiUO.GetX:GetX("self").
Interner Implementierungscode; kein eigenständiges Skript.
public int GetX() => GetX("self");Parameter: id (Any/Integer/String)
Ergebnis: int / Any.
Beim Aufruf:
-
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.
Interner Implementierungscode; kein eigenständiges Skript.
case "getx": return new InjectionValue(bridge.GetX(Arg(0, bridge.Self)));Parameter: id (Any/Integer/String)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetX. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(id).
Interner Implementierungscode; kein eigenständiges Skript.
public int GetX(int id) => bridge.GetX(id);Parameter: id (Any/Integer/String)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetX. -
InjectionScript.Runtime.InjectionApiUO.GetX:GetX(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Interner Implementierungscode; kein eigenständiges Skript.
public int GetX(string id) => GetX(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetY();
int UO.GetY(object? id);Liest das Y-Feld des geladenen Objekts oder des aktuellen Zeichens.
-
idist die Seriennummer/ID des Objekts, nicht graphic/type. Zahl, Hex-String, Standardname self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse oder Name AddObject. Der Alias muss festgelegt werden; Die Existenz wird durch Exists überprüft. Das registrierte Formular ohne Argumente verwendet self.
int ist die Y-Koordinate. Für ein unbekanntes Objekt wird 0 zurückgegeben. Null ist auch eine gültige Koordinate. Gemessen in Zellen für Weltobjekte; Dies sind keine Bildschirmpixel.
- Es werden die aktuellsten, dem Client bereits bekannten Daten gelesen; Die Update-Anfrage wird nicht an den Server gesendet.
- Ein unbekanntes Objekt und eine Eigenschaft, die noch nicht abgerufen wurde, können einen Null-/leeren Wert haben. Überprüfen Sie Exists und die Bedingungen einer bestimmten Aktion.
- Für eine Figur oder ein Objekt auf dem Boden ist dies die Weltkoordinate. Der Gegenstand im Behälter hat eine X/Y-Position innerhalb des Gummis; Der Befehl übersetzt sie nicht in die Weltkoordinaten des Besitzers.
- Die aktuelle Koordinate des Objekts wird gelesen. Ausstehende Schritte werden durch diesen Befehl nicht in Routenberechnungen umgewandelt.
int y = UO.GetY();
UO.Print($"Y = {y}");Jedes Beispiel kann als separate Datei .csx gespeichert und in IDE ausgeführt werden. Die UO-Objekt- und Wartefunktionen stellen den Host der aktuellen Spielsitzung bereit. Ersetzen Sie Demo-serial-Namen, Koordinaten und Adressen durch Ihre eigenen.
Führe diesen Code als eigene .csx-Datei aus. Die Argumente stehen direkt im Aufruf; ersetze Beispielnamen, Serials und Adressen durch eigene Werte.
Das Ergebnis eines Aufrufs wird im Journal ausgegeben. Zahlen werden nicht in bool umgewandelt; bei Arrays wird die Anzahl der Elemente angezeigt.
var result = UO.GetY();
UO.Print("GetY: " + Convert.ToString(result));Parameter und Ablauf:
- Das Formular ohne Argument wählt self, das aktuelle Zeichen.
- Position enthält die Koordinate Y, nicht serial.
var position = UO.GetY();
UO.Print("Y: " + Convert.ToString(position));Parameter und Ablauf:
- lasttarget sollte auf den geladenen Charakter oder Gegenstand auf dem Boden zeigen.
- Delta – Differenz entlang einer Achse. Es kommt nicht auf die Länge der Strecke an; Der Wert kann negativ sein.
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;Parameter und Ablauf:
- id="self" ist eine explizite Form der Zeichenauswahl. UO.Wait=500 Millisekunden.
- Der Vergleich zeigt nur die Änderung in der Y-Achse. Änderungen in der anderen Achse oder Drehung werden hier nicht berücksichtigt.
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# unterscheidet Groß- und Kleinschreibung. Verwenden Sie den genauen UO-Namen. Numerische Flags mit 0 vergleichen; bool nur bei Rückgabetyp bool verwenden.
Parameter: Keine Parameter.
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetY. -
InjectionScript.Runtime.InjectionApiUO.GetY:GetY("self").
Interner Implementierungscode; kein eigenständiges Skript.
public int GetY() => GetY("self");Parameter: id (Any/Integer/String)
Ergebnis: int / Any.
Beim Aufruf:
-
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.
Interner Implementierungscode; kein eigenständiges Skript.
case "gety": return new InjectionValue(bridge.GetY(Arg(0, bridge.Self)));Parameter: id (Any/Integer/String)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetY. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(id).
Interner Implementierungscode; kein eigenständiges Skript.
public int GetY(int id) => bridge.GetY(id);Parameter: id (Any/Integer/String)
Ergebnis: int / Integer.
Beim Aufruf:
-
InjectionScript.Runtime.InjectionApiUO.GetY. -
InjectionScript.Runtime.InjectionApiUO.GetY:GetY(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Interner Implementierungscode; kein eigenständiges Skript.
public int GetY(string id) => GetY(GetObject(id));