FR UO Topic mobiles - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

Personnages et créatures

Accueil · C# · IDE · UO API · A–Z · Exemples · Langues

Personnages, NPC, monstres et familiers déjà connus du client. Serial définit une créature spécifique, body/type ses graphismes ; ce sont des significations différentes.

Sections

Sujet Commandes et explications
Players UO.GetMobiles · UO.FindMobile
NPC UO.IsNpc · UO.FindMobile
Monsters UO.FindType · UO.FindMobile
Pets UO.GetPetsCurrent · UO.GetPetsMax
Followers UO.GetFollowers · UO.GetFollowersMax
Name / Serial / Body UO.GetName · UO.GetSerial · UO.GetType
Coordonnées UO.GetX · UO.GetY · UO.GetZ
Distance UO.GetDistance
Notoriety UO.Notoriety
Status UO.GetStatus · UO.Alive · UO.Dead · UO.Hidden · UO.Poisoned · UO.Paralyzed
Rename UO.Rename

Toutes les commandes du thème

Joueurs / NPC / Monstres

UO.GetMobile · UO.GetMobiles · UO.IsNpc

Animaux / Followers

UO.Followers · UO.GetFollowers · UO.FollowersMax · UO.GetFollowersMax · UO.PetsCurrent · UO.GetPetsCurrent · UO.PetsMax · UO.GetPetsMax

Notoriety

UO.Notoriety · UO.GetNotoriety

Rename

UO.CanChangeName · UO.MobileCanBeRenamed · UO.Rename · UO.RenameMobile

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

Paramètres, résultat et tous les scénarios

var radius = 12;
var allyStatus = 2;
var anyBody = -1;
var maxHeight = 8;
dynamic nearestFirst = true;
dynamic includeMe = false;
dynamic livingOnly = true;
dynamic visibleOnly = true;
var allies = UO.GetMobiles(radius, allyStatus, anyBody, maxHeight, nearestFirst, includeMe, livingOnly, visibleOnly);
if (Truth(ArrayLength(allies) == 0))
{
    return null;
}
UO.AddObject("leader", allies[0]);
UO.Follow(allies[0], 2, false);

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;

UO.GetNotoriety

Paramètres, résultat et tous les scénarios

var value = UO.GetNotoriety();
UO.Print("GetNotoriety: " + Convert.ToString(value));

Référence complète des commandes


UO.CanChangeName

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

Signatures C#

int UO.CanChangeName(object? id);

Vérifie le signe connu du client concernant la capacité de renommer le mobile.

Paramètres

  • id — Obligatoire serial/ID d'un objet spécifique : int, chaîne hexadécimale ou alias self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse ou nom AddObject. Ce n'est pas graphic/type. Le nom non spécifié se résout en 0 ; la commande n'ouvre aucune nouvelle cible. L'argument est requis; pour vous-même, passez self.

Valeur de retour

int 1 — le mobile chargé a l'attribut IsRenamable. int 0 - l'attribut est manquant, l'objet n'est pas mobile, inconnu ou supprimé. Il s'agit de la dernière autorisation du serveur, par exemple pour un animal de compagnie. La commande ne renomme pas l'objet et ne garantit pas qu'une requête ultérieure sera acceptée par le serveur.

Le résultat de la commande est un indicateur numérique : 1 signifie une condition remplie, 0 signifie une condition non remplie. Après var result = command(...) vérifiez si (result != 0) ou if (result == 0). Enregistrez le résultat d'un appel : un appel répété peut effectuer à nouveau l'action ou lire l'état qui a déjà changé.

Comportement

  • Le modèle client local est lu ; Il n'y a aucune requête au serveur, pas d'attente ni de déplacement.
  • Le résultat fait référence au moment de la lecture. Après UO.Wait ou une autre action, l'objet et ses drapeaux peuvent changer.
  • Il s'agit de la dernière autorisation du serveur, par exemple pour un animal de compagnie. La commande ne renomme pas l'objet et ne garantit pas qu'une requête ultérieure sera acceptée par le serveur.

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.CanChangeName("self");
UO.Print("CanChangeName: " + Convert.ToString(result));

1. Vérifiez votre propre état - script direct

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

  • L'argument self sélectionne explicitement son caractère. état - 1/0 uniquement.
  • Il s'agit de la dernière autorisation du serveur, par exemple pour un animal de compagnie. La commande ne renomme pas l'objet et ne garantit pas qu'une requête ultérieure sera acceptée par le serveur.
var state = UO.CanChangeName("self");
if (Truth(state))
{
    UO.Print("Rename permission flag is present");
}
else
{
    UO.Print("Rename permission flag is absent");
}

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 le mobile sélectionné - fonction de script

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

  • IsNpc exclut le sujet et l'objet inconnu. target stocke un seul serial plutôt qu'une référence en direct à un lasttarget changeant.
  • Le résultat fait référence au champ IsRenamable. Les données ne sont mises à jour qu'une fois que le client a reçu l'état approprié.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.CanChangeName(target);
        UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    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. Comparez l'état avant et après la pause - classe de script

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

  • UO.Wait(500) — pause en millisecondes. Après cela, il est vérifié séparément que mobile existe toujours.
  • Deux photographies sont comparées. Des modifications intermédiaires peuvent être manquées, et il ne s'agit pas d'un abonnement continu aux événements 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 target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.CanChangeName(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.CanChangeName(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        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.CanChangeName(id) — UO.CanChangeName(Any)

Paramètres: id (Any)

Résultat: int / Integer.

Pendant un appel:

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

public int CanChangeName(InjectionValue id) => bridge.CanChangeName(GetObject(id));

UO.Followers

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

Signatures C#

int UO.Followers();

Aide à décider à l'avance si le personnage dispose de suffisamment d'espace pour la prochaine créature apprivoisée ou invoquée. Followers montre les emplacements de contrôle occupés, FollowersMax est leur limite totale. Il ne s'agit pas du nombre d'animaux à proximité ni de la commande de mouvement Follow. Lit le compteur de statut de votre personnage : emplacements de contrôle d'animaux occupés.

Paramètres

Il n'y a pas de paramètres.

Valeur de retour

int — emplacements de contrôle des animaux occupés, 0..255 dans le modèle client. 0 peut être une valeur réelle, aucune donnée ou un joueur manquant/détruit. Il s'agit de quantité, pas de bool, ID ou de type : 1 signifie une unité, pas de succès. La commande ne parcourt pas les objets et ne renvoie pas de tableau.

Comportement

  • Par exemple, 3 de 5 est occupé - l'emplacement 2 est libre. La valeur 4 peut signifier quatre créatures pour un emplacement, une pour quatre ou une autre combinaison. Pour une créature à 2, l'emplacement de contrôle « occupé < maximum » n'est pas suffisant : vous avez besoin de maximum - courant >= 2. Le coût d'une créature spécifique et la limite sont déterminés par le serveur ; ne remplacez pas la constante 5 par FollowersMax.
  • 0 ne prouve pas que l'animal est perdu, mort ou relâché : il peut être vide ou son statut n'a pas encore été mis à jour. Une augmentation du compteur n’est qu’un signe supplémentaire d’un changement de contrôle ; cela ne détermine pas quelle créature est apprivoisée. Vérifiez également les messages du serveur et de l'animal lui-même. Ces emplacements ne sont pas égaux aux places dans l’écurie.
  • La commande ne prend aucun argument. Utilisez les signatures exactes ci-dessus.
  • La lecture sur le fil de jeu prend Player.Followers si le joueur actuel existe et n'a pas été détruit ; sinon 0. L'équipement n'est pas trié, les bonus ne sont pas recalculés, le statut n'est pas demandé et il n'y a pas d'attente de mises à jour. Un fantôme présent n'est pas égal à un joueur détruit.
  • PetsCurrent/Followers signale les emplacements de contrôle occupés à partir de son statut type >= 3. Un animal peut occuper plusieurs emplacements ; Les règles relatives aux créatures invoquées et apprivoisées sont fixées par le serveur. Il ne s'agit pas du nombre d'animaux mobile visibles, ni de la liste des animaux ID, ni du nombre d'animaux à proximité.
  • CharacterStatus vérifie le corps requis avant la mise à jour. Weight est disponible dans son propre statut étendu, slots - de type 3, Luck - de type 4, serveur WeightMax - de type 5. Un package compact/ancien sans compteur optionnel quitte son cache précédent. Le nouveau Player repart de zéro ; l'appel ne prouve pas la réception d'un nouveau statut.
  • Ces fonctions enregistrent l’API. Elles ne sont pas exécutées à nouveau pour chaque appel de commande. C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
  • Chaque appel lit à nouveau les données locales. La variable stocke l'instantané ; les lectures individuelles peuvent recevoir différentes mises à jour du serveur. Un résultat non nul ne teste pas la connexion. Zéro peut être une valeur ou aucune donnée.

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.Followers();
UO.Print("Followers: " + Convert.ToString(result));

1. Calculer les emplacements disponibles avant de quitter - script direct

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

  • courant - occupé, maximum - limite, freeSlots - différence. Avec une limite inconnue/zéro ou des données incohérentes, l'exemple se termine sans affirmer que l'espace est libre. La commande lit uniquement le dernier statut, ne demande pas de nouvelle mise à jour.
var current = UO.Followers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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 la capacité avant d'apprivoiser les animaux - Fonction de script

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

  • Sélectionnez d'abord l'animal souhaité pour que son ID soit dans lasttarget. requiredSlots=2 - exemple de paramètre, remplacez-le par le coût réel de cette créature sur votre serveur. S'il n'y a pas assez d'espace, la cible n'est pas fixée et la compétence n'est pas appelée. Sinon, la file d'attente de la cible est préparée AVANT l'unique argument UseSkill("Animal Taming"). Lancer une tentative ne garantit pas le succès : la compétence, la portée, la capacité à apprivoiser et la réponse du serveur sont importantes.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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érification de réutilisation pour des créatures de coûts différents - classe de scénario

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

  • CanAddFollower est une aide utilisateur entièrement déclarée, pas une nouvelle commande UO. Il renvoie 1/true s'il y a une limite de cache suffisante, sinon 0/false. Le paramètre extraSlots est le coût de la créature AJOUTÉE, pas son type/ID. 2 - exemple ; La fonction n’apprivoise ni n’invoque. Le contrôle doit être répété immédiatement avant l'action.
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()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.Followers();
        var maximum = UO.PetsMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

    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.Followers() — UO.Followers()

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

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


UO.FollowersMax

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

Signatures C#

int UO.FollowersMax();

Aide à décider à l'avance si le personnage dispose de suffisamment d'espace pour la prochaine créature apprivoisée ou invoquée. Followers montre les emplacements de contrôle occupés, FollowersMax est leur limite totale. Il ne s'agit pas du nombre d'animaux à proximité ni de la commande de mouvement Follow. Lit le compteur de statut de votre personnage : emplacements maximum de contrôle des animaux de compagnie.

Paramètres

Il n'y a pas de paramètres.

Valeur de retour

int — nombre maximum d'emplacements de contrôle d'animaux de compagnie, 0..255 dans le modèle client. 0 peut être une valeur réelle, aucune donnée ou un joueur manquant/détruit. Il s'agit de quantité, pas de bool, ID ou de type : 1 signifie une unité, pas de succès. La commande ne parcourt pas les objets et ne renvoie pas de tableau.

Comportement

  • Par exemple, 3 de 5 est occupé - l'emplacement 2 est libre. La valeur 4 peut signifier quatre créatures pour un emplacement, une pour quatre ou une autre combinaison. Pour une créature à 2, l'emplacement de contrôle « occupé < maximum » n'est pas suffisant : vous avez besoin de maximum - courant >= 2. Le coût d'une créature spécifique et la limite sont déterminés par le serveur ; ne remplacez pas la constante 5 par FollowersMax.
  • 0 ne prouve pas que l'animal est perdu, mort ou relâché : il peut être vide ou son statut n'a pas encore été mis à jour. Une augmentation du compteur n’est qu’un signe supplémentaire d’un changement de contrôle ; cela ne détermine pas quelle créature est apprivoisée. Vérifiez également les messages du serveur et de l'animal lui-même. Ces emplacements ne sont pas égaux aux places dans l’écurie.
  • La commande ne prend aucun argument. Utilisez les signatures exactes ci-dessus.
  • La lecture sur le fil de jeu prend Player.FollowersMax si le joueur actuel existe et n'a pas été détruit ; sinon 0. L'équipement n'est pas trié, les bonus ne sont pas recalculés, le statut n'est pas demandé et il n'y a pas d'attente de mises à jour. Un fantôme présent n'est pas égal à un joueur détruit.
  • PetsMax/FollowersMax indique la limite totale d'emplacements autorisée par le serveur à partir du type d'état >= 3, pas les emplacements libres. Il peut y avoir plus d'emplacements occupés que la limite. Considérez la capacité libre comme le courant maximum, en remplaçant le résultat négatif par 0. L’équipe ne lâche rien, n’apprivoise pas, n’invoque rien.
  • CharacterStatus vérifie le corps requis avant la mise à jour. Weight est disponible dans son propre statut étendu, slots - de type 3, Luck - de type 4, serveur WeightMax - de type 5. Un package compact/ancien sans compteur optionnel quitte son cache précédent. Le nouveau Player repart de zéro ; l'appel ne prouve pas la réception d'un nouveau statut.
  • Ces fonctions enregistrent l’API. Elles ne sont pas exécutées à nouveau pour chaque appel de commande. C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
  • Chaque appel lit à nouveau les données locales. La variable stocke l'instantané ; les lectures individuelles peuvent recevoir différentes mises à jour du serveur. Un résultat non nul ne teste pas la connexion. Zéro peut être une valeur ou aucune donnée.

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.FollowersMax();
UO.Print("FollowersMax: " + Convert.ToString(result));

1. Calculer les emplacements disponibles avant de quitter - script direct

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

  • courant - occupé, maximum - limite, freeSlots - différence. Avec une limite inconnue/zéro ou des données incohérentes, l'exemple se termine sans affirmer que l'espace est libre. La commande lit uniquement le dernier statut, ne demande pas de nouvelle mise à jour.
var current = UO.Followers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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 la capacité avant d'apprivoiser les animaux - Fonction de script

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

  • Sélectionnez d'abord l'animal souhaité pour que son ID soit dans lasttarget. requiredSlots=2 - exemple de paramètre, remplacez-le par le coût réel de cette créature sur votre serveur. S'il n'y a pas assez d'espace, la cible n'est pas fixée et la compétence n'est pas appelée. Sinon, la file d'attente de la cible est préparée AVANT l'unique argument UseSkill("Animal Taming"). Lancer une tentative ne garantit pas le succès : la compétence, la portée, la capacité à apprivoiser et la réponse du serveur sont importantes.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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érification de réutilisation pour des créatures de coûts différents - classe de scénario

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

  • CanAddFollower est une aide utilisateur entièrement déclarée, pas une nouvelle commande UO. Il renvoie 1/true s'il y a une limite de cache suffisante, sinon 0/false. Le paramètre extraSlots est le coût de la créature AJOUTÉE, pas son type/ID. 2 - exemple ; La fonction n’apprivoise ni n’invoque. Le contrôle doit être répété immédiatement avant l'action.
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()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.PetsCurrent();
        var maximum = UO.FollowersMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

    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.FollowersMax() — UO.FollowersMax()

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

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


UO.GetFollowers

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

Signatures C#

int UO.GetFollowers();

Aide à décider à l'avance si le personnage dispose de suffisamment d'espace pour la prochaine créature apprivoisée ou invoquée. Followers montre les emplacements de contrôle occupés, FollowersMax est leur limite totale. Il ne s'agit pas du nombre d'animaux à proximité ni de la commande de mouvement Follow. Lit le compteur de statut de votre personnage : emplacements de contrôle d'animaux occupés.

Paramètres

Il n'y a pas de paramètres.

Valeur de retour

int — emplacements de contrôle des animaux occupés, 0..255 dans le modèle client. 0 peut être une valeur réelle, aucune donnée ou un joueur manquant/détruit. Il s'agit de quantité, pas de bool, ID ou de type : 1 signifie une unité, pas de succès. La commande ne parcourt pas les objets et ne renvoie pas de tableau.

Comportement

  • Par exemple, 3 de 5 est occupé - l'emplacement 2 est libre. La valeur 4 peut signifier quatre créatures pour un emplacement, une pour quatre ou une autre combinaison. Pour une créature à 2, l'emplacement de contrôle « occupé < maximum » n'est pas suffisant : vous avez besoin de maximum - courant >= 2. Le coût d'une créature spécifique et la limite sont déterminés par le serveur ; ne remplacez pas la constante 5 par FollowersMax.
  • 0 ne prouve pas que l'animal est perdu, mort ou relâché : il peut être vide ou son statut n'a pas encore été mis à jour. Une augmentation du compteur n’est qu’un signe supplémentaire d’un changement de contrôle ; cela ne détermine pas quelle créature est apprivoisée. Vérifiez également les messages du serveur et de l'animal lui-même. Ces emplacements ne sont pas égaux aux places dans l’écurie.
  • La commande ne prend aucun argument. Utilisez les signatures exactes ci-dessus.
  • La lecture sur le fil de jeu prend Player.Followers si le joueur actuel existe et n'a pas été détruit ; sinon 0. L'équipement n'est pas trié, les bonus ne sont pas recalculés, le statut n'est pas demandé et il n'y a pas d'attente de mises à jour. Un fantôme présent n'est pas égal à un joueur détruit.
  • PetsCurrent/Followers signale les emplacements de contrôle occupés à partir de son statut type >= 3. Un animal peut occuper plusieurs emplacements ; Les règles relatives aux créatures invoquées et apprivoisées sont fixées par le serveur. Il ne s'agit pas du nombre d'animaux mobile visibles, ni de la liste des animaux ID, ni du nombre d'animaux à proximité.
  • CharacterStatus vérifie le corps requis avant la mise à jour. Weight est disponible dans son propre statut étendu, slots - de type 3, Luck - de type 4, serveur WeightMax - de type 5. Un package compact/ancien sans compteur optionnel quitte son cache précédent. Le nouveau Player repart de zéro ; l'appel ne prouve pas la réception d'un nouveau statut.
  • Ces fonctions enregistrent l’API. Elles ne sont pas exécutées à nouveau pour chaque appel de commande. C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
  • Chaque appel lit à nouveau les données locales. La variable stocke l'instantané ; les lectures individuelles peuvent recevoir différentes mises à jour du serveur. Un résultat non nul ne teste pas la connexion. Zéro peut être une valeur ou aucune donnée.

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.GetFollowers();
UO.Print("GetFollowers: " + Convert.ToString(result));

1. Calculer les emplacements disponibles avant de quitter - script direct

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

  • courant - occupé, maximum - limite, freeSlots - différence. Avec une limite inconnue/zéro ou des données incohérentes, l'exemple se termine sans affirmer que l'espace est libre. La commande lit uniquement le dernier statut, ne demande pas de nouvelle mise à jour.
var current = UO.GetFollowers();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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 la capacité avant d'apprivoiser les animaux - Fonction de script

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

  • Sélectionnez d'abord l'animal souhaité pour que son ID soit dans lasttarget. requiredSlots=2 - exemple de paramètre, remplacez-le par le coût réel de cette créature sur votre serveur. S'il n'y a pas assez d'espace, la cible n'est pas fixée et la compétence n'est pas appelée. Sinon, la file d'attente de la cible est préparée AVANT l'unique argument UseSkill("Animal Taming"). Lancer une tentative ne garantit pas le succès : la compétence, la portée, la capacité à apprivoiser et la réponse du serveur sont importantes.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.GetFollowers();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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érification de réutilisation pour des créatures de coûts différents - classe de scénario

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

  • CanAddFollower est une aide utilisateur entièrement déclarée, pas une nouvelle commande UO. Il renvoie 1/true s'il y a une limite de cache suffisante, sinon 0/false. Le paramètre extraSlots est le coût de la créature AJOUTÉE, pas son type/ID. 2 - exemple ; La fonction n’apprivoise ni n’invoque. Le contrôle doit être répété immédiatement avant l'action.
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()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.GetFollowers();
        var maximum = UO.PetsMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

    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.GetFollowers() — UO.GetFollowers()

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

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


UO.GetFollowersMax

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

Signatures C#

int UO.GetFollowersMax();

Aide à décider à l'avance si le personnage dispose de suffisamment d'espace pour la prochaine créature apprivoisée ou invoquée. Followers montre les emplacements de contrôle occupés, FollowersMax est leur limite totale. Il ne s'agit pas du nombre d'animaux à proximité ni de la commande de mouvement Follow. Lit le compteur de statut de votre personnage : emplacements maximum de contrôle des animaux de compagnie.

Paramètres

Il n'y a pas de paramètres.

Valeur de retour

int — nombre maximum d'emplacements de contrôle d'animaux de compagnie, 0..255 dans le modèle client. 0 peut être une valeur réelle, aucune donnée ou un joueur manquant/détruit. Il s'agit de quantité, pas de bool, ID ou de type : 1 signifie une unité, pas de succès. La commande ne parcourt pas les objets et ne renvoie pas de tableau.

Comportement

  • Par exemple, 3 de 5 est occupé - l'emplacement 2 est libre. La valeur 4 peut signifier quatre créatures pour un emplacement, une pour quatre ou une autre combinaison. Pour une créature à 2, l'emplacement de contrôle « occupé < maximum » n'est pas suffisant : vous avez besoin de maximum - courant >= 2. Le coût d'une créature spécifique et la limite sont déterminés par le serveur ; ne remplacez pas la constante 5 par FollowersMax.
  • 0 ne prouve pas que l'animal est perdu, mort ou relâché : il peut être vide ou son statut n'a pas encore été mis à jour. Une augmentation du compteur n’est qu’un signe supplémentaire d’un changement de contrôle ; cela ne détermine pas quelle créature est apprivoisée. Vérifiez également les messages du serveur et de l'animal lui-même. Ces emplacements ne sont pas égaux aux places dans l’écurie.
  • La commande ne prend aucun argument. Utilisez les signatures exactes ci-dessus.
  • La lecture sur le fil de jeu prend Player.FollowersMax si le joueur actuel existe et n'a pas été détruit ; sinon 0. L'équipement n'est pas trié, les bonus ne sont pas recalculés, le statut n'est pas demandé et il n'y a pas d'attente de mises à jour. Un fantôme présent n'est pas égal à un joueur détruit.
  • PetsMax/FollowersMax indique la limite totale d'emplacements autorisée par le serveur à partir du type d'état >= 3, pas les emplacements libres. Il peut y avoir plus d'emplacements occupés que la limite. Considérez la capacité libre comme le courant maximum, en remplaçant le résultat négatif par 0. L’équipe ne lâche rien, n’apprivoise pas, n’invoque rien.
  • CharacterStatus vérifie le corps requis avant la mise à jour. Weight est disponible dans son propre statut étendu, slots - de type 3, Luck - de type 4, serveur WeightMax - de type 5. Un package compact/ancien sans compteur optionnel quitte son cache précédent. Le nouveau Player repart de zéro ; l'appel ne prouve pas la réception d'un nouveau statut.
  • Ces fonctions enregistrent l’API. Elles ne sont pas exécutées à nouveau pour chaque appel de commande. C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
  • Chaque appel lit à nouveau les données locales. La variable stocke l'instantané ; les lectures individuelles peuvent recevoir différentes mises à jour du serveur. Un résultat non nul ne teste pas la connexion. Zéro peut être une valeur ou aucune donnée.

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.GetFollowersMax();
UO.Print("GetFollowersMax: " + Convert.ToString(result));

1. Calculer les emplacements disponibles avant de quitter - script direct

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

  • courant - occupé, maximum - limite, freeSlots - différence. Avec une limite inconnue/zéro ou des données incohérentes, l'exemple se termine sans affirmer que l'espace est libre. La commande lit uniquement le dernier statut, ne demande pas de nouvelle mise à jour.
var current = UO.Followers();
var maximum = UO.GetFollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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 la capacité avant d'apprivoiser les animaux - Fonction de script

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

  • Sélectionnez d'abord l'animal souhaité pour que son ID soit dans lasttarget. requiredSlots=2 - exemple de paramètre, remplacez-le par le coût réel de cette créature sur votre serveur. S'il n'y a pas assez d'espace, la cible n'est pas fixée et la compétence n'est pas appelée. Sinon, la file d'attente de la cible est préparée AVANT l'unique argument UseSkill("Animal Taming"). Lancer une tentative ne garantit pas le succès : la compétence, la portée, la capacité à apprivoiser et la réponse du serveur sont importantes.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.GetFollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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érification de réutilisation pour des créatures de coûts différents - classe de scénario

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

  • CanAddFollower est une aide utilisateur entièrement déclarée, pas une nouvelle commande UO. Il renvoie 1/true s'il y a une limite de cache suffisante, sinon 0/false. Le paramètre extraSlots est le coût de la créature AJOUTÉE, pas son type/ID. 2 - exemple ; La fonction n’apprivoise ni n’invoque. Le contrôle doit être répété immédiatement avant l'action.
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()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.PetsCurrent();
        var maximum = UO.GetFollowersMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

    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.GetFollowersMax() — UO.GetFollowersMax()

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

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


UO.GetMobile

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

Signatures C#

dynamic UO.GetMobile(object? id);

Collecte un enregistrement compact des propriétés une par une ID.

Paramètres

  • id — Série/ID d'un objet spécifique : int, chaîne décimale/hexadécimale ou alias défini self, backpack, lasttarget, lastobject ou nom AddObject. Ce n'est pas graphic/type.

Valeur de retour

Tableau de 9 champs : [0] int serial, [1] string nom, [2] int X, [3] int Y, [4] int Z, [5] int HP, [6] int MaxHP, [7] int notoriété, [8] int direction 0..7. Pour l'inconnu ID le tableau a également des champs 9 : le ID passé est stocké, le nom est vide, les propriétés numériques indisponibles sont 0. Ce n'est pas un enregistrement Pascal complet de TMobile.

Comportement

  • Les données déjà téléchargées par le client sont lues. La commande n'ouvre pas le conteneur, ne déplace pas les éléments et ne télécharge pas les objets depuis l'ensemble du serveur.
  • Array - tableau avec des indices commençant à 0. Enregistrez-le dans var, vérifiez ArrayLength avant d'y accéder. Des éléments peuvent disparaître du monde après avoir pris un instantané : vérifiez Exists(serial) avant d'agir.
  • Avoir neuf champs ne confirme pas l'existence du personnage ; utilisez Exists. La commande elle-même ne vérifie pas que ID appartient à Mobile. Le nom/les coordonnées de l'élément et les propriétés de zéro caractère peuvent être renvoyées.
  • HP/MaxHP d'un autre caractère dépend de l'échelle envoyée par le serveur. Z est la hauteur, pas la couche d'équipement.

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.GetMobile("self");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Lisez le nom et la santé de votre personnage - script direct

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

  • ID=self. [1] est le nom, [5]/[6] sont le HP actuel et maximum, pas Mana.
  • Le tableau a corrigé neuf champs. Un nom vide et 0/0 sont possibles avant d'entrer dans le monde.
var mobile = UO.GetMobile("self");
UO.Print(mobile[1] + ": " + Convert.ToString(mobile[5]) + "/" + Convert.ToString(mobile[6]));

2. Lire les coordonnées du personnage sélectionné - fonction script

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

  • lasttarget doit pointer vers le personnage. [2]/[3]/[4] - X/Y/Z du monde.
  • Tout d'abord, la présence de l'objet est vérifiée. Si la cible est un objet dans le sac, les coordonnées font référence à son gump.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(target)))
    {
        var mobile = UO.GetMobile(target);
        UO.Print(Convert.ToString(mobile[2]) + "," + Convert.ToString(mobile[3]) + "," + Convert.ToString(mobile[4]));
    }

    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'état de la classe de script Mobile sélectionnée

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

  • [7] - valeur de notoriété, [8] - direction 0..7. Aucun champ n'est un type.
  • La commande lit les données connues, ne dirige pas le personnage et ne change pas de mode de combat.
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 target = UO.GetSerial("lasttarget");
        if (Truth(UO.Exists(target)))
        {
            var mobile = UO.GetMobile(target);
            UO.Print("Notoriety: " + Convert.ToString(mobile[7]));
            UO.Print("Direction: " + Convert.ToString(mobile[8]));
        }

        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.GetMobile(id) — UO.GetMobile(Any)

Paramètres: id (Any)

Résultat: dynamic / Any.

Pendant un appel:

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

case "getmobile":

                {

                    int id = Arg(0);

                    return new InjectionValue(new[]

                    {

                        new InjectionValue(id), new InjectionValue(bridge.GetName(id)), new InjectionValue(bridge.GetX(id)),

                        new InjectionValue(bridge.GetY(id)), new InjectionValue(bridge.GetZ(id)), new InjectionValue(bridge.GetHP(id)),

                        new InjectionValue(bridge.GetMaxHP(id)), new InjectionValue(bridge.GetNotoriety(id)), new InjectionValue(bridge.GetDir(id))

                    });

                }

UO.GetMobiles

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

Signatures C#

dynamic UO.GetMobiles();
dynamic UO.GetMobiles(object? distance);
dynamic UO.GetMobiles(object? distance, object? notoriety);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf, object? aliveOnly);
dynamic UO.GetMobiles(object? distance, object? notoriety, object? body, object? maxZ, object? nearest, object? includeSelf, object? aliveOnly, object? visibleOnly);

Obtient un tableau ID de caractères chargés correspondants/NPC. Il est nécessaire lorsque le script doit vérifier plusieurs cibles, sélectionner la sienne, calculer l'environnement ou ajouter sa propre condition avant une action.

Paramètres

  • distance — Rayon horizontal en cellules incluses : 5 permet la distance 0..5. La distance est max(abs(dx),abs(dy)), donc la diagonale adjacente est également 1. Par défaut ou si le nombre est négatif, c'est UO.FindDistance() qui est utilisé plutôt qu'une recherche illimitée. 0 laisse la même cellule X/Y. Pas la longueur du parcours ; les obstacles et les sols ne sont pas vérifiés par ce paramètre.
  • notoriety — Statut de la relation avec le personnage reçu du serveur : 0 — inconnu, 1 — Innocent, 2 — Allié, 3 — Gris, 4 — Criminel, 5 — Ennemi, 6 — Meurtrier, 7 - Invulnérable. Le nombre signifie un statut ; "5|6" ou un tableau de nombres - l'un des éléments ci-dessus. Ce n'est pas la couleur des vêtements ou de la classe. Un nombre négatif (généralement -1), 0xFFFF, "any", une chaîne vide ou un tableau vide désactive séparément ce filtre. Une chaîne invalide sans nombres valides ne trouve personne. L'ordre des statuts ne définit pas la priorité. Le filtre 5 sélectionne l'ennemi plutôt que de sélectionner automatiquement n'importe quel NPC/monstre ; les valeurs réelles dépendent du serveur.
  • body - Graphique du corps du personnage/NPC, pas ID d'un personnage spécifique et non type de l'armure portée. Un nombre, une chaîne hexadécimale, la chaîne "0x0190|0x0191" ou un tableau de nombres. 0x0190 (400) - mâle humain ; 0x0191 (401) - femme humaine. Le masque unit les deux corps. La liste n'inclut pas automatiquement d'autres races, fantômes ou transformations ; tableau des types de corps graphiques standard. Un nombre négatif (-1 par défaut), 0xFFFF, "any", une chaîne vide ou un tableau vide seul - n'importe quel corps. Un texte inconnu sans numéro valide produit un résultat vide.
  • maxZ — Abs maximum (Z de la cible - Z du propre personnage), inclus, en unités Z du monde. Il ne s'agit pas du nombre d'étages ou de cellules X/Y. maxZ=4 avec le joueur Z 10 autorise la cible Z 6..14 ; 0 nécessite exactement la même hauteur. Par défaut/pour un nombre négatif, UO.FindVertical() est pris. Dans les escaliers, un Z égal peut éliminer la cible souhaitée. Même une petite différence de Z ne prouve pas l’accessibilité du sol.
  • nearest - true/1 trie le tableau de près à loin, puis par serial s'il est égal. false/0 préserve la commande client par défaut. Il ne s'agit pas d'un rayon supplémentaire ou d'une sélection d'un objet.
  • includeSelf - true/1 vous permet d'activer self si tous les autres filtres et Ignore le permettent. false/0 exclut self par défaut. L'inclusion ne garantit pas la présence de self dans le résultat.
  • aliveOnly - true/1 exclut les mobiles avec IsDead != 0 ; false/0 n'ajoute pas cette condition par défaut. Ne pas comparer HP à zéro, ne pas rechercher d'objets cadavres et ne pas garantir que la cible restera en vie après avoir été invoquée.
  • visibleOnly - true/1 nécessite IsVisible=1 selon l'état actuel de ClassicUO ; false/0 n'ajoute pas de condition par défaut. Il s'agit de la visibilité de l'objet chargé pour le client, et non d'une vérification du mur/de la ligne de vue. Pour la vérification géométrique, il existe un UO.CheckLOS séparé avec des coordonnées ; le serveur peut toujours rejeter l'action.

Valeur de retour

Tableau - serial mobiles. Un tableau vide signifie qu’il n’y a aucune correspondance ; vérifiez ArrayLength avant les cibles[0]. Pas body/type, pas total HP, pas 1/0. La forme sans argument s'applique toujours FindDistance/FindVertical/Ignore et exclut self.

Comportement

  • Recherche locale : uniquement les mobiles déjà téléchargés. Ignore est pris en compte ; self est exclu, à l'exception du includeSelf=true explicite dans les commandes qui le prennent en charge. Les conteneurs et les objets ne sont pas mobiles.
  • Les conditions s'appliquent ensemble (AND). Les alternatives valides au sein de body/notoriété sont combinées via OR. La recherche ne change pas FindItem, FindCount et GetFoundItems.
  • Dans body/notoriété, le masque avec les numéros valides utilise ceux-ci : "any|5" le limite toujours à 5. Les éléments vides/invalides à côté des nombres valides sont ignorés. Sans restriction, passez -1 séparément. Ne portez pas cette règle à classMask : le nom de classe inconnu rejette la liste entière.
  • Les équipes n'ouvrent pas de zone du monde, ne courent pas vers le but et ne vérifient pas la praticabilité du parcours. Entre la sélection et le traitement par le serveur, l'état du monde peut changer.
  • La transmission de true et 1 est équivalente pour les drapeaux, false et 0 également. D'autres nombres non nuls sont également convertis en true, mais 8/9 ne sont pas des modes séparés ; utilisez clair true/false.
  • Les arguments de position 0..8 sont pris en charge. classMask et la couleur ne sont pas présents dans cette commande ; ne reportez pas ici l'ordre des arguments AttackNearest.
  • Tableau - instantané ID. La cible peut disparaître plus tard ; revérifiez Exists s'il y a eu une attente entre la recherche et l'action. Rien n’attaque tout seul.

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.GetMobiles(5, 2, -1, 8, true, false, true, true);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Sélectionnez l'allié le plus proche et activez le suivi - script direct

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

  • nearestFirst=true fait des alliés[0] l'allié le plus proche. Follow inclut la marche en arrière-plan ; arrête UO.Follow(0). Le nom/la classe de l'allié n'est pas déterminé par cette commande.
var radius = 12;
var allyStatus = 2;
var anyBody = -1;
var maxHeight = 8;
dynamic nearestFirst = true;
dynamic includeMe = false;
dynamic livingOnly = true;
dynamic visibleOnly = true;
var allies = UO.GetMobiles(radius, allyStatus, anyBody, maxHeight, nearestFirst, includeMe, livingOnly, visibleOnly);
if (Truth(ArrayLength(allies) == 0))
{
    return null;
}
UO.AddObject("leader", allies[0]);
UO.Follow(allies[0], 2, false);

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. Comptez les cibles dangereuses et sélectionnez une action en fonction de leur nombre - fonction script

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

  • Ici le plus proche=false convient : le compteur est important. ArrayLength est le nombre de mobiles, pas le nombre d'éléments dans la pile. Alarm imprime un avis dans le journal.
return  RunScenario();
 object? RunScenario()
{
    var enemies = UO.GetMobiles(5, "5|6", -1, 4, false, false, true, true);
    var count = ArrayLength(enemies);
    if (Truth(count == 1))
    {
        UO.Attack(enemies[0]);
    }
    else if (Truth(count > 1))
    {
        UO.Alarm();
    }

    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. Liste sur la même cellule et hauteur, y compris elle-même - classe de script

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

  • distance=0 - identique X/Y, maxZ=0 - identique Z. body est limité à deux graphic. includeSelf=true autorise self, mais il doit toujours correspondre à body et aliveOnly. L'exemple rapporte d'autres caractères sur le même carré.
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 sameCell = UO.GetMobiles(0, -1, "0x0190|0x0191", 0, false, true, true, false);
        var i = 0;
        var others = 0;
        while (Truth(i < ArrayLength(sameCell)))
        {
            if (Truth(sameCell[i] != UO.GetSerial("self")))
            {
                others += 1;
            }

            i += 1;
        }

        if (Truth(others > 0))
        {
            UO.Alarm();
        }

        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.GetMobiles() — UO.GetMobiles()

Paramètres: Aucun paramètre.

Résultat: dynamic / Any.

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 => CompactGetMobiles(values)

UO.GetMobiles(distance) — UO.GetMobiles(Any)

Paramètres: distance (Any)

Résultat: dynamic / Any.

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 => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety) — UO.GetMobiles(Any,Any)

Paramètres: distance (Any), notoriety (Any)

Résultat: dynamic / Any.

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 => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body) — UO.GetMobiles(Any,Any,Any)

Paramètres: distance (Any), notoriety (Any), body (Any)

Résultat: dynamic / Any.

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 => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ) — UO.GetMobiles(Any,Any,Any,Any)

Paramètres: distance (Any), notoriety (Any), body (Any), maxZ (Any)

Résultat: dynamic / Any.

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 => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ, nearest) — UO.GetMobiles(Any,Any,Any,Any,Any)

Paramètres: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any)

Résultat: dynamic / Any.

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 => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf) — UO.GetMobiles(Any,Any,Any,Any,Any,Any)

Paramètres: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any), includeSelf (Any)

Résultat: dynamic / Any.

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 => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf, aliveOnly) — UO.GetMobiles(Any,Any,Any,Any,Any,Any,Any)

Paramètres: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any), includeSelf (Any), aliveOnly (Any)

Résultat: dynamic / Any.

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 => CompactGetMobiles(values)

UO.GetMobiles(distance, notoriety, body, maxZ, nearest, includeSelf, aliveOnly, visibleOnly) — UO.GetMobiles(Any,Any,Any,Any,Any,Any,Any,Any)

Paramètres: distance (Any), notoriety (Any), body (Any), maxZ (Any), nearest (Any), includeSelf (Any), aliveOnly (Any), visibleOnly (Any)

Résultat: dynamic / Any.

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 => CompactGetMobiles(values)

UO.GetNotoriety

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

Signatures C#

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

Lit la réputation du personnage à partir du modèle client.

Paramètres

  • id — Objet facultatif uniquement dans les formes à paramètre unique spécifiées : serial nombre/chaîne hexadécimale, "self", "lasttarget" ou nom AddObject. Ce n'est pas graphic/type. Sans argument, son propre caractère est lu. Avant de lire un autre objet, vérifiez UO.Exists ; un nom inconnu n'ouvre pas la portée.

Valeur de retour

int — 0=inconnu, 1=innocent, 2=allié, 3=gris, 4=criminel, 5=ennemi, 6=meurtrier, 7=invulnérable. Il s'agit d'un code de statut, pas de hue, de karma ou de renommée. Inconnu mobile donne 0.

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.GetNotoriety();
UO.Print("GetNotoriety: " + 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. La réputation du personnage est stockée en valeur.
  • Convert.ToString convertit le nombre à sortir et ne change pas la signification du résultat.
var value = UO.GetNotoriety();
UO.Print("GetNotoriety: " + 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. La réputation du personnage est utilisée dans le calcul ou la condition affiché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.GetNotoriety();
    if (Truth(value == 3) || Truth(value == 4))
    {
        UO.Print("Gray or criminal notoriety");
    }

    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é de l'objet sélectionné - classe de script

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

  • L'argument unique sélectionne l'objet lasttarget ; son serial doit être connu du client. Graphic/type n'est pas transféré ici.
  • Les données d'un autre objet peuvent être inconnues même si Exists est positif. Pour les coordonnées d'un article dans un sac, la position du conteneur est obtenue et non le point mondial.
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()
    {
        if (Truth(UO.Exists("lasttarget")))
        {
            var targetValue = UO.GetNotoriety("lasttarget");
            UO.Print("Selected value: " + Convert.ToString(targetValue));
        }
        else
        {
            UO.Print("Target is not loaded");
        }

        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.GetNotoriety() — UO.GetNotoriety()

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.GetNotoriety(bridge.Self)

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

UO.GetNotoriety(id) — UO.GetNotoriety(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 "getnotoriety": return new InjectionValue(bridge.GetNotoriety(Arg(0)));

UO.GetNotoriety(id) — UO.GetNotoriety(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 GetNotoriety(int id) => bridge.GetNotoriety(id);

UO.GetNotoriety(id) — UO.GetNotoriety(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 GetNotoriety(string id) => GetNotoriety(GetObject(id));

UO.GetPetsCurrent

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

Signatures C#

int UO.GetPetsCurrent();

Aide à décider à l'avance si le personnage dispose de suffisamment d'espace pour la prochaine créature apprivoisée ou invoquée. Followers montre les emplacements de contrôle occupés, FollowersMax est leur limite totale. Il ne s'agit pas du nombre d'animaux à proximité ni de la commande de mouvement Follow. Lit le compteur de statut de votre personnage : emplacements de contrôle d'animaux occupés.

Paramètres

Il n'y a pas de paramètres.

Valeur de retour

int — emplacements de contrôle des animaux occupés, 0..255 dans le modèle client. 0 peut être une valeur réelle, aucune donnée ou un joueur manquant/détruit. Il s'agit de quantité, pas de bool, ID ou de type : 1 signifie une unité, pas de succès. La commande ne parcourt pas les objets et ne renvoie pas de tableau.

Comportement

  • Par exemple, 3 de 5 est occupé - l'emplacement 2 est libre. La valeur 4 peut signifier quatre créatures pour un emplacement, une pour quatre ou une autre combinaison. Pour une créature à 2, l'emplacement de contrôle « occupé < maximum » n'est pas suffisant : vous avez besoin de maximum - courant >= 2. Le coût d'une créature spécifique et la limite sont déterminés par le serveur ; ne remplacez pas la constante 5 par FollowersMax.
  • 0 ne prouve pas que l'animal est perdu, mort ou relâché : il peut être vide ou son statut n'a pas encore été mis à jour. Une augmentation du compteur n’est qu’un signe supplémentaire d’un changement de contrôle ; cela ne détermine pas quelle créature est apprivoisée. Vérifiez également les messages du serveur et de l'animal lui-même. Ces emplacements ne sont pas égaux aux places dans l’écurie.
  • La commande ne prend aucun argument. Utilisez les signatures exactes ci-dessus.
  • La lecture sur le fil de jeu prend Player.Followers si le joueur actuel existe et n'a pas été détruit ; sinon 0. L'équipement n'est pas trié, les bonus ne sont pas recalculés, le statut n'est pas demandé et il n'y a pas d'attente de mises à jour. Un fantôme présent n'est pas égal à un joueur détruit.
  • PetsCurrent/Followers signale les emplacements de contrôle occupés à partir de son statut type >= 3. Un animal peut occuper plusieurs emplacements ; Les règles relatives aux créatures invoquées et apprivoisées sont fixées par le serveur. Il ne s'agit pas du nombre d'animaux mobile visibles, ni de la liste des animaux ID, ni du nombre d'animaux à proximité.
  • CharacterStatus vérifie le corps requis avant la mise à jour. Weight est disponible dans son propre statut étendu, slots - de type 3, Luck - de type 4, serveur WeightMax - de type 5. Un package compact/ancien sans compteur optionnel quitte son cache précédent. Le nouveau Player repart de zéro ; l'appel ne prouve pas la réception d'un nouveau statut.
  • Ces fonctions enregistrent l’API. Elles ne sont pas exécutées à nouveau pour chaque appel de commande. C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
  • Chaque appel lit à nouveau les données locales. La variable stocke l'instantané ; les lectures individuelles peuvent recevoir différentes mises à jour du serveur. Un résultat non nul ne teste pas la connexion. Zéro peut être une valeur ou aucune donnée.

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.GetPetsCurrent();
UO.Print("GetPetsCurrent: " + Convert.ToString(result));

1. Calculer les emplacements disponibles avant de quitter - script direct

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

  • courant - occupé, maximum - limite, freeSlots - différence. Avec une limite inconnue/zéro ou des données incohérentes, l'exemple se termine sans affirmer que l'espace est libre. La commande lit uniquement le dernier statut, ne demande pas de nouvelle mise à jour.
var current = UO.GetPetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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 la capacité avant d'apprivoiser les animaux - Fonction de script

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

  • Sélectionnez d'abord l'animal souhaité pour que son ID soit dans lasttarget. requiredSlots=2 - exemple de paramètre, remplacez-le par le coût réel de cette créature sur votre serveur. S'il n'y a pas assez d'espace, la cible n'est pas fixée et la compétence n'est pas appelée. Sinon, la file d'attente de la cible est préparée AVANT l'unique argument UseSkill("Animal Taming"). Lancer une tentative ne garantit pas le succès : la compétence, la portée, la capacité à apprivoiser et la réponse du serveur sont importantes.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.GetPetsCurrent();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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érification de réutilisation pour des créatures de coûts différents - classe de scénario

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

  • CanAddFollower est une aide utilisateur entièrement déclarée, pas une nouvelle commande UO. Il renvoie 1/true s'il y a une limite de cache suffisante, sinon 0/false. Le paramètre extraSlots est le coût de la créature AJOUTÉE, pas son type/ID. 2 - exemple ; La fonction n’apprivoise ni n’invoque. Le contrôle doit être répété immédiatement avant l'action.
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()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.GetPetsCurrent();
        var maximum = UO.PetsMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

    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.GetPetsCurrent() — UO.GetPetsCurrent()

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

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


UO.GetPetsMax

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

Signatures C#

int UO.GetPetsMax();

Aide à décider à l'avance si le personnage dispose de suffisamment d'espace pour la prochaine créature apprivoisée ou invoquée. Followers montre les emplacements de contrôle occupés, FollowersMax est leur limite totale. Il ne s'agit pas du nombre d'animaux à proximité ni de la commande de mouvement Follow. Lit le compteur de statut de votre personnage : emplacements maximum de contrôle des animaux de compagnie.

Paramètres

Il n'y a pas de paramètres.

Valeur de retour

int — nombre maximum d'emplacements de contrôle d'animaux de compagnie, 0..255 dans le modèle client. 0 peut être une valeur réelle, aucune donnée ou un joueur manquant/détruit. Il s'agit de quantité, pas de bool, ID ou de type : 1 signifie une unité, pas de succès. La commande ne parcourt pas les objets et ne renvoie pas de tableau.

Comportement

  • Par exemple, 3 de 5 est occupé - l'emplacement 2 est libre. La valeur 4 peut signifier quatre créatures pour un emplacement, une pour quatre ou une autre combinaison. Pour une créature à 2, l'emplacement de contrôle « occupé < maximum » n'est pas suffisant : vous avez besoin de maximum - courant >= 2. Le coût d'une créature spécifique et la limite sont déterminés par le serveur ; ne remplacez pas la constante 5 par FollowersMax.
  • 0 ne prouve pas que l'animal est perdu, mort ou relâché : il peut être vide ou son statut n'a pas encore été mis à jour. Une augmentation du compteur n’est qu’un signe supplémentaire d’un changement de contrôle ; cela ne détermine pas quelle créature est apprivoisée. Vérifiez également les messages du serveur et de l'animal lui-même. Ces emplacements ne sont pas égaux aux places dans l’écurie.
  • La commande ne prend aucun argument. Utilisez les signatures exactes ci-dessus.
  • La lecture sur le fil de jeu prend Player.FollowersMax si le joueur actuel existe et n'a pas été détruit ; sinon 0. L'équipement n'est pas trié, les bonus ne sont pas recalculés, le statut n'est pas demandé et il n'y a pas d'attente de mises à jour. Un fantôme présent n'est pas égal à un joueur détruit.
  • PetsMax/FollowersMax indique la limite totale d'emplacements autorisée par le serveur à partir du type d'état >= 3, pas les emplacements libres. Il peut y avoir plus d'emplacements occupés que la limite. Considérez la capacité libre comme le courant maximum, en remplaçant le résultat négatif par 0. L’équipe ne lâche rien, n’apprivoise pas, n’invoque rien.
  • CharacterStatus vérifie le corps requis avant la mise à jour. Weight est disponible dans son propre statut étendu, slots - de type 3, Luck - de type 4, serveur WeightMax - de type 5. Un package compact/ancien sans compteur optionnel quitte son cache précédent. Le nouveau Player repart de zéro ; l'appel ne prouve pas la réception d'un nouveau statut.
  • Ces fonctions enregistrent l’API. Elles ne sont pas exécutées à nouveau pour chaque appel de commande. C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
  • Chaque appel lit à nouveau les données locales. La variable stocke l'instantané ; les lectures individuelles peuvent recevoir différentes mises à jour du serveur. Un résultat non nul ne teste pas la connexion. Zéro peut être une valeur ou aucune donnée.

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.GetPetsMax();
UO.Print("GetPetsMax: " + Convert.ToString(result));

1. Calculer les emplacements disponibles avant de quitter - script direct

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

  • courant - occupé, maximum - limite, freeSlots - différence. Avec une limite inconnue/zéro ou des données incohérentes, l'exemple se termine sans affirmer que l'espace est libre. La commande lit uniquement le dernier statut, ne demande pas de nouvelle mise à jour.
var current = UO.Followers();
var maximum = UO.GetPetsMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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 la capacité avant d'apprivoiser les animaux - Fonction de script

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

  • Sélectionnez d'abord l'animal souhaité pour que son ID soit dans lasttarget. requiredSlots=2 - exemple de paramètre, remplacez-le par le coût réel de cette créature sur votre serveur. S'il n'y a pas assez d'espace, la cible n'est pas fixée et la compétence n'est pas appelée. Sinon, la file d'attente de la cible est préparée AVANT l'unique argument UseSkill("Animal Taming"). Lancer une tentative ne garantit pas le succès : la compétence, la portée, la capacité à apprivoiser et la réponse du serveur sont importantes.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.GetPetsMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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érification de réutilisation pour des créatures de coûts différents - classe de scénario

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

  • CanAddFollower est une aide utilisateur entièrement déclarée, pas une nouvelle commande UO. Il renvoie 1/true s'il y a une limite de cache suffisante, sinon 0/false. Le paramètre extraSlots est le coût de la créature AJOUTÉE, pas son type/ID. 2 - exemple ; La fonction n’apprivoise ni n’invoque. Le contrôle doit être répété immédiatement avant l'action.
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()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.PetsCurrent();
        var maximum = UO.GetPetsMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

    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.GetPetsMax() — UO.GetPetsMax()

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

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


UO.IsNPC

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

Signatures C#

int UO.IsNPC(object? objID);

Vérifie le mobile chargé par rapport au serial explicitement passé.

Paramètres

  • objID - Obligatoire serial/ID d'un objet spécifique : int, chaîne hexadécimale ou alias self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse ou name AddObject. Ce n'est pas graphic/type. Le nom non spécifié se résout en 0 ; la commande n'ouvre aucune nouvelle cible. Seul IsNpc a également une forme sans arguments enregistrés : self est utilisé.

Valeur de retour

int 1 - chargé, non supprimé mobile. int 0 - un objet inconnu serial ou un objet distant. Le nom IsNPC ne signifie pas « personnage non-joueur uniquement » : votre propre personnage et les autres joueurs donnent également 1.

Le résultat de la commande est un indicateur numérique : 1 signifie une condition remplie, 0 signifie une condition non remplie. Après var result = command(...) vérifiez si (result != 0) ou if (result == 0). Enregistrez le résultat d'un appel : un appel répété peut effectuer à nouveau l'action ou lire l'état qui a déjà changé.

Comportement

  • Le modèle client local est lu ; Il n'y a aucune requête au serveur, pas d'attente ni de déplacement.
  • Le résultat fait référence au moment de la lecture. Après UO.Wait ou une autre action, l'objet et ses drapeaux peuvent changer.
  • Le gestionnaire de jeu traite IsNpc et IsNPC comme des variantes du même nom ; dans le code source C#, utilisez l'orthographe exacte du formulaire public. Ce résultat ne peut pas distinguer de manière fiable le joueur de NPC ; les règles de cette distinction dépendent du serveur.

Dans C# les caractères du nom sont sensibles à la casse : UO.IsNPC nécessite un argument ; la forme UO.IsNpc() sans arguments sélectionne self. Les deux noms vérifient mobile, y compris les joueurs, plutôt que exclusivement NPC.

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.IsNPC(UO.Self());
UO.Print("IsNPC: " + Convert.ToString(result));

1. Vérifiez serial de votre propre personnage - script direct

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

  • Cette forme C# nécessite un argument. Son propre caractère donne également 1 ; Il s'agit d'un chèque mobile, pas exclusivement NPC.
int mobile = UO.IsNPC(UO.Self());
UO.Print($"Self is a loaded mobile: {mobile != 0}");

2. Sélectionnez la cible chargée avant de lire les coordonnées - fonction de script

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

  • La série est extraite de lasttarget. Les coordonnées ne sont lues que s'il existe mobile connu du client.
return  RunScenario();
 object? RunScenario()
{
    string target = UO.GetSerial("lasttarget");
    if (UO.IsNPC(target) == 0)
        return false;
    UO.Print($"Mobile coordinates: {UO.GetX(target)}, {UO.GetY(target)}, {UO.GetZ(target)}");
    return true;
    return null;
}

3. Comparez le personnage et le sac à dos – Classe de scénario

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

  • Le personnage qui entre dans le monde est un mobile et le sac à dos est un objet. Le résultat se réfère au moment de la lecture locale.
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 character = UO.IsNPC(UO.Self());
        int bag = UO.IsNPC(UO.Backpack());
        UO.Print($"Character mobile flag: {character}; backpack mobile flag: {bag}");
        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.IsNPC(objID) — UO.IsNPC(Any)

Paramètres: objID (Any)

Résultat: int / Integer.

Pendant un appel:

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

case "isnpc": return new InjectionValue(bridge.IsNpc(Arg(0)));

UO.IsNpc

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

Signatures C#

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

Paramètres

  • id - Obligatoire serial/ID d'un objet spécifique : int, chaîne hexadécimale ou alias self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse ou name AddObject. Ce n'est pas graphic/type. Le nom non spécifié se résout en 0 ; la commande n'ouvre aucune nouvelle cible. Seul IsNpc a également une forme sans arguments enregistrés : self est utilisé.

Valeur de retour

int 1 - chargé, non supprimé mobile. int 0 - un objet inconnu serial ou un objet distant. Le nom IsNPC ne signifie pas « personnage non-joueur uniquement » : votre propre personnage et les autres joueurs donnent également 1.

Le résultat de la commande est un indicateur numérique : 1 signifie une condition remplie, 0 signifie une condition non remplie. Après var result = command(...) vérifiez si (result != 0) ou if (result == 0). Enregistrez le résultat d'un appel : un appel répété peut effectuer à nouveau l'action ou lire l'état qui a déjà changé.

Comportement

  • Le modèle client local est lu ; Il n'y a aucune requête au serveur, pas d'attente ni de déplacement.
  • Le résultat fait référence au moment de la lecture. Après UO.Wait ou une autre action, l'objet et ses drapeaux peuvent changer.
  • Le gestionnaire de jeu traite IsNpc et IsNPC comme des variantes du même nom ; dans le code source C#, utilisez l'orthographe exacte du formulaire public. Ce résultat ne peut pas distinguer de manière fiable le joueur de NPC ; les règles de cette distinction dépendent du serveur.

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.IsNpc();
UO.Print("IsNpc: " + Convert.ToString(result));

1. Testez votre propre personnage - script direct

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

  • Le formulaire sans argument sélectionne self. Le résultat 1/0 n'est pas serial et ne distingue pas NPC du joueur.
int mobile = UO.IsNpc();
if (mobile != 0) UO.Print("Self is a loaded mobile");

2. Distinguer mobile, objet et cible inconnue - fonction de script

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

  • Présélectionnez lasttarget. Tout d'abord, le chargement de l'objet est vérifié ; le classement mobile ne définit pas son hostilité.
return  RunScenario();
 object? RunScenario()
{
    string target = UO.GetSerial("lasttarget");
    if (UO.Exists(target) == 0)
        UO.Print("Target is not loaded");
    else
        UO.Print(UO.IsNpc(target) != 0 ? "Mobile: NPC or player" : "Loaded item");
    return null;
}

3. Lire les hits connus du client uniquement depuis un mobile - classe de script

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

  • Les hits d'autres personnes peuvent être normalisés par le serveur. Le chèque ne demande pas le statut complet.
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()
    {
        string target = UO.GetSerial("lasttarget");
        if (UO.IsNpc(target) != 0)
            UO.Print($"Known hits: {UO.GetHP(target)}/{UO.GetMaxHP(target)}");
        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.IsNpc() — UO.IsNpc()

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 IsNpc() => IsNpc(bridge.Self);

UO.IsNpc(id) — UO.IsNpc(Integer)

Paramètres: id (Integer/String)

Résultat: int / Integer.

Pendant un appel:

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

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

UO.IsNpc(id) — UO.IsNpc(String)

Paramètres: id (Integer/String)

Résultat: int / Integer.

Pendant un appel:

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

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

UO.MobileCanBeRenamed

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

Signatures C#

int UO.MobileCanBeRenamed(object? mobID);

Vérifie le signe connu du client concernant la capacité de renommer le mobile.

Paramètres

  • mobID — Obligatoire serial/ID d'un objet spécifique : int, chaîne hexadécimale ou alias self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse ou nom AddObject. Ce n'est pas graphic/type. Le nom non spécifié se résout en 0 ; la commande n'ouvre aucune nouvelle cible. L'argument est requis; pour vous-même, passez self.

Valeur de retour

int 1 — le mobile chargé a l'attribut IsRenamable. int 0 - l'attribut est manquant, l'objet n'est pas mobile, inconnu ou supprimé. Il s'agit de la dernière autorisation du serveur, par exemple pour un animal de compagnie. La commande ne renomme pas l'objet et ne garantit pas qu'une requête ultérieure sera acceptée par le serveur.

Le résultat de la commande est un indicateur numérique : 1 signifie une condition remplie, 0 signifie une condition non remplie. Après var result = command(...) vérifiez si (result != 0) ou if (result == 0). Enregistrez le résultat d'un appel : un appel répété peut effectuer à nouveau l'action ou lire l'état qui a déjà changé.

Comportement

  • Le modèle client local est lu ; Il n'y a aucune requête au serveur, pas d'attente ni de déplacement.
  • Le résultat fait référence au moment de la lecture. Après UO.Wait ou une autre action, l'objet et ses drapeaux peuvent changer.
  • Il s'agit de la dernière autorisation du serveur, par exemple pour un animal de compagnie. La commande ne renomme pas l'objet et ne garantit pas qu'une requête ultérieure sera acceptée par le serveur.

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.MobileCanBeRenamed("self");
UO.Print("MobileCanBeRenamed: " + Convert.ToString(result));

1. Vérifiez votre propre état - script direct

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

  • L'argument self sélectionne explicitement son caractère. état - 1/0 uniquement.
  • Il s'agit de la dernière autorisation du serveur, par exemple pour un animal de compagnie. La commande ne renomme pas l'objet et ne garantit pas qu'une requête ultérieure sera acceptée par le serveur.
var state = UO.MobileCanBeRenamed("self");
if (Truth(state))
{
    UO.Print("Rename permission flag is present");
}
else
{
    UO.Print("Rename permission flag is absent");
}

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 le mobile sélectionné - fonction de script

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

  • IsNpc exclut le sujet et l'objet inconnu. target stocke un seul serial plutôt qu'une référence en direct à un lasttarget changeant.
  • Le résultat fait référence au champ IsRenamable. Les données ne sont mises à jour qu'une fois que le client a reçu l'état approprié.
return  RunScenario();
 object? RunScenario()
{
    var target = UO.GetSerial("lasttarget");
    if (Truth(UO.IsNPC(target)))
    {
        var state = UO.MobileCanBeRenamed(target);
        UO.Print("Selected mobile state 1/0: " + Convert.ToString(state));
    }
    else
    {
        UO.Print("No loaded mobile selected");
    }

    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. Comparez l'état avant et après la pause - classe de script

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

  • UO.Wait(500) — pause en millisecondes. Après cela, il est vérifié séparément que mobile existe toujours.
  • Deux photographies sont comparées. Des modifications intermédiaires peuvent être manquées, et il ne s'agit pas d'un abonnement continu aux événements 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 target = UO.GetSerial("lasttarget");
        if (Truth(UO.IsNPC(target)))
        {
            var before = UO.MobileCanBeRenamed(target);
            await Delay(500);
            if (Truth(UO.IsNPC(target)))
            {
                var after = UO.MobileCanBeRenamed(target);
                if (Truth(before != after))
                {
                    UO.Print("Flag changed: " + Convert.ToString(before) + " -> " + Convert.ToString(after));
                }
            }
            else
            {
                UO.Print("Mobile left the local world");
            }
        }

        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.MobileCanBeRenamed(mobID) — UO.MobileCanBeRenamed(Any)

Paramètres: mobID (Any)

Résultat: int / Integer.

Pendant un appel:

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

case "mobilecanberenamed": return new InjectionValue(bridge.CanChangeName(Arg(0)));

UO.Notoriety

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

Signatures C#

int UO.Notoriety();

Lit la réputation du personnage à partir du modèle client.

Paramètres

Il n'y a pas de paramètres.

Valeur de retour

int — 0=inconnu, 1=innocent, 2=allié, 3=gris, 4=criminel, 5=ennemi, 6=meurtrier, 7=invulnérable. Il s'agit d'un code de statut, pas de hue, de karma ou de renommée. Inconnu mobile donne 0.

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.Notoriety();
UO.Print("Notoriety: " + 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. La réputation du personnage est stockée en valeur.
  • Convert.ToString convertit le nombre à sortir et ne change pas la signification du résultat.
var value = UO.Notoriety();
UO.Print("Notoriety: " + 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. La réputation du personnage est utilisée dans le calcul ou la condition affiché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.Notoriety();
    if (Truth(value == 3) || Truth(value == 4))
    {
        UO.Print("Gray or criminal notoriety");
    }

    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. 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 la réputation du personnage. 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.Notoriety();
        await Delay(1000);
        var after = UO.Notoriety();
        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.Notoriety() — UO.Notoriety()

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.GetNotoriety(bridge.Self)

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


UO.PetsCurrent

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

Signatures C#

int UO.PetsCurrent();

Aide à décider à l'avance si le personnage dispose de suffisamment d'espace pour la prochaine créature apprivoisée ou invoquée. Followers montre les emplacements de contrôle occupés, FollowersMax est leur limite totale. Il ne s'agit pas du nombre d'animaux à proximité ni de la commande de mouvement Follow. Lit le compteur de statut de votre personnage : emplacements de contrôle d'animaux occupés.

Paramètres

Il n'y a pas de paramètres.

Valeur de retour

int — emplacements de contrôle des animaux occupés, 0..255 dans le modèle client. 0 peut être une valeur réelle, aucune donnée ou un joueur manquant/détruit. Il s'agit de quantité, pas de bool, ID ou de type : 1 signifie une unité, pas de succès. La commande ne parcourt pas les objets et ne renvoie pas de tableau.

Comportement

  • Par exemple, 3 de 5 est occupé - l'emplacement 2 est libre. La valeur 4 peut signifier quatre créatures pour un emplacement, une pour quatre ou une autre combinaison. Pour une créature à 2, l'emplacement de contrôle « occupé < maximum » n'est pas suffisant : vous avez besoin de maximum - courant >= 2. Le coût d'une créature spécifique et la limite sont déterminés par le serveur ; ne remplacez pas la constante 5 par FollowersMax.
  • 0 ne prouve pas que l'animal est perdu, mort ou relâché : il peut être vide ou son statut n'a pas encore été mis à jour. Une augmentation du compteur n’est qu’un signe supplémentaire d’un changement de contrôle ; cela ne détermine pas quelle créature est apprivoisée. Vérifiez également les messages du serveur et de l'animal lui-même. Ces emplacements ne sont pas égaux aux places dans l’écurie.
  • La commande ne prend aucun argument. Utilisez les signatures exactes ci-dessus.
  • La lecture sur le fil de jeu prend Player.Followers si le joueur actuel existe et n'a pas été détruit ; sinon 0. L'équipement n'est pas trié, les bonus ne sont pas recalculés, le statut n'est pas demandé et il n'y a pas d'attente de mises à jour. Un fantôme présent n'est pas égal à un joueur détruit.
  • PetsCurrent/Followers signale les emplacements de contrôle occupés à partir de son statut type >= 3. Un animal peut occuper plusieurs emplacements ; Les règles relatives aux créatures invoquées et apprivoisées sont fixées par le serveur. Il ne s'agit pas du nombre d'animaux mobile visibles, ni de la liste des animaux ID, ni du nombre d'animaux à proximité.
  • CharacterStatus vérifie le corps requis avant la mise à jour. Weight est disponible dans son propre statut étendu, slots - de type 3, Luck - de type 4, serveur WeightMax - de type 5. Un package compact/ancien sans compteur optionnel quitte son cache précédent. Le nouveau Player repart de zéro ; l'appel ne prouve pas la réception d'un nouveau statut.
  • Ces fonctions enregistrent l’API. Elles ne sont pas exécutées à nouveau pour chaque appel de commande. C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
  • Chaque appel lit à nouveau les données locales. La variable stocke l'instantané ; les lectures individuelles peuvent recevoir différentes mises à jour du serveur. Un résultat non nul ne teste pas la connexion. Zéro peut être une valeur ou aucune donnée.

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.PetsCurrent();
UO.Print("PetsCurrent: " + Convert.ToString(result));

1. Calculer les emplacements disponibles avant de quitter - script direct

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

  • courant - occupé, maximum - limite, freeSlots - différence. Avec une limite inconnue/zéro ou des données incohérentes, l'exemple se termine sans affirmer que l'espace est libre. La commande lit uniquement le dernier statut, ne demande pas de nouvelle mise à jour.
var current = UO.PetsCurrent();
var maximum = UO.FollowersMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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 la capacité avant d'apprivoiser les animaux - Fonction de script

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

  • Sélectionnez d'abord l'animal souhaité pour que son ID soit dans lasttarget. requiredSlots=2 - exemple de paramètre, remplacez-le par le coût réel de cette créature sur votre serveur. S'il n'y a pas assez d'espace, la cible n'est pas fixée et la compétence n'est pas appelée. Sinon, la file d'attente de la cible est préparée AVANT l'unique argument UseSkill("Animal Taming"). Lancer une tentative ne garantit pas le succès : la compétence, la portée, la capacité à apprivoiser et la réponse du serveur sont importantes.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.PetsCurrent();
    var maximum = UO.FollowersMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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érification de réutilisation pour des créatures de coûts différents - classe de scénario

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

  • CanAddFollower est une aide utilisateur entièrement déclarée, pas une nouvelle commande UO. Il renvoie 1/true s'il y a une limite de cache suffisante, sinon 0/false. Le paramètre extraSlots est le coût de la créature AJOUTÉE, pas son type/ID. 2 - exemple ; La fonction n’apprivoise ni n’invoque. Le contrôle doit être répété immédiatement avant l'action.
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()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.PetsCurrent();
        var maximum = UO.PetsMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

    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.PetsCurrent() — UO.PetsCurrent()

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.

case "petscurrent": return new InjectionValue(bridge.Followers);

UO.PetsMax

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

Signatures C#

int UO.PetsMax();

Aide à décider à l'avance si le personnage dispose de suffisamment d'espace pour la prochaine créature apprivoisée ou invoquée. Followers montre les emplacements de contrôle occupés, FollowersMax est leur limite totale. Il ne s'agit pas du nombre d'animaux à proximité ni de la commande de mouvement Follow. Lit le compteur de statut de votre personnage : emplacements maximum de contrôle des animaux de compagnie.

Paramètres

Il n'y a pas de paramètres.

Valeur de retour

int — nombre maximum d'emplacements de contrôle d'animaux de compagnie, 0..255 dans le modèle client. 0 peut être une valeur réelle, aucune donnée ou un joueur manquant/détruit. Il s'agit de quantité, pas de bool, ID ou de type : 1 signifie une unité, pas de succès. La commande ne parcourt pas les objets et ne renvoie pas de tableau.

Comportement

  • Par exemple, 3 de 5 est occupé - l'emplacement 2 est libre. La valeur 4 peut signifier quatre créatures pour un emplacement, une pour quatre ou une autre combinaison. Pour une créature à 2, l'emplacement de contrôle « occupé < maximum » n'est pas suffisant : vous avez besoin de maximum - courant >= 2. Le coût d'une créature spécifique et la limite sont déterminés par le serveur ; ne remplacez pas la constante 5 par FollowersMax.
  • 0 ne prouve pas que l'animal est perdu, mort ou relâché : il peut être vide ou son statut n'a pas encore été mis à jour. Une augmentation du compteur n’est qu’un signe supplémentaire d’un changement de contrôle ; cela ne détermine pas quelle créature est apprivoisée. Vérifiez également les messages du serveur et de l'animal lui-même. Ces emplacements ne sont pas égaux aux places dans l’écurie.
  • La commande ne prend aucun argument. Utilisez les signatures exactes ci-dessus.
  • La lecture sur le fil de jeu prend Player.FollowersMax si le joueur actuel existe et n'a pas été détruit ; sinon 0. L'équipement n'est pas trié, les bonus ne sont pas recalculés, le statut n'est pas demandé et il n'y a pas d'attente de mises à jour. Un fantôme présent n'est pas égal à un joueur détruit.
  • PetsMax/FollowersMax indique la limite totale d'emplacements autorisée par le serveur à partir du type d'état >= 3, pas les emplacements libres. Il peut y avoir plus d'emplacements occupés que la limite. Considérez la capacité libre comme le courant maximum, en remplaçant le résultat négatif par 0. L’équipe ne lâche rien, n’apprivoise pas, n’invoque rien.
  • CharacterStatus vérifie le corps requis avant la mise à jour. Weight est disponible dans son propre statut étendu, slots - de type 3, Luck - de type 4, serveur WeightMax - de type 5. Un package compact/ancien sans compteur optionnel quitte son cache précédent. Le nouveau Player repart de zéro ; l'appel ne prouve pas la réception d'un nouveau statut.
  • Ces fonctions enregistrent l’API. Elles ne sont pas exécutées à nouveau pour chaque appel de commande. C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
  • Chaque appel lit à nouveau les données locales. La variable stocke l'instantané ; les lectures individuelles peuvent recevoir différentes mises à jour du serveur. Un résultat non nul ne teste pas la connexion. Zéro peut être une valeur ou aucune donnée.

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.PetsMax();
UO.Print("PetsMax: " + Convert.ToString(result));

1. Calculer les emplacements disponibles avant de quitter - script direct

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

  • courant - occupé, maximum - limite, freeSlots - différence. Avec une limite inconnue/zéro ou des données incohérentes, l'exemple se termine sans affirmer que l'espace est libre. La commande lit uniquement le dernier statut, ne demande pas de nouvelle mise à jour.
var current = UO.Followers();
var maximum = UO.PetsMax();
if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(current > maximum))
{
    UO.Print("Follower status is unavailable or inconsistent");
    return null;
}
var freeSlots = maximum - current;
UO.Print("Control slots: " + Convert.ToString(current) + "/" + Convert.ToString(maximum));
UO.Print("Free slots: " + Convert.ToString(freeSlots));

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 la capacité avant d'apprivoiser les animaux - Fonction de script

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

  • Sélectionnez d'abord l'animal souhaité pour que son ID soit dans lasttarget. requiredSlots=2 - exemple de paramètre, remplacez-le par le coût réel de cette créature sur votre serveur. S'il n'y a pas assez d'espace, la cible n'est pas fixée et la compétence n'est pas appelée. Sinon, la file d'attente de la cible est préparée AVANT l'unique argument UseSkill("Animal Taming"). Lancer une tentative ne garantit pas le succès : la compétence, la portée, la capacité à apprivoiser et la réponse du serveur sont importantes.
return  RunScenario();
 object? RunScenario()
{
    var requiredSlots = 2;
    var current = UO.Followers();
    var maximum = UO.PetsMax();
    if (Truth(UO.Self() == 0) || Truth(maximum <= 0) || Truth(maximum - current < requiredSlots))
    {
        UO.Print("Not enough known control slots");
        return null;
    }

    var animal = UO.LastTarget();
    if (Truth(animal == 0))
    {
        UO.Print("Select the animal first");
        return null;
    }

    UO.WaitTargetObject(animal);
    UO.UseSkill("Animal Taming");
    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érification de réutilisation pour des créatures de coûts différents - classe de scénario

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

  • CanAddFollower est une aide utilisateur entièrement déclarée, pas une nouvelle commande UO. Il renvoie 1/true s'il y a une limite de cache suffisante, sinon 0/false. Le paramètre extraSlots est le coût de la créature AJOUTÉE, pas son type/ID. 2 - exemple ; La fonction n’apprivoise ni n’invoque. Le contrôle doit être répété immédiatement avant l'action.
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()
    {
        if (Truth(CanAddFollower(2)))
        {
            UO.Print("Capacity check passed; verify the creature cost before acting");
        }
        else
        {
            UO.Print("Insufficient capacity or unavailable status");
        }

        return null;
    }

    dynamic CanAddFollower(dynamic extraSlots)
    {
        if (Truth(extraSlots < 0) || Truth(UO.Self() == 0))
        {
            return false;
        }

        var current = UO.PetsCurrent();
        var maximum = UO.PetsMax();
        if (Truth(maximum <= 0))
        {
            return false;
        }

        return extraSlots <= maximum - current;
    }

    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.PetsMax() — UO.PetsMax()

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.

case "petsmax": return new InjectionValue(bridge.FollowersMax);

UO.Rename

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

Signatures C#

void UO.Rename(object? mobile, object? newName);

Demande un changement de nom de personnage/animal.

Paramètres

  • mobile — Objet série/ID : int, chaîne numérique/hexadécimale ou alias établi, par exemple "lasttarget". Ce n'est pas graphic/type. Vérifiez l’objet chargé avant d’agir.
  • newName — Envoyez du texte via ToString ; enregistré comme transmis.

Valeur de retour

void - aucune valeur. Appelez sur une ligne séparée ; l'achèvement ne confirme pas l'action du serveur.

Comportement

  • L'ordre est serial, puis le nouveau nom. Bridge.RenameMobile appelle GameActions.Rename(serial, nom). API ne vérifie pas CanChangeName et ne modifie pas le Name local lui-même.
  • Le serveur vérifie l'autorisation de renommer. Pour les animaux de compagnie, cochez d'abord MobileCanBeRenamed ; la demande ne garantit pas l'acceptation du nom.

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.Rename");
UO.Rename(UO.GetSerial("lasttarget"), "Companion");

1. Appel direct - script direct

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

  • Demande un changement de nom de personnage/animal.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.MobileCanBeRenamed(id)))
{
    UO.Rename(id, "Companion");
}

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

2. Option explicite - fonction de script

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

  • L'ordre est serial, puis le nouveau nom. Bridge.RenameMobile appelle GameActions.Rename(serial, nom). API ne vérifie pas CanChangeName et ne modifie pas le Name local lui-même.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(id)) && Truth(UO.MobileCanBeRenamed(id)))
    {
        UO.Rename(id, "Guardian");
    }

    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 :

  • Le serveur vérifie l'autorisation de renommer. Pour les animaux de compagnie, cochez d'abord MobileCanBeRenamed ; la demande ne garantit pas l'acceptation du nom.
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()
    {
        RenamePet(UO.GetSerial("lasttarget"), "Companion");
        return null;
    }

    void RenamePet(dynamic id, dynamic name)
    {
        if (Truth(UO.MobileCanBeRenamed(id)) && Truth(Len(name) > 0))
        {
            UO.Rename(id, name);
        }
    }

    int Len(object? value) => Convert.ToString(value)?.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.Rename(mobile, newName) — UO.Rename(Any,Any)

Paramètres: mobile (Any), newName (Any)

Résultat: void / Unit.

Pendant un appel:

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

case "rename": bridge.RenameMobile(Arg(0, bridge.LastTarget), Text(1)); break;

UO.RenameMobile

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

Signatures C#

void UO.RenameMobile(object? mobID, object? newName);

Demande un changement de nom de personnage/animal.

Paramètres

  • mobID — Objet série/ID : int, chaîne numérique/hexadécimale ou alias établi, par exemple "lasttarget". Ce n'est pas graphic/type. Vérifiez l’objet chargé avant d’agir.
  • newName — Envoyez du texte via ToString ; enregistré comme transmis.

Valeur de retour

void - aucune valeur. Appelez sur une ligne séparée ; l'achèvement ne confirme pas l'action du serveur.

Comportement

  • L'ordre est serial, puis le nouveau nom. Bridge.RenameMobile appelle GameActions.Rename(serial, nom). API ne vérifie pas CanChangeName et ne modifie pas le Name local lui-même.
  • Le serveur vérifie l'autorisation de renommer. Pour les animaux de compagnie, cochez d'abord MobileCanBeRenamed ; la demande ne garantit pas l'acceptation du nom.

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.RenameMobile");
UO.RenameMobile(UO.GetSerial("lasttarget"), "Companion");

1. Appel direct - script direct

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

  • Demande un changement de nom de personnage/animal.
var id = UO.GetSerial("lasttarget");
if (Truth(UO.MobileCanBeRenamed(id)))
{
    UO.RenameMobile(id, "Companion");
}

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

2. Option explicite - fonction de script

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

  • L'ordre est serial, puis le nouveau nom. Bridge.RenameMobile appelle GameActions.Rename(serial, nom). API ne vérifie pas CanChangeName et ne modifie pas le Name local lui-même.
return  RunScenario();
 object? RunScenario()
{
    var id = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(id)) && Truth(UO.MobileCanBeRenamed(id)))
    {
        UO.RenameMobile(id, "Guardian");
    }

    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 :

  • Le serveur vérifie l'autorisation de renommer. Pour les animaux de compagnie, cochez d'abord MobileCanBeRenamed ; la demande ne garantit pas l'acceptation du nom.
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()
    {
        RenamePet(UO.GetSerial("lasttarget"), "Companion");
        return null;
    }

    void RenamePet(dynamic id, dynamic name)
    {
        if (Truth(UO.MobileCanBeRenamed(id)) && Truth(Len(name) > 0))
        {
            UO.RenameMobile(id, name);
        }
    }

    int Len(object? value) => Convert.ToString(value)?.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.RenameMobile(mobID, newName) — UO.RenameMobile(Any,Any)

Paramètres: mobID (Any), newName (Any)

Résultat: void / Unit.

Pendant un appel:

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

case "renamemobile": bridge.RenameMobile(Arg(0), Text(1)); return InjectionValue.Unit;
⚠️ **GitHub.com Fallback** ⚠️