Repository navigation
FR UO Topic combat
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Accueil · C# · IDE · UO API · A–Z · Exemples · Langues
Attaque, mode de combat, capacités des armes et guérison des bandages. La demande du client et l'action entreprise par le serveur sont différentes.
| Sujet | Commandes et explications |
|---|---|
| Attack | UO.Attack |
| AttackNearest | UO.AttackNearest |
| LastAttack | UO.LastAttack |
| WarMode | UO.WarMode |
| WarTarget | UO.WarTargetID |
| Capacités des armes | UO.GetWeaponAbilities · UO.GetAbilityID · UO.GetAbilityName · UO.GetActiveAbility |
| Primary Ability | UO.UsePrimaryAbility |
| Secondary Ability | UO.UseSecondaryAbility |
| Special Moves | UO.Specmove |
| BandageSelf | UO.BandageSelf |
UO.Attack · UO.AttackNearest · UO.LastAttack · UO.WarMode · UO.IsWarMode · UO.SetWarMode · UO.WarTargetID
UO.GetWeaponAbilities · UO.GetAbilityID · UO.GetAbilityName · UO.GetActiveAbility · UO.UseAbility · UO.UsePrimaryAbility · UO.UseSecondaryAbility · UO.Specmove
UO.SetClassMask · UO.ClearClassMask · UO.AttackNearest
Les noms des groupes et les types d'articles portés sont précisés par le script ; l'ordre des noms via | spécifie la priorité.
Chaque carte de commande possède plusieurs scénarios indépendants : code direct, fonctions et classes. Vous trouverez ci-dessous une sélection de courts scénarios ; des restrictions et une analyse complète sont à prévoir.
Paramètres, résultat et tous les scénarios
var selected = UO.LastTarget();
var allowed = UO.GetMobiles(10, "5|6", -1, 8, false, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(allowed)))
{
if (Truth(allowed[i] == selected))
{
UO.Attack(selected);
return null;
}
i += 1;
}
UO.Print("Selected target does not pass the filters");
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres, résultat et tous les scénarios
var abilities = UO.GetWeaponAbilities();
UO.Print(UO.GetArrayLength(abilities));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Attack(object? objID);Dirige une demande d'attaque vers un serial spécifique. Convient lorsque la cible a déjà été sélectionnée par l'utilisateur ou trouvée par une autre équipe ; Il n’y a pas de recherche indépendante par vêtements/distance ici.
-
objID— Série mobile : int, chaîne décimale/hexadécimale ou nom d'objet résoluble (par exemple lasttarget ou nom AddObject). Pas graphic/type ou le nom de la classe. Argument requis ; 0 n'est pas un ordre pour arrêter le combat. Pour sélectionner une cible sans son ID, utilisez la recherche ou la cible de jeu.
void - aucune valeur. Écrivez UO.Attack(enemy) sur une ligne séparée, pas var result=UO.Attack(...). La fin d'un appel ne confirme pas un succès, un dommage ou l'acceptation du serveur.
- Le défi lui-même ne repousse pas les morts, les lointains, les self, les alliés, les serial vides ou les objets. Vérifiez la cible sélectionnée ; filtrer de préférence mobile à partir de GetMobiles/FindMan.
- Le standard GameActions.Attack est utilisé : la question d'une attaque criminelle avec EnabledCriminalActionQuery est possible. En cours normal, LastAttack/NewTargetSystemSerial sont mis à jour et un paquet de demande d'attaque est envoyé.
- La commande n’active pas WarMode, n’effectue pas de double-clic, ne calcule pas d’itinéraire et ne démarre pas de boucle d’attaques répétées. Le mode combat et la suite du combat dépendent du serveur.
- Une erreur de résolution peut se produire pour une chaîne avec un nom d'objet inconnu. Le test Exists prouve la présence d'un objet, mais pas qu'il s'agit de mobile ; GetMobiles est donné par les mobiles.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
La commande forme une instruction séparée. Le message précédent indique le début de l’appel et ne confirme aucune action du serveur.
UO.Print("Calling UO.Attack");
UO.Attack(UO.LastTarget());Paramètres et déroulement de l’exécution :
- lasttarget peut être un objet ou un personnage amical. La liste autorisée exclut ces cas ; Attack est appelé au maximum une fois.
var selected = UO.LastTarget();
var allowed = UO.GetMobiles(10, "5|6", -1, 8, false, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(allowed)))
{
if (Truth(allowed[i] == selected))
{
UO.Attack(selected);
return null;
}
i += 1;
}
UO.Print("Selected target does not pass the filters");
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- FindMan renvoie serial et n'attaque pas. La vérification IsDead est ajoutée séparément car FindMan n'a pas de aliveOnly.
return RunScenario();
object? RunScenario()
{
var enemy = UO.FindMan(5, 6, true, 4, -1, -1, false);
if (Truth(enemy == 0))
{
return null;
}
if (Truth(UO.IsDead(enemy) == 0))
{
UO.AddObject("enemy", enemy);
UO.Attack(enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- GetMobiles est déjà ordonné le plus proche=true. S'il y a un mur devant la première cible, la suivante est vérifiée ; la présence de visibleOnly ne remplace pas en soi CheckLOS. La vérification du serveur peut varier.
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 targets = UO.GetMobiles(8, 5, -1, 10, true, false, true, true);
var i = 0;
while (Truth(i < ArrayLength(targets)))
{
var enemy = targets[i];
if (Truth(UO.CheckLOS(UO.GetX("self"), UO.GetY("self"), UO.GetZ("self"), UO.GetX(enemy), UO.GetY(enemy), UO.GetZ(enemy), UO.WorldNum())))
{
UO.Attack(enemy);
return null;
}
i += 1;
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: objID (Any/Integer/String)
Résultat: void / Unit.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Attack:bridge.Attack(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Code interne de l’implémentation ; ce n’est pas un script autonome.
case "attack": bridge.Attack(Arg(0)); return InjectionValue.Unit;Paramètres: objID (Any/Integer/String)
Résultat: void / Unit.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.Attack. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Attack:bridge.Attack(id).
Code interne de l’implémentation ; ce n’est pas un script autonome.
public void Attack(int id) => bridge.Attack(id);Paramètres: objID (Any/Integer/String)
Résultat: void / Unit.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.Attack. -
InjectionScript.Runtime.InjectionApiUO.Attack:Attack(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Code interne de l’implémentation ; ce n’est pas un script autonome.
public void Attack(string id) => Attack(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.AttackNearest(object? notoriety);
int UO.AttackNearest(object? notoriety, object? distance);
int UO.AttackNearest(object? notoriety, object? distance, object? body);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask, object? aliveOnly);
int UO.AttackNearest(object? notoriety, object? distance, object? body, object? maxZ, object? nearest, object? color, object? classMask, object? aliveOnly, object? visibleOnly);Sélectionne une cible de combat appropriée et la transmet au gestionnaire d'attaque. Les filtres limitent les caractères acceptables ; personnalisé classMask définit la priorité de l'équipement et de la classe, le choix le plus proche au sein d'une classe.
-
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. -
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. -
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 sélectionne par défaut le caractère correspondant le plus proche ; une distance égale est autorisée par un serial plus petit. false/0 conserve le premier objet correspondant dans l'ordre de la liste des clients, ne sélectionne pas le plus éloigné. Avec classMask, la priorité de classe s'applique en premier, puis la distance intra-classe. -
color— Teinte de mobile lui-même : int ou chaîne numérique/hexadécimale. Nombre négatif (-1 par défaut) et 0xFFFF - n'importe quel hue ; 0 est exactement hue 0, et non n'importe quelle valeur. Pas la couleur de la bande de notoriété ni la teinte des vêtements. Ce paramètre ne vérifie pas la couleur de l'article porté. -
classMask— Noms des règles prédéfinies par UO.SetClassMask dans le même runtime de script. Par exemple, "DTMH|hunter|spare" - priorité de gauche à droite ; un tableau de chaînes est également autorisé. Tous les noms, la casse n'est pas important. Séparateurs de lignes : |, virgule ou ;. Tout nom inconnu/élément vide à l'intérieur de la liste désélectionne toute la sélection : résultat 0, pas d'attaque. Ce n'est pas un masque de bits numérique : 7 ne signifie pas trois classes. Un argument manquant, -1, "-1", "any", "all" ou la chaîne vide désactive séparément le filtre de classe. Mage/Tank/Archer ne sont pas intégrés : sans enregistrer de telles règles, il n'y aura pas de matchs. -
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.
int - serial sélectionné mobile, ou 0 lorsqu'il n'y a pas de cible appropriée ou classMask n'est pas valide. Ce n'est pas un drapeau 1/0, ni un body/type, ni une distance ou une confirmation de frappe. Vérifiez l'ennemi != 0; ennemis == true n'est pas valide dans C# : int n'est pas comparable à bool. Si ID est différent de zéro, le gestionnaire ClassicUO peut toujours afficher la confirmation de l'attaque innocente ; le serveur peut rejeter l'action.
- 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.
- Le nom est une étiquette personnalisée, pas un métier de serveur. Vous pouvez appeler la règle DTMH, my_group ou tout autre mot. Le moteur ne détermine pas les compétences/classes sur le serveur par nom de personnage.
- En cas d'obligation, un type ou un tableau plat signifie au moins un élément de la liste. Un tableau de groupes signifie : vous avez besoin d’au moins un élément de CHAQUE groupe. Par exemple, [cuir, douelles] nécessite du cuir ET un bâton. Il s’agit d’un ensemble d’alternatives et non d’une obligation de porter toute la garde-robe répertoriée.
- Tout objet porté depuis l'interdit exclut le personnage de cette règle, même si les conditions requises sont remplies. Le cuir et une chaîne interdite ne satisfont pas à la règle du cuir. D'autres règles continuent d'être testées.
- Seuls les articles chargés portés sur les couches 1..24 à l'exception du sac à dos 21 sont comptés. Le contenu du sac à dos/coffre, de la monture 25, du magazine 26..28 et de la banque 29 ne sont pas considérés comme des vêtements. Compare graphic/type ; Les éléments serial, nom et hue ne sont pas utilisés ici.
- La liste ne correspond pas sans l’équipement approprié chargé. L'absence d'un élément interdit dans les données locales ne prouve pas son absence sur le serveur si le serveur n'a pas encore envoyé le matériel. Le client ne devine pas les données cachées.
- Les règles appartiennent à un script d'exécution, y compris ses fonctions et Comprend ; ne sont pas transférés vers d'autres lancements indépendants et ne sont pas enregistrés dans le profil. Au redémarrage, définissez-les à nouveau, par exemple par la procédure générale de configuration. Un SetClassMask répété remplace la règle du même nom, seulement après que les nouvelles données ont été entièrement vérifiées.
- Les tableaux sont copiés lors de l'enregistrement. Changer le tableau d'origine ne change pas la règle : répétez SetClassMask. Plusieurs règles de correspondance sont résolues par l'ordre des noms dans classMask. Il n’existe pas de tables standard pour les vêtements des serveurs.
- Les arguments de position 1..9 sont pris en charge. Vous pouvez sauter la queue ; pour définir classMask, les six premiers arguments doivent être transmis. Utilisez nommé var pour voir la signification de chaque position.
- Une cible est sélectionnée et l'attaque est envoyée une fois. Il ne s’agit pas d’un cycle de combat automatique. Sans classMask le filtrage des équipements et la lecture des éléments ne sont pas effectués.
- D'abord les filtres généraux, puis la priorité de gauche à droite, puis la plus proche. close=false conserve toujours la priorité de classe, mais dans la première classe correspondante, il sélectionne le premier mobile de la liste des clients.
- L'ancienne tentative de recherche d'une sous-chaîne dans un nom/titre a été remplacée par des règles d'équipement. Déplacez ces scripts vers un SetClassMask explicite ; Le nom du personnage ne l'identifie plus comme une classe spécifique.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.AttackNearest(5, 5);
UO.Print("AttackNearest: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- body=-1, maxZ=FindVertical(), le plus proche=true, color=-1, classMask désactivé, aliveOnly=false, visibleOnly=false. Pour être sûr d’exclure les personnes décédées, utilisez le formulaire complet ci-dessous.
var enemy = UO.AttackNearest(5, 5);
if (Truth(enemy == 0))
{
return null;
}
UO.AddObject("combat_target", enemy);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- maxZ=0 est utile pour des comparaisons strictes de hauteur, mais peut couper la cible au niveau du pas. visibleOnly ne vérifie pas le mur. Les neuf arguments sont signés ; renvoie ID, pas true.
return RunScenario();
object? RunScenario()
{
var status = "5|6";
var radius = 8;
var bodies = "0x0190|0x0191";
var heightTolerance = 0;
dynamic chooseNearest = true;
var bodyHue = -1;
var equipmentClasses = -1;
dynamic requireAlive = true;
dynamic requireVisible = true;
var enemy = UO.AttackNearest(status, radius, bodies, heightTolerance, chooseNearest, bodyHue, equipmentClasses, requireAlive, requireVisible);
if (Truth(enemy != 0))
{
UO.AddObject("enemy_same_height", enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- DTMH est sélectionné en premier ; seulement s'il n'y a pas de DTMH approprié - lourd, alors chasseur. DTMH sur les cellules 10 a la priorité sur lourd sur les cellules 2. Pour inverser l'ordre, modifiez la ligne classMask. Parmi les deux DTMH, le plus proche est sélectionné.
- Gear est une fonction utilisateur complètement réduite C#, pas une commande distincte UO. Les deux tableaux dans Gear (cuir, portées) forment deux groupes obligatoires. L'ajout d'un type au cuir élargit les alternatives ; ne nécessite pas le port de deux articles en cuir.
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 leather = Gear(0x13C4, 0x13C7);
var staves = Gear(0x0DF0, 0x0E81);
var chain = Gear(0x13BF, 0x13C0);
var plate = Gear(0x1415, 0x1411);
var bows = Gear(0x13B2, 0x0F50);
UO.SetClassMask("DTMH", Gear(leather, staves), chain);
UO.SetClassMask("охотник", bows);
UO.SetClassMask("тяжёлый", plate);
var notoriety = "5|6";
var distance = 12;
var body = -1;
var maxZ = 8;
dynamic nearest = true;
var color = -1;
var classMask = "DTMH|тяжёлый|охотник";
dynamic aliveOnly = true;
dynamic visibleOnly = true;
var enemy = UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly);
if (Truth(enemy == 0))
{
UO.Print("No matching enemy; no attack sent");
return null;
}
UO.AddObject("selected_enemy", enemy);
return null;
}
dynamic Gear(params dynamic[] values)
{
return values;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}Paramètres et déroulement de l’exécution :
- 10 est le rayon, 4 est la différence admissible Z, les deux -1 après la couleur de désactivation du drapeau et classMask. L'ordre de la liste des clients n'est pas garanti entre les mises à jour mondiales. Pour une proximité prévisible, utilisez true.
dynamic sortByDistance = false;
var target = UO.AttackNearest(5, 10, -1, 4, sortByDistance, -1, -1, true, true);
if (Truth(target == 0))
{
return null;
}
UO.AddObject("current_enemy", target);
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- Seul l'ordre des étiquettes change : aucun nouveau tableau de vêtements ou nom ne doit être ajouté au client. Pour éviter de recourir à un système lourd, supprimez-le de la priorité.
return RunScenario();
object? RunScenario()
{
var leather = Gear(0x13C4, 0x13C7);
var staves = Gear(0x0DF0, 0x0E81);
var chain = Gear(0x13BF, 0x13C0);
var plate = Gear(0x1415, 0x1411);
var bows = Gear(0x13B2, 0x0F50);
UO.SetClassMask("DTMH", Gear(leather, staves), chain);
UO.SetClassMask("охотник", bows);
UO.SetClassMask("тяжёлый", plate);
var priority = "охотник|DTMH|тяжёлый";
var enemy = UO.AttackNearest(5, 12, -1, 8, true, -1, priority, true, true);
if (Truth(enemy != 0))
{
UO.AddObject("priority_enemy", enemy);
}
return null;
}
dynamic Gear(params dynamic[] values)
{
return values;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: notoriety (Any)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
L’appel exécute le delegate du gestionnaire enregistré. La méthode d’enregistrement crée ce delegate lors de la construction de l’API.
Code interne de l’implémentation ; ce n’est pas un script autonome.
values => new InjectionValue(CompactAttackNearest(values))Paramètres: notoriety (Any), distance (Any)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
L’appel exécute le delegate du gestionnaire enregistré. La méthode d’enregistrement crée ce delegate lors de la construction de l’API.
Code interne de l’implémentation ; ce n’est pas un script autonome.
values => new InjectionValue(CompactAttackNearest(values))Paramètres: notoriety (Any), distance (Any), body (Any)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
L’appel exécute le delegate du gestionnaire enregistré. La méthode d’enregistrement crée ce delegate lors de la construction de l’API.
Code interne de l’implémentation ; ce n’est pas un script autonome.
values => new InjectionValue(CompactAttackNearest(values))Paramètres: notoriety (Any), distance (Any), body (Any), maxZ (Any)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
L’appel exécute le delegate du gestionnaire enregistré. La méthode d’enregistrement crée ce delegate lors de la construction de l’API.
Code interne de l’implémentation ; ce n’est pas un script autonome.
values => new InjectionValue(CompactAttackNearest(values))Paramètres: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
L’appel exécute le delegate du gestionnaire enregistré. La méthode d’enregistrement crée ce delegate lors de la construction de l’API.
Code interne de l’implémentation ; ce n’est pas un script autonome.
values => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color) — UO.AttackNearest(Any,Any,Any,Any,Any,Any)
Paramètres: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
L’appel exécute le delegate du gestionnaire enregistré. La méthode d’enregistrement crée ce delegate lors de la construction de l’API.
Code interne de l’implémentation ; ce n’est pas un script autonome.
values => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask) — UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any)
Paramètres: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
L’appel exécute le delegate du gestionnaire enregistré. La méthode d’enregistrement crée ce delegate lors de la construction de l’API.
Code interne de l’implémentation ; ce n’est pas un script autonome.
values => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly) — UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any,Any)
Paramètres: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any), aliveOnly (Any)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
L’appel exécute le delegate du gestionnaire enregistré. La méthode d’enregistrement crée ce delegate lors de la construction de l’API.
Code interne de l’implémentation ; ce n’est pas un script autonome.
values => new InjectionValue(CompactAttackNearest(values))
UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly) — UO.AttackNearest(Any,Any,Any,Any,Any,Any,Any,Any,Any)
Paramètres: notoriety (Any), distance (Any), body (Any), maxZ (Any), nearest (Any), color (Any), classMask (Any), aliveOnly (Any), visibleOnly (Any)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCompactSearchApi [AttackNearest]. -
InjectionScript.Runtime.InjectionApiUO.CompactAttackNearest:CompactAttackNearest(values).
L’appel exécute le delegate du gestionnaire enregistré. La méthode d’enregistrement crée ce delegate lors de la construction de l’API.
Code interne de l’implémentation ; ce n’est pas un script autonome.
values => new InjectionValue(CompactAttackNearest(values))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.BandageSelf();Place le personnage comme cible UO.Wait et utilise un bandage de type 0x0E21 sélectionné dans le sac à dos. L'opération est envoyée par le client et exécutée de manière asynchrone par le serveur.
Il n'y a pas de paramètres.
void. La méthode ne renvoie pas l'état du traitement et n'attend pas la fin du bandage.
- Le runtime définit la cible
Self, puis recherche dans le sac à dos l'élément correspondant le plus proche de type0x0E21à n'importe quel hue et l'utilise. Si le pansement n'est pas trouvé, la recherche le signale dans le journal système ; le résultat de la recherche n'est pas renvoyé au script appelant. La possibilité et le résultat du traitement dépendent de l'état du serveur sur le personnage.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
La commande forme une instruction séparée. Le message précédent indique le début de l’appel et ne confirme aucune action du serveur.
UO.Print("Calling UO.BandageSelf");
UO.BandageSelf();Paramètres et déroulement de l’exécution :
- Utilisez le bandage trouvé dans le sac à dos sur vous-même une fois.
UO.BandageSelf();2. Vérifiez d’abord la connexion, puis envoyez l’action ; l'appel n'attend pas la fin du traitement. - fonction de script
Paramètres et déroulement de l’exécution :
- Vérifiez d’abord la connexion, puis envoyez l’action ; l'appel n'attend pas la fin du traitement.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.Connected()))
{
UO.BandageSelf();
}
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. La procédure rapporte uniquement l’utilisation du bandage et ne rend pas compte du succès du traitement. - cours de script
Paramètres et déroulement de l’exécution :
- La procédure rapporte uniquement l’utilisation du bandage et ne rend pas compte du succès du traitement.
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()
{
ApplyBandage();
return null;
}
void ApplyBandage()
{
UO.BandageSelf();
}
}C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: Aucun paramètre.
Résultat: void / Unit.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.BandageSelf. -
InjectionScript.Runtime.InjectionApiUO.FindType:FindType(new InjectionValue(0x0e21), new InjectionValue(0), new InjectionValue("my")). -
InjectionScript.Runtime.InjectionApiUO.WaitTargetSelf:WaitTargetSelf(). -
InjectionScript.Runtime.InjectionApiUO.UseObject:UseObject(foundBandages). -
InjectionScript.Runtime.InjectionApiUO.SystemMessage:SystemMessage("No bandages found.").
Code interne de l’implémentation ; ce n’est pas un script autonome.
public void BandageSelf()
{
var foundBandages = FindType(new InjectionValue(0x0e21), new InjectionValue(0), new InjectionValue("my"));
if (foundBandages != string.Empty)
{
WaitTargetSelf();
UseObject(foundBandages);
}
else
SystemMessage("No bandages found.");
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.ClearClassMask();
int UO.ClearClassMask(object? name);Supprime une règle d'équipement personnalisée ou toutes les règles du runtime de script actuel. Utile avant de reconfigurer des ensembles ou de désactiver la priorité temporaire.
-
name— Nom facultatif transmis à SetClassMask. Le cas n'est pas important. Sans arguments, toutes les règles de ce runtime sont supprimées. Ce n'est pas une chaîne de priorité : "mage|tank" n'est pas autorisé ici ; supprimez-en un à la fois ou appelez sans arguments.
int — nombre de règles supprimées. Avec le nom 1 signifie supprimé, 0 - une telle règle n'existait pas. Sans arguments, 0..N, et non un indicateur booléen, est renvoyé. Par conséquent, comparez le résultat global avec > 0, et non avec true.
- N'annule pas une attaque déjà envoyée et n'arrête pas le script. Ne change pas l'équipement du personnage.
- Une fois supprimé, le nom reste inconnu du prochain AttackNearest. Supprimez-le également de classMask ou enregistrez-le à nouveau ; un nom inconnu bloque toute sélection.
- Les temps d'exécution des autres personnes et leurs règles ne sont pas affectés. Pour une recherche régulière sans cours, utilisez classMask=-1 plutôt que l'ensemble de vêtements obligatoire vide.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.ClearClassMask();
UO.Print("ClearClassMask: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- La suppression ne change pas d’arme et ne met pas fin au combat. Cela ne fait que modifier la classification ultérieure.
UO.SetClassMask("временный", 0x13B2);
UO.SetClassMask("основной", 0x1415);
UO.ClearClassMask("временный");
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "основной", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("main_enemy", enemy);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- supprimé — nombre de règles supprimées. Un nouvel ensemble est créé dans le même runtime, sans redémarrer le client.
return RunScenario();
object? RunScenario()
{
UO.SetClassMask("старый_набор", 0x13B2);
var removed = UO.ClearClassMask();
UO.SetClassMask("новый_набор", 0x0F50);
var enemy = UO.AttackNearest(5, 8, -1, 4, true, -1, "новый_набор", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("new_enemy", enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- Ne transmettez pas le nom distant : le résultat serait 0. -1 désactive uniquement les vêtements ; d'autres filtres continuent de fonctionner.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.SetClassMask("по_одежде", 0x13C4);
UO.ClearClassMask();
var classes = -1;
var enemy = UO.AttackNearest(5, 5, -1, 4, true, -1, classes, true, true);
if (Truth(enemy != 0))
{
UO.AddObject("enemy_without_classes", enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: Aucun paramètre.
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [ClearClassMask]. -
InjectionScript.Runtime.InjectionApiUO.ClearClassMask:ClearClassMask(null).
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.
args => new InjectionValue(ClearClassMask(null))Paramètres: name (Any)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [ClearClassMask]. -
InjectionScript.Runtime.InjectionApiUO.ClearClassMask:ClearClassMask(ReadClassName(args[0])). -
InjectionScript.Runtime.InjectionApiUO.ReadClassName:ReadClassName(args[0]).
L’appel exécute le delegate du gestionnaire enregistré. La méthode d’enregistrement crée ce delegate lors de la construction de l’API.
Code interne de l’implémentation ; ce n’est pas un script autonome.
args => new InjectionValue(ClearClassMask(ReadClassName(args[0])))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetAbilityID(object? abilityName);Résout un nom de capacité d'arme ou une chaîne numérique dans le répertoire client ID.
-
abilityName- string : nom AbilityData, enum Nom de la capacité ou décimal ID. Les espaces/ponctuations sont supprimés lors de la comparaison des noms et ne sont pas sensibles à la casse.
int 1..AbilityData.Abilities.Length - capacité connue ; 0 est un nom inconnu, une chaîne normalisée vide ou un ID numérique en dehors du répertoire.
- ResolveClassicUOAbilityId analyse d'abord la décimale int, puis compare le répertoire normalisé et les noms d'énumération. La commande n'active pas la capacité et ne vérifie pas la compatibilité avec l'arme actuelle.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.GetAbilityID("Armor Ignore");
UO.Print("GetAbilityID: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- Le nombre représente le ID du catalogue, pas l'utilisation de la capacité.
var id = UO.GetAbilityID("Armor Ignore");
UO.Print(Convert.ToString(id));Paramètres et déroulement de l’exécution :
- La ligne 1 parcourt le chemin numérique du résolveur.
return RunScenario();
object? RunScenario()
{
var id = UO.GetAbilityID("1");
UO.Print(Convert.ToString(id));
return null;
}Paramètres et déroulement de l’exécution :
- Un nom manquant renvoie 0.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var id = UO.GetAbilityID("unknown-example-ability");
UO.Print(Convert.ToString(id));
return null;
}
}C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: abilityName (String)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetAbilityID. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ResolveAbility:bridge.ResolveAbility(abilityName).
Code interne de l’implémentation ; ce n’est pas un script autonome.
public int GetAbilityID(string abilityName) => bridge.ResolveAbility(abilityName);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.GetAbilityName(object? abilityId);Renvoie le nom de la capacité d'une arme depuis son répertoire ID.
-
abilityId- int : l'indexation ID commence par 1 ; le pont indique AbilityData.Abilities[abilityId-1].
string nom du répertoire. Pour ID inférieur à 1 ou supérieur à la longueur du répertoire, une chaîne vide est renvoyée.
- La lecture est locale et n'active pas la capacité. ID du catalogue ne signifie pas que la capacité est présente dans l'arme actuelle.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.GetAbilityName(1);
UO.Print("GetAbilityName: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- ID 1 correspond au premier élément du répertoire.
var name = UO.GetAbilityName(1);
UO.Print(name);Paramètres et déroulement de l’exécution :
- Le nom est renvoyé en fonction de ID trouvé par le résolveur.
return RunScenario();
object? RunScenario()
{
var id = UO.GetAbilityID("Armor Ignore");
if (Truth(id > 0))
{
UO.Print(UO.GetAbilityName(id));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- ID 0 renvoie une chaîne de longueur 0.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var name = UO.GetAbilityName(0);
UO.Print(Convert.ToString(Len(name)));
return null;
}
int Len(object? value) => Convert.ToString(value)?.Length ?? 0;
}C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: abilityId (Integer)
Résultat: string / String.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetAbilityName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetAbilityName:bridge.GetAbilityName(abilityId).
Code interne de l’implémentation ; ce n’est pas un script autonome.
public string GetAbilityName(int abilityId) => bridge.GetAbilityName(abilityId);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetActiveAbility();Lit le nom de la capacité de combat activée de votre personnage.
Il n'y a pas de paramètres.
string est le nom anglais de la capacité activée, par exemple Armor Ignore. Chaîne "0" si aucune capacité n'est activée ou si un personnage est manquant. Ce n'est pas un int 0, ni une capacité ID, ni une confirmation d'un coup réussi.
- Les drapeaux PrimaryAbility/SecondaryAbility du caractère courant sont lus. Si les deux sont actifs, la capacité principale est choisie. L'indicateur d'activité est supprimé du numéro avant la recherche du nom.
- Les données sont lues localement ; le getter lui-même n'active pas la capacité et ne consomme pas de mana. Après l'attaque, le serveur peut supprimer l'activation.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.GetActiveAbility();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- Il n’y a pas d’arguments ; le caractère du client actuel est lu.
- S'il n'y a pas d'activation, la chaîne 0 est imprimée.
var name = UO.GetActiveAbility();
UO.Print(name);Paramètres et déroulement de l’exécution :
- La comparaison se fait avec la chaîne 0. UsePrimaryAbility est appelé séparément.
- Il s'agit d'une demande d'activation et non d'une preuve d'une frappe réussie. La disponibilité dépend des armes et des règles du serveur.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.GetActiveAbility() == "0"))
{
UO.UsePrimaryAbility();
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- GetAbilityID reçoit le nom renvoyé par le getter.
- La capacité ID n'est pas l'arme ou le personnage serial. Premièrement, l’absence de capacité active est exclue.
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 name = UO.GetActiveAbility();
if (Truth(name != "0"))
{
var id = UO.GetAbilityID(name);
UO.Print("Ability ID: " + Convert.ToString(id));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: Aucun paramètre.
Résultat: dynamic / Any.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetActiveAbility:bridge.GetActiveAbility().
Code interne de l’implémentation ; ce n’est pas un script autonome.
case "getactiveability": return new InjectionValue(bridge.GetActiveAbility());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetWeaponAbilities();Bridge lit Player.Abilities, applique ((byte)valeur & 0x7F), stocke ID positif dans l'ordre d'origine.
Il n'y a pas de paramètres.
Tableau de capacités int positives ID de l'arme actuelle. Le drapeau haut 0x80 est supprimé ; les valeurs nulles sont exclues. Sans Player - un tableau vide.
- Bridge lit Player.Abilities, applique ((byte)valeur & 0x7F), stocke ID positif dans l'ordre d'origine. Renvoie le ID disponible, pas le fait du mode actif ni les noms.
- Lit l'état local actuel. Il n’y a pas de package, de cible ou de mise à jour automatique ; les lectures individuelles peuvent voir différents états.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.GetWeaponAbilities();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- Bridge lit Player.Abilities, applique ((byte)valeur & 0x7F), stocke ID positif dans l'ordre d'origine.
var abilities = UO.GetWeaponAbilities();
UO.Print(UO.GetArrayLength(abilities));Paramètres et déroulement de l’exécution :
- Bridge lit Player.Abilities, applique ((byte)valeur & 0x7F), stocke ID positif dans l'ordre d'origine. Renvoie le ID disponible, pas le fait du mode actif ni les noms.
return RunScenario();
object? RunScenario()
{
var abilities = UO.GetWeaponAbilities();
if (Truth(UO.GetArrayLength(abilities) > 0))
{
UO.Print(UO.GetAbilityName(abilities[0]));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- Lit l'état local actuel. Il n’y a pas de package, de cible ou de mise à jour automatique ; les lectures individuelles peuvent voir différents états.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.GetWeaponAbilities();
UO.Wait(500);
var after = UO.GetWeaponAbilities();
UO.Print(before);
UO.Print(after);
return null;
}
}C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: Aucun paramètre.
Résultat: dynamic / Any.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.GetWeaponAbilities. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetWeaponAbilities:bridge.GetWeaponAbilities().
Code interne de l’implémentation ; ce n’est pas un script autonome.
public InjectionValue GetWeaponAbilities() => new InjectionValue(
(bridge.GetWeaponAbilities() ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.IsWarMode(object? objID);Vérifie la position de combat du mobile.
-
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 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.
int 1 — le mobile chargé a l'attribut InWarMode. int 0 - l'attribut est manquant, l'objet n'est pas mobile, inconnu ou supprimé. Ne vous dit pas qui le personnage attaque et n'active pas le mode combat. La lecture du mode étranger est limitée aux données reçues du 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é.
- 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.
- Ne vous dit pas qui le personnage attaque et n'active pas le mode combat. La lecture du mode étranger est limitée aux données reçues du serveur.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.IsWarMode("self");
UO.Print("IsWarMode: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- L'argument self sélectionne explicitement son caractère. état - 1/0 uniquement.
- Ne vous dit pas qui le personnage attaque et n'active pas le mode combat. La lecture du mode étranger est limitée aux données reçues du serveur.
var state = UO.IsWarMode("self");
if (Truth(state))
{
UO.Print("Combat stance is active");
}
else
{
UO.Print("Combat stance is inactive");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- 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 InWarMode. 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.IsWarMode(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;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.IsWarMode(target);
await Delay(500);
if (Truth(UO.IsNPC(target)))
{
var after = UO.IsWarMode(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;
}C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: objID (Any)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsWarMode:bridge.IsWarMode(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.WarMode:WarMode().
Code interne de l’implémentation ; ce n’est pas un script autonome.
case "iswarmode": return new InjectionValue(arguments.Length > 0 ? bridge.IsWarMode(Arg(0)) : WarMode());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.LastAttack();Lit serial de la dernière cible d'attaque.
Il n'y a pas de paramètres.
int — enregistré serial ; 0 signifie que serial n'est pas installé. Ce n'est pas bool ni graphic/type ; un ID différent de zéro peut ne plus exister dans le monde.
- Source du champ : pont.LastAttack. La commande ne sélectionne, n’utilise ou n’attaque pas l’objet.
- Lit l'état local actuel. Il n’y a pas de package, de cible ou de mise à jour automatique ; les lectures individuelles peuvent voir différents états.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.LastAttack();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- Lit serial de la dernière cible d'attaque.
var id = UO.LastAttack();
UO.Print(Hex(id));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");Paramètres et déroulement de l’exécution :
- Source du champ : pont.LastAttack. La commande ne sélectionne, n’utilise ou n’attaque pas l’objet.
return RunScenario();
object? RunScenario()
{
var id = UO.LastAttack();
if (Truth(id != 0) && Truth(UO.Exists(id)))
{
UO.Print(UO.GetName(id));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- Lit l'état local actuel. Il n’y a pas de package, de cible ou de mise à jour automatique ; les lectures individuelles peuvent voir différents états.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.LastAttack();
UO.Wait(500);
var after = UO.LastAttack();
UO.Print(before = after);
return null;
}
}C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: Aucun paramètre.
Résultat: dynamic / Any.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastAttack:bridge.LastAttack.
Code interne de l’implémentation ; ce n’est pas un script autonome.
case "lastattack":
case "wartargetid": return new InjectionValue(bridge.LastAttack);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.SetClassMask(object? name, object? required);
int UO.SetClassMask(object? name, object? required, object? forbidden);Crée ou remplace une classe d'équipement personnalisée pour classMask dans UO.AttackNearest. Vous choisissez un nom et des choses graphic/type ; les titres de poste intégrés ne sont pas requis.
-
name— Une chaîne non vide avec votre nom, par exemple "DTMH", "my_group", "archer_with_shield". La casse n'a pas d'importance, les espaces autour des bords sont supprimés. | , ; interdit : ce sont des séparateurs prioritaires. any/all/-1 sont réservés à la désactivation du filtre. -
required— Un type, un tableau plat d'alternatives ou un tableau de groupes obligatoires. Chaque groupe est type ou un tableau plat. Vous avez besoin d'au moins une chose de chaque groupe ; Les groupes obligatoires vides ne sont pas autorisés. Chaque type est une chaîne int/numérique/hexadécimale 1..65534. L'imbrication plus profonde qu'un ensemble de groupes n'est pas acceptée. Ce sont des choses graphic, pas des caractères serial et non body. -
forbidden— type facultatif ou tableau plat de types illégaux. Par défaut, il n’y a aucun élément interdit ; un tableau vide est également autorisé. Si un tel article est porté, la règle ne correspond pas. Les mêmes limites 1..65534 ; -1/any ne sont pas acceptés ici. Il est impossible d’interdire complètement toutes les alternatives à un groupe obligatoire.
int 1 - la règle a été vérifiée et enregistrée. Un type/nom non valide/un groupe requis vide/une incohérence provoque une erreur de script, qui peut être détectée par try/CATCH ; la règle précédente demeure. Ne renvoie pas serial ou les caractères trouvés, et ne démarre pas d'attaque.
- Le nom est une étiquette personnalisée, pas un métier de serveur. Vous pouvez appeler la règle DTMH, my_group ou tout autre mot. Le moteur ne détermine pas les compétences/classes sur le serveur par nom de personnage.
- En cas d'obligation, un type ou un tableau plat signifie au moins un élément de la liste. Un tableau de groupes signifie : vous avez besoin d’au moins un élément de CHAQUE groupe. Par exemple, [cuir, douelles] nécessite du cuir ET un bâton. Il s’agit d’un ensemble d’alternatives et non d’une obligation de porter toute la garde-robe répertoriée.
- Tout objet porté depuis l'interdit exclut le personnage de cette règle, même si les conditions requises sont remplies. Le cuir et une chaîne interdite ne satisfont pas à la règle du cuir. D'autres règles continuent d'être testées.
- Seuls les articles chargés portés sur les couches 1..24 à l'exception du sac à dos 21 sont comptés. Le contenu du sac à dos/coffre, de la monture 25, du magazine 26..28 et de la banque 29 ne sont pas considérés comme des vêtements. Compare graphic/type ; Les éléments serial, nom et hue ne sont pas utilisés ici.
- La liste ne correspond pas sans l’équipement approprié chargé. L'absence d'un élément interdit dans les données locales ne prouve pas son absence sur le serveur si le serveur n'a pas encore envoyé le matériel. Le client ne devine pas les données cachées.
- Les règles appartiennent à un script d'exécution, y compris ses fonctions et Comprend ; ne sont pas transférés vers d'autres lancements indépendants et ne sont pas enregistrés dans le profil. Au redémarrage, définissez-les à nouveau, par exemple par la procédure générale de configuration. Un SetClassMask répété remplace la règle du même nom, seulement après que les nouvelles données ont été entièrement vérifiées.
- Les tableaux sont copiés lors de l'enregistrement. Changer le tableau d'origine ne change pas la règle : répétez SetClassMask. Plusieurs règles de correspondance sont résolues par l'ordre des noms dans classMask. Il n’existe pas de tables standard pour les vêtements des serveurs.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.SetClassMask("simple_sword", 0x0F5E);
UO.Print("SetClassMask: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- DTMH - juste votre nom. Les valeurs dans myLeather/forbiddenChain sont des exemples : remplacez/complétez par le vrai graphic de votre serveur. Une liste plate signifie OR, pas un ensemble complet.
var myLeather = Gear(0x13C4, 0x13C7);
var forbiddenChain = Gear(0x13BF, 0x13C0);
UO.SetClassMask("DTMH", myLeather, forbiddenChain);
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "DTMH", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("leather_enemy", enemy);
}
dynamic Gear(params dynamic[] values)
{
return values;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- DTMH est sélectionné en premier ; seulement s'il n'y a pas de DTMH approprié - lourd, alors chasseur. DTMH sur les cellules 10 a la priorité sur lourd sur les cellules 2. Pour inverser l'ordre, modifiez la ligne classMask. Parmi les deux DTMH, le plus proche est sélectionné.
- Gear est une fonction utilisateur complètement réduite C#, pas une commande distincte UO. Les deux tableaux dans Gear (cuir, portées) forment deux groupes obligatoires. L'ajout d'un type au cuir élargit les alternatives ; ne nécessite pas le port de deux articles en cuir.
return RunScenario();
object? RunScenario()
{
var leather = Gear(0x13C4, 0x13C7);
var staves = Gear(0x0DF0, 0x0E81);
var chain = Gear(0x13BF, 0x13C0);
var plate = Gear(0x1415, 0x1411);
var bows = Gear(0x13B2, 0x0F50);
UO.SetClassMask("DTMH", Gear(leather, staves), chain);
UO.SetClassMask("охотник", bows);
UO.SetClassMask("тяжёлый", plate);
var notoriety = "5|6";
var distance = 12;
var body = -1;
var maxZ = 8;
dynamic nearest = true;
var color = -1;
var classMask = "DTMH|тяжёлый|охотник";
dynamic aliveOnly = true;
dynamic visibleOnly = true;
var enemy = UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly);
if (Truth(enemy == 0))
{
UO.Print("No matching enemy; no attack sent");
return null;
}
UO.AddObject("selected_enemy", enemy);
return null;
}
dynamic Gear(params dynamic[] values)
{
return values;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- déclarer la variable requise[1] crée deux éléments avec les index 0 et 1. Les deux groupes imbriqués nécessitent un torse ET une arme ; plat [torsoType,weaponType] signifierait torse OU arme.
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()
{
dynamic[] required = new dynamic[checked((int)(1) + 1)];
dynamic[] torso = new dynamic[checked((int)(0) + 1)];
dynamic[] weapon = new dynamic[checked((int)(0) + 1)];
torso[0] = 0x13C4;
weapon[0] = 0x0DF0;
required[0] = torso;
required[1] = weapon;
UO.SetClassMask("мой_комплект", required);
var enemy = UO.AttackNearest(5, 6, -1, 4, true, -1, "мой_комплект", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("outfit_enemy", enemy);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}Paramètres et déroulement de l’exécution :
- La réinscription remplace une copie du règlement. L'ancien nom reste le même, il n'est donc pas nécessaire de réécrire la ligne de priorité.
dynamic[] allowed = new dynamic[checked((int)(0) + 1)];
allowed[0] = 0x13B2;
UO.SetClassMask("приоритетный", allowed);
allowed[0] = 0x0F50;
UO.SetClassMask("приоритетный", allowed);
var enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "приоритетный", true, true);
if (Truth(enemy != 0))
{
UO.AddObject("updated_outfit", enemy);
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: name (Any), required (Any)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [SetClassMask]. -
InjectionScript.Runtime.InjectionApiUO.SetClassMask:SetClassMask(args).
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.
args => new InjectionValue(SetClassMask(args))Paramètres: name (Any), required (Any), forbidden (Any)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.RegisterClassMaskApi [SetClassMask]. -
InjectionScript.Runtime.InjectionApiUO.SetClassMask:SetClassMask(args).
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.
args => new InjectionValue(SetClassMask(args))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetWarMode(object? value);Demande le mode combat ou pacifique du personnage.
-
value- 0 - mode paisible ; tout entier non nul est le mode combat.
void - aucune valeur. Appelez sur une ligne séparée ; l'achèvement ne confirme pas l'action du serveur.
- WarMode passe le mode à GameActions.ToggleWarMode : 0 désactive, toute valeur non nulle est activée. Sans Player, il n'y a pas d'action.
- Bridge envoie la requête sur le flux du jeu. Les règles du serveur s'appliquent ; Il n’y a pas d’attente de confirmation intégrée.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
La commande forme une instruction séparée. Le message précédent indique le début de l’appel et ne confirme aucune action du serveur.
UO.Print("Calling UO.SetWarMode");
UO.SetWarMode(1);Paramètres et déroulement de l’exécution :
- Demande le mode combat ou pacifique du personnage.
UO.SetWarMode(1);Paramètres et déroulement de l’exécution :
- WarMode passe le mode à GameActions.ToggleWarMode : 0 désactive, toute valeur non nulle est activée. Sans Player, il n'y a pas d'action.
return RunScenario();
object? RunScenario()
{
UO.SetWarMode(0);
return null;
}Paramètres et déroulement de l’exécution :
- Bridge envoie la requête sur le flux du jeu. Les règles du serveur s'appliquent ; Il n’y a pas d’attente de confirmation intégrée.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
ApplyMode(1);
return null;
}
void ApplyMode(dynamic mode)
{
UO.SetWarMode(mode);
}
}C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: value (Any)
Résultat: void / Unit.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.WarMode:WarMode(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Code interne de l’implémentation ; ce n’est pas un script autonome.
case "setwarmode": WarMode(Arg(0)); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.Specmove(object? direction);
void UO.Specmove(object? direction, object? running);Envoie une requête en une étape directement au pont.
-
direction— int ; direction & 7 jour 0..7 N,NE,E,SE,S,SW,W,NW. -
running- Indicateur numérique facultatif int : 0/aucun - marche, non nul - course.
void - aucune valeur. Appelez sur une ligne séparée ; l'achèvement ne confirme pas l'action du serveur.
- ExecuteLegacyManualAlias appelle bridge.Step(direction & 7, running != 0) et supprime tous les codes de résultat 0/2/3/4/5/7 ; void revient dehors. Il s’agit d’un pas/tour, pas d’un itinéraire. L'attente entre Step et 10000 ms est maintenue, mais le script ne reçoit pas d'accusé de réception, d'échec ou de code de délai d'attente.
- La branche ne remplit pas les conditions d'exécution MoveCheckStamina/MoveExitOnDisconnect/MoveOpenDoor de UO.Step. Bridge/Player.Walk lui-même et le serveur vérifient toujours le mouvement.
- QueueStep sur le flux de jeu vérifie le joueur, la connexion, la direction, la file d'attente, le tempo et le trafic local. Avant Player.Walk, chaque appel enregistre séparément les générations Confirm/Deny de sa séquence et de Walker ; renvoie ensuite le résultat avec cet instantané. Step et en attente StepControlled vérifient uniquement cette paire stockée, pas les champs communs de la requête suivante ; le joueur/marcheur remplaçant termine l'attente par un refus général. La confirmation d'une autre commande régulière ne confirme pas cette étape. La rotation sans mouvement reste un cas à part.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
La commande forme une instruction séparée. Le message précédent indique le début de l’appel et ne confirme aucune action du serveur.
UO.Print("Calling UO.Specmove");
UO.Specmove(0);Paramètres et déroulement de l’exécution :
- Envoie une requête en une étape directement au pont.
UO.Specmove(0);Paramètres et déroulement de l’exécution :
- ExecuteLegacyManualAlias appelle bridge.Step(direction&7,running!=0), puis rejette le 1/0 renvoyé. Il s'agit d'une étape, pas d'un chemin vers une coordonnée.
return RunScenario();
object? RunScenario()
{
UO.Specmove(2, 1);
return null;
}Paramètres et déroulement de l’exécution :
- La branche ne remplit pas les conditions d'exécution MoveCheckStamina/MoveExitOnDisconnect/MoveOpenDoor de UO.Step. Bridge/Player.Walk lui-même et le serveur vérifient toujours le mouvement.
Intervalle minimum de pas : marche - marche 400 ms, course 200 ms ; équitation - marche 200 ms, course 100 ms.
Il s'agit de limites client standard et non de paramètres automatiquement définis pour votre partition. La vitesse du serveur et les modes de vol sont comptés séparément. Les minuteries de script peuvent ralentir le mouvement, mais ne réduisent pas ces limites.
Les étapes, les itinéraires, Follow, les commandes souris/touches et la carte utilisent la file d'attente partagée du personnage. Le remplacement de l'itinéraire, le virage ou l'ajustement de la position par le serveur n'annule pas la pause restante après la demande d'étape. Après le délai, il n'y a pas de rafale rapide pour compenser les images perdues. L’attente de confirmation, les obstacles et une mauvaise communication peuvent ralentir le mouvement.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.GetX();
UO.Specmove(2, 0);
UO.Wait(500);
UO.Print(UO.GetX() - before);
return null;
}
}C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: direction (Any)
Résultat: void / Unit.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Step:bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0).
Code interne de l’implémentation ; ce n’est pas un script autonome.
case "specmove": bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0); break;Paramètres: direction (Any), running (Any)
Résultat: void / Unit.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Step:bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias::Arg:Arg(0).
Code interne de l’implémentation ; ce n’est pas un script autonome.
case "specmove": bridge.Step(Arg(0) & 7, arguments.Length > 1 && Arg(1) != 0); break;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.UseAbility(object? abilityId);Demande la capacité disponible pour l’arme actuelle.
-
abilityId- Le nom de la capacité ou int ID 1..AbilityData.Abilities.Length. Les noms sont normalisés : seuls les lettres/chiffres sont stockés et comparés en majuscules. Le texte numérique signifie ID.
Indicateur numérique int : 1 - ID correspond à la capacité primaire/secondaire du joueur actuel et le GameActions correspondant est appelé ; 0 - aucun joueur, inconnu ID/nom ou capacité n'appartient pas à l'arme actuelle.
- La forme chaîne utilise ResolveAbility ; pont numérique immédiatement.UseAbility. Bridge masque 0x80 de deux capacités actuelles et correspond à ID, puis appelle UsePrimaryAbility ou UseSecondaryAbility.
- Il s'agit d'une acceptation d'une demande locale, et non d'une confirmation d'un succès, d'une dépense de mana ou d'une activation par le serveur. Les ID disponibles sont lus GetWeaponAbilities, le nom actif est GetActiveAbility.
- GameActions bascule le bit de sélection de capacité 0x80. Une capacité déjà sélectionnée envoie ID 0 et la désélectionne ; sinon, les deux bits de sélection sont effacés, le ID sélectionné est envoyé, puis son bit est défini localement. Par conséquent, l’appeler à nouveau peut désactiver cette capacité. Un changement local ne signifie pas un hit réussi ou une confirmation du serveur.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.UseAbility("Armor Ignore");
UO.Print("UseAbility: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- Demande la capacité disponible pour l’arme actuelle.
UO.Print(UO.UseAbility("Armor Ignore"));Paramètres et déroulement de l’exécution :
- La forme chaîne utilise ResolveAbility ; pont numérique immédiatement.UseAbility. Bridge masque 0x80 de deux capacités actuelles et correspond à ID, puis appelle UsePrimaryAbility ou UseSecondaryAbility.
return RunScenario();
object? RunScenario()
{
var abilities = UO.GetWeaponAbilities();
if (Truth(UO.GetArrayLength(abilities) > 0))
{
UO.Print(UO.UseAbility(abilities[0]));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- Il s'agit d'une acceptation d'une demande locale, et non d'une confirmation d'un succès, d'une dépense de mana ou d'une activation par le serveur. Les ID disponibles sont lus GetWeaponAbilities, le nom actif est GetActiveAbility.
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 id = UO.GetAbilityID("Armor Ignore");
if (Truth(id > 0))
{
var accepted = UO.UseAbility(id);
UO.Print(accepted);
UO.Print(UO.GetActiveAbility());
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: abilityId (Integer/String)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.UseAbility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseAbility:bridge.UseAbility(abilityId).
Code interne de l’implémentation ; ce n’est pas un script autonome.
public int UseAbility(int abilityId) => bridge.UseAbility(abilityId);Paramètres: abilityId (Integer/String)
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.UseAbility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ResolveAbility:bridge.ResolveAbility(abilityName). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseAbility:bridge.UseAbility(abilityId).
Code interne de l’implémentation ; ce n’est pas un script autonome.
public int UseAbility(string abilityName)
{
int abilityId = bridge.ResolveAbility(abilityName);
return abilityId > 0 ? bridge.UseAbility(abilityId) : 0;
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UsePrimaryAbility();Invoque la capacité principale de l'arme.
Il n'y a pas de paramètres.
void - aucune valeur. Appelez sur une ligne séparée ; l'achèvement ne confirme pas l'action du serveur.
- UsePrimaryAbility transmet GameActions.UsePrimaryAbility(_world) via Invoke. Aucun signe d'acceptation n'est renvoyé ; la capacité active est vérifiée séparément.
- Dans les exemples, UO.Wait spécifie uniquement une pause de script ; la fin de la pause ne prouve pas que le serveur a complété la requête.
- GameActions bascule le bit de sélection de capacité 0x80. Une capacité déjà sélectionnée envoie ID 0 et la désélectionne ; sinon, les deux bits de sélection sont effacés, le ID sélectionné est envoyé, puis son bit est défini localement. Par conséquent, l’appeler à nouveau peut désactiver cette capacité. Un changement local ne signifie pas un hit réussi ou une confirmation du serveur.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
La commande forme une instruction séparée. Le message précédent indique le début de l’appel et ne confirme aucune action du serveur.
UO.Print("Calling UO.UsePrimaryAbility");
UO.UsePrimaryAbility();Paramètres et déroulement de l’exécution :
- Invoque la capacité principale de l'arme.
UO.UsePrimaryAbility();Paramètres et déroulement de l’exécution :
- UsePrimaryAbility transmet GameActions.UsePrimaryAbility(_world) via Invoke. Aucun signe d'acceptation n'est renvoyé ; la capacité active est vérifiée séparément.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.GetWeaponAbilities());
UO.UsePrimaryAbility();
return null;
}Paramètres et déroulement de l’exécution :
- Dans les exemples, UO.Wait spécifie uniquement une pause de script ; la fin de la pause ne prouve pas que le serveur a complété la requête.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.UsePrimaryAbility();
UO.Print(UO.GetActiveAbility());
return null;
}
}C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: Aucun paramètre.
Résultat: void / Unit.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UsePrimaryAbility:bridge.UsePrimaryAbility().
Code interne de l’implémentation ; ce n’est pas un script autonome.
case "useprimaryability": bridge.UsePrimaryAbility(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.UseSecondaryAbility();Invoque une capacité d'arme supplémentaire.
Il n'y a pas de paramètres.
void - aucune valeur. Appelez sur une ligne séparée ; l'achèvement ne confirme pas l'action du serveur.
- UseSecondaryAbility transmet GameActions.UseSecondaryAbility(_world) via Invoke. Aucun signe d'acceptation n'est renvoyé ; la capacité active est vérifiée séparément.
- Dans les exemples, UO.Wait spécifie uniquement une pause de script ; la fin de la pause ne prouve pas que le serveur a complété la requête.
- GameActions bascule le bit de sélection de capacité 0x80. Une capacité déjà sélectionnée envoie ID 0 et la désélectionne ; sinon, les deux bits de sélection sont effacés, le ID sélectionné est envoyé, puis son bit est défini localement. Par conséquent, l’appeler à nouveau peut désactiver cette capacité. Un changement local ne signifie pas un hit réussi ou une confirmation du serveur.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
La commande forme une instruction séparée. Le message précédent indique le début de l’appel et ne confirme aucune action du serveur.
UO.Print("Calling UO.UseSecondaryAbility");
UO.UseSecondaryAbility();Paramètres et déroulement de l’exécution :
- Invoque une capacité d'arme supplémentaire.
UO.UseSecondaryAbility();Paramètres et déroulement de l’exécution :
- UseSecondaryAbility transmet GameActions.UseSecondaryAbility(_world) via Invoke. Aucun signe d'acceptation n'est renvoyé ; la capacité active est vérifiée séparément.
return RunScenario();
object? RunScenario()
{
UO.Print(UO.GetWeaponAbilities());
UO.UseSecondaryAbility();
return null;
}Paramètres et déroulement de l’exécution :
- Dans les exemples, UO.Wait spécifie uniquement une pause de script ; la fin de la pause ne prouve pas que le serveur a complété la requête.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.UseSecondaryAbility();
UO.Print(UO.GetActiveAbility());
return null;
}
}C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: Aucun paramètre.
Résultat: void / Unit.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.UseSecondaryAbility:bridge.UseSecondaryAbility().
Code interne de l’implémentation ; ce n’est pas un script autonome.
case "usesecondaryability": bridge.UseSecondaryAbility(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.WarMode();
void UO.WarMode(object? mode);Lit ou interroge le mode de combat du personnage.
-
mode- Facultatif int : 0 est désactivé, toute valeur non nulle est activée. Le formulaire sans arguments lit uniquement.
Aucun argument Drapeau numérique int : 1 - Joueur actuel en mode combat, 0 - mode paisible/aucun joueur. Avec le mode - null, il n'y a aucun résultat.
- WarMode() lit Player.InWarMode localement. WarMode(mode) appelle GameActions.ToggleWarMode avec le mode sélectionné ; sans Player, la demande n'est pas exécutée.
- N'attribuez pas le résultat d'un formulaire avec un argument à une variable. Une relecture immédiate ne constitue pas une confirmation en ligne.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
var result = UO.WarMode();
UO.Print("WarMode: " + Convert.ToString(result));Paramètres et déroulement de l’exécution :
- Lit ou interroge le mode de combat du personnage.
var active = UO.WarMode();
UO.Print(active);Paramètres et déroulement de l’exécution :
- WarMode() lit Player.InWarMode localement. WarMode(mode) appelle GameActions.ToggleWarMode avec le mode sélectionné ; sans Player, la demande n'est pas exécutée.
return RunScenario();
object? RunScenario()
{
UO.WarMode(1);
UO.Wait(250);
UO.Print(UO.WarMode());
return null;
}Paramètres et déroulement de l’exécution :
- N'attribuez pas le résultat d'un formulaire avec un argument à une variable. Une relecture immédiate ne constitue pas une confirmation en ligne.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.WarMode();
UO.WarMode(0);
UO.Print(before);
return null;
}
}C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: Aucun paramètre.
Résultat: int / Integer.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.WarMode. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WarMode:bridge.WarMode().
Code interne de l’implémentation ; ce n’est pas un script autonome.
public int WarMode() => bridge.WarMode();Paramètres: mode (Integer)
Résultat: void / Unit.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.WarMode. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WarMode:bridge.WarMode(mode).
Code interne de l’implémentation ; ce n’est pas un script autonome.
public void WarMode(int mode) => bridge.WarMode(mode);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.WarTargetID();Lit serial de la dernière cible d'attaque.
Il n'y a pas de paramètres.
int — enregistré serial ; 0 signifie que serial n'est pas installé. Ce n'est pas bool ni graphic/type ; un ID différent de zéro peut ne plus exister dans le monde.
- Source du champ : pont.LastAttack. La commande ne sélectionne, n’utilise ou n’attaque pas l’objet.
- Lit l'état local actuel. Il n’y a pas de package, de cible ou de mise à jour automatique ; les lectures individuelles peuvent voir différents états.
Chaque exemple peut être enregistré dans un fichier séparé .csx et exécuté dans IDE. Les fonctions d'objet UO et d'attente fournissent l'hôte de la session de jeu en cours. Remplacez les noms, coordonnées et adresses de la démo serial par les vôtres.
Exécutez ce code dans un fichier .csx séparé. Les arguments sont visibles dans l’appel ; remplacez les noms, serials et adresses d’exemple par les vôtres.
Le résultat d’un seul appel est affiché dans le journal. Un nombre n’est pas converti en bool ; un tableau est affiché par son nombre d’éléments.
object? result = UO.WarTargetID();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Paramètres et déroulement de l’exécution :
- Lit serial de la dernière cible d'attaque.
var id = UO.WarTargetID();
UO.Print(Hex(id));
string Hex(object? value) => Convert.ToInt64(value).ToString("X");Paramètres et déroulement de l’exécution :
- Source du champ : pont.LastAttack. La commande ne sélectionne, n’utilise ou n’attaque pas l’objet.
return RunScenario();
object? RunScenario()
{
var id = UO.WarTargetID();
if (Truth(id != 0) && Truth(UO.Exists(id)))
{
UO.Print(UO.GetName(id));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Paramètres et déroulement de l’exécution :
- Lit l'état local actuel. Il n’y a pas de package, de cible ou de mise à jour automatique ; les lectures individuelles peuvent voir différents états.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.WarTargetID();
UO.Wait(500);
var after = UO.WarTargetID();
UO.Print(before = after);
return null;
}
}C# distingue les majuscules. Utilisez le nom UO exact. Comparez les indicateurs numériques à 0 ; utilisez bool seulement si la signature renvoie bool.
Paramètres: Aucun paramètre.
Résultat: dynamic / Any.
Pendant un appel:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.LastAttack:bridge.LastAttack.
Code interne de l’implémentation ; ce n’est pas un script autonome.
case "lastattack":
case "wartargetid": return new InjectionValue(bridge.LastAttack);ClassicUO — Bad Newbie & C# Scripts IDE