Repository navigation
FR UO Topic world geometry
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Accueil · C# · IDE · UO API · A–Z · Exemples · Langues
Coordonnées, distances, ligne de vue, capacité de cross-country et données cartographiques. L'obtention d'un itinéraire est décrite séparément dans Mouvement.
| Sujet | Commandes et explications |
|---|---|
| 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
Chaque carte de commande possède plusieurs scénarios indépendants : code direct, fonctions et classes. Vous trouverez ci-dessous une sélection de courts scénarios ; des restrictions et une analyse complète sont à prévoir.
Paramètres, résultat et tous les scénarios
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;Paramètres, résultat et tous les scénarios
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);Ajoute une entrée statique personnalisée à l'état du script local. Le numérique graphic est utilisé pour la vérification des obstacles locaux par Pathfinder ; l'objet n'est pas créé sur le serveur. Un appel à deux arguments avec du texte non numéroté préserve les valeurs héritées et n'ajoute pas de statique au pathfinder.
-
staticItem— valeur numérique graphic ou texte hérité. -
worldNum- index de la carte pour enregistrement ou statique locale. -
graphic— ID statique de0à65535. -
z— hauteur. Lorsqu'elle est ajoutée à Pathfinder, la valeur est limitée à la plage signée byte. -
hue- hue ; une fois ajouté, limité à la plage de0à65535. -
map— index de la carte ; pour le traitement du gestionnaire, la plage est limitée à0–255. -
x— Statistiques personnalisées du monde X ; int. Le gestionnaire accepte les coordonnées dans la carte actuellement chargée. -
y— Statistiques personnalisées du monde Y ; int. Le gestionnaire accepte les coordonnées dans la carte actuellement chargée.
Positif ID de l'entrée créée. Pour la forme à six paramètres, graphic négatif, x, y ou map, ainsi que graphic au-dessus de 65535 donnent -1. ID peut être transmis à UO.UserStaticExists, UO.RemoveUserStatic ou utilisé pour vérifier/supprimer un enregistrement hérité. Le ID renvoyé en lui-même ne confirme pas que le statique sera visible ou appliqué sur le serveur.
-
-
UO.AddUserStatic('tree', 0)- puisquetreen'est pas un nombre, enregistre une paire de valeurs d'origine en tant qu'enregistrement hérité dans l'état d'exécution ; Pathfinder ne l'utilise pas.
-
- Un appel à deux paramètres avec le numérique graphic ajoute la statique de ce graphic aux coordonnées actuelles du personnage, avec les caractères
zet hue0. - L'appel à six paramètres ajoute une statique avec le graphic donné, les coordonnées, l'altitude, hue et la carte. Pathfinding n'en tient compte que sur la carte active et selon les flags graphic dans les données de la tuile client.
Ces entrées sont locales au client de script : elles ne créent pas d'objet de jeu, ne font pas de requête réseau et ne modifient pas les données de fragment.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.AddUserStatic(0x0CCA, UO.GetWorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));1. Enregistrez la paire en tant que données héritées ; le texte StaticItem ne crée pas d'obstacle au pathfinder. - scénario direct
Paramètres et déroulement de l’exécution :
- Enregistrez la paire en tant que données héritées ; le texte StaticItem ne crée pas d'obstacle au pathfinder.
var legacyId = UO.AddUserStatic("tree", 0);
UO.Print(Convert.ToString(legacyId));2. Le numérique graphic est ajouté à la position du personnage sur la carte actuelle. - fonction de script
Paramètres et déroulement de l’exécution :
- Le numérique graphic est ajouté à la position du personnage sur la carte actuelle.
return RunScenario();
object? RunScenario()
{
var staticId = UO.AddUserStatic(0x0CCA, UO.GetWorldNum());
UO.Print(Convert.ToString(staticId));
return null;
}3. Ajoutez explicitement le statique local graphic à la position spécifiée et à la carte spécifiée. - cours de script
Paramètres et déroulement de l’exécution :
- Ajoutez explicitement le statique local graphic à la position spécifiée et à la carte spécifiée.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: staticItem (Any), worldNum (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
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.
Code interne de l’implémentation ; ce n’est pas un script autonome.
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));
}Paramètres: graphic (Any), x (Any), y (Any), z (Any), hue (Any), map (Any)
Résultat: int / Integer.
Pendant un appel:
-
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]).
L’appel exécute le delegate du gestionnaire enregistré. La méthode d’enregistrement crée ce delegate lors de la construction de l’API.
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Vérifie la praticabilité locale d'une ligne entre deux points de la carte via CheckPortableLineOfSight.
-
xfrom— Source X : 0..65535. -
yfrom— Source Y : 0..65535. -
zfrom— Z initial, int. -
xto- Fin X : 0..65535. -
yto- Fin Y : 0..65535. -
zto— Z final, int. -
worldNum- 0..255. Un faisceau de longueur non nulle lit uniquement le _world.Map/World.Map actuellement chargé : via CheckWorldStep vous avez besoin de WorldNum == _world.MapIndex et d'un Player.Pathfinder en direct. Une autre facette n'est pas chargée ou demandée ; il n'y a pas de carte/personnage/éclaireur ou l'étape n'est pas disponible - 0. L'exclusion de X/Y identiques ignore tout le cycle de cellules : avec X/Y dans 0..65535, WorldNum dans 0..255 et abs(Zfrom-Zto)<=20 renvoie 1 même sans carte chargée ou avec un numéro de carte différent. Ceci n’est pas une preuve de géométrie ou d’accessibilité. Le résultat est local, pas une solution serveur LOS.
int 1 — le rayon local a atteint X/Y et la hauteur finale ne diffère de Zto que de 20 ; 0—coordonnées, obstacle ou limite de contrôle invalides.
- Le faisceau se déplace selon l'algorithme de Bresenham, avec un maximum de pas 4096. Sur chaque cellule, BadLocations, CheckWorldStep et la hauteur renvoyée sont pris en compte.
- Lorsque LosOptions != 0 en plus CheckLosCell est utilisé ; le bit 0x100 vérifie les deux carrés latéraux de la diagonale. La vérification de la géométrie locale ne valide pas les règles LOS spécifiques au serveur et ne déplace rien.
- Le mineur byte (valeur & 0xFF) sélectionne l'algorithme 1..4 ; les autres valeurs du mineur byte dans CheckLosCell utilisent l'algorithme 3. Les algorithmes 1/2 bloquent les murs et les impraticables, 3 en plus NoShoot et 4 activent NoShoot uniquement avec 0x200 et autorisent les obstacles de fenêtre uniquement avec 0x400. Le bit 0x100 vérifie en outre les deux cellules latérales de chaque pas de faisceau diagonal pour tout algorithme sélectionné. value=0 désactive les vérifications supplémentaires CheckLosCell/diagonale, mais BadLocations et CheckWorldStep restent. Par exemple 4+0x100+0x200+0x400 sélectionne personnalisé avec trois indicateurs ; setter préserve l'algorithme int original et non normalisé.
- Un faisceau de longueur non nulle lit uniquement le _world.Map/World.Map actuellement chargé : via CheckWorldStep vous avez besoin de WorldNum == _world.MapIndex et d'un Player.Pathfinder en direct. Une autre facette n'est pas chargée ou demandée ; il n'y a pas de carte/personnage/pathfinder ou l'étape n'est pas disponible - 0. L'exclusion de X/Y identiques ignore tout le cycle de cellules : avec X/Y dans 0..65535, WorldNum dans 0..255 et abs(Zfrom-Zto)<=20 renvoie 1 même sans carte chargée ou avec un numéro de carte différent. Ceci n’est pas une preuve de géométrie ou d’accessibilité. Le résultat est local, pas une solution serveur LOS.
- CheckLosCell contourne le Land/Static/Multi/Item chargé d'une cellule. Blocs de terrain infranchissables avec abs(rayZ-land.Z)<=20. Les drapeaux Statique/Multi/Item ne sont valables que dans la plage tuile.Z-2 .. tuile.Z+max(1,Hauteur)+2; La fenêtre personnalisée autorisée est ignorée jusqu'à ce que Wall/Impassable/NoShoot soit coché. Le faisceau X/Y utilise Bresenham, pas maximum de 4096 ; Z est pris à partir des surfaces CheckWorldStep, non interpolé à Zto, la tolérance de hauteur finale est 20.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
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));Paramètres et déroulement de l’exécution :
- Des points identiques passent dans des limites X/Y/carte acceptables.
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));Paramètres et déroulement de l’exécution :
- La hauteur et la perméabilité de la cellule voisine sont lues sur la carte locale.
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;
}Paramètres et déroulement de l’exécution :
- Un X négatif est rejeté avec un résultat de 0 sans passer par la carte.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
UO.CheckLOS(xfrom, yfrom, zfrom, xto, yto, zto, worldNum) — UO.CheckLOS(Any,Any,Any,Any,Any,Any,Any)
Paramètres: xfrom (Any), yfrom (Any), zfrom (Any), xto (Any), yto (Any), zto (Any), worldNum (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
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).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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();Supprime toutes les entrées d’exécution statique utilisateur et les objets du gestionnaire statique local.
Il n'y a pas de paramètres.
void - aucune valeur de retour.
- State.UserStatics et les objets gestionnaire sont effacés. Les fichiers de carte téléchargés et les éléments réels du serveur ne sont pas supprimés.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
La commande forme une instruction séparée. Le message précédent indique le début de l’appel et ne confirme aucune action du serveur.
UO.Print("Calling UO.ClearUserStatics");
UO.ClearUserStatics();Paramètres et déroulement de l’exécution :
- Supprime toutes les entrées d’exécution statique utilisateur et les objets du gestionnaire statique local.
UO.ClearUserStatics();Paramètres et déroulement de l’exécution :
- Ajoutez une statique locale sur la cellule actuelle, puis supprimez toutes les statiques personnalisées.
return RunScenario();
object? RunScenario()
{
var localStatic = UO.AddUserStatic(0x0CCA, UO.GetX(), UO.GetY(), UO.GetZ(), 0, UO.WorldNum());
UO.ClearUserStatics();
return null;
}Paramètres et déroulement de l’exécution :
- Effacer un ensemble vide est acceptable et ne crée pas de nouveau paramètre.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: Aucun paramètre.
Résultat: void / Unit.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClearUserStatics:bridge.ClearUserStatics().
Code interne de l’implémentation ; ce n’est pas un script autonome.
case "clearuserstatics": state.UserStatics.Clear(); bridge.ClearUserStatics(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.ConvertIntegerToFlags(object? group, object? value);Analyse un masque numérique d'indicateurs de tuiles en un tableau de noms d'énumération TileFlag.
-
group- int : seuls 1 ou 2 activent la conversion ; toute autre valeur donne un tableau vide. -
value— Un masque qu'Arg convertit en un bit 32 signé int, puis le pont aboutit à ulong. Pour les indicateurs de bits 64 élevés, cette forme ne préserve pas le masque complet.
Tableau de chaînes nommées non nulles TileFlag dont les bits sont entièrement présents dans le masque. Le masque 0 produit un tableau vide.
- Les groupes 1 et 2 utilisent le même Enum.GetValues plutôt que des répertoires différents. Il s'agit d'une transformation de masque locale ; Les données de tuile ne sont pas demandées.
- L'enregistrement API utilise object?, mais le répartiteur Arg(1) envoie int. Le signe négatif int s'étend lorsqu'il est converti en ulong. GetTileFlags renvoie également uniquement les bits faibles 32 tels que signés int : cette paire compatible ne fournit pas le contrat complet de données de tuiles 64 bits.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.ConvertIntegerToFlags(1, 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- Aucun flag non nul n'est présent dans le masque 0.
var flags = UO.ConvertIntegerToFlags(1,0);
UO.Print(Convert.ToString(ArrayLength(flags)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Paramètres et déroulement de l’exécution :
- Le tableau contient les vrais noms TileFlag du masque sélectionné.
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;Paramètres et déroulement de l’exécution :
- Le groupe 0 n'est pas accepté par cette commande et renvoie un tableau vide.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: group (Any), value (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ConvertTileFlags:bridge.ConvertTileFlags(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Calcule la distance en cellules entre deux points du monde : la plus grande des différences absolues entre X et Y.
-
xfrom— Coordonnée X du point de départ. -
yfrom— Coordonnée Y du point de départ. -
xto— La coordonnée d'affectation X. -
yto— La coordonnée d'affectation Y.
int — distance en cellules, non négative pour les coordonnées valides. 0 signifie le même XY, 1 - une cellule. C'est une quantité, pas un signe de réussite. Une distance de comparaison distincte <= 2 renvoie bool true ou false ; la distance elle-même reste int.
- Calculez uniquement les coordonnées : pas de lots, pas d'attente, pas de chargement de carte, pas de vérification d'obstacles, pas de Z, pas de carte du monde. L'équipe ne recherche pas de parcours praticable et ne garantit pas la réalisation de l'objectif. Les points doivent appartenir au même système de coordonnées ; éviter les obstacles peut allonger le chemin.
- Les quatre paramètres sont nécessaires. Envoyez les coordonnées mondiales int dans la plage documentée 0..65535. object ? dans la signature indique un adaptateur universel, pas le ID de l'article. Ces commandes n'ont pas de valeurs par défaut, de coordonnées à l'intérieur du coffre, de cinquième Z et de surcharge avec un seul objet.
- Formule : Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). Lorsque vous réorganisez les points, le résultat est le même. Ce n'est pas la distance euclidienne, ni la somme des différences, ni le nombre de pas pour contourner un obstacle.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.Dist(100, 100, 103, 104);
UO.Print("Dist: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- De (100,100) à (103,104) : les différences absolues sont 3 et 4, avec un maximum de 4. Les retours principaux int 4.
- int — distance en cellules, non négative pour les coordonnées valides. 0 signifie le même XY, 1 - une cellule. C'est une quantité, pas un signe de réussite. Une distance de comparaison distincte <= 2 renvoie bool true ou false ; la distance elle-même reste int.
- Formule : Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). Lorsque vous réorganisez les points, le résultat est le même. Ce n'est pas la distance euclidienne, ni la somme des différences, ni le nombre de pas pour contourner un obstacle.
return UO.Dist(100,100,103,104);Paramètres et déroulement de l’exécution :
- De (100,100) à (101,99) la distance est de 1. Une comparaison distincte de la distance <=2 donne true=1. Main renvoie "1:1" : la première unité est la distance, la seconde est le résultat logique de la comparaison.
- int — distance en cellules, non négative pour les coordonnées valides. 0 signifie le même XY, 1 - une cellule. C'est une quantité, pas un signe de réussite. Une distance de comparaison distincte <= 2 renvoie bool true ou false ; la distance elle-même reste int.
- Formule : Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). Lorsque vous réorganisez les points, le résultat est le même. Ce n'est pas la distance euclidienne, ni la somme des différences, ni le nombre de pas pour contourner un obstacle.
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;
}Paramètres et déroulement de l’exécution :
- UO.Dist renvoie 4. RebuildTileDistance calcule les différences via Abs, les compare et renvoie la plus grande, tout comme 4. Principal renvoie "4:4". L'assistant est entièrement représenté dans l'exemple et n'est pas une autre commande moteur.
- int — distance en cellules, non négative pour les coordonnées valides. 0 signifie le même XY, 1 - une cellule. C'est une quantité, pas un signe de réussite. Une distance de comparaison distincte <= 2 renvoie bool true ou false ; la distance elle-même reste int.
- Formule : Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). Lorsque vous réorganisez les points, le résultat est le même. Ce n'est pas la distance euclidienne, ni la somme des différences, ni le nombre de pas pour contourner un obstacle.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: xfrom (Any), yfrom (Any), xto (Any), yto (Any)
Résultat: int / Integer.
Pendant un appel:
-
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)).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Mesure la distance dans les cellules en fonction des différences X/Y maximales. Il s’agit d’une estimation géométrique sans recherche de chemin.
-
id— Un argument : serial ou l'alias de l'objet chargé, la distance à laquelle vous souhaitez accéder. -
x— Deux arguments : destination mondiale. Le début est GetX(self), GetY(self). -
y— Deux arguments : destination mondiale. Le début est GetX(self), GetY(self). -
id1- Sous forme de trois arguments - serial/alias de l'objet dont les coordonnées servent d'origine. -
x1— Sous forme de quatre arguments, les coordonnées de l'origine. Aucun objet n'est nécessaire pour ce formulaire. -
y1— Sous forme de quatre arguments, les coordonnées de l'origine. Aucun objet n'est nécessaire pour ce formulaire. -
x2— Dans les formulaires avec trois/quatre arguments, les coordonnées de fin. Ne les confondez pas avec serial du deuxième objet. -
y2— Dans les formulaires avec trois/quatre arguments, les coordonnées de fin. Ne les confondez pas avec serial du deuxième objet.
int - max(abs(x2-x1), abs(y2-y1)) : horizontale, verticale et diagonale par rapport à une cellule adjacente ont une distance 1. La hauteur Z et les obstacles ne sont pas pris en compte. Pour l'inconnu serial, la forme à un argument renvoie 0 ; pour un objet existant en l'absence de caractère - 65535. Pour l'id1 inconnu, la forme à trois arguments utilise (0,0), alors vérifiez d'abord Exists(id1).
- La forme d'objet unique utilise le centre de portée World.RangeSize actuel et la dernière position dans la file d'attente des pas de la foule en mouvement. Lors du déplacement, le résultat peut différer du calcul via GetX/GetY.
- Les formulaires de coordonnées fonctionnent avec les numéros transmis. Pour les coordonnées du jeu, utilisez la plage 0..65535 ; les valeurs int extrêmes et le dépassement de différence ne sont pas des coordonnées prises en charge.
- L'équipe ne promet pas que l'objectif sera réalisable. Pour vous déplacer, vous avez besoin de MoveXY/NewMoveXY et de vérifier son résultat ; les murs peuvent allonger le chemin réel.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.GetDistance("lasttarget");
UO.Print("GetDistance: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- la cible est serial, pas type. La vérification Exists empêche que le zéro d'un objet inconnu soit confondu avec une cible proche.
- distance<=2 vérifie la plage X/Y. La visibilité et la praticabilité sont vérifiées séparément.
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;Paramètres et déroulement de l’exécution :
- x1=100, y1=200, x2=103, y2=204. Les différences sont 3 et 4.
- Le résultat est 4, pas 7 et non pas l'euclidien 5.
return RunScenario();
object? RunScenario()
{
var distance = UO.GetDistance(100, 200, 103, 204);
UO.Print(Convert.ToString(distance));
return null;
}Paramètres et déroulement de l’exécution :
- Les deux arguments x/y utilisent la position actuelle self. Les trois arguments id1/x2/y2 vous permettent de spécifier explicitement l'objet de départ.
- A position constante, les deux quantités sont égales à 3. Les coordonnées doivent rester dans les limites de la carte.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: id (Any/Integer/String)
Résultat: int / Any.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDistance:bridge.GetDistance(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Code interne de l’implémentation ; ce n’est pas un script autonome.
case "getdistance": return new InjectionValue(bridge.GetDistance(Arg(0)));Paramètres: id (Any/Integer/String)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDistance:bridge.GetDistance(id).
Code interne de l’implémentation ; ce n’est pas un script autonome.
public int GetDistance(int id) => bridge.GetDistance(id);Paramètres: id (Any/Integer/String)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
InjectionScript.Runtime.InjectionApiUO.GetDistance:GetDistance(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Code interne de l’implémentation ; ce n’est pas un script autonome.
public int GetDistance(string id) => GetDistance(GetObject(id));Paramètres: x (Integer), y (Integer)
Résultat: int / Integer.
Pendant un appel:
-
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.
Code interne de l’implémentation ; ce n’est pas un script autonome.
public int GetDistance(int x, int y) => GetDistance(bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), x, y);Paramètres: id1 (Any), x2 (Any), y2 (Any)
Résultat: int / Integer.
Pendant un appel:
-
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).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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));
}Paramètres: x1 (Integer), y1 (Integer), x2 (Integer), y2 (Integer)
Résultat: int / Integer.
Pendant un appel:
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Renvoie l'enregistrement foncier étendu de la cellule sélectionnée.
-
x— Cellule X de la carte actuellement chargée ; coordonnée mondiale, pas position à l'intérieur du gump. -
y— Cellule Y de la carte actuellement chargée ; coordonnée mondiale, pas position à l'intérieur du gump. -
map— Numéro de carte. Si cet argument n'est pas présent dans le formulaire sélectionné, la carte actuelle est utilisée. Le vrai client lit uniquement les tuiles de la carte actuellement chargée.
Tableau de champs 11 d'un enregistrement ; les indices commencent par 0 :
-
[0] kind— string : "terre", "statique" ou "object". -
[1] serial- int : serial élément dynamique ; pour la terre/statique est 0. -
[2] graphic— int : type graphique. -
[3] x,[4] y- int : coordonnées mondiales de la cellule. -
[5] z- int : la hauteur de la base dans le monde. -
[6] hue- int : couleur, près du sol 0. -
[7] flags- int : bits 32 faibles des indicateurs de données de tuile. -
[8] name- string : nom issu des données de tuile. -
[9] layer- int : couche d'équipement issue des tuiles, proche du sol 0 ; pas un index statique. -
[10] height- int : hauteur graphic à partir des données de tuile, près du sol 0 ; pas la coordonnée Z.
Un tableau vide [] signifie aucune entrée ou une carte/cellule inaccessible. Pour GetStaticTileAt, un indice négatif/trop grand produit également [] ; Le dépassement d'index ne sélectionne pas l'entrée de quelqu'un d'autre.
- Les données font référence à la carte actuellement chargée. Une autre carte ou une cellule inaccessible entraîne un tableau vide. Les requêtes directes de tuiles peuvent en outre signaler des discordances de carte ; GetWorldCell et GetWorldTilesArray renvoient immédiatement un tableau vide sans un tel message.
- Les indices de tableau commencent par 0. Vérifiez ArrayLength avant de lire le champ. Z représente l'altitude du monde ; layer est la propriété d'équipement de TileData et Index est le numéro de série de l'entrée de cellule.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.GetLandTileAt(UO.GetX(), UO.GetY());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- x/y — position du caractère ; la carte est abaissée et sélectionnée automatiquement. Pour GetStaticTileAt index=0 signifie la première entrée.
- Les champs [2], [5], [9] ont des significations différentes ; tous sont lus uniquement après avoir vérifié la longueur de 11.
var tile = UO.GetLandTileAt(UO.GetX(), UO.GetY());
if (Truth(ArrayLength(tile) == 11))
{
UO.Print("Type: " + Convert.ToString(tile[2]));
UO.Print("World Z: " + Convert.ToString(tile[5]));
UO.Print("Equipment layer: " + Convert.ToString(tile[9]));
}
else
{
UO.Print("Tile is unavailable");
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- Les mêmes coordonnées sont utilisées ; GetStaticTileAt lit index=0.
- Tile[8] est la chaîne de nom, Tile[10] est la dimension de hauteur de TileData, pas la base Z.
return RunScenario();
object? RunScenario()
{
var tile = UO.GetLandTileAt(UO.GetX(), UO.GetY());
if (Truth(ArrayLength(tile) == 11))
{
UO.Print(tile[8]);
UO.Print("Graphic height: " + Convert.ToString(tile[10]));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- WaitTargetTile reçoit graphic, x, y, z des champs 2…5.
- Ce n'est qu'une préparation pour le prochain objectif. L'exemple ne déclenche pas d'outil ou de sort. serial=0 pour la statique ne doit pas être transmis comme ID de l'élément.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: x (Any), y (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetLandTileAt. -
InjectionScript.Runtime.InjectionApiUO.GetLandTileAt:GetLandTileAt(x, y, new InjectionValue(bridge.WorldNumber)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
Code interne de l’implémentation ; ce n’est pas un script autonome.
public InjectionValue GetLandTileAt(InjectionValue x, InjectionValue y)
=> GetLandTileAt(x, y, new InjectionValue(bridge.WorldNumber));Paramètres: x (Any), y (Any), map (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
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).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Lit l'enregistrement de référence foncière étendu à partir des données de tuiles.
-
tileest une entrée Graphique/type, pas serial et pas un index dans une cellule. La table des terrains est choisie par le nom de l'équipe lui-même.
Tableau de champs 7 pour un graphic valide. Tous les champs int sauf nom (string) :
-
[0] graphic— Enregistrements graphic/type. -
[1] flags— bits d'indicateur 32 d'ordre inférieur. -
[2] name- nom de Tiledata (string). -
[3] texId- ID textures de sol. -
[4] wet— 1 si humide est installé, sinon 0. -
[5] impassable— 1 si infranchissable, sinon 0. -
[6] noDiagonal— 1 si noDiagonal, sinon 0.
Pour un graphic invalide, il n'y a pas de propriétés de référence : un court tableau [переданный graphic, 0, ""] est renvoyé. Vérifiez toute la longueur avant de lire les propriétés. Ce n'est pas un enregistrement Pascal ou une liste d'objets.
- La commande lit les données des tuiles et ne nécessite aucun élément avec ce graphic dans le monde. Les indicateurs décrivent la ressource ; le résultat ne remplace pas une vérification complète de l'itinéraire.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.GetLandTileData(0x0003);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- Tile est le graphic numérique de la table sélectionnée.
- data[2] contient le nom. La vérification de la longueur sépare une entrée complète d'une entrée courte d'un graphic invalide.
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;Paramètres et déroulement de l’exécution :
- data[5] est un champ infranchissable distinct : 1 (condition remplie), 0 (condition non remplie).
- Ce test ne prend pas en compte les autres objets de la cellule ni les capacités du personnage.
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;Paramètres et déroulement de l’exécution :
- data[0] répète le graphic transmis, data[1] est un masque de drapeau général.
- Le masque peut contenir plusieurs bits à la fois ; sa valeur numérique n'est pas 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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: tile (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.BuildTileData:BuildTileData(0, Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Recherche les tuiles de terrain à graphic/type dans un rectangle.
-
xmin— Coordonnées mondiales de deux angles inclus ; 0..65535. Les angles réarrangés sont normalisés. Zone ne dépassant pas les cellules 1 000 000 ; des limites non valides provoquent une erreur de script avant la lecture de la carte. -
ymin— Coordonnées mondiales de deux angles inclus ; 0..65535. Les angles réarrangés sont normalisés. Zone ne dépassant pas les cellules 1 000 000 ; des limites non valides provoquent une erreur de script avant la lecture de la carte. -
xmax— Coordonnées mondiales de deux angles inclus ; 0..65535. Les angles réarrangés sont normalisés. Zone ne dépassant pas les cellules 1 000 000 ; des limites non valides provoquent une erreur de script avant la lecture de la carte. -
ymax— Coordonnées mondiales de deux angles inclus ; 0..65535. Les angles réarrangés sont normalisés. Zone ne dépassant pas les cellules 1 000 000 ; des limites non valides provoquent une erreur de script avant la lecture de la carte. -
worldNum— Carte/facette 0..255 ; utilisez UO.WorldNum(). Une autre carte donne un tableau vide. Si la carte change entre les morceaux, le résultat partiel est ignoré. -
tileType- Une tuile graphic/type, généralement 0..65535 ; ce n'est pas serial. 0 est l'exact graphic 0, -1 ne signifie aucun type. Un type incompatible donne un résultat vide.
Tableau d'entrées [graphic, X, Y, Z] ; tous les champs int. graphic - type de la terre, Z - sa fondation. Aucune correspondance : tableau vide. La quantité est ArrayLength(résultat), pas le résultat lui-même. Les indices commencent par 0. Il ne s'agit pas d'un enregistrement bool, serial ou Pascal ; il n'y a pas de septième paramètre de sortie.
- Les données locales sont lues. La recherche ne modifie pas FindItem/FindCount et n'effectue pas de commande de déplacement, de cible ou de réseau.
- Ordre : X ascendant, dans X - Y ascendant. Les enregistrements d'une cellule préservent l'ordre du pont ; il n'est pas trié par distance ou par hauteur.
- La recherche est traitée par morceaux allant jusqu'à 32 cellules avec un budget souple d'environ 1 ms. L'annulation est vérifiée entre les portions. Une cellule complexe ou une lecture à froid peut dépasser le budget. Il est préférable de diviser une grande surface ; le monde peut changer en lisant.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
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));Paramètres et déroulement de l’exécution :
- x/y — position self, carte — carte actuelle. La région 3×3 comprend les limites. Dans Ex, deux type sont transmis, sous forme normale un. Modifiez les échantillons en fonction de vos ressources ; c'est un objet graphic, pas un objet ID.
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;Paramètres et déroulement de l’exécution :
- La région 2×2 est transférée du plus grand angle au plus petit. L'algorithme lui-même normalise les limites. ligne - un enregistrement ; PrintTile est déclaré dans son intégralité et ne formate que les nombres, sans rien déplacer. graphic - type, x/y - coordonnées, z - hauteur, hue - couleur. Pour les terrains, un conditionnel hue=0 est passé : il n'y a pas de champ de couleur dans le registre foncier.
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;Paramètres et déroulement de l’exécution :
- Pas plus de trois recherches pour une cellule ; entre les tentatives WaitAsync(250). Chaque appel crée un nouveau résultat. Une longueur nulle signifie qu'il n'y a aucune correspondance maintenant, plutôt que l'objet est définitivement absent du serveur.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
UO.GetLandTilesArray(xmin, ymin, xmax, ymax, worldNum, tileType) — UO.GetLandTilesArray(Any,Any,Any,Any,Any,Any)
Paramètres: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileType (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
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).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Recherche les tuiles de terrain à graphic/type dans un rectangle.
-
xmin— Coordonnées mondiales de deux angles inclus ; 0..65535. Les angles réarrangés sont normalisés. Zone ne dépassant pas les cellules 1 000 000 ; des limites non valides provoquent une erreur de script avant la lecture de la carte. -
ymin— Coordonnées mondiales de deux angles inclus ; 0..65535. Les angles réarrangés sont normalisés. Zone ne dépassant pas les cellules 1 000 000 ; des limites non valides provoquent une erreur de script avant la lecture de la carte. -
xmax— Coordonnées mondiales de deux angles inclus ; 0..65535. Les angles réarrangés sont normalisés. Zone ne dépassant pas les cellules 1 000 000 ; des limites non valides provoquent une erreur de script avant la lecture de la carte. -
ymax— Coordonnées mondiales de deux angles inclus ; 0..65535. Les angles réarrangés sont normalisés. Zone ne dépassant pas les cellules 1 000 000 ; des limites non valides provoquent une erreur de script avant la lecture de la carte. -
worldNum— Carte/facette 0..255 ; utilisez UO.WorldNum(). Une autre carte donne un tableau vide. Si la carte change entre les morceaux, le résultat partiel est ignoré. -
tileTypes— Tableau de graphic/type numériques ; chaque type correspondant est activé. La répétition de type ne duplique pas les entrées. Le scalaire est également considéré comme un type. Un tableau vide signifie tout type ; un tableau d'un 0 recherche uniquement 0.
Tableau d'entrées [graphic, X, Y, Z] ; tous les champs int. graphic - type de la terre, Z - sa fondation. Aucune correspondance : tableau vide. La quantité est ArrayLength(résultat), pas le résultat lui-même. Les indices commencent par 0. Il ne s'agit pas d'un enregistrement bool, serial ou Pascal ; il n'y a pas de septième paramètre de sortie.
- Les données locales sont lues. La recherche ne modifie pas FindItem/FindCount et n'effectue pas de commande de déplacement, de cible ou de réseau.
- Ordre : X ascendant, dans X - Y ascendant. Les enregistrements d'une cellule préservent l'ordre du pont ; il n'est pas trié par distance ou par hauteur.
- La recherche est traitée par morceaux allant jusqu'à 32 cellules avec un budget souple d'environ 1 ms. L'annulation est vérifiée entre les portions. Une cellule complexe ou une lecture à froid peut dépasser le budget. Il est préférable de diviser une grande surface ; le monde peut changer en lisant.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
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));Paramètres et déroulement de l’exécution :
- x/y — position self, carte — carte actuelle. La région 3×3 comprend les limites. Dans Ex, deux type sont transmis, sous forme normale un. Modifiez les échantillons en fonction de vos ressources ; c'est un objet graphic, pas un objet ID.
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;Paramètres et déroulement de l’exécution :
- La région 2×2 est transférée du plus grand angle au plus petit. L'algorithme lui-même normalise les limites. ligne - un enregistrement ; PrintTile est déclaré dans son intégralité et ne formate que les nombres, sans rien déplacer. graphic - type, x/y - coordonnées, z - hauteur, hue - couleur. Pour les terrains, un conditionnel hue=0 est passé : il n'y a pas de champ de couleur dans le registre foncier.
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;Paramètres et déroulement de l’exécution :
- Pas plus de trois recherches pour une cellule ; entre les tentatives WaitAsync(250). Chaque appel crée un nouveau résultat. Une longueur nulle signifie qu'il n'y a aucune correspondance maintenant, plutôt que l'objet est définitivement absent du serveur.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
UO.GetLandTilesArrayEx(xmin, ymin, xmax, ymax, worldNum, tileTypes) — UO.GetLandTilesArrayEx(Any,Any,Any,Any,Any,Any)
Paramètres: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileTypes (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
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).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Lit le terrain d'une cellule de la carte actuelle.
-
x— Cellule X de la carte actuellement chargée ; coordonnée mondiale, pas position à l'intérieur du gump. -
y— Cellule Y de la carte actuellement chargée ; coordonnée mondiale, pas position à l'intérieur du gump. -
map— Numéro de carte. Si cet argument n'est pas présent dans le formulaire sélectionné, la carte actuelle est utilisée. Le vrai client lit uniquement les tuiles de la carte actuellement chargée.
Tableau de trois terrains int : [0] graphic - type ; [1] z — altitude mondiale de la terre ; [2] flags — bits faibles 32 des indicateurs de données de tuile. Si la carte/tuile n'est pas disponible ou s'il n'y a pas de terrain, un tableau vide [] est renvoyé. Il s'agit d'un enregistrement plat, pas d'une liste de trois tuiles.
- Les données font référence à la carte actuellement chargée. Une autre carte ou une cellule inaccessible entraîne un tableau vide. Les requêtes directes de tuiles peuvent en outre signaler des discordances de carte ; GetWorldCell et GetWorldTilesArray renvoient immédiatement un tableau vide sans un tel message.
- Les indices de tableau commencent par 0. Vérifiez ArrayLength avant de lire le champ. Z représente l'altitude du monde ; layer est la propriété d'équipement de TileData et Index est le numéro de série de l'entrée de cellule.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- x/y sont pris à partir de la position du personnage ; map=WorldNum() sélectionne la carte actuelle.
- La présence de trois champs est vérifiée avant indexation ; terrain[0] - graphic, terrain[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;Paramètres et déroulement de l’exécution :
- x+1 est une cellule voisine, y et map sont conservés.
- deltaZ compare le terrain et le caractère. Il ne s'agit pas d'un test de réussite : les ponts et la statique sont comptés séparément.
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;Paramètres et déroulement de l’exécution :
- group=0 sélectionne le terrain ; terrain[0] — graphic.
- GetTileName renvoie du texte, tandis que GetLandscapeTile renvoie un tableau.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: x (Any), y (Any), map (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
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).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Compte les enregistrements de géométrie non terrestre dans une cellule.
-
x— Coordonnée mondiale X de la cellule de la carte actuelle, pas la position dans le Gump. -
y— Coordonnée mondiale Y de la cellule actuelle de la carte. -
worldNum— Numéro de carte/facette ; utilisez UO.WorldNum(). Seule la carte actuellement chargée est lue.
int — nombre de triples graphic/Z/hue reçus par GetStaticTiles. Dans le client actuel, Static, Multi et Item sont pris en compte : plusieurs enregistrements de même hauteur sont comptés séparément. Une case vide/une autre carte donne 0. Il ne s'agit pas du numéro de couche d'équipement, du nombre d'étages, du nombre de hauteurs uniques ou de bool.
- La commande lit la carte locale et ne déclenche ni mouvement ni cible. Une cellule en dehors de la taille de la carte n'est pas remplacée par une cellule dans une colonne adjacente.
- La hauteur de Z, graphic/type, la couleur de hue, les drapeaux et la couche d'équipement ont des significations différentes. Null graphic ou Z=0 peuvent être des données valides ; vérifiez le formulaire de résultat.
- La composition correspond à ReadStaticsXY, pas à GetLayer ou ObjAtLayer. Ce client comprend des éléments dynamiques et des pièces multiples.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.GetLayerCount(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- count — nombre d'enregistrements de cellules ; 1 signifie une entrée, pas un succès logique.
var count = UO.GetLayerCount(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print("Tile records: " + Convert.ToString(count));Paramètres et déroulement de l’exécution :
- L'absence de registres ne prouve pas le passage des terres. La présence d’un enregistrement ne prouve pas non plus qu’il s’agit d’un mur.
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;Paramètres et déroulement de l’exécution :
- Les cellules actuelles et voisines du même monde sont vérifiées. Le nombre de couches n'est pas leur hauteur ou 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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: x (Any), y (Any), worldNum (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticTiles:bridge.GetStaticTiles(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Lit graphic, les drapeaux de hauteur et de terre dans une case de la carte.
-
x— Coordonnée mondiale X de la cellule de la carte actuelle, pas la position dans le Gump. -
y— Coordonnée mondiale Y de la cellule actuelle de la carte. -
worldNum— Numéro de carte/facette ; utilisez UO.WorldNum(). Seule la carte actuellement chargée est lue.
Tableau de trois terrains int : [0] graphic/type, [1] terrains de bases mondiales Z, [2] bits mineurs 32 de drapeaux de données de tuiles. Une cellule ou une autre carte inaccessible entraîne un tableau vide. Il ne s'agit pas d'un enregistrement serial, bool ou Pascal ; n'utilisez pas les champs .Tile/.Z. Pour le nombre de champs, appelez ArrayLength(cellule).
- La commande lit la carte locale et ne déclenche ni mouvement ni cible. Une cellule en dehors de la taille de la carte n'est pas remplacée par une cellule dans une colonne adjacente.
- La hauteur de Z, graphic/type, la couleur de hue, les drapeaux et la couche d'équipement ont des significations différentes. Null graphic ou Z=0 peuvent être des données valides ; vérifiez le formulaire de résultat.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.GetMapCell(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- X/Y sont extraits de self, WorldNum est la carte actuelle. la cellule stocke tous les champs d’un appel.
- Les indices commencent par 0. cell[1] est la hauteur, pas le signe d'une recherche réussie ; un tableau vide est vérifié avant l'indexation.
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;Paramètres et déroulement de l’exécution :
- Le deuxième appel lit la case à l’est, tous deux utilisant la même carte.
- La différence de hauteur du sol ne prouve pas la praticabilité : les murs, la statique et autres objets sont vérifiés séparément.
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;Paramètres et déroulement de l’exécution :
- GetMapCell lit Land.Z ; GetSurfaceZ lit Land.AverageZ.
- Les deux valeurs sont la hauteur. Sur terrain en pente, ils peuvent varier ; Ce n'est pas la hauteur du sol de la maison.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: x (Any), y (Any), worldNum (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLandscapeTile:bridge.GetLandscapeTile(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Calcule la hauteur estimée de la prochaine marche dans la direction spécifiée.
-
currX— Monde initial X, généralement UO.GetX(). -
currY— Monde initial Y, généralement UO.GetY(). -
destX— Destination X. Pour vérifier une étape spécifique, passez une cellule adjacente. -
destY— Destination Y ; avec DestX, il définit la direction d'une étape plutôt que l'itinéraire complet. -
worldNum— Numéro de carte/facette ; utilisez UO.WorldNum(). Seule la carte actuellement chargée est lue. -
currZ— Hauteur initiale Z, généralement UO.GetZ() ; le calcul géométrique utilise la plage -128..127.
int — Z calculé de l'étape suivante ; 0 et les nombres négatifs sont des hauteurs valides. Lorsqu'un personnage ou une autre carte 0 est désactivé. La méthode renvoie le composant Z de la vérification même en cas d'échec ; le numéro lui-même ne constitue pas une confirmation de passage. Pour le drapeau et la hauteur ensemble, utilisez IsWorldCellPassable et lisez [0]/[1].
- La commande lit la carte locale et ne déclenche ni mouvement ni cible. Une cellule en dehors de la taille de la carte n'est pas remplacée par une cellule dans une colonne adjacente.
- La hauteur de Z, graphic/type, la couleur de hue, les drapeaux et la couche d'équipement ont des significations différentes. Null graphic ou Z=0 peuvent être des données valides ; vérifiez le formulaire de résultat.
- Le calcul ne fait pas un pas et n’ouvre pas la porte. Il vérifie la géométrie locale ; le serveur peut rejeter le mouvement réel. Si le pont ne renvoie pas Z, CurrZ est utilisé.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.GetNextStepZ(UO.GetX(), UO.GetY(), UO.GetX() + 1, UO.GetY(), UO.WorldNum(), UO.GetZ());
UO.Print("GetNextStepZ: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- Six paramètres : original X/Y, adjacent X/Y, carte et original Z. nextZ est la hauteur, pas 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));Paramètres et déroulement de l’exécution :
- L'appel est effectué uniquement lorsqu'il existe une connexion connue. Entre la vérification et la lecture, la connexion peut être perdue ; Z=0 n'est toujours pas un code de réussite.
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;Paramètres et déroulement de l’exécution :
- Les coordonnées des cellules source et cible sont transmises séparément. Le résultat est la hauteur attendue, même en cas d'obstruction ; le drapeau de passe donne séparément 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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
UO.GetNextStepZ(currX, currY, destX, destY, worldNum, currZ) — UO.GetNextStepZ(Any,Any,Any,Any,Any,Any)
Paramètres: currX (Any), currY (Any), destX (Any), destY (Any), worldNum (Any), currZ (Any)
Résultat: int / Integer.
Pendant un appel:
-
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.
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Obtient une seule image graphique à partir des fichiers graphiques Ultima Online installés et la renvoie en mémoire au format BMP. Utile pour vérifier vos ressources de jeu, la taille des icônes, lire la couleur des pixels et comparer les versions colorées d'un élément. La commande elle-même n'ouvre pas de fenêtre, n'enregistre pas de fichier et ne recherche pas d'éléments dans le monde.
-
objType— Graphique obligatoire/type de la section d'art statique : entier 0..65535, une chaîne avec ce numéro ou un nom stocké AddType. Par exemple, 0x0EED est un art pour une pile d'or. Il ne s'agit pas du serial de l'élément, des coordonnées de la carte/tuile ou du numéro d'animation du corps. Pour obtenir l'illustration d'un élément chargé, passez UO.GetType(item), où l'élément est son serial. Lorsque le numérique type est hors plage, le résultat est un tableau vide ; un nom de chaîne inconnu provoque une erreur de conversion. -
hue— Valeur de couleur entière obligatoire : 0 — couleurs originales de l'art ; une valeur positive est hue issue des fichiers clients. Les chaînes numériques sont acceptables, y compris le résultat UO.GetColor(item). La valeur est limitée à la plage 0..65535 : le négatif devient 0, trop grand devient 65535. Ici -1 ne signifie AUCUNE couleur. L'art du drapeau PartialHue utilise une coloration partielle ; pour d'autres - complet. Le résultat d'un hue particulier dépend de la table des couleurs chargée.
Le tableau est un tableau unidimensionnel int, chaque élément 0..255 représente un octet du fichier BMP complet, en commençant par l'en-tête. Indexation avec 0. Ce n'est pas bool, ni ID, ni un chemin, ni un objet Bitmap, ni un tableau de couleurs RGB. Un tableau vide signifie que le numérique type n'est pas valide, que l'illustration est manquante ou que les fichiers de jeu requis ne sont pas chargés. Avant de lire le titre, cochez ArrayLength ; le tableau vide n'est pas égal au nombre 0.
- Exactement deux arguments sont requis. La lecture s'effectue depuis les ressources locales du client, sans requête au serveur. L'existence d'un objet dans le monde n'est pas requise. Pour mobile, un nombre de GetType signifie body ; ici, le même numéro concerne une section de ressources différente et ne fournit pas d'image de l'animation du personnage.
- Format du résultat : 24-bit BMP non compressé. Octets [0]=66 et [1]=77 - BM ; [2..5] - size of the entire file; [10..13] - le début des pixels, maintenant 54 ; [14..17] - taille de l'en-tête DIB, maintenant 40 ; [18..21] - width; [22..25] - positive height; [26..27] - 1 plane; [28..29] - 24 bit. Multibyte numbers are written little-endian.
- Chaque pixel occupe trois octets dans l'ordre B, G, R. Les lignes vont de bas en haut et sont complétées par zéro octet jusqu'à un multiple de 4. Longueur de la chaîne = Int((largeur * 3 + 3) / 4) * 4. Pour les coordonnées x,y à partir du coin supérieur gauche, décalage = 54 + (hauteur - 1 - y) * foulée + x * 3. Vérifiez les limites et la taille du tableau avant d'y accéder.
- La transparence de l'illustration originale n'est pas préservée : BMP ne contient pas d'alpha ici. Le fond transparent devient noir, et il est impossible de le distinguer du pixel noir d'origine par le résultat. La capture d'écran, la mise à l'échelle de la fenêtre de jeu, la lumière, la plage de visibilité et les coordonnées de l'objet ne sont pas impliqués.
- Pour chaque appel, un tableau d'images est généré. Si vous avez besoin d'art plusieurs fois, enregistrez le résultat dans une variable et traitez-le à nouveau. N'appelez pas le chargement/coloration pour chaque pixel à l'intérieur de la boucle. Les mêmes paramètres et fichiers inchangés donnent le même résultat ; différents hue ne sont pas nécessaires pour changer chaque pixel, surtout avec PartialHue.
- Un vrai .bmp nécessite une sortie binaire des octets exacts sans encodage de texte. Un File.WriteLine ou JsonSave normal ne crée pas BMP. Les exemples ci-dessous traitent le tableau en mémoire et ne promettent pas la présence d'un File.WriteBytes inexistant.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.GetStaticArt(0x0EED, 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- ObjType=0x0EED sélectionne la ressource, Hue=0 laisse les couleurs d'origine. Le tableau est vérifié avant de lire les offsets 18 et 22. 64 est la propre limite de l'exemple, pas une limite de commande.
- ArtSizeField est une fonction C# définie par l'utilisateur, pas une commande UO. Ajoute quatre octets avec les poids 1, 256, 65536, 16777216. Le script vous aide à choisir la taille de votre cellule ; Ne crée pas automatiquement de gump.
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;Paramètres et déroulement de l’exécution :
- GetStaticArt renvoie BMP ; ArtPixelRGB est un exemple de fonction distinct pour ce format. x=0,y=0 signifie le pixel supérieur gauche de l'image, pas les coordonnées du monde. La hauteur de remplacement-1-y est requise en raison de l'ordre des lignes de bas en haut.
- La fonction renvoie RGB int 0..16777215, et utilise -1 uniquement comme indicateur de l'absence de pixel. Le noir 0 est une couleur valide, pas false et ce n'est pas une erreur. Par conséquent, le test pour savoir si rgb < 0 est distinct de si 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;Paramètres et déroulement de l’exécution :
- 0x1F03 — Robes graphiques ; 0 et 0x0044 sont les hue originaux et sélectionnés. Le même graphique donne les mêmes dimensions. Si le résultat est vide, la comparaison ne démarre pas.
- modifié compte différents octets de canaux de couleur, pas les objets ou le nombre de pixels. Un pixel peut changer jusqu'à trois octets. PartialHue, la table des couleurs et les couleurs originales peuvent laisser une partie ou la totalité de l'image identique ; ce n’est pas la preuve d’une erreur d’équipe.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: objType (Any), hue (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
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).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Renvoie un enregistrement étendu d'un enregistrement au-dessus du sol de la cellule sélectionnée.
-
x— Cellule X de la carte actuellement chargée ; coordonnée mondiale, pas position à l'intérieur du gump. -
y— Cellule Y de la carte actuellement chargée ; coordonnée mondiale, pas position à l'intérieur du gump. -
map— Numéro de carte. Si cet argument n'est pas présent dans le formulaire sélectionné, la carte actuelle est utilisée. Le vrai client lit uniquement les tuiles de la carte actuellement chargée. -
index— Le numéro de séquence de l'enregistrement dans les résultats GetStaticTiles, commençant par 0. Ce n'est pas graphic, ni Z, ni une couche d'équipement. Sous la forme d'arguments 3, l'index arrive en troisième position ; sous la forme de la carte des arguments 4 troisième, index quatrième.
Tableau de champs 11 d'un enregistrement ; les indices commencent par 0 :
-
[0] kind— string : "terre", "statique" ou "object". -
[1] serial- int : serial élément dynamique ; pour la terre/statique est 0. -
[2] graphic— int : type graphique. -
[3] x,[4] y- int : coordonnées mondiales de la cellule. -
[5] z- int : la hauteur de la base dans le monde. -
[6] hue- int : couleur, près du sol 0. -
[7] flags- int : bits 32 faibles des indicateurs de données de tuile. -
[8] name- string : nom issu des données de tuile. -
[9] layer- int : couche d'équipement issue des tuiles, proche du sol 0 ; pas un index statique. -
[10] height- int : hauteur graphic à partir des données de tuile, près du sol 0 ; pas la coordonnée Z.
Un tableau vide [] signifie aucune entrée ou une carte/cellule inaccessible. Pour GetStaticTileAt, un indice négatif/trop grand produit également [] ; Le dépassement d'index ne sélectionne pas l'entrée de quelqu'un d'autre.
- Les données font référence à la carte actuellement chargée. Une autre carte ou une cellule inaccessible entraîne un tableau vide. Les requêtes directes de tuiles peuvent en outre signaler des discordances de carte ; GetWorldCell et GetWorldTilesArray renvoient immédiatement un tableau vide sans un tel message.
- Les indices de tableau commencent par 0. Vérifiez ArrayLength avant de lire le champ. Z représente l'altitude du monde ; layer est la propriété d'équipement de TileData et Index est le numéro de série de l'entrée de cellule.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- x/y — position du caractère ; la carte est abaissée et sélectionnée automatiquement. Pour GetStaticTileAt index=0 signifie la première entrée.
- Les champs [2], [5], [9] ont des significations différentes ; tous sont lus uniquement après avoir vérifié la longueur de 11.
var tile = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
if (Truth(ArrayLength(tile) == 11))
{
UO.Print("Type: " + Convert.ToString(tile[2]));
UO.Print("World Z: " + Convert.ToString(tile[5]));
UO.Print("Equipment layer: " + Convert.ToString(tile[9]));
}
else
{
UO.Print("Tile is unavailable");
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- Les mêmes coordonnées sont utilisées ; GetStaticTileAt lit index=0.
- Tile[8] est la chaîne de nom, Tile[10] est la dimension de hauteur de TileData, pas la base Z.
return RunScenario();
object? RunScenario()
{
var tile = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
if (Truth(ArrayLength(tile) == 11))
{
UO.Print(tile[8]);
UO.Print("Graphic height: " + Convert.ToString(tile[10]));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- WaitTargetTile reçoit graphic, x, y, z des champs 2…5.
- Ce n'est qu'une préparation pour le prochain objectif. L'exemple ne déclenche pas d'outil ou de sort. serial=0 pour la statique ne doit pas être transmis comme ID de l'élément.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: x (Any), y (Any), index (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetStaticTileAt. -
InjectionScript.Runtime.InjectionApiUO.GetStaticTileAt:GetStaticTileAt(x, y, new InjectionValue(bridge.WorldNumber), index). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
Code interne de l’implémentation ; ce n’est pas un script autonome.
public InjectionValue GetStaticTileAt(InjectionValue x, InjectionValue y, InjectionValue index)
=> GetStaticTileAt(x, y, new InjectionValue(bridge.WorldNumber), index);Paramètres: x (Any), y (Any), map (Any), index (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
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).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Lit l'entrée de référence étendue statique graphic à partir de TileData.
-
tileest une entrée Graphique/type, pas serial et pas un index dans une cellule. La table statique est sélectionnée par le nom de la commande lui-même.
Tableau de champs 17 pour un graphic valide. Tous les champs int sauf nom (string) :
-
[0] graphic— Enregistrements graphic/type. -
[1] flags— bits d'indicateur 32 d'ordre inférieur. -
[2] name- nom de Tiledata (string). -
[3] weight— poids des données de tuile. -
[4] layer— numéro de couche d'équipement. -
[5] countest le champ Count de TileData, pas le nombre d'éléments dans le monde. - Animations
[6] animId- ID. -
[7] hue— hue à partir des données de tuile. -
[8] lightIndex— indice de la source lumineuse. -
[9] height— hauteur graphic, pas hauteur mondiale Z. -
[10] wet— 1 si humide est installé, sinon 0. -
[11] impassable— 1 si infranchissable, sinon 0. -
[12] surface— 1 si surface, sinon 0. -
[13] foliage— 1 si feuillage, sinon 0. -
[14] door— 1 si porte, sinon 0. -
[15] wall— 1 si mur, sinon 0. -
[16] container— 1 si conteneur, sinon 0.
Pour un graphic invalide, il n'y a pas de propriétés de référence : un court tableau [переданный graphic, 0, ""] est renvoyé. Vérifiez toute la longueur avant de lire les propriétés. Ce n'est pas un enregistrement Pascal ou une liste d'objets.
- La commande lit les données des tuiles et ne nécessite aucun élément avec ce graphic dans le monde. Les indicateurs décrivent la ressource ; le résultat ne remplace pas une vérification complète de l'itinéraire.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.GetStaticTileData(0x0CCA);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- Tile est le graphic numérique de la table sélectionnée.
- data[2] contient le nom. La vérification de la longueur sépare une entrée complète d'une entrée courte d'un graphic invalide.
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;Paramètres et déroulement de l’exécution :
- data[11] est un champ infranchissable distinct : 1 (condition remplie), 0 (condition non remplie).
- Ce test ne prend pas en compte les autres objets de la cellule ni les capacités du personnage.
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;Paramètres et déroulement de l’exécution :
- data[0] répète le graphic transmis, data[1] est un masque de drapeau général.
- Le masque peut contenir plusieurs bits à la fois ; sa valeur numérique n'est pas 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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: tile (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.BuildTileData:BuildTileData(1, Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Code interne de l’implémentation ; ce n’est pas un script autonome.
case "getstatictiledata":
return BuildTileData(1, Arg(0));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetStaticTiles(object? x, object? y, object? map);Lit les entrées au-dessus du sol dans une cellule de la carte actuelle.
-
x— Cellule X de la carte actuellement chargée ; coordonnée mondiale, pas position à l'intérieur du gump. -
y— Cellule Y de la carte actuellement chargée ; coordonnée mondiale, pas position à l'intérieur du gump. -
map— Numéro de carte. Si cet argument n'est pas présent dans le formulaire sélectionné, la carte actuelle est utilisée. Le vrai client lit uniquement les tuiles de la carte actuellement chargée.
Le tableau est une séquence plate de int-triples [graphic0, z0, hue0, graphic1, z1, hue1, …]. Le nombre d'entrées est égal à la longueur du tableau / 3. Pour la notation i, graphic est dans [i*3], Z est dans [i*3+1], hue est dans [i*3+2]. Un tableau vide signifie aucune entrée ou une carte/cellule inaccessible. Les numéros de série et de couche ne sont pas renvoyés ici.
- Les données font référence à la carte actuellement chargée. Une autre carte ou une cellule inaccessible entraîne un tableau vide. Les requêtes directes de tuiles peuvent en outre signaler des discordances de carte ; GetWorldCell et GetWorldTilesArray renvoient immédiatement un tableau vide sans un tel message.
- Les indices de tableau commencent par 0. Vérifiez ArrayLength avant de lire le champ. Z représente l'altitude du monde ; layer est la propriété d'équipement de TileData et Index est le numéro de série de l'entrée de cellule.
- Le pont actuel répertorie les éléments statiques, multiples et mondiaux dans la chaîne cellulaire. Le nom de la commande ne limite pas le résultat uniquement aux entrées statics.mul. L'ordre en chaîne ne garantit pas le tri Z.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.GetStaticTiles(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- x/y/map sélectionne la cellule actuelle.
- La longueur du tableau correspond au nombre de champs. Diviser par 3 donne le nombre d'entrées.
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;Paramètres et déroulement de l’exécution :
- offset est l'indice du premier champ du triplet suivant, augmenté de 3.
- La vérification offset+2 protège l'intégralité de l'enregistrement contre la lecture.
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;Paramètres et déroulement de l’exécution :
- x+1 sélectionne une cellule adjacente.
- tuiles[2] — couleur de la première entrée ; Ce n'est pas la troisième tuile.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: x (Any), y (Any), map (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
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).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Recherche les entrées Statique/Multi/Item par graphic/type dans un rectangle.
-
xmin— Coordonnées mondiales de deux angles inclus ; 0..65535. Les angles réarrangés sont normalisés. Zone ne dépassant pas les cellules 1 000 000 ; des limites non valides provoquent une erreur de script avant la lecture de la carte. -
ymin— Coordonnées mondiales de deux angles inclus ; 0..65535. Les angles réarrangés sont normalisés. Zone ne dépassant pas les cellules 1 000 000 ; des limites non valides provoquent une erreur de script avant la lecture de la carte. -
xmax— Coordonnées mondiales de deux angles inclus ; 0..65535. Les angles réarrangés sont normalisés. Zone ne dépassant pas les cellules 1 000 000 ; des limites non valides provoquent une erreur de script avant la lecture de la carte. -
ymax— Coordonnées mondiales de deux angles inclus ; 0..65535. Les angles réarrangés sont normalisés. Zone ne dépassant pas les cellules 1 000 000 ; des limites non valides provoquent une erreur de script avant la lecture de la carte. -
worldNum— Carte/facette 0..255 ; utilisez UO.WorldNum(). Une autre carte donne un tableau vide. Si la carte change entre les morceaux, le résultat partiel est ignoré. -
tileType- Une tuile graphic/type, généralement 0..65535 ; ce n'est pas serial. 0 est l'exact graphic 0, -1 ne signifie aucun type. Un type incompatible donne un résultat vide.
Entrées du tableau [graphic, X, Y, Z, hue] ; tous les champs int. graphic - type, Z - base, hue - couleur. Plusieurs entrées de cellule restent séparées. Aucune correspondance : tableau vide. La quantité est ArrayLength(résultat), pas le résultat lui-même. Les indices commencent par 0. Il ne s'agit pas d'un enregistrement bool, serial ou Pascal ; il n'y a pas de septième paramètre de sortie.
- Les données locales sont lues. La recherche ne modifie pas FindItem/FindCount et n'effectue pas de commande de déplacement, de cible ou de réseau.
- Ordre : X ascendant, dans X - Y ascendant. Les enregistrements d'une cellule préservent l'ordre du pont ; il n'est pas trié par distance ou par hauteur.
- La recherche est traitée par morceaux allant jusqu'à 32 cellules avec un budget souple d'environ 1 ms. L'annulation est vérifiée entre les portions. Une cellule complexe ou une lecture à froid peut dépasser le budget. Il est préférable de diviser une grande surface ; le monde peut changer en lisant.
- La branche Statique du client actuel comprend Statique, Multi et Objet de la cellule, y compris les objets chargés au sol ; Les services terrestres et mobiles ne sont pas inclus. Elle est plus large que la sélection classique de fichiers statiques uniquement.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
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));Paramètres et déroulement de l’exécution :
- x/y — position self, carte — carte actuelle. La région 3×3 comprend les limites. Dans Ex, deux type sont transmis, sous forme normale un. Modifiez les échantillons en fonction de vos ressources ; c'est un objet graphic, pas un objet ID.
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;Paramètres et déroulement de l’exécution :
- La région 2×2 est transférée du plus grand angle au plus petit. L'algorithme lui-même normalise les limites. ligne - un enregistrement ; PrintTile est déclaré dans son intégralité et ne formate que les nombres, sans rien déplacer. graphic - type, x/y - coordonnées, z - hauteur, hue - couleur. Pour les terrains, un conditionnel hue=0 est passé : il n'y a pas de champ de couleur dans le registre foncier.
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;Paramètres et déroulement de l’exécution :
- Pas plus de trois recherches pour une cellule ; entre les tentatives WaitAsync(250). Chaque appel crée un nouveau résultat. Une longueur nulle signifie qu'il n'y a aucune correspondance maintenant, plutôt que l'objet est définitivement absent du serveur.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
UO.GetStaticTilesArray(xmin, ymin, xmax, ymax, worldNum, tileType) — UO.GetStaticTilesArray(Any,Any,Any,Any,Any,Any)
Paramètres: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileType (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
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).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Recherche les entrées Statique/Multi/Item par graphic/type dans un rectangle.
-
xmin— Coordonnées mondiales de deux angles inclus ; 0..65535. Les angles réarrangés sont normalisés. Zone ne dépassant pas les cellules 1 000 000 ; des limites non valides provoquent une erreur de script avant la lecture de la carte. -
ymin— Coordonnées mondiales de deux angles inclus ; 0..65535. Les angles réarrangés sont normalisés. Zone ne dépassant pas les cellules 1 000 000 ; des limites non valides provoquent une erreur de script avant la lecture de la carte. -
xmax— Coordonnées mondiales de deux angles inclus ; 0..65535. Les angles réarrangés sont normalisés. Zone ne dépassant pas les cellules 1 000 000 ; des limites non valides provoquent une erreur de script avant la lecture de la carte. -
ymax— Coordonnées mondiales de deux angles inclus ; 0..65535. Les angles réarrangés sont normalisés. Zone ne dépassant pas les cellules 1 000 000 ; des limites non valides provoquent une erreur de script avant la lecture de la carte. -
worldNum— Carte/facette 0..255 ; utilisez UO.WorldNum(). Une autre carte donne un tableau vide. Si la carte change entre les morceaux, le résultat partiel est ignoré. -
tileTypes— Tableau de graphic/type numériques ; chaque type correspondant est activé. La répétition de type ne duplique pas les entrées. Le scalaire est également considéré comme un type. Un tableau vide signifie tout type ; un tableau d'un 0 recherche uniquement 0.
Entrées du tableau [graphic, X, Y, Z, hue] ; tous les champs int. graphic - type, Z - base, hue - couleur. Plusieurs entrées de cellule restent séparées. Aucune correspondance : tableau vide. La quantité est ArrayLength(résultat), pas le résultat lui-même. Les indices commencent par 0. Il ne s'agit pas d'un enregistrement bool, serial ou Pascal ; il n'y a pas de septième paramètre de sortie.
- Les données locales sont lues. La recherche ne modifie pas FindItem/FindCount et n'effectue pas de commande de déplacement, de cible ou de réseau.
- Ordre : X ascendant, dans X - Y ascendant. Les enregistrements d'une cellule préservent l'ordre du pont ; il n'est pas trié par distance ou par hauteur.
- La recherche est traitée par morceaux allant jusqu'à 32 cellules avec un budget souple d'environ 1 ms. L'annulation est vérifiée entre les portions. Une cellule complexe ou une lecture à froid peut dépasser le budget. Il est préférable de diviser une grande surface ; le monde peut changer en lisant.
- La branche Statique du client actuel comprend Statique, Multi et Objet de la cellule, y compris les objets chargés au sol ; Les services terrestres et mobiles ne sont pas inclus. Elle est plus large que la sélection classique de fichiers statiques uniquement.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
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));Paramètres et déroulement de l’exécution :
- x/y — position self, carte — carte actuelle. La région 3×3 comprend les limites. Dans Ex, deux type sont transmis, sous forme normale un. Modifiez les échantillons en fonction de vos ressources ; c'est un objet graphic, pas un objet ID.
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;Paramètres et déroulement de l’exécution :
- La région 2×2 est transférée du plus grand angle au plus petit. L'algorithme lui-même normalise les limites. ligne - un enregistrement ; PrintTile est déclaré dans son intégralité et ne formate que les nombres, sans rien déplacer. graphic - type, x/y - coordonnées, z - hauteur, hue - couleur. Pour les terrains, un conditionnel hue=0 est passé : il n'y a pas de champ de couleur dans le registre foncier.
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;Paramètres et déroulement de l’exécution :
- Pas plus de trois recherches pour une cellule ; entre les tentatives WaitAsync(250). Chaque appel crée un nouveau résultat. Une longueur nulle signifie qu'il n'y a aucune correspondance maintenant, plutôt que l'objet est définitivement absent du serveur.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
UO.GetStaticTilesArrayEx(xmin, ymin, xmax, ymax, worldNum, tileTypes) — UO.GetStaticTilesArrayEx(Any,Any,Any,Any,Any,Any)
Paramètres: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileTypes (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
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).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Lit la hauteur moyenne de la surface du sol dans une cellule.
-
x— Coordonnée mondiale X de la cellule de la carte actuelle, pas la position dans le Gump. -
y— Coordonnée mondiale Y de la cellule actuelle de la carte. -
worldNum— Numéro de carte/facette ; utilisez UO.WorldNum(). Seule la carte actuellement chargée est lue.
int — Land.AverageZ, y compris la hauteur négative et 0. S'il n'y a pas de carte/sol ou une incompatibilité de carte, 0 est renvoyé, donc cette valeur ne distingue pas les données manquantes de la vraie hauteur 0. Ce n'est pas bool, le sol ou la hauteur du statique le plus proche.
- La commande lit la carte locale et ne déclenche ni mouvement ni cible. Une cellule en dehors de la taille de la carte n'est pas remplacée par une cellule dans une colonne adjacente.
- La hauteur de Z, graphic/type, la couleur de hue, les drapeaux et la couche d'équipement ont des significations différentes. Null graphic ou Z=0 peuvent être des données valides ; vérifiez le formulaire de résultat.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.GetSurfaceZ(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- Les trois paramètres concernent la cellule actuelle de la carte. z est une hauteur numérique et non le résultat d'un mouvement.
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));Paramètres et déroulement de l’exécution :
- GetMapCell est nécessaire pour distinguer les données manquantes de la hauteur 0. La carte peut encore changer entre deux appels.
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;Paramètres et déroulement de l’exécution :
- La différence montre la pente de la terre. Cet exemple ne déplace rien et ne calcule pas l'itinéraire.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: x (Any), y (Any), worldNum (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetSurfaceZ:bridge.GetSurfaceZ(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Lit le masque de bits de propriété graphic à partir de l'entrée de données de tuile.
-
group- 0 - table des terrains ; 1 — table de graphic statique. L'implémentation considère tout groupe non nul comme une seconde table ; utilisez 0 ou 1. -
tileId— Entrées graphiques/type dans les données de tuile, généralement l'entier 0…65535. Ce n'est pas le serial d'un objet ou un indice de statique à l'intérieur d'une cellule.
int — bits faibles 32 des indicateurs de données de tuile. L’ensemble de bits le plus significatif donne un nombre de signe négatif. 0 signifie l'absence de ces drapeaux ou un tileId invalide ; Ce n'est pas un signe indépendant d'erreur et non bool. Multiple properties can be set at the same time.
- Cette commande lit l'entrée de référence graphic ; les coordonnées mondiales ne sont pas nécessaires. group=0 et group=1 sélectionnent des tables différentes même si tileId est le même.
- La propriété est lue à partir des données graphic, et non à partir de l'état actuel d'un élément particulier.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.GetTileFlags(1, 0x0CCA);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- group=1 sélectionne les données de tuiles statiques ; tileId=0x0CCA - graphic arbre.
- value contient le résultat décrit dans la section Retours ; sa signification ne coïncide pas avec serial.
var value = UO.GetTileFlags(1, 0x0CCA);
if (Truth((Convert.ToUInt64(value) & 0x40UL) != 0))
{
UO.Print("Impassable flag is set");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- FindType renvoie serial. GetType le transforme en graphic numérique.
- group=1 est utilisé pour les éléments ; dans tileId graphic est transmis, pas l'élément.
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;Paramètres et déroulement de l’exécution :
- Les deux premiers arguments GetLandscapeTile sont le monde actuel X/Y ; la troisième est la carte actuelle.
- land[0] contient des terrains graphic. group=0 sélectionne les données des tuiles de terrain. Pour GetTileLayer/GetTileHeight le sol donne 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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: group (Any), tileId (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetTileFlags. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileFlags:bridge.GetTileFlags(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Lit la hauteur graphic à partir de l'entrée de données de tuile.
-
group- 0 - table des terrains ; 1 — table de graphic statique. L'implémentation considère tout groupe non nul comme une seconde table ; utilisez 0 ou 1. -
tileId— Entrées graphiques/type dans les données de tuile, généralement l'entier 0…65535. Ce n'est pas le serial d'un objet ou un indice de statique à l'intérieur d'une cellule.
int est la hauteur du graphique en unités Z à partir des données de tuile. Il s'agit de la hauteur du graphique, et non de la coordonnée mondiale de sa base Z. Pour le sol, une entrée manquante ou une hauteur nulle, 0 est renvoyé. La hauteur en elle-même ne prouve pas l'aptitude au cross-country.
- Cette commande lit l'entrée de référence graphic ; les coordonnées mondiales ne sont pas nécessaires. group=0 et group=1 sélectionnent des tables différentes même si tileId est le même.
- La propriété est lue à partir des données graphic, et non à partir de l'état actuel d'un élément particulier.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.GetTileHeight(1, 0x0CCA);
UO.Print("GetTileHeight: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- group=1 sélectionne les données de tuiles statiques ; tileId=0x0CCA - graphic arbre.
- value contient le résultat décrit dans la section Retours ; sa signification ne coïncide pas avec serial.
var value = UO.GetTileHeight(1, 0x0CCA);
UO.Print("Tiledata height: " + Convert.ToString(value));Paramètres et déroulement de l’exécution :
- FindType renvoie serial. GetType le transforme en graphic numérique.
- group=1 est utilisé pour les éléments ; dans tileId graphic est transmis, pas l'élément.
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;Paramètres et déroulement de l’exécution :
- Les deux premiers arguments GetLandscapeTile sont le monde actuel X/Y ; la troisième est la carte actuelle.
- land[0] contient des terrains graphic. group=0 sélectionne les données des tuiles de terrain. Pour GetTileLayer/GetTileHeight le sol donne 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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: group (Any), tileId (Any)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetTileHeight. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileDataProperties:bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Lit le numéro de couche d'équipement à partir de l'entrée de données de tuile.
-
group- 0 - table des terrains ; 1 — table de graphic statique. L'implémentation considère tout groupe non nul comme une seconde table ; utilisez 0 ou 1. -
tileId— Entrées graphiques/type dans les données de tuile, généralement l'entier 0…65535. Ce n'est pas le serial d'un objet ou un indice de statique à l'intérieur d'une cellule.
int — numéro de la couche d'équipement graphic : par exemple 1=Rhand, 2=Lhand, 21=Backpack. Pour une couche au sol, une entrée manquante ou une couche nulle, 0 est renvoyé. Ce n'est pas l'ordre de la statique dans une cellule, ni un étage, ni Z.
- Cette commande lit l'entrée de référence graphic ; les coordonnées mondiales ne sont pas nécessaires. group=0 et group=1 sélectionnent des tables différentes même si tileId est le même.
- La propriété est lue à partir des données graphic, et non à partir de l'état actuel d'un élément particulier.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.GetTileLayer(1, 0x0CCA);
UO.Print("GetTileLayer: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- group=1 sélectionne les données de tuiles statiques ; tileId=0x0CCA - graphic arbre.
- value contient le résultat décrit dans la section Retours ; sa signification ne coïncide pas avec serial.
var value = UO.GetTileLayer(1, 0x0CCA);
if (Truth(value == 1))
{
UO.Print("Right-hand graphic");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- FindType renvoie serial. GetType le transforme en graphic numérique.
- group=1 est utilisé pour les éléments ; dans tileId graphic est transmis, pas l'élément.
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;Paramètres et déroulement de l’exécution :
- Les deux premiers arguments GetLandscapeTile sont le monde actuel X/Y ; la troisième est la carte actuelle.
- land[0] contient des terrains graphic. group=0 sélectionne les données des tuiles de terrain. Pour GetTileLayer/GetTileHeight le sol donne 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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: group (Any), tileId (Any)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetTileLayer. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileDataProperties:bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Lit le nom graphic à partir de l'entrée de données de tuile.
-
group- 0 - table des terrains ; 1 — table de graphic statique. L'implémentation considère tout groupe non nul comme une seconde table ; utilisez 0 ou 1. -
tileId— Entrées graphiques/type dans les données de tuile, généralement l'entier 0…65535. Ce n'est pas le serial d'un objet ou un indice de statique à l'intérieur d'une cellule.
string — nom issu des fichiers de jeu TileData. Une chaîne vide signifie un nom vide ou un tileId invalide. Le nom est tiré des ressources du jeu et n'est pas automatiquement traduit dans la langue de l'interface IDE. Ce n'est pas le nom d'un élément spécifique du serveur.
- Cette commande lit l'entrée de référence graphic ; les coordonnées mondiales ne sont pas nécessaires. group=0 et group=1 sélectionnent des tables différentes même si tileId est le même.
- La propriété est lue à partir des données graphic, et non à partir de l'état actuel d'un élément particulier.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.GetTileName(1, 0x0CCA);
UO.Print("GetTileName: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- group=1 sélectionne les données de tuiles statiques ; tileId=0x0CCA - graphic arbre.
- value contient le résultat décrit dans la section Retours ; sa signification ne coïncide pas avec serial.
var value = UO.GetTileName(1, 0x0CCA);
if (Truth(value != ""))
{
UO.Print(value);
}
else
{
UO.Print("No tiledata name");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- FindType renvoie serial. GetType le transforme en graphic numérique.
- group=1 est utilisé pour les éléments ; dans tileId graphic est transmis, pas l'élément.
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;Paramètres et déroulement de l’exécution :
- Les deux premiers arguments GetLandscapeTile sont le monde actuel X/Y ; la troisième est la carte actuelle.
- land[0] contient des terrains graphic. group=0 sélectionne les données des tuiles de terrain. Pour GetTileLayer/GetTileHeight le sol donne 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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: group (Any), tileId (Any)
Résultat: string / String.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetTileName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileDataName:bridge.GetTileDataName(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Lit le graphic ID correspondant à partir de la chaîne d'objets de la cellule de la carte de jeu actuellement chargée.
-
x— Coordonner les cellules X, int. -
y— Coordonner les cellules Y, int. -
map— Numéro de carte ; doit correspondre à World.MapIndex et World.Map doit exister. -
tileStart— Bordure graphique inférieure activée. -
tileEnd— La bordure supérieure incluse du graphique. La plage inversée n'est pas réorganisée et ne produit pas de correspondances. -
uoPath- Le paramètre de compatibilité est converti en string, mais le pont actuel ne l'utilise pas et ne charge pas l'autre dossier de fichiers UO.
Tableau int avec des quads plats [graphic,x,y,z,graphic,x,y,z,...]. L'erreur de mappage donne un tableau vide et un message ; aucune correspondance n'entraîne également un tableau vide.
- Suit World.Map.GetTile(x,y).TNext et vérifie tileStart<=Graphic<=tileEnd. Les types d'objets ne sont pas filtrés séparément : il s'agit d'une chaîne de cellules, pas seulement de données statiques.
- La commande lit la géométrie chargée du client. Les données d'une autre carte/facette ne sont pas chargées. Le paramètre uoPath n'est pas utilisé pour télécharger des fichiers ; le nombre d'entrées est égal à la longueur du tableau/4.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.GetTileXYM(UO.GetX(), UO.GetY(), UO.WorldNum(), 0, 65535, "");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- Chaque entrée occupe quatre 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;Paramètres et déroulement de l’exécution :
- Les indices i et i+3 correspondent à graphic et z du même enregistrement.
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;Paramètres et déroulement de l’exécution :
- La plage 100..99 ne contient aucun graphic et produit un tableau vide.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: x (Any), y (Any), map (Any), tileStart (Any), tileEnd (Any), uoPath (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
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().
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Lit un enregistrement statique utilisateur enregistré.
-
id- int ID, obtenu par AddUserStatic ; pas le graphic/type et pas le serial du monde.
string — enregistrement sérialisé enregistré ; inconnu ID donne une chaîne vide.
- state.UserStatics.TryGetValue renvoie la chaîne sans l'analyser. Notation géométrique - "graphic|x|y|z|hue|map" ; les anciennes entrées de texte peuvent être un texte différent.
- Lit l'état local actuel. Il n’y a pas de package, de cible ou de mise à jour automatique ; les lectures individuelles peuvent voir différents états.
- Dans un hôte client standard, ces données d'état sont extraites du gestionnaire GetPersistentState et sont communes aux scripts/chat/macros du même monde/profil, et n'appartiennent pas à un seul script. Un autre processus ou un InjectionRuntimeState apparemment séparé a un état différent. Charger/effacer un profil peut le remplacer ; Les serial enregistrés sont toujours comparés au monde chargé.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.GetUserStatic(1);
UO.Print("GetUserStatic: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- Lit un enregistrement statique utilisateur enregistré.
UO.Print(UO.GetUserStatic(1));Paramètres et déroulement de l’exécution :
- state.UserStatics.TryGetValue renvoie la chaîne sans l'analyser. Notation géométrique - "graphic|x|y|z|hue|map" ; les anciennes entrées de texte peuvent être un texte différent.
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;Paramètres et déroulement de l’exécution :
- Lit l'état local actuel. Il n’y a pas de package, de cible ou de mise à jour automatique ; les lectures individuelles peuvent voir différents états.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: id (Any)
Résultat: string / String.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetUserStatic. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(id).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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();Lit l'état.UserStatics.
Il n'y a pas de paramètres.
Tableau de chaînes [id, serializedText], triées par identifiant. Chaque identifiant est int, serializedText - string ; un dictionnaire vide donne un tableau vide.
- Lit l'état.UserStatics. La notation géométrique est stockée sous la forme « graphic|x|y|z|hue|map » ; les entrées de texte plus anciennes AddUserStatic peuvent avoir un format différent. Il s'agit d'entrées d'utilisateurs locaux, et non de toutes les cartes statiques.
- Lit l'état local actuel. Il n’y a pas de package, de cible ou de mise à jour automatique ; les lectures individuelles peuvent voir différents états.
- Dans un hôte client standard, ces données d'état sont extraites du gestionnaire GetPersistentState et sont communes aux scripts/chat/macros du même monde/profil, et n'appartiennent pas à un seul script. Un autre processus ou un InjectionRuntimeState apparemment séparé a un état différent. Charger/effacer un profil peut le remplacer ; Les serial enregistrés sont toujours comparés au monde chargé.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.GetUserStatics();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- Lit l'état.UserStatics.
var records = UO.GetUserStatics();
UO.Print(UO.GetArrayLength(records));Paramètres et déroulement de l’exécution :
- Lit l'état.UserStatics. La notation géométrique est stockée sous la forme « graphic|x|y|z|hue|map » ; les entrées de texte plus anciennes AddUserStatic peuvent avoir un format différent. Il s'agit d'entrées d'utilisateurs locaux, et non de toutes les cartes statiques.
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;Paramètres et déroulement de l’exécution :
- Lit l'état local actuel. Il n’y a pas de package, de cible ou de mise à jour automatique ; les lectures individuelles peuvent voir différents états.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: Aucun paramètre.
Résultat: dynamic / Any.
Pendant un appel:
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Lit les enregistrements au sol étendus, les enregistrements en surface et les éléments du monde chargés dans la zone sélectionnée.
-
x— Cellule X de la carte actuellement chargée ; coordonnée mondiale, pas position à l'intérieur du gump. -
y— Cellule Y de la carte actuellement chargée ; coordonnée mondiale, pas position à l'intérieur du gump. -
map— Numéro de carte. Si cet argument n'est pas présent dans le formulaire sélectionné, la carte actuelle est utilisée. Le vrai client lit uniquement les tuiles de la carte actuellement chargée.
Tableau d'enregistrements. Chaque élément result[i] a le format suivant :
Tableau de champs 11 d'un enregistrement ; les indices commencent par 0 :
-
[0] kind— string : "terre", "statique" ou "object". -
[1] serial- int : serial élément dynamique ; pour la terre/statique est 0. -
[2] graphic— int : type graphique. -
[3] x,[4] y- int : coordonnées mondiales de la cellule. -
[5] z- int : la hauteur de la base dans le monde. -
[6] hue- int : couleur, près du sol 0. -
[7] flags- int : bits 32 faibles des indicateurs de données de tuile. -
[8] name- string : nom issu des données de tuile. -
[9] layer- int : couche d'équipement issue des tuiles, proche du sol 0 ; pas un index statique. -
[10] height- int : hauteur graphic à partir des données de tuile, près du sol 0 ; pas la coordonnée Z.
ArrayLength(résultat) - le nombre d'enregistrements, pas le nombre de cellules ni le nombre d'étapes de routage. Le résultat peut être vide. Un x/y peut avoir plusieurs entrées avec différents Z. L'entrée "object" a serial ; l'entrée "static" n'a pas de serial utilisable.
- Les données font référence à la carte actuellement chargée. Une autre carte ou une cellule inaccessible entraîne un tableau vide. Les requêtes directes de tuiles peuvent en outre signaler des discordances de carte ; GetWorldCell et GetWorldTilesArray renvoient immédiatement un tableau vide sans un tel message.
- Les indices de tableau commencent par 0. Vérifiez ArrayLength avant de lire le champ. Z représente l'altitude du monde ; layer est la propriété d'équipement de TileData et Index est le numéro de série de l'entrée de cellule.
- La partie statique utilise GetStaticTiles : sa sélection actuelle inclut également Multi/Item. Un objet mondial peut en outre apparaître sous la forme « object » avec serial ; Ne traitez pas chaque entrée comme un élément unique.
- GetWorldTilesArray limite la région des cellules 1 000 000. Le dépassement de coordonnées en dehors de 0…65535/map en dehors de 0…255 provoque une erreur de commande plutôt qu'un tableau partiel. Pour des sondages fréquents, choisissez une petite zone.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.GetWorldCell(UO.GetX(), UO.GetY());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- GetWorldCell lit une cellule ; GetWorldTilesArray dans cet exemple lit le carré 3×3 avec les bordures activées.
- cell[i] est un tableau imbriqué. tuile[0] - catégorie, [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;Paramètres et déroulement de l’exécution :
- La zone est sélectionnée par coordonnées et non par conteneur.
- La vérification kind="object" sépare les éléments en série des éléments terrestres/statiques ; [1] contient 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;Paramètres et déroulement de l’exécution :
- Tile[5] et GetZ() sont comparés dans les mêmes unités de hauteur mondiale.
- L'égalité Z filtre la base, mais ne signifie pas la praticabilité ou l'adéquation de l'ensemble du sol.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: x (Any), y (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetWorldCell. -
InjectionScript.Runtime.InjectionApiUO.GetWorldCell:GetWorldCell(x, y, new InjectionValue(bridge.WorldNumber)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
Code interne de l’implémentation ; ce n’est pas un script autonome.
public InjectionValue GetWorldCell(InjectionValue x, InjectionValue y)
=> GetWorldCell(x, y, new InjectionValue(bridge.WorldNumber));Paramètres: x (Any), y (Any), map (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
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).
Code interne de l’implémentation ; ce n’est pas un script autonome.
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();Lit le numéro de carte actuel à partir du modèle client.
Il n'y a pas de paramètres.
int — index de la carte actuelle du client, généralement 0=Felucca, 1=Trammel, 2=Ilshenar, 3=Malas, 4=Tokuno, 5=Ter Mur. Le serveur utilisateur peut utiliser un jeu de cartes différent. 0 est une carte à part entière, pas le signe d'une erreur.
- Les données locales déjà reçues sont lues. La requête n'ouvre pas le statut et n'oblige pas le serveur à envoyer une mise à jour. Après un décès, une transition de map ou une suppression d'objet, les valeurs peuvent changer entre deux appels.
- C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.GetWorldNum();
UO.Print("GetWorldNum: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- L'appel sans arguments fait référence à self. Le numéro de carte actuel est stocké en valeur.
- Convert.ToString convertit le nombre à sortir et ne change pas la signification du résultat.
var value = UO.GetWorldNum();
UO.Print("GetWorldNum: " + Convert.ToString(value));Paramètres et déroulement de l’exécution :
- La valeur est lue une fois sans aucun argument. Le numéro de carte actuel est utilisé dans le calcul ou la condition indiquée.
- Les seuils numériques sont des exemples de conditions de script et non de nouvelles limites client. Le champ stocke les unités de serveur et les restrictions décrites ci-dessus.
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;Paramètres et déroulement de l’exécution :
- Les deux appels sans argument lisent leur valeur actuelle. UO.Wait(1000) donne une pause en millisecondes entre les prises de vue.
- Le changement comparé est le numéro de la carte actuelle. Un exemple ne change rien au monde et n’attend pas indéfiniment. Les événements au cours de cette seconde peuvent être manqués.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: Aucun paramètre.
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [GetWorldNum]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
L’appel exécute le delegate du gestionnaire enregistré. La méthode d’enregistrement crée ce delegate lors de la construction de l’API.
Code interne de l’implémentation ; ce n’est pas un script autonome.
() => bridge.WorldNumberCréation de l’API: Ces fonctions enregistrent l’API. Elles ne sont pas exécutées à nouveau pour chaque appel de commande.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetWorldTilesArray(object? minX, object? minY, object? maxX, object? maxY, object? map);Lit les enregistrements au sol étendus, les enregistrements en surface et les éléments du monde chargés dans la zone sélectionnée.
-
minX— La première bordure X du rectangle, incluse ; 0…65535. -
minY— La première bordure Y du rectangle, incluse ; 0…65535. -
maxX— Deuxième limite incluse X ; le plus petit/plus grand des deux X est sélectionné automatiquement. -
maxY— Deuxième limite incluse Y ; le plus petit/plus grand des deux Y est sélectionné automatiquement. -
map— Numéro de carte. Si cet argument n'est pas présent dans le formulaire sélectionné, la carte actuelle est utilisée. Le vrai client lit uniquement les tuiles de la carte actuellement chargée.
Tableau d'enregistrements. Chaque élément result[i] a le format suivant :
Tableau de champs 11 d'un enregistrement ; les indices commencent par 0 :
-
[0] kind— string : "terre", "statique" ou "object". -
[1] serial- int : serial élément dynamique ; pour la terre/statique est 0. -
[2] graphic— int : type graphique. -
[3] x,[4] y- int : coordonnées mondiales de la cellule. -
[5] z- int : la hauteur de la base dans le monde. -
[6] hue- int : couleur, près du sol 0. -
[7] flags- int : bits 32 faibles des indicateurs de données de tuile. -
[8] name- string : nom issu des données de tuile. -
[9] layer- int : couche d'équipement issue des tuiles, proche du sol 0 ; pas un index statique. -
[10] height- int : hauteur graphic à partir des données de tuile, près du sol 0 ; pas la coordonnée Z.
ArrayLength(résultat) - le nombre d'enregistrements, pas le nombre de cellules ni le nombre d'étapes de routage. Le résultat peut être vide. Un x/y peut avoir plusieurs entrées avec différents Z. L'entrée "object" a serial ; l'entrée "static" n'a pas de serial utilisable.
- Les données font référence à la carte actuellement chargée. Une autre carte ou une cellule inaccessible entraîne un tableau vide. Les requêtes directes de tuiles peuvent en outre signaler des discordances de carte ; GetWorldCell et GetWorldTilesArray renvoient immédiatement un tableau vide sans un tel message.
- Les indices de tableau commencent par 0. Vérifiez ArrayLength avant de lire le champ. Z représente l'altitude du monde ; layer est la propriété d'équipement de TileData et Index est le numéro de série de l'entrée de cellule.
- La partie statique utilise GetStaticTiles : sa sélection actuelle inclut également Multi/Item. Un objet mondial peut en outre apparaître sous la forme « object » avec serial ; Ne traitez pas chaque entrée comme un élément unique.
- GetWorldTilesArray limite la région des cellules 1 000 000. Le dépassement de coordonnées en dehors de 0…65535/map en dehors de 0…255 provoque une erreur de commande plutôt qu'un tableau partiel. Pour des sondages fréquents, choisissez une petite zone.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
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));Paramètres et déroulement de l’exécution :
- GetWorldCell lit une cellule ; GetWorldTilesArray dans cet exemple lit le carré 3×3 avec les bordures activées.
- cell[i] est un tableau imbriqué. tuile[0] - catégorie, [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;Paramètres et déroulement de l’exécution :
- La zone est sélectionnée par coordonnées et non par conteneur.
- La vérification kind="object" sépare les éléments en série des éléments terrestres/statiques ; [1] contient 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;Paramètres et déroulement de l’exécution :
- Tile[5] et GetZ() sont comparés dans les mêmes unités de hauteur mondiale.
- L'égalité Z filtre la base, mais ne signifie pas la praticabilité ou l'adéquation de l'ensemble du sol.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: minX (Any), minY (Any), maxX (Any), maxY (Any), map (Any)
Résultat: dynamic / Any.
Pendant un appel:
-
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.
Code interne de l’implémentation ; ce n’est pas un script autonome.
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);Lit le champ X de l'objet chargé ou du caractère actuel.
-
idest le Serial/ID de l'objet, pas graphic/type. Numéro, chaîne hexadécimale, nom standard self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse ou nom AddObject. L'alias doit être défini ; l'existence est vérifiée par Exists. Le formulaire enregistré sans arguments utilise self.
int est la coordonnée X. Pour un objet inconnu, 0 est renvoyé. Zéro est également une coordonnée valide. Mesuré en cellules pour les objets du monde ; Ce ne sont pas des pixels d'écran.
- Les dernières données déjà connues du client sont lues ; la demande de mise à jour n'est pas envoyée au serveur.
- Un objet inconnu et une propriété qui n'a pas encore été récupérée peuvent avoir une valeur nulle/vide. Vérifiez Exists et les conditions d'une action particulière.
- Pour un personnage ou un objet au sol, il s'agit de la coordonnée mondiale. L'article à l'intérieur du conteneur a une position X/Y à l'intérieur de la gomme ; la commande ne les traduit pas dans les coordonnées mondiales du propriétaire.
- La coordonnée actuelle de l'objet est lue. Les étapes en attente ne sont pas converties en calculs d'itinéraire par cette commande.
int x = UO.GetX();
UO.Print($"X = {x}");Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.GetX();
UO.Print("GetX: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- La forme sans argument sélectionne self, le caractère actuel.
- la position contient la coordonnée X, pas serial.
var position = UO.GetX();
UO.Print("X: " + Convert.ToString(position));Paramètres et déroulement de l’exécution :
- lasttarget doit pointer vers le personnage ou l'objet chargé au sol.
- delta — différence le long d'un axe. Ce n’est pas la longueur du parcours qui compte ; la valeur peut être négative.
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;Paramètres et déroulement de l’exécution :
- id="self" est une forme explicite de sélection de caractères. UO.Wait=500 millisecondes.
- La comparaison montre uniquement la modification de l'axe X. Les changements dans l'autre axe ou la rotation ne sont pas pris en compte ici.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: Aucun paramètre.
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetX. -
InjectionScript.Runtime.InjectionApiUO.GetX:GetX("self").
Code interne de l’implémentation ; ce n’est pas un script autonome.
public int GetX() => GetX("self");Paramètres: id (Any/Integer/String)
Résultat: int / Any.
Pendant un appel:
-
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.
Code interne de l’implémentation ; ce n’est pas un script autonome.
case "getx": return new InjectionValue(bridge.GetX(Arg(0, bridge.Self)));Paramètres: id (Any/Integer/String)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetX. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(id).
Code interne de l’implémentation ; ce n’est pas un script autonome.
public int GetX(int id) => bridge.GetX(id);Paramètres: id (Any/Integer/String)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetX. -
InjectionScript.Runtime.InjectionApiUO.GetX:GetX(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Code interne de l’implémentation ; ce n’est pas un script autonome.
public int GetX(string id) => GetX(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetY();
int UO.GetY(object? id);Lit le champ Y de l'objet chargé ou du caractère actuel.
-
idest le Serial/ID de l'objet, pas graphic/type. Numéro, chaîne hexadécimale, nom standard self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse ou nom AddObject. L'alias doit être défini ; l'existence est vérifiée par Exists. Le formulaire enregistré sans arguments utilise self.
int est la coordonnée Y. Pour un objet inconnu, 0 est renvoyé. Zéro est également une coordonnée valide. Mesuré en cellules pour les objets du monde ; Ce ne sont pas des pixels d'écran.
- Les dernières données déjà connues du client sont lues ; la demande de mise à jour n'est pas envoyée au serveur.
- Un objet inconnu et une propriété qui n'a pas encore été récupérée peuvent avoir une valeur nulle/vide. Vérifiez Exists et les conditions d'une action particulière.
- Pour un personnage ou un objet au sol, il s'agit de la coordonnée mondiale. L'article à l'intérieur du conteneur a une position X/Y à l'intérieur de la gomme ; la commande ne les traduit pas dans les coordonnées mondiales du propriétaire.
- La coordonnée actuelle de l'objet est lue. Les étapes en attente ne sont pas converties en calculs d'itinéraire par cette commande.
int y = UO.GetY();
UO.Print($"Y = {y}");Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.GetY();
UO.Print("GetY: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- La forme sans argument sélectionne self, le caractère actuel.
- la position contient la coordonnée Y, pas serial.
var position = UO.GetY();
UO.Print("Y: " + Convert.ToString(position));Paramètres et déroulement de l’exécution :
- lasttarget doit pointer vers le personnage ou l'objet chargé au sol.
- delta — différence le long d'un axe. Ce n’est pas la longueur du parcours qui compte ; la valeur peut être négative.
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;Paramètres et déroulement de l’exécution :
- id="self" est une forme explicite de sélection de caractères. UO.Wait=500 millisecondes.
- La comparaison montre uniquement la modification de l'axe Y. Les changements dans l'autre axe ou la rotation ne sont pas pris en compte ici.
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# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: Aucun paramètre.
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetY. -
InjectionScript.Runtime.InjectionApiUO.GetY:GetY("self").
Code interne de l’implémentation ; ce n’est pas un script autonome.
public int GetY() => GetY("self");Paramètres: id (Any/Integer/String)
Résultat: int / Any.
Pendant un appel:
-
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.
Code interne de l’implémentation ; ce n’est pas un script autonome.
case "gety": return new InjectionValue(bridge.GetY(Arg(0, bridge.Self)));Paramètres: id (Any/Integer/String)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetY. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(id).
Code interne de l’implémentation ; ce n’est pas un script autonome.
public int GetY(int id) => bridge.GetY(id);Paramètres: id (Any/Integer/String)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetY. -
InjectionScript.Runtime.InjectionApiUO.GetY:GetY(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Code interne de l’implémentation ; ce n’est pas un script autonome.
public int GetY(string id) => GetY(GetObject(id));ClassicUO — Bad Newbie & C# Scripts IDE