Skip to content

FR UO Topic world geometry

Codex edited this page Oct 12, 2026 · 4 revisions

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Monde et géométrie

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.

Sections

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

Toutes les commandes du thème

X / Y / Z

UO.X · UO.Y · UO.Z · UO.GetX · UO.GetY · UO.GetZ

Distance

UO.Dist · UO.GetDistance

LOS

UO.CheckLOS · UO.LOSOptions

Numéro mondial

UO.WorldNum · UO.GetWorldNum

Cellules du monde / Passabilité

UO.GetWorldCell · UO.GetMapCell · UO.IsWorldCellPassable · UO.GetSurfaceZ · UO.GetNextStepZ · UO.GetWorldTilesArray

Tuiles de terrain

UO.GetLandscapeTile · UO.GetLandTileAt · UO.GetLandTileData · UO.GetLandTilesArray · UO.GetLandTilesArrayEx

Tuiles statiques

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

Propriétés des tuiles

UO.GetTileFlags · UO.GetTileHeight · UO.GetTileLayer · UO.GetTileName · UO.IsWaterTile · UO.IsTreeTile · UO.IsMineTile · UO.ConvertIntegerToFlags

Statistiques des clients

UO.AddUserStatic · UO.ClearUserStatics · UO.GetUserStatic · UO.GetUserStatics · UO.RemoveUserStatic · UO.UserStaticExists

Exemples sur le sujet

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.

UO.GetDistance

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;

UO.IsWorldCellPassable

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;

Parties de la référence

1 · 2

Référence complète des commandes


UO.AddUserStatic

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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.

Paramètres

  • staticItem — valeur numérique graphic ou texte hérité.
  • worldNum - index de la carte pour enregistrement ou statique locale.
  • graphic — ID statique de 0 à 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 de 0 à 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.

Valeur de retour

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.

Comportement

    • UO.AddUserStatic('tree', 0) - puisque tree n'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 z et hue 0.
  • 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.

Scripts C# autonomes

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.

Exemple simple

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;
    }
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.AddUserStatic(staticItem, worldNum) — UO.AddUserStatic(Any,Any)

Paramètres: staticItem (Any), worldNum (Any)

Résultat: dynamic / Any.

Pendant un appel:

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));

                }

UO.AddUserStatic(graphic, x, y, z, hue, map) — UO.AddUserStatic(Any,Any,Any,Any,Any,Any)

Paramètres: graphic (Any), x (Any), y (Any), z (Any), hue (Any), map (Any)

Résultat: int / Integer.

Pendant un appel:

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])))

UO.CheckLOS

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Ligne sur la cellule actuelle - script direct

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));

2. Vérification de la cellule adjacente - fonction de script

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;
}

3. Coordonnée invalide – classe de script

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;
    }
}

Implémentation de la commande

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:

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);

UO.ClearUserStatics

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

void UO.ClearUserStatics();

Supprime toutes les entrées d’exécution statique utilisateur et les objets du gestionnaire statique local.

Paramètres

Il n'y a pas de paramètres.

Valeur de retour

void - aucune valeur de retour.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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();

1. État clair - script direct

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();

2. Effacer après l'installation - fonction de script

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;
}

3. Re-Purge - Classe de script

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;
    }
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.ClearUserStatics() — UO.ClearUserStatics()

Paramètres: Aucun paramètre.

Résultat: void / Unit.

Pendant un appel:

Code interne de l’implémentation ; ce n’est pas un script autonome.

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

UO.ConvertIntegerToFlags

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Masque nul - script direct

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;

2. Masque de bits bas - Fonction de script

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;

3. Groupe invalide – Classe de script

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.ConvertIntegerToFlags(group, value) — UO.ConvertIntegerToFlags(Any,Any)

Paramètres: group (Any), value (Any)

Résultat: dynamic / Any.

Pendant un appel:

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());

UO.Dist

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Calcul direct - script direct

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);

2. Vérifier correctement le résultat est une fonction du script

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;
}

3. Analyse complète du script - classe de script

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.Dist(xfrom, yfrom, xto, yto) — UO.Dist(Any,Any,Any,Any)

Paramètres: xfrom (Any), yfrom (Any), xto (Any), yto (Any)

Résultat: int / Integer.

Pendant un appel:

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)));

UO.GetDistance

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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

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.

Paramètres

  • 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.

Valeur de retour

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).

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Vérifier la plage par rapport à la cible - script direct

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;

2. Distance entre deux points - fonction script

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;
}

3. Partez d'un objet et de votre personnage - classe de script

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;
    }
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetDistance(id) — UO.GetDistance(Any)

Paramètres: id (Any/Integer/String)

Résultat: int / Any.

Pendant un appel:

Code interne de l’implémentation ; ce n’est pas un script autonome.

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

UO.GetDistance(id) — UO.GetDistance(Integer)

Paramètres: id (Any/Integer/String)

Résultat: int / Integer.

Pendant un appel:

Code interne de l’implémentation ; ce n’est pas un script autonome.

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

UO.GetDistance(id) — UO.GetDistance(String)

Paramètres: id (Any/Integer/String)

Résultat: int / Integer.

Pendant un appel:

Code interne de l’implémentation ; ce n’est pas un script autonome.

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

UO.GetDistance(x, y) — UO.GetDistance(Integer,Integer)

Paramètres: x (Integer), y (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 x, int y) => GetDistance(bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), x, y);

UO.GetDistance(id1, x2, y2) — UO.GetDistance(Any,Any,Any)

Paramètres: id1 (Any), x2 (Any), y2 (Any)

Résultat: int / Integer.

Pendant un appel:

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));

        }

UO.GetDistance(x1, y1, x2, y2) — UO.GetDistance(Integer,Integer,Integer,Integer)

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);

        }

UO.GetLandTileAt

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Lire le type, Z et le calque séparément - script direct

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;

2. Obtenir le nom et la hauteur graphic - fonction de script

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;

3. Préparer la cible par type et coordonnées - classe de script

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetLandTileAt(x, y) — UO.GetLandTileAt(Any,Any)

Paramètres: x (Any), y (Any)

Résultat: dynamic / Any.

Pendant un appel:

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));

UO.GetLandTileAt(x, y, map) — UO.GetLandTileAt(Any,Any,Any)

Paramètres: x (Any), y (Any), map (Any)

Résultat: dynamic / Any.

Pendant un appel:

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>());

        }

UO.GetLandTileData

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

dynamic UO.GetLandTileData(object? tile);

Lit l'enregistrement de référence foncière étendu à partir des données de tuiles.

Paramètres

  • tile est 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Lire le nom de l'entrée - script direct

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;

2. Vérifier l'indicateur booléen individuel - Fonction de script

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;

3. Imprimer graphic et le masque de drapeau général - classe de script

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetLandTileData(tile) — UO.GetLandTileData(Any)

Paramètres: tile (Any)

Résultat: dynamic / Any.

Pendant un appel:

Code interne de l’implémentation ; ce n’est pas un script autonome.

case "getlandtiledata":

                    return BuildTileData(0, Arg(0));

UO.GetLandTilesArray

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Rechercher à proximité d'un personnage - script direct

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;

2. Angles réorganisés et sortie de tous les champs - fonction script

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;

3. Ré-interrogation avec limite de tentatives - Classe de script

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;
}

Implémentation de la commande

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:

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);

UO.GetLandTilesArrayEx

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Rechercher à proximité d'un personnage - script direct

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;

2. Angles réorganisés et sortie de tous les champs - fonction script

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;

3. Ré-interrogation avec limite de tentatives - Classe de script

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;
}

Implémentation de la commande

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:

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);

UO.GetLandscapeTile

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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

Lit le terrain d'une cellule de la carte actuelle.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Montrer le sol sous le personnage - script direct

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;

2. Comparer la hauteur de la cellule voisine - fonction de script

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;

3. Lire le nom du terrain trouvé - classe de scénario

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetLandscapeTile(x, y, map) — UO.GetLandscapeTile(Any,Any,Any)

Paramètres: x (Any), y (Any), map (Any)

Résultat: dynamic / Any.

Pendant un appel:

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)));

UO.GetLayerCount

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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

Compte les enregistrements de géométrie non terrestre dans une cellule.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Compter les enregistrements sous un caractère - script direct

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));

2. Vérifier la cellule adjacente - fonction de script

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;

3. Comparer le contenu de deux couches cartographiques - classe de script

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;
    }
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetLayerCount(x, y, worldNum) — UO.GetLayerCount(Any,Any,Any)

Paramètres: x (Any), y (Any), worldNum (Any)

Résultat: dynamic / Any.

Pendant un appel:

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);

UO.GetMapCell

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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

Lit graphic, les drapeaux de hauteur et de terre dans une case de la carte.

Paramètres

  • 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.

Valeur de retour

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).

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Lire le sol sous le personnage - script direct

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;

2. Comparez deux cellules adjacentes - fonction de script

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;

3. Comparer la base de la Terre à la surface moyenne - Classe de script

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetMapCell(x, y, worldNum) — UO.GetMapCell(Any,Any,Any)

Paramètres: x (Any), y (Any), worldNum (Any)

Résultat: dynamic / Any.

Pendant un appel:

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());

UO.GetNextStepZ

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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.

Paramètres

  • 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.

Valeur de retour

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].

Comportement

  • 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é.

Scripts C# autonomes

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.

Exemple simple

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));

1. Découvrez la hauteur estimée de la marche est - script direct

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));

2. Voyage séparé de l'altitude réelle 0 - fonction script

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;

3. Vérifier l'étape suivante à partir de la hauteur actuelle - classe de script

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;
    }
}

Implémentation de la commande

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:

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));

                }

UO.GetStaticArt

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Vérifiez la taille de l'icône avant de la traiter vous-même - script direct

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;

2. Calculer RGB d'un pixel en tenant compte des lignes inversées BMP - fonction script

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;

3. Comparez les versions originales et colorées du même cours d'art et de script

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetStaticArt(objType, hue) — UO.GetStaticArt(Any,Any)

Paramètres: objType (Any), hue (Any)

Résultat: dynamic / Any.

Pendant un appel:

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());

UO.GetStaticTileAt

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Lire le type, Z et le calque séparément - script direct

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;

2. Obtenir le nom et la hauteur graphic - fonction de script

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;

3. Préparer la cible par type et coordonnées - classe de script

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetStaticTileAt(x, y, index) — UO.GetStaticTileAt(Any,Any,Any)

Paramètres: x (Any), y (Any), index (Any)

Résultat: dynamic / Any.

Pendant un appel:

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);

UO.GetStaticTileAt(x, y, map, index) — UO.GetStaticTileAt(Any,Any,Any,Any)

Paramètres: x (Any), y (Any), map (Any), index (Any)

Résultat: dynamic / Any.

Pendant un appel:

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>());

        }

UO.GetStaticTileData

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

dynamic UO.GetStaticTileData(object? tile);

Lit l'entrée de référence étendue statique graphic à partir de TileData.

Paramètres

  • tile est 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.

Valeur de retour

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] count est 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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Lire le nom de l'entrée - script direct

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;

2. Vérifier l'indicateur booléen individuel - Fonction de script

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;

3. Imprimer graphic et le masque de drapeau général - classe de script

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetStaticTileData(tile) — UO.GetStaticTileData(Any)

Paramètres: tile (Any)

Résultat: dynamic / Any.

Pendant un appel:

Code interne de l’implémentation ; ce n’est pas un script autonome.

case "getstatictiledata":

                    return BuildTileData(1, Arg(0));

UO.GetStaticTiles

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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

Lit les entrées au-dessus du sol dans une cellule de la carte actuelle.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Compter les enregistrements de cellules - script direct

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;

2. Parcourez graphic et la hauteur de toutes les entrées - fonction de script

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;

3. Lire hue de la première entrée - classe de script

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetStaticTiles(x, y, map) — UO.GetStaticTiles(Any,Any,Any)

Paramètres: x (Any), y (Any), map (Any)

Résultat: dynamic / Any.

Pendant un appel:

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)));

UO.GetStaticTilesArray

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Rechercher à proximité d'un personnage - script direct

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;

2. Angles réorganisés et sortie de tous les champs - fonction script

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;

3. Ré-interrogation avec limite de tentatives - Classe de script

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;
}

Implémentation de la commande

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:

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);

UO.GetStaticTilesArrayEx

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Rechercher à proximité d'un personnage - script direct

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;

2. Angles réorganisés et sortie de tous les champs - fonction script

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;

3. Ré-interrogation avec limite de tentatives - Classe de script

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;
}

Implémentation de la commande

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:

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);

UO.GetSurfaceZ

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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

Lit la hauteur moyenne de la surface du sol dans une cellule.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Taille moyenne sous caractère - écriture directe

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));

2. Vérifier la disponibilité du terrain avant de lire - fonction script

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;

3. Afficher le changement de hauteur moyenne vers l'est - Classe de scénario

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetSurfaceZ(x, y, worldNum) — UO.GetSurfaceZ(Any,Any,Any)

Paramètres: x (Any), y (Any), worldNum (Any)

Résultat: dynamic / Any.

Pendant un appel:

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)));

UO.GetTileFlags

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Lire la propriété du statique connu graphic - script direct

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;

2. Lire la propriété graphic d'un élément trouvé - fonction de script

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;

3. Lire la propriété du sol sous le personnage - classe scénario

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetTileFlags(group, tileId) — UO.GetTileFlags(Any,Any)

Paramètres: group (Any), tileId (Any)

Résultat: dynamic / Any.

Pendant un appel:

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))));

UO.GetTileHeight

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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

Lit la hauteur graphic à partir de l'entrée de données de tuile.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Lire la propriété du statique connu graphic - script direct

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));

2. Lire la propriété graphic d'un élément trouvé - fonction de script

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;

3. Lire la propriété du sol sous le personnage - classe scénario

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetTileHeight(group, tileId) — UO.GetTileHeight(Any,Any)

Paramètres: group (Any), tileId (Any)

Résultat: int / Integer.

Pendant un appel:

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];

        }

UO.GetTileLayer

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Lire la propriété du statique connu graphic - script direct

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;

2. Lire la propriété graphic d'un élément trouvé - fonction de script

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;

3. Lire la propriété du sol sous le personnage - classe scénario

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetTileLayer(group, tileId) — UO.GetTileLayer(Any,Any)

Paramètres: group (Any), tileId (Any)

Résultat: int / Integer.

Pendant un appel:

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];

        }

UO.GetTileName

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

string UO.GetTileName(object? group, object? tileId);

Lit le nom graphic à partir de l'entrée de données de tuile.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Lire la propriété du statique connu graphic - script direct

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;

2. Lire la propriété graphic d'un élément trouvé - fonction de script

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;

3. Lire la propriété du sol sous le personnage - classe scénario

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetTileName(group, tileId) — UO.GetTileName(Any,Any)

Paramètres: group (Any), tileId (Any)

Résultat: string / String.

Pendant un appel:

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));

UO.GetTileXYM

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Tous les graphiques de la cellule actuelle sont un script direct

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;

2. Imprimer graphic et hauteur - fonction script

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;

3. Plage inversée - Classe de script

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetTileXYM(x, y, map, tileStart, tileEnd, uoPath) — UO.GetTileXYM(Any,Any,Any,Any,Any,Any)

Paramètres: x (Any), y (Any), map (Any), tileStart (Any), tileEnd (Any), uoPath (Any)

Résultat: dynamic / Any.

Pendant un appel:

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()));

UO.GetUserStatic

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

string UO.GetUserStatic(object? id);

Lit un enregistrement statique utilisateur enregistré.

Paramètres

  • id - int ID, obtenu par AddUserStatic ; pas le graphic/type et pas le serial du monde.

Valeur de retour

string — enregistrement sérialisé enregistré ; inconnu ID donne une chaîne vide.

Comportement

  • 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é.

Scripts C# autonomes

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.

Exemple simple

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));

1. Appel direct - script direct

Paramètres et déroulement de l’exécution :

  • Lit un enregistrement statique utilisateur enregistré.
UO.Print(UO.GetUserStatic(1));

2. Option explicite - fonction de script

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;

3. Fonction d'assistance complète - Classe de script

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetUserStatic(id) — UO.GetUserStatic(Any)

Paramètres: id (Any)

Résultat: string / String.

Pendant un appel:

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;

UO.GetUserStatics

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

dynamic UO.GetUserStatics();

Lit l'état.UserStatics.

Paramètres

Il n'y a pas de paramètres.

Valeur de retour

Tableau de chaînes [id, serializedText], triées par identifiant. Chaque identifiant est int, serializedText - string ; un dictionnaire vide donne un tableau vide.

Comportement

  • 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é.

Scripts C# autonomes

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.

Exemple simple

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));

1. Appel direct - script direct

Paramètres et déroulement de l’exécution :

  • Lit l'état.UserStatics.
var records = UO.GetUserStatics();
UO.Print(UO.GetArrayLength(records));

2. Option explicite - fonction de script

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;

3. Fonction d'assistance complète - Classe de script

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;
    }
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetUserStatics() — UO.GetUserStatics()

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());

UO.GetWorldCell

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Compter et lister les enregistrements - script direct

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;

2. Afficher uniquement les entrées avec l'élément serial - fonction de script

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;

3. Sélectionner des enregistrements à hauteur de caractère - Classe de script

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetWorldCell(x, y) — UO.GetWorldCell(Any,Any)

Paramètres: x (Any), y (Any)

Résultat: dynamic / Any.

Pendant un appel:

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));

UO.GetWorldCell(x, y, map) — UO.GetWorldCell(Any,Any,Any)

Paramètres: x (Any), y (Any), map (Any)

Résultat: dynamic / Any.

Pendant un appel:

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);

UO.GetWorldNum

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

int UO.GetWorldNum();

Lit le numéro de carte actuel à partir du modèle client.

Paramètres

Il n'y a pas de paramètres.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Afficher la valeur actuelle de votre personnage - script direct

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));

2. Utiliser la valeur dans la validation de l'application - Fonction de script

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;

3. Regardez le changement en une seconde - cours de script

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetWorldNum() — UO.GetWorldNum()

Paramètres: Aucun paramètre.

Résultat: int / Integer.

Pendant un appel:

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.WorldNumber

Création de l’API: Ces fonctions enregistrent l’API. Elles ne sont pas exécutées à nouveau pour chaque appel de commande.


UO.GetWorldTilesArray

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

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.

Paramètres

  • 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.

Valeur de retour

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.

Comportement

  • 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.

Scripts C# autonomes

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.

Exemple simple

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));

1. Compter et lister les enregistrements - script direct

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;

2. Afficher uniquement les entrées avec l'élément serial - fonction de script

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;

3. Sélectionner des enregistrements à hauteur de caractère - Classe de script

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetWorldTilesArray(minX, minY, maxX, maxY, map) — UO.GetWorldTilesArray(Any,Any,Any,Any,Any)

Paramètres: minX (Any), minY (Any), maxX (Any), maxY (Any), map (Any)

Résultat: dynamic / Any.

Pendant un appel:

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());

        }

UO.GetX

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

int UO.GetX();
int UO.GetX(object? id);

Lit le champ X de l'objet chargé ou du caractère actuel.

Paramètres

  • id est 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.

Valeur de retour

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.

Comportement

  • 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.

Exemple .csx

int x = UO.GetX();
UO.Print($"X = {x}");

Scripts C# autonomes

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.

Exemple simple

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));

1. Lisez vos coordonnées - script direct

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));

2. Comparer avec le caractère sélectionné - fonction de script

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;

3. Rappelez-vous le point et comparez plus tard - classe de script

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetX() — UO.GetX()

Paramètres: Aucun paramètre.

Résultat: int / Integer.

Pendant un appel:

Code interne de l’implémentation ; ce n’est pas un script autonome.

public int GetX() => GetX("self");

UO.GetX(id) — UO.GetX(Any)

Paramètres: id (Any/Integer/String)

Résultat: int / Any.

Pendant un appel:

Code interne de l’implémentation ; ce n’est pas un script autonome.

case "getx": return new InjectionValue(bridge.GetX(Arg(0, bridge.Self)));

UO.GetX(id) — UO.GetX(Integer)

Paramètres: id (Any/Integer/String)

Résultat: int / Integer.

Pendant un appel:

Code interne de l’implémentation ; ce n’est pas un script autonome.

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

UO.GetX(id) — UO.GetX(String)

Paramètres: id (Any/Integer/String)

Résultat: int / Integer.

Pendant un appel:

Code interne de l’implémentation ; ce n’est pas un script autonome.

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

UO.GetY

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Signatures C#

int UO.GetY();
int UO.GetY(object? id);

Lit le champ Y de l'objet chargé ou du caractère actuel.

Paramètres

  • id est 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.

Valeur de retour

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.

Comportement

  • 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.

Exemple .csx

int y = UO.GetY();
UO.Print($"Y = {y}");

Scripts C# autonomes

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.

Exemple simple

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));

1. Lisez vos coordonnées - script direct

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));

2. Comparer avec le caractère sélectionné - fonction de script

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;

3. Rappelez-vous le point et comparez plus tard - classe de script

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;
}

Implémentation de la commande

C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.

UO.GetY() — UO.GetY()

Paramètres: Aucun paramètre.

Résultat: int / Integer.

Pendant un appel:

Code interne de l’implémentation ; ce n’est pas un script autonome.

public int GetY() => GetY("self");

UO.GetY(id) — UO.GetY(Any)

Paramètres: id (Any/Integer/String)

Résultat: int / Any.

Pendant un appel:

Code interne de l’implémentation ; ce n’est pas un script autonome.

case "gety": return new InjectionValue(bridge.GetY(Arg(0, bridge.Self)));

UO.GetY(id) — UO.GetY(Integer)

Paramètres: id (Any/Integer/String)

Résultat: int / Integer.

Pendant un appel:

Code interne de l’implémentation ; ce n’est pas un script autonome.

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

UO.GetY(id) — UO.GetY(String)

Paramètres: id (Any/Integer/String)

Résultat: int / Integer.

Pendant un appel:

Code interne de l’implémentation ; ce n’est pas un script autonome.

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

Clone this wiki locally