IT UO Topic world geometry - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

Mondo e geometria

Home · C# · IDE · UO API · A–Z · Esempi · Lingue

Coordinate, distanze, linea di vista, capacità di attraversare il paese e dati cartografici. Ottenere un percorso è descritto separatamente in Movimento.

Sezioni

Argomento Comandi e spiegazioni
X / Y / Z UO.GetX · UO.GetY · UO.GetZ
Distance UO.GetDistance · UO.Dist
LOS UO.CheckLOS · UO.LOSOptions
World Number UO.WorldNum
World Cells UO.GetWorldCell · UO.GetWorldTilesArray
Passability UO.IsWorldCellPassable · UO.GetNextStepZ
Surface Z UO.GetSurfaceZ
Map Cells UO.GetMapCell
Land Tiles UO.GetLandTileAt · UO.GetLandTileData · UO.GetLandTilesArray · UO.GetLandTilesArrayEx
Static Tiles UO.GetStaticTileAt · UO.GetStaticTileData · UO.GetStaticTiles · UO.GetStaticTilesArray · UO.GetStaticTilesArrayEx
Tile Flags UO.GetTileFlags · UO.ConvertIntegerToFlags
Tile Height UO.GetTileHeight
Tile Layer UO.GetTileLayer
Tile Name UO.GetTileName
Water Tiles UO.IsWaterTile
Tree Tiles UO.IsTreeTile
Mine Tiles UO.IsMineTile

Tutti i comandi del tema

X / Y / Z

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

Distanza

UO.Dist · UO.GetDistance

LOS

UO.CheckLOS · UO.LOSOptions

Numero mondiale

UO.WorldNum · UO.GetWorldNum

Cellule del mondo/Passabilità

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

Tessere Terra

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

Piastrelle statiche

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

Proprietà delle tessere

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

Statica del cliente

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

Esempi sull'argomento

Ogni carta comando ha diversi scenari indipendenti: codice diretto, funzioni e classi. Di seguito sono selezionati brevi scenari; restrizioni e un'analisi completa sono nelle carte.

UO.GetDistance

Parametri, risultato e tutti gli scenari

var target = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(target)))
{
    var distance = UO.GetDistance(target);
    if (Truth(distance <= 2))
    {
        UO.Print("Target is within two tiles");
    }
}

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

UO.IsWorldCellPassable

Parametri, risultato e tutti gli scenari

var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var result = UO.IsWorldCellPassable(x,y,z,x+1,y,z,UO.WorldNum());
if (Truth(Truth(result[0]) == true))
{
    UO.Print("Passable, Z=" + Convert.ToString(result[1]));
}
else
{
    UO.Print("Blocked");
}

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

Parti del riferimento

1 · 2

Riferimento completo dei comandi


UO.AddUserStatic

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

Firme C#

dynamic UO.AddUserStatic(object? staticItem, object? worldNum);
int UO.AddUserStatic(object? graphic, object? x, object? y, object? z, object? hue, object? map);

Aggiunge una voce statica personalizzata allo stato dello script locale. Il numerico graphic viene utilizzato per il controllo degli ostacoli locali da parte del pathfinder; l'oggetto non viene creato sul server. Una chiamata a due argomenti con testo non numerato preserva i valori legacy e non aggiunge elettricità statica al pathfinder.

Parametri

  • staticItem: valore numerico graphic o testo precedente.
  • worldNum - indice della scheda per la registrazione o statico locale.
  • graphic — ID statico da 0 a 65535.
  • z — altezza. Quando aggiunto a Pathfinder, il valore è limitato all'intervallo di byte con segno.
  • hue - hue; quando aggiunto, limitato all'intervallo da 0 a 65535.
  • map — indice della mappa; per l'elaborazione manager, l'intervallo è limitato a 0–255.
  • x - Statistiche personalizzate del Mondo X; int. Il manager accetta le coordinate all'interno della mappa attualmente caricata.
  • y - Statistiche personalizzate del Mondo Y; int. Il manager accetta le coordinate all'interno della mappa attualmente caricata.

Valore restituito

Positivo ID della voce creata. Per la forma a sei parametri, i negativi graphic, x, y o map, così come graphic sopra 65535 danno come risultato -1. ID può essere passato a UO.UserStaticExists, UO.RemoveUserStatic o utilizzato per controllare/eliminare un record legacy. Il ID restituito di per sé non conferma che lo statico sarà visibile o applicato sul server.

Comportamento

    • UO.AddUserStatic('tree', 0) - poiché tree non è un numero, salva una coppia di valori originali come record legacy nello stato di runtime; pathfinder non lo usa.
  • Una chiamata a due parametri con il numerico graphic aggiunge lo statico di quel graphic alle coordinate attuali del personaggio, con z e hue 0 del personaggio.
  • La chiamata a sei parametri aggiunge una statica con i dati graphic, coordinate, altitudine, hue e mappa. Il pathfinding ne tiene conto solo sulla mappa attiva e in base ai flag graphic nei Tiledata del client.

Queste voci sono locali nel client di script: non creano un oggetto di gioco, non effettuano una richiesta di rete o modificano i dati di shard.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.AddUserStatic(0x0CCA, UO.GetWorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Salva la coppia come dati legacy; il testo StaticItem non crea un ostacolo al pathfinder. - sceneggiatura diretta

Parametri e flusso di esecuzione:

  • Salva la coppia come dati legacy; il testo StaticItem non crea un ostacolo al pathfinder.
var legacyId = UO.AddUserStatic("tree", 0);
UO.Print(Convert.ToString(legacyId));

2. Il numero graphic viene aggiunto alla posizione del personaggio sulla mappa corrente. - funzione di script

Parametri e flusso di esecuzione:

  • Il numero graphic viene aggiunto alla posizione del personaggio sulla mappa corrente.
return  RunScenario();
 object? RunScenario()
{
    var staticId = UO.AddUserStatic(0x0CCA, UO.GetWorldNum());
    UO.Print(Convert.ToString(staticId));
    return null;
}

3. Aggiungi esplicitamente lo statico locale graphic alla posizione specificata e alla mappa specificata. - lezione di sceneggiatura

Parametri e flusso di esecuzione:

  • Aggiungi esplicitamente lo statico locale graphic alla posizione specificata e alla mappa specificata.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var staticId = UO.AddUserStatic(0x0CCA, UO.GetX(), UO.GetY(), UO.GetZ(), 0, UO.GetWorldNum());
        UO.Print(Convert.ToString(staticId));
        return null;
    }
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: staticItem (Any), worldNum (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

case "adduserstatic":

                {

                    int map = Arg(1, bridge.WorldNumber);

                    if (arguments[0].Kind != InjectionValueKind.Array)

                    {

                        int graphic = 0;

                        if (arguments[0].Kind == InjectionValueKind.String &&

                            !NumberConversions.TryStr2Int(arguments[0].String, out graphic))

                        {

                            int legacyId = state.NextUserStaticId++;

                            state.UserStatics[legacyId] = Text(0) + "|" + Text(1);

                            return new InjectionValue(legacyId);

                        }

                        graphic = arguments[0].Kind == InjectionValueKind.String

                            ? graphic

                            : NumberConversions.ToInt(arguments[0]);

                        return new InjectionValue(AddUserStatic(graphic, bridge.GetX(bridge.Self), bridge.GetY(bridge.Self),

                            bridge.GetZ(bridge.Self), 0, map));

                    }

                    if (arguments[0].Array.Length < 4)

                        throw new NativeSubrutineException("AddUserStatic expects [graphic,x,y,z,color] and world number, or graphic,x,y,z,color,world.");

                    InjectionValue[] item = arguments[0].Array;

                    return new InjectionValue(AddUserStatic(

                        NumberConversions.ToInt(item[0]), NumberConversions.ToInt(item[1]), NumberConversions.ToInt(item[2]),

                        NumberConversions.ToInt(item[3]), item.Length > 4 ? NumberConversions.ToInt(item[4]) : 0, map));

                }

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

Parametri: graphic (Any), x (Any), y (Any), z (Any), hue (Any), map (Any)

Risultato: int / Integer.

Durante la chiamata:

La chiamata esegue il delegate del gestore memorizzato. Il metodo di registrazione lo crea durante la costruzione dell’API.

Codice interno di implementazione; non è uno script autonomo.

values => new InjectionValue(AddUserStatic(

                    NumberConversions.ToInt(values[0]), NumberConversions.ToInt(values[1]), NumberConversions.ToInt(values[2]),

                    NumberConversions.ToInt(values[3]), NumberConversions.ToInt(values[4]), NumberConversions.ToInt(values[5])))

UO.CheckLOS

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

Firme C#

dynamic UO.CheckLOS(object? xfrom, object? yfrom, object? zfrom, object? xto, object? yto, object? zto, object? worldNum);

Verifica la passabilità locale di una linea tra due punti sulla mappa tramite CheckPortableLineOfSight.

Parametri

  • xfrom — Sorgente X: 0..65535.
  • yfrom — Sorgente Y: 0..65535.
  • zfrom - Z iniziale, int.
  • xto - Fine X: 0..65535.
  • yto - Fine Y: 0..65535.
  • zto — Z finale, int.
  • worldNum - 0..255. Un raggio di lunghezza diversa da zero legge solo _world.Map/World.Map attualmente caricato: tramite CheckWorldStep è necessario WorldNum == _world.MapIndex e un Player.Pathfinder live. Un altro aspetto non è caricato o richiesto; non c'è mappa/personaggio/esploratore o il passaggio non è disponibile - 0. Escludendo X/Y identici si salta l'intero ciclo di celle: con X/Y in 0..65535, WorldNum in 0..255 e abs(Zfrom-Zto)<=20 restituisce 1 anche senza carta caricata o con un numero di carta diverso. Questa non è una prova della geometria o della raggiungibilità. Il risultato è locale, non una soluzione server LOS.

Valore restituito

int 1 — il raggio locale ha raggiunto X/Y e l'altezza finale differisce da Zto di non più di 20; 0—coordinate, ostacolo o limite di controllo non validi.

Comportamento

  • Il raggio viaggia utilizzando l'algoritmo di Bresenham, con un massimo di passi 4096. Su ciascuna cella vengono presi in considerazione BadLocations, CheckWorldStep e l'altezza restituita.
  • Quando LosOptions != 0 viene utilizzato inoltre CheckLosCell; bit 0x100 controlla entrambi i quadrati laterali della diagonale. Il controllo della geometria locale non convalida le regole LOS specifiche del server e non sposta nulla.
  • Il byte basso (valore & 0xFF) seleziona l'algoritmo 1..4; altri valori di byte bassi in CheckLosCell utilizzano l'algoritmo 3. Gli algoritmi 1/2 bloccano Muro e Invalicabile, 3 inoltre NoShoot e 4 abilita NoShoot solo con 0x200 e consente ostacoli Finestra solo con 0x400. Il bit 0x100 controlla inoltre entrambe le celle laterali di ciascun passaggio del raggio diagonale per qualsiasi algoritmo selezionato. value=0 disabilita i controlli aggiuntivi CheckLosCell/diagonale, ma rimangono BadLocations e CheckWorldStep. Ad esempio 4+0x100+0x200+0x400 seleziona personalizzato con tre flag; setter memorizza l'int originale, non l'algoritmo normalizzato.
  • Un raggio di lunghezza diversa da zero legge solo _world.Map/World.Map attualmente caricato: tramite CheckWorldStep è necessario WorldNum == _world.MapIndex e un Player.Pathfinder live. Un altro aspetto non è caricato o richiesto; non c'è mappa/personaggio/esploratore oppure il passaggio non è disponibile - 0. Escludendo X/Y identici si salta l'intero ciclo di celle: con X/Y in 0..65535, WorldNum in 0..255 e abs(Zfrom-Zto)<=20 restituisce 1 anche senza carta caricata o con un numero di carta diverso. Questa non è una prova della geometria o della raggiungibilità. Il risultato è locale, non una soluzione server LOS.
  • CheckLosCell ignora il Land/Static/Multi/Item caricato di una cella. Blocchi di terra invalicabili con abs(rayZ-land.Z)<=20. I flag Static/Multi/Item sono validi solo nell'intervallo tile.Z-2 .. tile.Z+max(1,Height)+2; La finestra personalizzata consentita viene saltata finché non viene selezionato Muro/Invalicabile/NoShoot. Il raggio X/Y utilizza Bresenham, massimo 4096 passi; Z è presa dalle superfici CheckWorldStep, non interpolata su Zto, la tolleranza dell'altezza finale è 20.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.CheckLOS(UO.X(), UO.Y(), UO.Z(), UO.X() + 1, UO.Y(), UO.Z(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Riga sulla cella corrente - script diretto

Parametri e flusso di esecuzione:

  • I punti identici passano all'interno della mappa X/Y accettabile.
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var visible = UO.CheckLOS(x,y,z,x,y,z,UO.WorldNum());
UO.Print(Convert.ToString(visible));

2. Controllo della cella adiacente - funzione dello script

Parametri e flusso di esecuzione:

  • L'altezza e la permeabilità della cella vicina vengono lette dalla mappa locale.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX();
    var y = UO.GetY();
    var z = UO.GetZ();
    var clear = UO.CheckLOS(x, y, z, x + 1, y, z, UO.WorldNum());
    UO.Print(Convert.ToString(clear));
    return null;
}

3. Coordinata non valida: classe di script

Parametri e flusso di esecuzione:

  • Una X negativa viene scartata con risultato 0 senza passare per la mappa.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var clear = UO.CheckLOS(-1, 0, 0, 0, 0, 0, 0);
        UO.Print(Convert.ToString(clear));
        return null;
    }
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

UO.CheckLOS(xfrom, yfrom, zfrom, xto, yto, zto, worldNum) — UO.CheckLOS(Any,Any,Any,Any,Any,Any,Any)

Parametri: xfrom (Any), yfrom (Any), zfrom (Any), xto (Any), yto (Any), zto (Any), worldNum (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

case "checklos": return new InjectionValue(CheckPortableLineOfSight(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), Arg(5), Arg(6)) ? 1 : 0);

UO.ClearUserStatics

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

Firme C#

void UO.ClearUserStatics();

Rimuove tutte le voci di runtime statiche dell'utente e gli oggetti del gestore statico locale.

Parametri

Non ci sono parametri.

Valore restituito

void: nessun valore restituito.

Comportamento

  • State.UserStatics e gli oggetti manager vengono cancellati. I file della mappa caricati e gli elementi del real server non vengono eliminati.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il comando è un’istruzione separata. Il messaggio precedente indica l’inizio della chiamata e non conferma un’azione del server.

UO.Print("Calling UO.ClearUserStatics");
UO.ClearUserStatics();

1. Stato chiaro: sceneggiatura diretta

Parametri e flusso di esecuzione:

  • Rimuove tutte le voci di runtime statiche dell'utente e gli oggetti del gestore statico locale.
UO.ClearUserStatics();

2. Cancella dopo l'installazione - funzione script

Parametri e flusso di esecuzione:

  • Aggiungi uno statico locale sulla cella corrente, quindi rimuovi tutti gli statici personalizzati.
return  RunScenario();
 object? RunScenario()
{
    var localStatic = UO.AddUserStatic(0x0CCA, UO.GetX(), UO.GetY(), UO.GetZ(), 0, UO.WorldNum());
    UO.ClearUserStatics();
    return null;
}

3. Rieliminazione: classe di script

Parametri e flusso di esecuzione:

  • La cancellazione di un set vuoto è accettabile e non crea una nuova impostazione.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.ClearUserStatics();
        UO.ClearUserStatics();
        return null;
    }
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

UO.ClearUserStatics() — UO.ClearUserStatics()

Parametri: Nessun parametro.

Risultato: void / Unit.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

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

UO.ConvertIntegerToFlags

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

Firme C#

dynamic UO.ConvertIntegerToFlags(object? group, object? value);

Analizza una maschera numerica di flag di riquadro in un array di nomi di enumerazione TileFlag.

Parametri

  • group - int: solo 1 o 2 abilitano la conversione; qualsiasi altro valore risulta in un array vuoto.
  • value — Una maschera che Arg converte in un int con segno 32-bit, quindi il bridge porta a ulong. Per i flag ad alto 64 bit, questo modulo non preserva la maschera completa.

Valore restituito

Matrice di stringhe denominate diverse da zero TileFlag i cui bit sono completamente presenti nella maschera. La maschera 0 produce un array vuoto.

Comportamento

  • I gruppi 1 e 2 utilizzano la stessa Enum.GetValues anziché directory diverse. Questa è una trasformazione della maschera locale; i Tiledata non sono richiesti.
  • La registrazione API utilizza object?, ma il dispatcher Arg(1) invia int. Il segno negativo int si estende quando lanciato a ulong. GetTileFlags restituisce anche solo i bit bassi 32 come firmati int: questa coppia compatibile non fornisce l'intero contratto Tiledata a 64 bit.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.ConvertIntegerToFlags(1, 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Maschera nulla: script diretto

Parametri e flusso di esecuzione:

  • Nella maschera 0 non è presente alcun flag diverso da zero.
var flags = UO.ConvertIntegerToFlags(1,0);
UO.Print(Convert.ToString(ArrayLength(flags)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. Maschera bit basso - Funzione script

Parametri e flusso di esecuzione:

  • L'array contiene i nomi reali TileFlag della maschera selezionata.
return  RunScenario();
 object? RunScenario()
{
    var flags = UO.ConvertIntegerToFlags(2, 1);
    for (int i = (int)(0); i <= ArrayLength(flags) - 1; i += (int)(1))
    {
        UO.Print(flags[i]);
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

3. Gruppo non valido - Classe script

Parametri e flusso di esecuzione:

  • Il gruppo 0 non è accettato da questo comando e restituisce un array vuoto.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var flags = UO.ConvertIntegerToFlags(0, 1);
        UO.Print(Convert.ToString(ArrayLength(flags)));
        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: group (Any), value (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

case "convertintegertoflags":

                    return new InjectionValue(bridge.ConvertTileFlags(Arg(0), Arg(1))

                        .Select(flag => new InjectionValue(flag)).ToArray());

UO.Dist

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

Firme C#

int UO.Dist(object? xfrom, object? yfrom, object? xto, object? yto);

Calcola la distanza in celle tra due punti del mondo: la maggiore delle differenze assolute tra X e Y.

Parametri

  • xfrom — Coordinata X del punto iniziale.
  • yfrom — Coordinata Y del punto iniziale.
  • xto — La coordinata di assegnazione X.
  • yto — La coordinata di assegnazione Y.

Valore restituito

int — distanza in celle, non negativa per coordinate valide. 0 significa lo stesso XY, 1 - una cella. Questa è una quantità, non un segno di successo. Una distanza di confronto separata <= 2 restituisce bool true o false; la distanza stessa rimane int.

Comportamento

  • Calcola solo le coordinate: nessun batch, nessuna attesa, nessun caricamento della mappa, nessun controllo degli ostacoli, nessuna Z, nessuna mappa del mondo. La squadra non cerca un percorso percorribile e non garantisce il raggiungimento dell'obiettivo. I punti devono appartenere allo stesso sistema di coordinate; evitare gli ostacoli può allungare il percorso.
  • Sono necessari tutti e quattro i parametri. Invia le coordinate mondiali int nell'intervallo documentato 0..65535. object? nella firma indica un adattatore universale, non il ID dell'articolo. Questi comandi non hanno valori predefiniti, coordinate all'interno del baule, quinto Z e sovraccarico con un oggetto.
  • Formula: Max(Abs(Xa-Xda), Abs(Ya-Yda)). Quando riorganizzi i punti, il risultato è lo stesso. Questa non è la distanza euclidea, non la somma delle differenze e non il numero di passi per aggirare un ostacolo.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

var result = UO.Dist(100, 100, 103, 104);
UO.Print("Dist: " + Convert.ToString(result));

1. Calcolo diretto - sceneggiatura diretta

Parametri e flusso di esecuzione:

  • Da (100,100) a (103,104): le differenze assolute sono 3 e 4, con un massimo di 4. Rendimenti principali int 4.
  • int — distanza in celle, non negativa per coordinate valide. 0 significa lo stesso XY, 1 - una cella. Questa è una quantità, non un segno di successo. Una distanza di confronto separata <= 2 restituisce bool true o false; la distanza stessa rimane int.
  • Formula: Max(Abs(Xa-Xda), Abs(Ya-Yda)). Quando riorganizzi i punti, il risultato è lo stesso. Questa non è la distanza euclidea, non la somma delle differenze e non il numero di passi per aggirare un ostacolo.
return UO.Dist(100,100,103,104);

2. Controllare correttamente il risultato è una funzione dello script

Parametri e flusso di esecuzione:

  • Da (100,100) a (101,99) la distanza è 1. Un confronto separato della distanza<=2 dà true=1. Principale restituisce "1:1": la prima unità è la distanza, la seconda è il risultato logico del confronto.
  • int — distanza in celle, non negativa per coordinate valide. 0 significa lo stesso XY, 1 - una cella. Questa è una quantità, non un segno di successo. Una distanza di confronto separata <= 2 restituisce bool true o false; la distanza stessa rimane int.
  • Formula: Max(Abs(Xa-Xda), Abs(Ya-Yda)). Quando riorganizzi i punti, il risultato è lo stesso. Questa non è la distanza euclidea, non la somma delle differenze e non il numero di passi per aggirare un ostacolo.
return  RunScenario();
 object? RunScenario()
{
    var distance = UO.Dist(100, 100, 101, 99);
    var close = distance <= 2;
    return Convert.ToString(distance) + ":" + Convert.ToString(close);
    return null;
}

3. Analisi completa dello script: classe di script

Parametri e flusso di esecuzione:

  • UO.Dist restituisce 4. RebuildTileDistance calcola le differenze tramite Abs, le confronta e restituisce quella più grande, così come 4. Il principale restituisce "4:4". L'assistente è mostrato completamente nell'esempio e non è un altro comando del motore.
  • int — distanza in celle, non negativa per coordinate valide. 0 significa lo stesso XY, 1 - una cella. Questa è una quantità, non un segno di successo. Una distanza di confronto separata <= 2 restituisce bool true o false; la distanza stessa rimane int.
  • Formula: Max(Abs(Xa-Xda), Abs(Ya-Yda)). Quando riorganizzi i punti, il risultato è lo stesso. Questa non è la distanza euclidea, non la somma delle differenze e non il numero di passi per aggirare un ostacolo.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var actual = UO.Dist(100, 100, 103, 104);
        var rebuilt = RebuildTileDistance(100, 100, 103, 104);
        return Convert.ToString(actual) + ":" + Convert.ToString(rebuilt);
        return null;
    }

    dynamic RebuildTileDistance(dynamic Xfrom, dynamic Yfrom, dynamic Xto, dynamic Yto)
    {
        var dx = Math.Abs(Xto - Xfrom);
        var dy = Math.Abs(Yto - Yfrom);
        if (Truth(dx > dy))
        {
            return dx;
        }

        return dy;
    }

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

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: xfrom (Any), yfrom (Any), xto (Any), yto (Any)

Risultato: int / Integer.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

case "dist": return new InjectionValue(arguments.Length >= 4

                    ? GetDistance(Arg(0), Arg(1), Arg(2), Arg(3))

                    : bridge.GetDistance(Arg(0)));

UO.GetDistance

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

Firme C#

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

Misura la distanza nelle celle in base alle differenze X/Y massime. Questa è una stima geometrica senza pathfinding.

Parametri

  • id — Un argomento: serial o l'alias dell'oggetto caricato, la distanza alla quale vuoi arrivare.
  • x — Due argomenti: destinazione mondiale. L'inizio è GetX(self), GetY(self).
  • y — Due argomenti: destinazione mondiale. L'inizio è GetX(self), GetY(self).
  • id1 - Nella forma a tre argomenti - serial/alias dell'oggetto le cui coordinate fungono da origine.
  • x1 — Nella forma a quattro argomenti, le coordinate dell'origine. Nessun oggetto è necessario per questo modulo.
  • y1 — Nella forma a quattro argomenti, le coordinate dell'origine. Nessun oggetto è necessario per questo modulo.
  • x2 — Nei moduli con tre/quattro argomenti, le coordinate finali. Non confonderli con serial del secondo oggetto.
  • y2 — Nei moduli con tre/quattro argomenti, le coordinate finali. Non confonderli con serial del secondo oggetto.

Valore restituito

int - max(abs(x2-x1), abs(y2-y1)): orizzontale, verticale e diagonale rispetto a una cella adiacente hanno una distanza 1. L'altezza Z e gli ostacoli non vengono presi in considerazione. Per l'incognita serial, la forma ad un argomento restituisce 0; per un oggetto esistente in assenza di un carattere - 65535. Per id1 sconosciuto, la forma a tre argomenti utilizza (0,0), quindi controlla prima Exists(id1).

Comportamento

  • La forma a oggetto singolo utilizza l'attuale centro del raggio World.RangeSize e l'ultima posizione nella coda dei passi del mob in movimento. Durante il movimento, il risultato può differire dal calcolo tramite GetX/GetY.
  • I moduli delle coordinate funzionano con i numeri passati. Per le coordinate del gioco, utilizzare l'intervallo 0..65535; i valori int estremi e l'overflow della differenza non sono coordinate supportate.
  • La squadra non promette che l'obiettivo sarà raggiungibile. Per muoverti, hai bisogno di MoveXY/NewMoveXY e controllarne il risultato; i muri possono allungare il percorso vero e proprio.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

var result = UO.GetDistance("lasttarget");
UO.Print("GetDistance: " + Convert.ToString(result));

1. Controlla l'intervallo fino al target: script diretto

Parametri e flusso di esecuzione:

  • l'obiettivo è serial, non type. Il controllo Exists impedisce che lo zero di un oggetto sconosciuto venga scambiato per un bersaglio vicino.
  • distance<=2 controlla la distanza X/Y. Visibilità e passabilità vengono controllate separatamente.
var target = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(target)))
{
    var distance = UO.GetDistance(target);
    if (Truth(distance <= 2))
    {
        UO.Print("Target is within two tiles");
    }
}

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

2. Distanza tra due punti - funzione dello script

Parametri e flusso di esecuzione:

  • x1=100, y1=200, x2=103, y2=204. Le differenze sono 3 e 4.
  • Il risultato è 4, non 7 e non l'euclideo 5.
return  RunScenario();
 object? RunScenario()
{
    var distance = UO.GetDistance(100, 200, 103, 204);
    UO.Print(Convert.ToString(distance));
    return null;
}

3. Inizia da un oggetto e dal tuo personaggio - classe script

Parametri e flusso di esecuzione:

  • I due argomenti x/y utilizzano la posizione corrente di self. I tre argomenti id1/x2/y2 consentono di specificare esplicitamente l'oggetto iniziale.
  • A una posizione costante, entrambe le quantità sono uguali a 3. Le coordinate devono rimanere entro i confini della mappa.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var x = UO.GetX() + 3;
        var y = UO.GetY() + 1;
        var fromSelf = UO.GetDistance(x, y);
        var fromObject = UO.GetDistance("self", x, y);
        UO.Print(Convert.ToString(fromSelf) + " / " + Convert.ToString(fromObject));
        return null;
    }
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: id (Any/Integer/String)

Risultato: int / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

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

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

Parametri: id (Any/Integer/String)

Risultato: int / Integer.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

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

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

Parametri: id (Any/Integer/String)

Risultato: int / Integer.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

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

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

Parametri: x (Integer), y (Integer)

Risultato: int / Integer.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public int GetDistance(int x, int y) => GetDistance(bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), x, y);

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

Parametri: id1 (Any), x2 (Any), y2 (Any)

Risultato: int / Integer.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public int GetDistance(InjectionValue id1, InjectionValue x2, InjectionValue y2)

        {

            var obj1 = GetObject(id1);

            int x1 = bridge.GetX(obj1);

            int y1 = bridge.GetY(obj1);



            return GetDistance(x1, y1, NumberConversions.ToInt(x2), NumberConversions.ToInt(y2));

        }

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

Parametri: x1 (Integer), y1 (Integer), x2 (Integer), y2 (Integer)

Risultato: int / Integer.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public int GetDistance(int x1, int y1, int x2, int y2)

        {

            int dx = Math.Abs(x1 - x2);

            int dy = Math.Abs(y1 - y2);



            return Math.Max(dx, dy);

        }

UO.GetLandTileAt

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

Firme C#

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

Restituisce il record catastale esteso della cella selezionata.

Parametri

  • x — cella X della mappa attualmente caricata; coordinate del mondo, non posizione all'interno del gump.
  • y — cella Y della mappa attualmente caricata; coordinate del mondo, non posizione all'interno del gump.
  • map — Numero della carta. Se questo argomento non è presente nel modulo selezionato, viene utilizzata la mappa corrente. Il vero client legge solo i riquadri dalla mappa attualmente caricata.

Valore restituito

Matrice di campi 11 di un record; gli indici iniziano con 0:

  • [0] kind — string: "terra", "statico" o "object".
  • [1] serial - int: serial voce dinamica; per terra/statico è 0.
  • [2] graphic - int: grafica type.
  • [3] x, [4] y - int: coordinate mondiali della cella.
  • [5] z - int: l'altezza della base nel mondo.
  • [6] hue - int: colore, vicino al suolo 0.
  • [7] flags - int: bit 32 bassi di flag di Tiledata.
  • [8] name - string: nome da Tiledata.
  • [9] layer - int: strato di attrezzature da Tiledata, vicino al suolo 0; non un indice statico.
  • [10] height - int: altezza graphic dai dati piastrellati, vicino al suolo 0; non la coordinata Z.

Un array vuoto [] significa nessuna voce o una carta/cella inaccessibile. Per GetStaticTileAt, un indice negativo/troppo grande produce anche []; L'overflow dell'indice non seleziona la voce di qualcun altro.

Comportamento

  • I dati si riferiscono alla mappa attualmente caricata. Un'altra carta o cella irraggiungibile risulta in un array vuoto. Le query dirette sui riquadri possono inoltre segnalare mancate corrispondenze della mappa; GetWorldCell e GetWorldTilesArray restituiscono immediatamente un array vuoto senza tale messaggio.
  • Gli indici degli array iniziano con 0. Controllare ArrayLength prima di leggere il campo. Z sta per altitudine mondiale; layer è la proprietà dell'attrezzatura da Tiledata e indice è il numero di serie della voce della cella.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetLandTileAt(UO.GetX(), UO.GetY());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Leggi type, Z e sovrapponi separatamente - script diretto

Parametri e flusso di esecuzione:

  • x/y: posizione del carattere; la carta viene abbassata e selezionata automaticamente. Per GetStaticTileAt indice=0 indica la prima voce.
  • I campi [2], [5], [9] hanno significati diversi; tutti vengono letti solo dopo aver controllato la lunghezza di 11.
var tile = UO.GetLandTileAt(UO.GetX(), UO.GetY());
if (Truth(ArrayLength(tile) == 11))
{
    UO.Print("Type: " + Convert.ToString(tile[2]));
    UO.Print("World Z: " + Convert.ToString(tile[5]));
    UO.Print("Equipment layer: " + Convert.ToString(tile[9]));
}
else
{
    UO.Print("Tile is unavailable");
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Ottieni nome e altezza graphic - funzione script

Parametri e flusso di esecuzione:

  • Vengono utilizzate le stesse coordinate; GetStaticTileAt legge indice=0.
  • piastrella[8] è la stringa del titolo, piastrella[10] è la dimensione dell'altezza da Tiledata, non la base Z.
return  RunScenario();
 object? RunScenario()
{
    var tile = UO.GetLandTileAt(UO.GetX(), UO.GetY());
    if (Truth(ArrayLength(tile) == 11))
    {
        UO.Print(tile[8]);
        UO.Print("Graphic height: " + Convert.ToString(tile[10]));
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Preparare il bersaglio tramite type e coordinate - classe scenario

Parametri e flusso di esecuzione:

  • WaitTargetTile riceve graphic, x, y, z dai campi 2…5.
  • Questa è solo la preparazione per il prossimo obiettivo. L'esempio non attiva uno strumento o un incantesimo. serial=0 per i dati statici non deve essere passato come ID dell'elemento.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var tile = UO.GetLandTileAt(UO.GetX(), UO.GetY());
        if (Truth(ArrayLength(tile) == 11))
        {
            UO.WaitTargetTile(tile[2], tile[3], tile[4], tile[5]);
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: x (Any), y (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public InjectionValue GetLandTileAt(InjectionValue x, InjectionValue y)

            => GetLandTileAt(x, y, new InjectionValue(bridge.WorldNumber));

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

Parametri: x (Any), y (Any), map (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public InjectionValue GetLandTileAt(InjectionValue x, InjectionValue y, InjectionValue map)

        {

            int cellX = NumberConversions.ToInt(x);

            int cellY = NumberConversions.ToInt(y);

            int world = NumberConversions.ToInt(map);

            int[] land = bridge.GetLandscapeTile(cellX, cellY, world) ?? Array.Empty<int>();

            return land.Length >= 2

                ? BuildWorldTileRecord("land", 0, land[0], cellX, cellY, land[1], 0, 0)

                : new InjectionValue(Array.Empty<InjectionValue>());

        }

UO.GetLandTileData

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

Firme C#

dynamic UO.GetLandTileData(object? tile);

Legge il record di riferimento del terreno esteso da Tiledata.

Parametri

  • tile è una voce Grafica/type, non serial e non un indice all'interno di una cella. Il tavolo del terreno viene scelto dal nome stesso della squadra.

Valore restituito

Matrice di campi 7 per graphic validi. Tutti i campi int tranne il nome (string):

  • [0] graphic — Registrazioni graphic/type.
  • [1] flags - bit flag 32 di ordine basso.
  • [2] name - nome da Tiledata (string).
  • [3] texId - ID trame del terreno.
  • [4] wet — 1 se installato bagnato, altrimenti 0.
  • [5] impassable — 1 se impraticabile, altrimenti 0.
  • [6] noDiagonal — 1 se noDiagonal, altrimenti 0.

Per un graphic non valido non ci sono proprietà di riferimento: viene restituito un breve array [переданный graphic, 0, ""]. Controlla l'intera lunghezza prima di leggere le proprietà. Questo non è un record Pascal o un elenco di oggetti.

Comportamento

  • Il comando legge Tiledata e non richiede un elemento con quello graphic nel mondo. I flag descrivono la risorsa; il risultato non sostituisce un controllo completo del percorso.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetLandTileData(0x0003);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Leggi il nome della voce - script diretto

Parametri e flusso di esecuzione:

  • Tile è il numero graphic della tabella selezionata.
  • data[2] contiene il nome. Il controllo della lunghezza separa una voce completa da una voce breve di un graphic non valido.
var data = UO.GetLandTileData(0x0003);
if (Truth(ArrayLength(data) == 7))
{
    UO.Print(data[2]);
}
else
{
    UO.Print("Tiledata entry is unavailable");
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Controlla Flag booleano individuale - Funzione script

Parametri e flusso di esecuzione:

  • data[5] è un campo invalicabile separato: 1 (condizione soddisfatta), 0 (condizione non soddisfatta).
  • Questo controllo non tiene conto degli altri oggetti nella cella o delle abilità del personaggio.
return  RunScenario();
 object? RunScenario()
{
    var data = UO.GetLandTileData(0x0003);
    if (Truth(ArrayLength(data) == 7))
    {
        if (Truth(data[5]))
        {
            UO.Print("Impassable flag is set");
        }
        else
        {
            UO.Print("Impassable flag is not set");
        }
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Stampa graphic e la maschera di flag generale - classe di script

Parametri e flusso di esecuzione:

  • data[0] ripete il graphic trasmesso, data[1] è una maschera di flag generale.
  • La maschera può contenere più bit contemporaneamente; il suo valore numerico non è serial.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var data = UO.GetLandTileData(0x0003);
        if (Truth(ArrayLength(data) == 7))
        {
            UO.Print("Graphic: " + Convert.ToString(data[0]));
            UO.Print("Flags: " + Convert.ToString(data[1]));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: tile (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

case "getlandtiledata":

                    return BuildTileData(0, Arg(0));

UO.GetLandTilesArray

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

Firme C#

dynamic UO.GetLandTilesArray(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileType);

Cerca le tessere terreno in graphic/type in un rettangolo.

Parametri

  • xmin - Coordinate mondiali di due angoli, inclusi; 0..65535. Gli angoli riorganizzati sono normalizzati. Area non superiore a 1 000 000 celle; i confini non validi causano un errore di script prima che la mappa venga letta.
  • ymin - Coordinate mondiali di due angoli, inclusi; 0..65535. Gli angoli riorganizzati sono normalizzati. Area non superiore a 1 000 000 celle; i confini non validi causano un errore di script prima che la mappa venga letta.
  • xmax - Coordinate mondiali di due angoli, inclusi; 0..65535. Gli angoli riorganizzati sono normalizzati. Area non superiore a 1 000 000 celle; i confini non validi causano un errore di script prima che la mappa venga letta.
  • ymax - Coordinate mondiali di due angoli, inclusi; 0..65535. Gli angoli riorganizzati sono normalizzati. Area non superiore a 1 000 000 celle; i confini non validi causano un errore di script prima che la mappa venga letta.
  • worldNum — Mappa/sfaccettatura 0..255; utilizzare UO.WorldNum(). Un'altra mappa fornisce un Array vuoto. Se la mappa cambia tra i blocchi, il risultato parziale viene scartato.
  • tileType - Una tessera graphic/type, solitamente 0..65535; questo non è serial. 0 è l'esatto graphic 0, -1 non significa alcun type. Un type non corrispondente dà un risultato vuoto.

Valore restituito

Array di voci [graphic, X, Y, Z]; tutti i campi int. graphic - type della terra, Z - le sue fondamenta. Nessuna corrispondenza: array vuoto. La quantità è ArrayLength(risultato), non il risultato stesso. Gli indici iniziano con 0. Questo non è un record bool, serial o Pascal; non esiste un settimo parametro di output.

Comportamento

  • Vengono letti i dati locali. La ricerca non cambia FindItem/FindCount e non esegue un comando di spostamento, bersaglio o di rete.
  • Ordine: X ascendente, all'interno di X - Y ascendente. Le registrazioni di una cella preservano l'ordine del bridge; non è ordinato per distanza o altezza.
  • La ricerca viene elaborata in blocchi fino a 32 celle con un budget flessibile di circa 1 ms. L'annullamento viene controllato tra una porzione e l'altra. Una cella complessa o una lettura a freddo potrebbero superare il budget. È meglio dividere una vasta area; il mondo può cambiare durante la lettura.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetLandTilesArray(UO.GetX(), UO.GetY(), UO.GetX() + 2, UO.GetY() + 2, UO.WorldNum(), 0x0003);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Cerca vicino a un personaggio - sceneggiatura diretta

Parametri e flusso di esecuzione:

  • x/y — posizione self, mappa — mappa corrente. La regione 3×3 comprende i confini. Nell'Es vengono trasmessi due type, nella forma normale uno. Modifica i campioni in base alle tue risorse; questo è un oggetto graphic, non un oggetto ID.
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetLandTilesArray(x, y, x + 2, y + 2, map, 0x0003);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. Angoli riorganizzati e output di tutti i campi - funzione script

Parametri e flusso di esecuzione:

  • La regione 2×2 viene trasferita dall'angolo maggiore a quello minore. L'algoritmo stesso normalizza i confini. riga: un record; PrintTile viene dichiarato nella sua interezza e formatta solo numeri, senza spostare nulla. graphic - type, x/y - coordinate, z - altezza, hue - colore. Per i terreni viene passato il condizionale hue=0: non vi è alcun campo colore nel record dei terreni.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX();
    var y = UO.GetY();
    var map = UO.WorldNum();
    var rows = UO.GetLandTilesArray(x + 1, y + 1, x, y, map, 0x0003);
    var i = 0;
    while (Truth(i < ArrayLength(rows)))
    {
        var row = rows[i];
        PrintTile(row[0], row[1], row[2], row[3], 0);
        i = i + 1;
    }

    return null;
}

void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
    UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
    UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Nuovo sondaggio con limite di tentativi - Classe script

Parametri e flusso di esecuzione:

  • Non più di tre ricerche per una cella; tra i tentativi WaitAsync(250). Ogni chiamata crea un nuovo risultato. La lunghezza zero significa che non ci sono corrispondenze ora, piuttosto che l'oggetto manca permanentemente dal server.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var attempt = 0;
        while (Truth(attempt < 3))
        {
            var rows = UO.GetLandTilesArray(x, y, x, y, map, 0x0003);
            UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
            attempt = attempt + 1;
            await Delay(250);
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

UO.GetLandTilesArray(xmin, ymin, xmax, ymax, worldNum, tileType) — UO.GetLandTilesArray(Any,Any,Any,Any,Any,Any)

Parametri: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileType (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

case "getlandtilesarray":

                    return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, false);

UO.GetLandTilesArrayEx

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

Firme C#

dynamic UO.GetLandTilesArrayEx(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileTypes);

Cerca le tessere terreno in graphic/type in un rettangolo.

Parametri

  • xmin - Coordinate mondiali di due angoli, inclusi; 0..65535. Gli angoli riorganizzati sono normalizzati. Area non superiore a 1 000 000 celle; i confini non validi causano un errore di script prima che la mappa venga letta.
  • ymin - Coordinate mondiali di due angoli, inclusi; 0..65535. Gli angoli riorganizzati sono normalizzati. Area non superiore a 1 000 000 celle; i confini non validi causano un errore di script prima che la mappa venga letta.
  • xmax - Coordinate mondiali di due angoli, inclusi; 0..65535. Gli angoli riorganizzati sono normalizzati. Area non superiore a 1 000 000 celle; i confini non validi causano un errore di script prima che la mappa venga letta.
  • ymax - Coordinate mondiali di due angoli, inclusi; 0..65535. Gli angoli riorganizzati sono normalizzati. Area non superiore a 1 000 000 celle; i confini non validi causano un errore di script prima che la mappa venga letta.
  • worldNum — Mappa/sfaccettatura 0..255; utilizzare UO.WorldNum(). Un'altra mappa fornisce un Array vuoto. Se la mappa cambia tra i blocchi, il risultato parziale viene scartato.
  • tileTypes — Array di numerici graphic/type; ogni type corrispondente è acceso. La ripetizione di type non duplica le voci. Anche lo scalare viene preso come uno type. Array vuoto significa tutto type; un array di uno 0 cerca solo 0.

Valore restituito

Array di voci [graphic, X, Y, Z]; tutti i campi int. graphic - type della terra, Z - le sue fondamenta. Nessuna corrispondenza: array vuoto. La quantità è ArrayLength(risultato), non il risultato stesso. Gli indici iniziano con 0. Questo non è un record bool, serial o Pascal; non esiste un settimo parametro di output.

Comportamento

  • Vengono letti i dati locali. La ricerca non cambia FindItem/FindCount e non esegue un comando di spostamento, bersaglio o di rete.
  • Ordine: X ascendente, all'interno di X - Y ascendente. Le registrazioni di una cella preservano l'ordine del bridge; non è ordinato per distanza o altezza.
  • La ricerca viene elaborata in blocchi fino a 32 celle con un budget flessibile di circa 1 ms. L'annullamento viene controllato tra una porzione e l'altra. Una cella complessa o una lettura a freddo potrebbero superare il budget. È meglio dividere una vasta area; il mondo può cambiare durante la lettura.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetLandTilesArrayEx(UO.X(), UO.Y(), UO.X() + 1, UO.Y() + 1, UO.WorldNum(), new[] { 0x0003 });
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Cerca vicino a un personaggio - sceneggiatura diretta

Parametri e flusso di esecuzione:

  • x/y — posizione self, mappa — mappa corrente. La regione 3×3 comprende i confini. Nell'Es vengono trasmessi due type, nella forma normale uno. Modifica i campioni in base alle tue risorse; questo è un oggetto graphic, non un oggetto ID.
dynamic[] types = new dynamic[checked((int)(1) + 1)];
types[0] = 0x0003;
types[1] = 0x0004;
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetLandTilesArrayEx(x, y, x + 2, y + 2, map, types);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. Angoli riorganizzati e output di tutti i campi - funzione script

Parametri e flusso di esecuzione:

  • La regione 2×2 viene trasferita dall'angolo maggiore a quello minore. L'algoritmo stesso normalizza i confini. riga: un record; PrintTile viene dichiarato nella sua interezza e formatta solo numeri, senza spostare nulla. graphic - type, x/y - coordinate, z - altezza, hue - colore. Per i terreni viene passato il condizionale hue=0: non vi è alcun campo colore nel record dei terreni.
return  RunScenario();
 object? RunScenario()
{
    dynamic[] types = new dynamic[checked((int)(1) + 1)];
    types[0] = 0x0003;
    types[1] = 0x0004;
    var x = UO.GetX();
    var y = UO.GetY();
    var map = UO.WorldNum();
    var rows = UO.GetLandTilesArrayEx(x + 1, y + 1, x, y, map, types);
    var i = 0;
    while (Truth(i < ArrayLength(rows)))
    {
        var row = rows[i];
        PrintTile(row[0], row[1], row[2], row[3], 0);
        i = i + 1;
    }

    return null;
}

void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
    UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
    UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Nuovo sondaggio con limite di tentativi - Classe script

Parametri e flusso di esecuzione:

  • Non più di tre ricerche per una cella; tra i tentativi WaitAsync(250). Ogni chiamata crea un nuovo risultato. La lunghezza zero significa che non ci sono corrispondenze ora, piuttosto che l'oggetto manca permanentemente dal server.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        dynamic[] types = new dynamic[checked((int)(1) + 1)];
        types[0] = 0x0003;
        types[1] = 0x0004;
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var attempt = 0;
        while (Truth(attempt < 3))
        {
            var rows = UO.GetLandTilesArrayEx(x, y, x, y, map, types);
            UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
            attempt = attempt + 1;
            await Delay(250);
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

UO.GetLandTilesArrayEx(xmin, ymin, xmax, ymax, worldNum, tileTypes) — UO.GetLandTilesArrayEx(Any,Any,Any,Any,Any,Any)

Parametri: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileTypes (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

case "getlandtilesarrayex":

                    return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), false);

UO.GetLandscapeTile

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

Firme C#

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

Legge la terra di una cella della carta corrente.

Parametri

  • x — cella X della mappa attualmente caricata; coordinate del mondo, non posizione all'interno del gump.
  • y — cella Y della mappa attualmente caricata; coordinate del mondo, non posizione all'interno del gump.
  • map — Numero della carta. Se questo argomento non è presente nel modulo selezionato, viene utilizzata la mappa corrente. Il vero client legge solo i riquadri dalla mappa attualmente caricata.

Valore restituito

Serie di tre int: [0] graphic - type atterra; [1] z — altitudine mondiale della terra; [2] flags — bit 32 bassi di flag di Tiledata. Se la carta/tessera non è disponibile o non c'è terra, viene restituito un array vuoto []. Si tratta di un record semplice, non di un elenco di tre riquadri.

Comportamento

  • I dati si riferiscono alla mappa attualmente caricata. Un'altra carta o cella irraggiungibile risulta in un array vuoto. Le query dirette sui riquadri possono inoltre segnalare mancate corrispondenze della mappa; GetWorldCell e GetWorldTilesArray restituiscono immediatamente un array vuoto senza tale messaggio.
  • Gli indici degli array iniziano con 0. Controllare ArrayLength prima di leggere il campo. Z sta per altitudine mondiale; layer è la proprietà dell'attrezzatura da Tiledata e indice è il numero di serie della voce della cella.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Mostra il terreno sotto il personaggio: sceneggiatura diretta

Parametri e flusso di esecuzione:

  • x/y sono presi dalla posizione del personaggio; map=WorldNum() seleziona la mappa corrente.
  • Prima dell'indicizzazione viene verificata la presenza di tre campi; terra[0] - graphic, terra[1] - Z.
var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(land) >= 3))
{
    UO.Print("Graphic: " + Convert.ToString(land[0]));
    UO.Print("Ground Z: " + Convert.ToString(land[1]));
}
else
{
    UO.Print("Land is unavailable");
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Confronta l'altezza della cella vicina - funzione dello script

Parametri e flusso di esecuzione:

  • x+1 è una cella vicina, y e la mappa vengono preservate.
  • deltaZ confronta terra e carattere. Questo non è un test di superabilità: i ponti e la statica vengono conteggiati separatamente.
return  RunScenario();
 object? RunScenario()
{
    var land = UO.GetLandscapeTile(UO.GetX() + 1, UO.GetY(), UO.WorldNum());
    if (Truth(ArrayLength(land) >= 3))
    {
        var deltaZ = land[1] - UO.GetZ();
        UO.Print("Ground height difference: " + Convert.ToString(deltaZ));
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Leggi il nome della terra trovata - classe dello scenario

Parametri e flusso di esecuzione:

  • group=0 seleziona il terreno; terra[0] — graphic.
  • GetTileName restituisce testo, mentre GetLandscapeTile restituisce un array.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var name = UO.GetTileName(0, land[0]);
            UO.Print(name);
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: x (Any), y (Any), map (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public InjectionValue GetLandscapeTile(InjectionValue x, InjectionValue y, InjectionValue map)

            => ToArray(bridge.GetLandscapeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)));

UO.GetLayerCount

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

Firme C#

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

Conta i record di geometria non terrestre in una cella.

Parametri

  • x — Coordinata mondiale X della cella della mappa corrente, non la posizione nel gump.
  • y — Coordinata Y del mondo della cella della mappa corrente.
  • worldNum — Numero della carta/sfaccettatura; utilizzare UO.WorldNum(). Viene letta solo la carta attualmente caricata.

Valore restituito

int — numero di triple graphic/Z/hue ricevute da GetStaticTiles. Nel client attuale vengono presi in considerazione Static, Multi e Item: più record della stessa altezza vengono conteggiati separatamente. Una casella vuota/un'altra carta dà 0. Questo non è il numero del livello dell'attrezzatura, il numero di piani, il numero di altezze univoche o bool.

Comportamento

  • Il comando legge la mappa locale e non attiva il movimento o il bersaglio. Una cella fuori dalla dimensione della mappa non viene sostituita da una cella in una colonna adiacente.
  • L'altezza di Z, graphic/type, il colore di hue, le bandiere e il livello dell'equipaggiamento hanno significati diversi. Null graphic o Z=0 possono essere dati validi; controlla il modulo dei risultati.
  • La composizione corrisponde a ReadStaticsXY, non GetLayer o ObjAtLayer. Questo client include articoli dinamici e parti multiple.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetLayerCount(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Contare i record sotto un carattere - script diretto

Parametri e flusso di esecuzione:

  • conteggio: numero di record di cella; 1 significa una voce, non un successo logico.
var count = UO.GetLayerCount(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print("Tile records: " + Convert.ToString(count));

2. Controlla la cella adiacente - funzione script

Parametri e flusso di esecuzione:

  • L'assenza di registrazioni non prova il passaggio di terra. Anche la presenza di una registrazione non prova che si tratti di un muro.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX() + 1;
    var y = UO.GetY();
    var count = UO.GetLayerCount(x, y, UO.WorldNum());
    if (Truth(count > 0))
    {
        UO.Print("Non-land geometry exists: " + Convert.ToString(count));
    }
    else
    {
        UO.Print("No loaded non-land records");
    }

    return null;
}

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

3. Confronta il contenuto di due livelli di mappa: classe di script

Parametri e flusso di esecuzione:

  • Vengono controllate le celle attuali e quelle vicine nello stesso mondo. Il numero di strati non è la loro altezza o graphic.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        int x = UO.GetX();
        int y = UO.GetY();
        int world = UO.WorldNum();
        int land = UO.GetLayerCount(x, y, world);
        int nearby = UO.GetLayerCount(x + 1, y, world);
        UO.Print($"Layers here: {land}; adjacent tile: {nearby}");
        return null;
    }
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: x (Any), y (Any), worldNum (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

case "getlayercount":

                    // Stealth's deprecated GetLayerCount(X,Y,WorldNum) is the

                    // number of static records at a map cell.  The portable

                    // bridge returns each record as Graphic/Z/Hue triples.

                    return new InjectionValue(bridge.GetStaticTiles(Arg(0), Arg(1), Arg(2)).Length / 3);

UO.GetMapCell

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

Firme C#

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

Legge graphic, bandiere di altezza e terra in un quadrato della mappa.

Parametri

  • x — Coordinata mondiale X della cella della mappa corrente, non la posizione nel gump.
  • y — Coordinata Y del mondo della cella della mappa corrente.
  • worldNum — Numero della carta/sfaccettatura; utilizzare UO.WorldNum(). Viene letta solo la carta attualmente caricata.

Valore restituito

Matrice di tre int: [0] graphic/type terre, [1] mondo Z basi terra, [2] minori 32 bit di flag di Tiledata. Una cella inaccessibile o un'altra carta risulta in una matrice vuota. Questo non è un record serial, bool o Pascal; non utilizzare i campi .Tile/.Z. Per il numero di campi, chiamare ArrayLength(cella).

Comportamento

  • Il comando legge la mappa locale e non attiva il movimento o il bersaglio. Una cella fuori dalla dimensione della mappa non viene sostituita da una cella in una colonna adiacente.
  • L'altezza di Z, graphic/type, il colore di hue, le bandiere e il livello dell'equipaggiamento hanno significati diversi. Null graphic o Z=0 possono essere dati validi; controlla il modulo dei risultati.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetMapCell(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Leggi il terreno sotto il personaggio: sceneggiatura diretta

Parametri e flusso di esecuzione:

  • X/Y vengono presi da self, WorldNum è la carta corrente. cella memorizza tutti i campi di una chiamata.
  • Gli indici iniziano con 0. cell[1] è l'altezza, non è un segno di una ricerca riuscita; un array vuoto viene controllato prima dell'indicizzazione.
var cell = UO.GetMapCell(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(cell) == 3))
{
    UO.Print("Type: " + Convert.ToString(cell[0]));
    UO.Print("Land Z: " + Convert.ToString(cell[1]));
    UO.Print("Flags: " + Convert.ToString(cell[2]));
}
else
{
    UO.Print("Map cell unavailable");
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Confronta due celle adiacenti: funzione dello script

Parametri e flusso di esecuzione:

  • La seconda chiamata legge la casella ad est, entrambi utilizzando la stessa carta.
  • La differenza di altezza dal suolo non dimostra la percorribilità: muri, statica e altri oggetti vengono controllati separatamente.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX();
    var y = UO.GetY();
    var map = UO.WorldNum();
    var here = UO.GetMapCell(x, y, map);
    var east = UO.GetMapCell(x + 1, y, map);
    if (Truth(ArrayLength(here) == 3) && Truth(ArrayLength(east) == 3))
    {
        UO.Print("Land difference: " + Convert.ToString(east[1] - here[1]));
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Confronta la base terrestre con la superficie media - Classe di script

Parametri e flusso di esecuzione:

  • GetMapCell legge Land.Z; GetSurfaceZ legge Land.AverageZ.
  • Entrambi i valori sono altezza. Su terreni in pendenza possono variare; Questa non è l'altezza del pavimento della casa.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var cell = UO.GetMapCell(x, y, map);
        if (Truth(ArrayLength(cell) == 3))
        {
            var average = UO.GetSurfaceZ(x, y, map);
            UO.Print("Base: " + Convert.ToString(cell[1]) + ", average: " + Convert.ToString(average));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: x (Any), y (Any), worldNum (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

case "getmapcell":

                    return new InjectionValue(bridge.GetLandscapeTile(Arg(0), Arg(1), Arg(2))

                        .Select(value => new InjectionValue(value)).ToArray());

UO.GetNextStepZ

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

Firme C#

int UO.GetNextStepZ(object? currX, object? currY, object? destX, object? destY, object? worldNum, object? currZ);

Calcola l'altezza stimata del passo successivo nella direzione specificata.

Parametri

  • currX - Mondo iniziale X, solitamente UO.GetX().
  • currY - Mondo iniziale Y, solitamente UO.GetY().
  • destX — destinazione X. Per controllare un passaggio specifico, supera la cella adiacente.
  • destY — destinazione Y; insieme a DestX, imposta la direzione di un passo, anziché l'intero percorso.
  • worldNum — Numero della carta/sfaccettatura; utilizzare UO.WorldNum(). Viene letta solo la carta attualmente caricata.
  • currZ - Altezza iniziale Z, solitamente UO.GetZ(); il calcolo geometrico utilizza l'intervallo -128..127.

Valore restituito

int: Z calcolata del passaggio successivo; 0 e i numeri negativi sono altezze valide. Quando un personaggio o un'altra carta 0 è disabilitato. Il metodo restituisce la componente Z del controllo anche se fallisce; il numero in sé non è una conferma del passaggio. Per bandiera e altezza insieme, usa IsWorldCellPassable e leggi [0]/[1].

Comportamento

  • Il comando legge la mappa locale e non attiva il movimento o il bersaglio. Una cella fuori dalla dimensione della mappa non viene sostituita da una cella in una colonna adiacente.
  • L'altezza di Z, graphic/type, il colore di hue, le bandiere e il livello dell'equipaggiamento hanno significati diversi. Null graphic o Z=0 possono essere dati validi; controlla il modulo dei risultati.
  • Il calcolo non fa un passo e non apre la porta. Controlla la geometria locale; il servitore può rifiutare il movimento effettivo. Se il bridge non restituisce Z, viene utilizzato CurrZ.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

var result = UO.GetNextStepZ(UO.GetX(), UO.GetY(), UO.GetX() + 1, UO.GetY(), UO.WorldNum(), UO.GetZ());
UO.Print("GetNextStepZ: " + Convert.ToString(result));

1. Scopri l'altezza stimata del gradino orientale - sceneggiatura diretta

Parametri e flusso di esecuzione:

  • Sei parametri: originale X/Y, adiacente X/Y, mappa e originale Z. nextZ è l'altezza, non true/false.
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var nextZ = UO.GetNextStepZ(x, y, x + 1, y, UO.WorldNum(), z);
UO.Print("Candidate Z: " + Convert.ToString(nextZ));

2. Viaggio separato dall'altitudine reale 0 - funzione script

Parametri e flusso di esecuzione:

  • La chiamata viene effettuata solo quando esiste una connessione nota. Tra il controllo e la lettura la connessione potrebbe perdersi; Z=0 non è ancora un codice di successo.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(Truth(UO.Connected()) == true))
    {
        var x = UO.GetX();
        var y = UO.GetY();
        var z = UO.GetNextStepZ(x, y, x, y + 1, UO.WorldNum(), UO.GetZ());
        UO.Print("South candidate Z: " + Convert.ToString(z));
    }
    else
    {
        UO.Print("Character disconnected");
    }

    return null;
}

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

3. Controlla il passaggio successivo dall'altezza corrente: classe di script

Parametri e flusso di esecuzione:

  • Le coordinate delle celle sorgente e bersaglio vengono trasmesse separatamente. Il risultato è l'altezza prevista, anche con ostruzione; la pass flag fornisce separatamente IsWorldCellPassable.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        int x = UO.GetX();
        int y = UO.GetY();
        int z = UO.GetZ();
        int nextZ = UO.GetNextStepZ(x, y, x + 1, y, UO.WorldNum(), z);
        UO.Print($"Current height: {z}; next-step result: {nextZ}");
        return null;
    }
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

UO.GetNextStepZ(currX, currY, destX, destY, worldNum, currZ) — UO.GetNextStepZ(Any,Any,Any,Any,Any,Any)

Parametri: currX (Any), currY (Any), destX (Any), destY (Any), worldNum (Any), currZ (Any)

Risultato: int / Integer.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

case "getnextstepz":

                {

                    if (bridge.IsOnline() == 0 || Arg(4) != bridge.WorldNumber)

                        return new InjectionValue(0);

                    int[] step = bridge.CheckWorldStep(Arg(0), Arg(1), Arg(5), Arg(2), Arg(3), Arg(4));

                    return new InjectionValue(step.Length > 1 ? step[1] : Arg(5));

                }

UO.GetStaticArt

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

Firme C#

dynamic UO.GetStaticArt(object? objType, object? hue);

Ottiene una singola immagine grafica dai file grafici di Ultima Online installati e la restituisce in memoria nel formato BMP. Utile per controllare le risorse di gioco, le dimensioni delle icone, leggere il colore dei pixel e confrontare le versioni colorate di un oggetto. Il comando in sé non apre una finestra, salva un file o cerca elementi nel mondo.

Parametri

  • objType — Grafico obbligatorio/type dalla sezione grafica statica: numero intero 0..65535, una stringa con quel numero o un nome memorizzato AddType. Ad esempio, 0x0EED è un'arte per una pila d'oro. Questo non è il serial dell'oggetto, le coordinate della mappa/riquadro o il numero dell'animazione del corpo. Per ottenere la grafica di un oggetto caricato, passa UO.GetType(item), dove oggetto è il suo serial. Quando il numero type è fuori intervallo, il risultato è un array vuoto; un nome di stringa sconosciuto provoca un errore di conversione.
  • hue — Mandatory integer color value: 0 — original colors of the art; a positive value is hue from the client files. Numeric strings are acceptable, including the result UO.GetColor(item). The value is limited to the range 0..65535: negative becomes 0, too large becomes 65535. Qui -1 NON significa alcun colore. La grafica della bandiera PartialHue utilizza una colorazione parziale; per gli altri: completo. The result of a particular hue depends on the loaded color table.

Valore restituito

L'array è un array unidimensionale int, ogni elemento 0..255 rappresenta un byte del file BMP completo, a partire dall'intestazione. Indicizzazione con 0. Non è bool, non ID, non un percorso, non un oggetto bitmap e non una matrice di colori RGB. Un array vuoto significa che il numero type non è valido, manca la grafica o i file di gioco richiesti non sono caricati. Prima di leggere il titolo, controlla ArrayLength; l'array vuoto non è uguale al numero 0.

Comportamento

  • Sono richiesti esattamente due argomenti. La lettura viene eseguita dalle risorse locali del client, senza richiesta al server. Non è richiesta l'esistenza di un oggetto nel mondo. Per mobile, un numero da GetType significa body; qui lo stesso numero indirizza una sezione di risorse diversa e non fornisce un'immagine dell'animazione del personaggio.
  • Formato risultato: 24-bit BMP non compresso. Byte [0]=66 e [1]=77 - BM; [2..5] - dimensione dell'intero file; [10..13] - l'inizio dei pixel, ora 54; [14..17] - dimensione dell'intestazione DIB, ora 40; [18..21] - larghezza; [22..25] - altezza positiva; [26..27] - 1 aereo; [28..29] - 24 bit. I numeri multibyte sono scritti in little-endian.
  • Ogni pixel occupa tre byte nell'ordine B, G, R. Le linee vanno dal basso verso l'alto e sono riempite con zero byte fino a un multiplo di 4. Lunghezza stringa = Int((larghezza * 3 + 3) / 4) * 4. Per le coordinate x,y dall'angolo in alto a sinistra, offset = 54 + (altezza - 1 - y) * passo + x * 3. Controllare i limiti e le dimensioni dell'array prima di accedere.
  • La trasparenza della grafica originale non è preservata: BMP non contiene alfa qui. Lo sfondo trasparente diventa nero ed è impossibile distinguerlo dal pixel nero originale. Lo screenshot, il ridimensionamento della finestra di gioco, la luce, il raggio di visibilità e le coordinate degli oggetti non sono coinvolti.
  • Per ogni chiamata viene generato un array di immagini. Se hai bisogno di grafica più volte, salva il risultato in una variabile ed elaboralo di nuovo. Non chiamare il caricamento/colorazione per ogni pixel all'interno del ciclo. Gli stessi parametri e i file invariati danno lo stesso risultato; non è necessario che diversi hue modifichino ogni pixel, specialmente con PartialHue.
  • Un vero file .bmp necessita di un output binario dei byte esatti senza codifica del testo. Un file normale.WriteLine o JsonSave non crea BMP. Gli esempi seguenti elaborano l'array in memoria e non promettono la presenza di un File inesistente.WriteBytes.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetStaticArt(0x0EED, 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Controlla la dimensione dell'icona prima di elaborarla tu stesso: script diretto

Parametri e flusso di esecuzione:

  • ObjType=0x0EED seleziona la risorsa, Tonalità=0 lascia i colori originali. L'array viene controllato prima di leggere gli offset 18 e 22. 64 è il limite dell'esempio, non un limite di comando.
  • ArtSizeField è una funzione definita dall'utente C#, non un comando UO. Aggiunge quattro byte con i pesi 1, 256, 65536, 16777216. Lo script ti aiuta a scegliere la dimensione della tua cella; Non crea automaticamente un gump.
var bmp = UO.GetStaticArt(0x0EED, 0);
if (Truth(ArrayLength(bmp) < 54))
{
    UO.Print("Gold art is unavailable");
    return null;
}
var width = ArtSizeField(bmp, 18);
var height = ArtSizeField(bmp, 22);
if (Truth(width > 64) || Truth(height > 64))
{
    UO.Print("Use a larger cell for this icon");
    return null;
}
UO.Print("Icon fits: " + Convert.ToString(width) + " x " + Convert.ToString(height));

dynamic ArtSizeField(dynamic bytes, dynamic offset)
{
    return bytes[offset] + bytes[offset+1]*256 + bytes[offset+2]*65536 + bytes[offset+3]*16777216;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Calcola RGB di un pixel tenendo conto delle linee invertite BMP - funzione script

Parametri e flusso di esecuzione:

  • GetStaticArt restituisce BMP; ArtPixelRGB è una funzione di esempio separata per questo formato. x=0,y=0 indica il pixel in alto a sinistra dell'immagine, non le coordinate mondiali. L'altezza sostitutiva-1-y è necessaria a causa dell'ordine delle linee dal basso verso l'alto.
  • La funzione restituisce RGB int 0..16777215 e utilizza -1 solo come indicatore dell'assenza di un pixel. Il nero 0 è un colore valido, non false e non è un errore. Pertanto, il test per if rgb < 0 è separato da if rgb = 0.
return  RunScenario();
 object? RunScenario()
{
    var bmp = UO.GetStaticArt(0x0EED, 0);
    var rgb = ArtPixelRGB(bmp, 0, 0);
    if (Truth(rgb < 0))
    {
        UO.Print("No pixel at this position");
        return null;
    }

    if (Truth(rgb == 0))
    {
        UO.Print("Black pixel: may also be the original transparent background");
    }

    return null;
}

dynamic ArtPixelRGB(dynamic bmp, dynamic x, dynamic y)
{
    if (Truth(ArrayLength(bmp) < 54))
    {
        return -1;
    }

    var width = bmp[18] + bmp[19] * 256 + bmp[20] * 65536 + bmp[21] * 16777216;
    var height = bmp[22] + bmp[23] * 256 + bmp[24] * 65536 + bmp[25] * 16777216;
    if (Truth(x < 0) || Truth(y < 0) || Truth(x >= width) || Truth(y >= height))
    {
        return -1;
    }

    var stride = Math.Floor((width * 3 + 3) / 4) * 4;
    var offset = 54 + (height - 1 - y) * stride + x * 3;
    if (Truth(offset + 2 >= ArrayLength(bmp)))
    {
        return -1;
    }

    return bmp[offset + 2] * 65536 + bmp[offset + 1] * 256 + bmp[offset];
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Confronta le versioni originali e colorate della stessa lezione di grafica e sceneggiatura

Parametri e flusso di esecuzione:

  • 0x1F03 — Vesti grafiche; 0 e 0x0044 sono hue originali e selezionati. La stessa grafica dà le stesse dimensioni. Se il risultato è vuoto, il confronto non inizia.
  • modificato conta diversi byte di canali di colore, non oggetti o numero di pixel. Un pixel può cambiare fino a tre byte. PartialHue, la tabella dei colori e i colori originali possono lasciare inalterata parte o tutta l'immagine; questa non è la prova di un errore di squadra.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var original = UO.GetStaticArt(0x1F03, 0);
        var colored = UO.GetStaticArt(0x1F03, 0x0044);
        var size = ArrayLength(original);
        if (Truth(size < 54) || Truth(size != ArrayLength(colored)))
        {
            UO.Print("Cannot compare these art resources");
            return null;
        }

        var changed = 0;
        for (int offset = (int)(54); offset <= size - 1; offset += (int)(1))
        {
            if (Truth(original[offset] != colored[offset]))
            {
                changed = changed + 1;
            }
        }

        if (Truth(changed == 0))
        {
            UO.Print("This hue did not change the exported bytes");
        }
        else
        {
            UO.Print("Changed color bytes: " + Convert.ToString(changed));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: objType (Any), hue (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

case "getstaticart":

                    return new InjectionValue(bridge.GetStaticArt(ResolveType(arguments[0]), Arg(1)).Select(value => new InjectionValue(value)).ToArray());

UO.GetStaticTileAt

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

Firme C#

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

Restituisce un record esteso di un record sopra il suolo della cella selezionata.

Parametri

  • x — cella X della mappa attualmente caricata; coordinate del mondo, non posizione all'interno del gump.
  • y — cella Y della mappa attualmente caricata; coordinate del mondo, non posizione all'interno del gump.
  • map — Numero della carta. Se questo argomento non è presente nel modulo selezionato, viene utilizzata la mappa corrente. Il vero client legge solo i riquadri dalla mappa attualmente caricata.
  • index — Il numero progressivo del record nei risultati GetStaticTiles, a partire da 0. Questo non è graphic, non Z e non è uno strato di equipaggiamento. Sotto forma di argomenti 3, l'indice viene al terzo posto; sotto forma di argomenti 4 terza mappa, indice quarto.

Valore restituito

Matrice di campi 11 di un record; gli indici iniziano con 0:

  • [0] kind — string: "terra", "statico" o "object".
  • [1] serial - int: serial voce dinamica; per terra/statico è 0.
  • [2] graphic - int: grafica type.
  • [3] x, [4] y - int: coordinate mondiali della cella.
  • [5] z - int: l'altezza della base nel mondo.
  • [6] hue - int: colore, vicino al suolo 0.
  • [7] flags - int: bit 32 bassi di flag di Tiledata.
  • [8] name - string: nome da Tiledata.
  • [9] layer - int: strato di attrezzature da Tiledata, vicino al suolo 0; non un indice statico.
  • [10] height - int: altezza graphic dai dati piastrellati, vicino al suolo 0; non la coordinata Z.

Un array vuoto [] significa nessuna voce o una carta/cella inaccessibile. Per GetStaticTileAt, un indice negativo/troppo grande produce anche []; L'overflow dell'indice non seleziona la voce di qualcun altro.

Comportamento

  • I dati si riferiscono alla mappa attualmente caricata. Un'altra carta o cella irraggiungibile risulta in un array vuoto. Le query dirette sui riquadri possono inoltre segnalare mancate corrispondenze della mappa; GetWorldCell e GetWorldTilesArray restituiscono immediatamente un array vuoto senza tale messaggio.
  • Gli indici degli array iniziano con 0. Controllare ArrayLength prima di leggere il campo. Z sta per altitudine mondiale; layer è la proprietà dell'attrezzatura da Tiledata e indice è il numero di serie della voce della cella.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Leggi type, Z e sovrapponi separatamente - script diretto

Parametri e flusso di esecuzione:

  • x/y: posizione del carattere; la carta viene abbassata e selezionata automaticamente. Per GetStaticTileAt indice=0 indica la prima voce.
  • I campi [2], [5], [9] hanno significati diversi; tutti vengono letti solo dopo aver controllato la lunghezza di 11.
var tile = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
if (Truth(ArrayLength(tile) == 11))
{
    UO.Print("Type: " + Convert.ToString(tile[2]));
    UO.Print("World Z: " + Convert.ToString(tile[5]));
    UO.Print("Equipment layer: " + Convert.ToString(tile[9]));
}
else
{
    UO.Print("Tile is unavailable");
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Ottieni nome e altezza graphic - funzione script

Parametri e flusso di esecuzione:

  • Vengono utilizzate le stesse coordinate; GetStaticTileAt legge indice=0.
  • piastrella[8] è la stringa del titolo, piastrella[10] è la dimensione dell'altezza da Tiledata, non la base Z.
return  RunScenario();
 object? RunScenario()
{
    var tile = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
    if (Truth(ArrayLength(tile) == 11))
    {
        UO.Print(tile[8]);
        UO.Print("Graphic height: " + Convert.ToString(tile[10]));
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Preparare il bersaglio tramite type e coordinate - classe scenario

Parametri e flusso di esecuzione:

  • WaitTargetTile riceve graphic, x, y, z dai campi 2…5.
  • Questa è solo la preparazione per il prossimo obiettivo. L'esempio non attiva uno strumento o un incantesimo. serial=0 per i dati statici non deve essere passato come ID dell'elemento.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var tile = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
        if (Truth(ArrayLength(tile) == 11))
        {
            UO.WaitTargetTile(tile[2], tile[3], tile[4], tile[5]);
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: x (Any), y (Any), index (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public InjectionValue GetStaticTileAt(InjectionValue x, InjectionValue y, InjectionValue index)

            => GetStaticTileAt(x, y, new InjectionValue(bridge.WorldNumber), index);

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

Parametri: x (Any), y (Any), map (Any), index (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public InjectionValue GetStaticTileAt(InjectionValue x, InjectionValue y, InjectionValue map, InjectionValue index)

        {

            int cellX = NumberConversions.ToInt(x);

            int cellY = NumberConversions.ToInt(y);

            int[] statics = bridge.GetStaticTiles(cellX, cellY, NumberConversions.ToInt(map)) ?? Array.Empty<int>();

            int tileIndex = NumberConversions.ToInt(index);

            if (tileIndex < 0 || tileIndex >= statics.Length / 3)

                return new InjectionValue(Array.Empty<InjectionValue>());

            int offset = tileIndex * 3;

            return offset + 2 < statics.Length

                ? BuildWorldTileRecord("static", 0, statics[offset], cellX, cellY, statics[offset + 1], statics[offset + 2], 1)

                : new InjectionValue(Array.Empty<InjectionValue>());

        }

UO.GetStaticTileData

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

Firme C#

dynamic UO.GetStaticTileData(object? tile);

Legge la voce di riferimento esteso statico graphic da Tiledata.

Parametri

  • tile è una voce Grafica/type, non serial e non un indice all'interno di una cella. La tabella statica viene selezionata dal nome del comando stesso.

Valore restituito

Matrice di campi 17 per graphic validi. Tutti i campi int tranne il nome (string):

  • [0] graphic — Registrazioni graphic/type.
  • [1] flags - bit flag 32 di ordine basso.
  • [2] name - nome da Tiledata (string).
  • [3] weight — peso dai dati delle piastrelle.
  • [4] layer: numero del livello dell'apparecchiatura.
  • [5] count è il campo Count di Tiledata, non il numero di elementi nel mondo.
  • Animazioni [6] animId - ID.
  • [7] hue — hue da Tiledata.
  • [8] lightIndex — indice della sorgente luminosa.
  • [9] height - altezza graphic, non altezza mondiale Z.
  • [10] wet — 1 se installato bagnato, altrimenti 0.
  • [11] impassable — 1 se impraticabile, altrimenti 0.
  • [12] surface — 1 se di superficie, altrimenti 0.
  • [13] foliage — 1 se fogliame, altrimenti 0.
  • [14] door — 1 se porta, altrimenti 0.
  • [15] wall — 1 se muro, altrimenti 0.
  • [16] container — 1 se contenitore, altrimenti 0.

Per un graphic non valido non ci sono proprietà di riferimento: viene restituito un breve array [переданный graphic, 0, ""]. Controlla l'intera lunghezza prima di leggere le proprietà. Questo non è un record Pascal o un elenco di oggetti.

Comportamento

  • Il comando legge Tiledata e non richiede un elemento con quello graphic nel mondo. I flag descrivono la risorsa; il risultato non sostituisce un controllo completo del percorso.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetStaticTileData(0x0CCA);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Leggi il nome della voce - script diretto

Parametri e flusso di esecuzione:

  • Tile è il numero graphic della tabella selezionata.
  • data[2] contiene il nome. Il controllo della lunghezza separa una voce completa da una voce breve di un graphic non valido.
var data = UO.GetStaticTileData(0x0CCA);
if (Truth(ArrayLength(data) == 17))
{
    UO.Print(data[2]);
}
else
{
    UO.Print("Tiledata entry is unavailable");
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Controlla Flag booleano individuale - Funzione script

Parametri e flusso di esecuzione:

  • data[11] è un campo invalicabile separato: 1 (condizione soddisfatta), 0 (condizione non soddisfatta).
  • Questo controllo non tiene conto degli altri oggetti nella cella o delle abilità del personaggio.
return  RunScenario();
 object? RunScenario()
{
    var data = UO.GetStaticTileData(0x0CCA);
    if (Truth(ArrayLength(data) == 17))
    {
        if (Truth(data[11]))
        {
            UO.Print("Impassable flag is set");
        }
        else
        {
            UO.Print("Impassable flag is not set");
        }
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Stampa graphic e la maschera di flag generale - classe di script

Parametri e flusso di esecuzione:

  • data[0] ripete il graphic trasmesso, data[1] è una maschera di flag generale.
  • La maschera può contenere più bit contemporaneamente; il suo valore numerico non è serial.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var data = UO.GetStaticTileData(0x0CCA);
        if (Truth(ArrayLength(data) == 17))
        {
            UO.Print("Graphic: " + Convert.ToString(data[0]));
            UO.Print("Flags: " + Convert.ToString(data[1]));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: tile (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

case "getstatictiledata":

                    return BuildTileData(1, Arg(0));

UO.GetStaticTiles

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

Firme C#

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

Legge le voci sopra il suolo in una cella della mappa corrente.

Parametri

  • x — cella X della mappa attualmente caricata; coordinate del mondo, non posizione all'interno del gump.
  • y — cella Y della mappa attualmente caricata; coordinate del mondo, non posizione all'interno del gump.
  • map — Numero della carta. Se questo argomento non è presente nel modulo selezionato, viene utilizzata la mappa corrente. Il vero client legge solo i riquadri dalla mappa attualmente caricata.

Valore restituito

L'array è una sequenza piatta di int-triple [graphic0, z0, hue0, graphic1, z1, hue1, …]. Il numero di voci è uguale alla lunghezza dell'array / 3. Per la notazione i, graphic è in [i*3], Z è in [i*3+1], hue è in [i*3+2]. Un array vuoto significa nessuna voce o una scheda/cella inaccessibile. Il numero di serie e di livello non vengono restituiti qui.

Comportamento

  • I dati si riferiscono alla mappa attualmente caricata. Un'altra carta o cella irraggiungibile risulta in un array vuoto. Le query dirette sui riquadri possono inoltre segnalare mancate corrispondenze della mappa; GetWorldCell e GetWorldTilesArray restituiscono immediatamente un array vuoto senza tale messaggio.
  • Gli indici degli array iniziano con 0. Controllare ArrayLength prima di leggere il campo. Z sta per altitudine mondiale; layer è la proprietà dell'attrezzatura da Tiledata e indice è il numero di serie della voce della cella.
  • Il bridge corrente elenca gli elementi statici, multipli e mondiali nella catena di celle. Il nome del comando non limita il risultato esclusivamente alle voci statics.mul. L'ordine della catena non garantisce l'ordinamento Z.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetStaticTiles(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Contare i record delle celle: script diretto

Parametri e flusso di esecuzione:

  • x/y/map seleziona la cella corrente.
  • La lunghezza dell'array è il numero di campi. Dividendo per 3 si ottiene il numero di voci.
var tiles = UO.GetStaticTiles(UO.GetX(), UO.GetY(), UO.WorldNum());
var count = ArrayLength(tiles) / 3;
UO.Print("Tile records: " + Convert.ToString(count));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. Passa attraverso graphic e l'altezza di tutte le voci - funzione script

Parametri e flusso di esecuzione:

  • offset è l'indice del primo campo della tripla successiva, aumentato di 3.
  • Il controllo offset+2 protegge l'intero record dalla lettura.
return  RunScenario();
 object? RunScenario()
{
    var tiles = UO.GetStaticTiles(UO.GetX(), UO.GetY(), UO.WorldNum());
    var offset = 0;
    while (Truth(offset + 2 < ArrayLength(tiles)))
    {
        UO.Print("Type: " + Convert.ToString(tiles[offset]) + ", Z: " + Convert.ToString(tiles[offset + 1]));
        offset = offset + 3;
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Leggi hue della prima voce - classe script

Parametri e flusso di esecuzione:

  • x+1 seleziona una cella adiacente.
  • piastrelle[2] — colore della prima voce; Questa non è la terza tessera.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var tiles = UO.GetStaticTiles(UO.GetX() + 1, UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(tiles) >= 3))
        {
            var hue = tiles[2];
            UO.Print("First tile hue: " + Convert.ToString(hue));
        }
        else
        {
            UO.Print("No tile records");
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: x (Any), y (Any), map (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public InjectionValue GetStaticTiles(InjectionValue x, InjectionValue y, InjectionValue map)

            => ToArray(bridge.GetStaticTiles(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)));

UO.GetStaticTilesArray

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

Firme C#

dynamic UO.GetStaticTilesArray(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileType);

Cerca voci statiche/multiple/item tramite graphic/type in un rettangolo.

Parametri

  • xmin - Coordinate mondiali di due angoli, inclusi; 0..65535. Gli angoli riorganizzati sono normalizzati. Area non superiore a 1 000 000 celle; i confini non validi causano un errore di script prima che la mappa venga letta.
  • ymin - Coordinate mondiali di due angoli, inclusi; 0..65535. Gli angoli riorganizzati sono normalizzati. Area non superiore a 1 000 000 celle; i confini non validi causano un errore di script prima che la mappa venga letta.
  • xmax - Coordinate mondiali di due angoli, inclusi; 0..65535. Gli angoli riorganizzati sono normalizzati. Area non superiore a 1 000 000 celle; i confini non validi causano un errore di script prima che la mappa venga letta.
  • ymax - Coordinate mondiali di due angoli, inclusi; 0..65535. Gli angoli riorganizzati sono normalizzati. Area non superiore a 1 000 000 celle; i confini non validi causano un errore di script prima che la mappa venga letta.
  • worldNum — Mappa/sfaccettatura 0..255; utilizzare UO.WorldNum(). Un'altra mappa fornisce un Array vuoto. Se la mappa cambia tra i blocchi, il risultato parziale viene scartato.
  • tileType - Una tessera graphic/type, solitamente 0..65535; questo non è serial. 0 è l'esatto graphic 0, -1 non significa alcun type. Un type non corrispondente dà un risultato vuoto.

Valore restituito

Voci dell'array [graphic, X, Y, Z, hue]; tutti i campi int. graphic - type, Z - base, hue - colore. Più voci di cella rimangono separate. Nessuna corrispondenza: array vuoto. La quantità è ArrayLength(risultato), non il risultato stesso. Gli indici iniziano con 0. Questo non è un record bool, serial o Pascal; non esiste un settimo parametro di output.

Comportamento

  • Vengono letti i dati locali. La ricerca non cambia FindItem/FindCount e non esegue un comando di spostamento, bersaglio o di rete.
  • Ordine: X ascendente, all'interno di X - Y ascendente. Le registrazioni di una cella preservano l'ordine del bridge; non è ordinato per distanza o altezza.
  • La ricerca viene elaborata in blocchi fino a 32 celle con un budget flessibile di circa 1 ms. L'annullamento viene controllato tra una porzione e l'altra. Una cella complessa o una lettura a freddo potrebbero superare il budget. È meglio dividere una vasta area; il mondo può cambiare durante la lettura.
  • Il ramo Statico del cliente corrente comprende Statico, Multi e Articolo dalla cella, compresi gli oggetti caricati a terra; Terreno e Mobile non sono inclusi. È più ampia della classica selezione di soli file statici.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetStaticTilesArray(UO.GetX(), UO.GetY(), UO.GetX() + 2, UO.GetY() + 2, UO.WorldNum(), 0x0CCA);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Cerca vicino a un personaggio - sceneggiatura diretta

Parametri e flusso di esecuzione:

  • x/y — posizione self, mappa — mappa corrente. La regione 3×3 comprende i confini. Nell'Es vengono trasmessi due type, nella forma normale uno. Modifica i campioni in base alle tue risorse; questo è un oggetto graphic, non un oggetto ID.
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetStaticTilesArray(x, y, x + 2, y + 2, map, 0x0CCA);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. Angoli riorganizzati e output di tutti i campi - funzione script

Parametri e flusso di esecuzione:

  • La regione 2×2 viene trasferita dall'angolo maggiore a quello minore. L'algoritmo stesso normalizza i confini. riga: un record; PrintTile viene dichiarato nella sua interezza e formatta solo numeri, senza spostare nulla. graphic - type, x/y - coordinate, z - altezza, hue - colore. Per i terreni viene passato il condizionale hue=0: non vi è alcun campo colore nel record dei terreni.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX();
    var y = UO.GetY();
    var map = UO.WorldNum();
    var rows = UO.GetStaticTilesArray(x + 1, y + 1, x, y, map, 0x0CCA);
    var i = 0;
    while (Truth(i < ArrayLength(rows)))
    {
        var row = rows[i];
        PrintTile(row[0], row[1], row[2], row[3], row[4]);
        i = i + 1;
    }

    return null;
}

void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
    UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
    UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Nuovo sondaggio con limite di tentativi - Classe script

Parametri e flusso di esecuzione:

  • Non più di tre ricerche per una cella; tra i tentativi WaitAsync(250). Ogni chiamata crea un nuovo risultato. La lunghezza zero significa che non ci sono corrispondenze ora, piuttosto che l'oggetto manca permanentemente dal server.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var attempt = 0;
        while (Truth(attempt < 3))
        {
            var rows = UO.GetStaticTilesArray(x, y, x, y, map, 0x0CCA);
            UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
            attempt = attempt + 1;
            await Delay(250);
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

UO.GetStaticTilesArray(xmin, ymin, xmax, ymax, worldNum, tileType) — UO.GetStaticTilesArray(Any,Any,Any,Any,Any,Any)

Parametri: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileType (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

case "getstatictilesarray":

                    return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, true);

UO.GetStaticTilesArrayEx

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

Firme C#

dynamic UO.GetStaticTilesArrayEx(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileTypes);

Cerca voci statiche/multiple/item tramite graphic/type in un rettangolo.

Parametri

  • xmin - Coordinate mondiali di due angoli, inclusi; 0..65535. Gli angoli riorganizzati sono normalizzati. Area non superiore a 1 000 000 celle; i confini non validi causano un errore di script prima che la mappa venga letta.
  • ymin - Coordinate mondiali di due angoli, inclusi; 0..65535. Gli angoli riorganizzati sono normalizzati. Area non superiore a 1 000 000 celle; i confini non validi causano un errore di script prima che la mappa venga letta.
  • xmax - Coordinate mondiali di due angoli, inclusi; 0..65535. Gli angoli riorganizzati sono normalizzati. Area non superiore a 1 000 000 celle; i confini non validi causano un errore di script prima che la mappa venga letta.
  • ymax - Coordinate mondiali di due angoli, inclusi; 0..65535. Gli angoli riorganizzati sono normalizzati. Area non superiore a 1 000 000 celle; i confini non validi causano un errore di script prima che la mappa venga letta.
  • worldNum — Mappa/sfaccettatura 0..255; utilizzare UO.WorldNum(). Un'altra mappa fornisce un Array vuoto. Se la mappa cambia tra i blocchi, il risultato parziale viene scartato.
  • tileTypes — Array di numerici graphic/type; ogni type corrispondente è acceso. La ripetizione di type non duplica le voci. Anche lo scalare viene preso come uno type. Array vuoto significa tutto type; un array di uno 0 cerca solo 0.

Valore restituito

Voci dell'array [graphic, X, Y, Z, hue]; tutti i campi int. graphic - type, Z - base, hue - colore. Più voci di cella rimangono separate. Nessuna corrispondenza: array vuoto. La quantità è ArrayLength(risultato), non il risultato stesso. Gli indici iniziano con 0. Questo non è un record bool, serial o Pascal; non esiste un settimo parametro di output.

Comportamento

  • Vengono letti i dati locali. La ricerca non cambia FindItem/FindCount e non esegue un comando di spostamento, bersaglio o di rete.
  • Ordine: X ascendente, all'interno di X - Y ascendente. Le registrazioni di una cella preservano l'ordine del bridge; non è ordinato per distanza o altezza.
  • La ricerca viene elaborata in blocchi fino a 32 celle con un budget flessibile di circa 1 ms. L'annullamento viene controllato tra una porzione e l'altra. Una cella complessa o una lettura a freddo potrebbero superare il budget. È meglio dividere una vasta area; il mondo può cambiare durante la lettura.
  • Il ramo Statico del cliente corrente comprende Statico, Multi e Articolo dalla cella, compresi gli oggetti caricati a terra; Terreno e Mobile non sono inclusi. È più ampia della classica selezione di soli file statici.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetStaticTilesArrayEx(UO.X(), UO.Y(), UO.X() + 1, UO.Y() + 1, UO.WorldNum(), new[] { 0x0CCA });
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Cerca vicino a un personaggio - sceneggiatura diretta

Parametri e flusso di esecuzione:

  • x/y — posizione self, mappa — mappa corrente. La regione 3×3 comprende i confini. Nell'Es vengono trasmessi due type, nella forma normale uno. Modifica i campioni in base alle tue risorse; questo è un oggetto graphic, non un oggetto ID.
dynamic[] types = new dynamic[checked((int)(1) + 1)];
types[0] = 0x0CCA;
types[1] = 0x0CCB;
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetStaticTilesArrayEx(x, y, x + 2, y + 2, map, types);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. Angoli riorganizzati e output di tutti i campi - funzione script

Parametri e flusso di esecuzione:

  • La regione 2×2 viene trasferita dall'angolo maggiore a quello minore. L'algoritmo stesso normalizza i confini. riga: un record; PrintTile viene dichiarato nella sua interezza e formatta solo numeri, senza spostare nulla. graphic - type, x/y - coordinate, z - altezza, hue - colore. Per i terreni viene passato il condizionale hue=0: non vi è alcun campo colore nel record dei terreni.
return  RunScenario();
 object? RunScenario()
{
    dynamic[] types = new dynamic[checked((int)(1) + 1)];
    types[0] = 0x0CCA;
    types[1] = 0x0CCB;
    var x = UO.GetX();
    var y = UO.GetY();
    var map = UO.WorldNum();
    var rows = UO.GetStaticTilesArrayEx(x + 1, y + 1, x, y, map, types);
    var i = 0;
    while (Truth(i < ArrayLength(rows)))
    {
        var row = rows[i];
        PrintTile(row[0], row[1], row[2], row[3], row[4]);
        i = i + 1;
    }

    return null;
}

void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
    UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
    UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Nuovo sondaggio con limite di tentativi - Classe script

Parametri e flusso di esecuzione:

  • Non più di tre ricerche per una cella; tra i tentativi WaitAsync(250). Ogni chiamata crea un nuovo risultato. La lunghezza zero significa che non ci sono corrispondenze ora, piuttosto che l'oggetto manca permanentemente dal server.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        dynamic[] types = new dynamic[checked((int)(1) + 1)];
        types[0] = 0x0CCA;
        types[1] = 0x0CCB;
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var attempt = 0;
        while (Truth(attempt < 3))
        {
            var rows = UO.GetStaticTilesArrayEx(x, y, x, y, map, types);
            UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
            attempt = attempt + 1;
            await Delay(250);
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

UO.GetStaticTilesArrayEx(xmin, ymin, xmax, ymax, worldNum, tileTypes) — UO.GetStaticTilesArrayEx(Any,Any,Any,Any,Any,Any)

Parametri: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileTypes (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

case "getstatictilesarrayex":

                    return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), true);

UO.GetSurfaceZ

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

Firme C#

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

Legge l'altezza media della superficie del terreno in una cella.

Parametri

  • x — Coordinata mondiale X della cella della mappa corrente, non la posizione nel gump.
  • y — Coordinata Y del mondo della cella della mappa corrente.
  • worldNum — Numero della carta/sfaccettatura; utilizzare UO.WorldNum(). Viene letta solo la carta attualmente caricata.

Valore restituito

int — Land.AverageZ, inclusa altezza negativa e 0. Se non è presente alcuna mappa/terreno o una mancata corrispondenza della mappa, viene restituito 0, quindi questo valore non distingue i dati mancanti dall'altezza reale 0. Questo non è bool, il pavimento o l'altezza dell'elemento statico più vicino.

Comportamento

  • Il comando legge la mappa locale e non attiva il movimento o il bersaglio. Una cella fuori dalla dimensione della mappa non viene sostituita da una cella in una colonna adiacente.
  • L'altezza di Z, graphic/type, il colore di hue, le bandiere e il livello dell'equipaggiamento hanno significati diversi. Null graphic o Z=0 possono essere dati validi; controlla il modulo dei risultati.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetSurfaceZ(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Altezza media sotto il carattere - scrittura diretta

Parametri e flusso di esecuzione:

  • Tutti e tre i parametri si riferiscono alla cella corrente della mappa. z è un'altezza numerica, non il risultato del movimento.
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var z = UO.GetSurfaceZ(x, y, map);
UO.Print("Average land Z: " + Convert.ToString(z));

2. Controlla la disponibilità del terreno prima di leggere - funzione script

Parametri e flusso di esecuzione:

  • GetMapCell è necessario per distinguere i dati mancanti dall'altezza 0. La mappa potrebbe ancora cambiare tra due chiamate.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX() + 1;
    var y = UO.GetY();
    var map = UO.WorldNum();
    var cell = UO.GetMapCell(x, y, map);
    if (Truth(ArrayLength(cell) == 3))
    {
        UO.Print("Average: " + Convert.ToString(UO.GetSurfaceZ(x, y, map)));
    }
    else
    {
        UO.Print("No land data");
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Mostra variazione dell'altezza media verso est - Classe dello scenario

Parametri e flusso di esecuzione:

  • La differenza mostra la pendenza della terra. Questo esempio non sposta nulla e non calcola il percorso.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var a = UO.GetMapCell(x, y, map);
        var b = UO.GetMapCell(x + 1, y, map);
        if (Truth(ArrayLength(a) == 3) && Truth(ArrayLength(b) == 3))
        {
            var difference = UO.GetSurfaceZ(x + 1, y, map) - UO.GetSurfaceZ(x, y, map);
            UO.Print("Average difference: " + Convert.ToString(difference));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: x (Any), y (Any), worldNum (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

case "getsurfacez":

                    return new InjectionValue(bridge.GetSurfaceZ(Arg(0), Arg(1), Arg(2)));

UO.GetTileFlags

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

Firme C#

dynamic UO.GetTileFlags(object? group, object? tileId);

Legge la maschera di bit della proprietà graphic dalla voce Tiledata.

Parametri

  • group - 0 - tavolato fondiario; 1 — tabella di graphic statico. L'implementazione considera qualsiasi gruppo non nullo come una seconda tabella; utilizzare 0 o 1.
  • tileId — Voci grafiche/type nei Tiledata, solitamente l'intero 0…65535. Questo non è il serial di un oggetto o un indice di statica all'interno di una cella.

Valore restituito

int: bit 32 bassi di flag Tiledata. Il set di bit più significativo risulta in un numero con segno negativo. 0 indica l'assenza di questi flag o tileId non valido; Questo non è un segno indipendente di errore e non è un valore bool. È possibile impostare più proprietà contemporaneamente.

Comportamento

  • Questo comando legge la voce di riferimento graphic; le coordinate del mondo non sono necessarie. group=0 e group=1 selezionano tabelle diverse anche se tileId è la stessa.
  • La proprietà viene letta dai dati graphic, non dallo stato corrente di un particolare elemento.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetTileFlags(1, 0x0CCA);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Leggi la proprietà della statica nota graphic - script diretto

Parametri e flusso di esecuzione:

  • group=1 seleziona i dati piastrellati statici; tileId=0x0CCA - graphic albero.
  • valore contiene il risultato descritto nella sezione Resi; il suo significato non coincide con serial.
var value = UO.GetTileFlags(1, 0x0CCA);
if (Truth((Convert.ToUInt64(value) & 0x40UL) != 0))
{
    UO.Print("Impassable flag is set");
}

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

2. Leggi la proprietà graphic di un oggetto trovato - funzione script

Parametri e flusso di esecuzione:

  • FindType restituisce serial. GetType lo trasforma in numerico graphic.
  • group=1 viene utilizzato per gli elementi; in tileId viene trasmesso graphic, non item.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(item != ""))
    {
        var graphic = UO.GetType(item);
        var value = UO.GetTileFlags(1, graphic);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

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

3. Leggi le proprietà del terreno nella classe personaggio - scenario

Parametri e flusso di esecuzione:

  • I primi due argomenti GetLandscapeTile sono il mondo attuale X/Y; la terza è la mappa attuale.
  • land[0] contiene graphic terre. group=0 seleziona i dati delle tessere del terreno. Per GetTileLayer/GetTileHeight il terreno dà 0.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var graphic = land[0];
            var value = UO.GetTileFlags(0, graphic);
            UO.Print(Convert.ToString(value));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: group (Any), tileId (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public InjectionValue GetTileFlags(InjectionValue group, InjectionValue tileId)

            => new InjectionValue(unchecked((int)bridge.GetTileFlags(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId))));

UO.GetTileHeight

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

Firme C#

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

Legge l'altezza graphic dalla voce Tiledata.

Parametri

  • group - 0 - tavolato fondiario; 1 — tabella di graphic statico. L'implementazione considera qualsiasi gruppo non nullo come una seconda tabella; utilizzare 0 o 1.
  • tileId — Voci grafiche/type nei Tiledata, solitamente l'intero 0…65535. Questo non è il serial di un oggetto o un indice di statica all'interno di una cella.

Valore restituito

int è l'altezza dell'immagine in unità Z da Tiledata. Questa è la dimensione dell'altezza dell'immagine, non la coordinata mondiale della sua base Z. Per terra, voce mancante o altezza zero, viene restituito 0. L'altezza di per sé non dimostra la capacità di attraversare il paese.

Comportamento

  • Questo comando legge la voce di riferimento graphic; le coordinate del mondo non sono necessarie. group=0 e group=1 selezionano tabelle diverse anche se tileId è la stessa.
  • La proprietà viene letta dai dati graphic, non dallo stato corrente di un particolare elemento.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

var result = UO.GetTileHeight(1, 0x0CCA);
UO.Print("GetTileHeight: " + Convert.ToString(result));

1. Leggi la proprietà della statica nota graphic - script diretto

Parametri e flusso di esecuzione:

  • group=1 seleziona i dati piastrellati statici; tileId=0x0CCA - graphic albero.
  • valore contiene il risultato descritto nella sezione Resi; il suo significato non coincide con serial.
var value = UO.GetTileHeight(1, 0x0CCA);
UO.Print("Tiledata height: " + Convert.ToString(value));

2. Leggi la proprietà graphic di un oggetto trovato - funzione script

Parametri e flusso di esecuzione:

  • FindType restituisce serial. GetType lo trasforma in numerico graphic.
  • group=1 viene utilizzato per gli elementi; in tileId viene trasmesso graphic, non item.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(item != ""))
    {
        var graphic = UO.GetType(item);
        var value = UO.GetTileHeight(1, graphic);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

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

3. Leggi le proprietà del terreno nella classe personaggio - scenario

Parametri e flusso di esecuzione:

  • I primi due argomenti GetLandscapeTile sono il mondo attuale X/Y; la terza è la mappa attuale.
  • land[0] contiene graphic terre. group=0 seleziona i dati delle tessere del terreno. Per GetTileLayer/GetTileHeight il terreno dà 0.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var graphic = land[0];
            var value = UO.GetTileHeight(0, graphic);
            UO.Print(Convert.ToString(value));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: group (Any), tileId (Any)

Risultato: int / Integer.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public int GetTileHeight(InjectionValue group, InjectionValue tileId)

        {

            int tileGroup = NumberConversions.ToInt(group);

            int[] properties = bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)) ?? Array.Empty<int>();

            return tileGroup == 0 || properties.Length < 7 ? 0 : properties[6];

        }

UO.GetTileLayer

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

Firme C#

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

Legge il numero del livello dell'apparecchiatura dalla voce Tiledata.

Parametri

  • group - 0 - tavolato fondiario; 1 — tabella di graphic statico. L'implementazione considera qualsiasi gruppo non nullo come una seconda tabella; utilizzare 0 o 1.
  • tileId — Voci grafiche/type nei Tiledata, solitamente l'intero 0…65535. Questo non è il serial di un oggetto o un indice di statica all'interno di una cella.

Valore restituito

int — numero del livello dell'apparecchiatura graphic: ad esempio 1=mano destra, 2=mano sinistra, 21=Backpack. Per una massa, una voce mancante o un livello nullo, viene restituito 0. Questo non è l'ordine statico in una cella, non in un piano e non in Z.

Comportamento

  • Questo comando legge la voce di riferimento graphic; le coordinate del mondo non sono necessarie. group=0 e group=1 selezionano tabelle diverse anche se tileId è la stessa.
  • La proprietà viene letta dai dati graphic, non dallo stato corrente di un particolare elemento.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

var result = UO.GetTileLayer(1, 0x0CCA);
UO.Print("GetTileLayer: " + Convert.ToString(result));

1. Leggi la proprietà della statica nota graphic - script diretto

Parametri e flusso di esecuzione:

  • group=1 seleziona i dati piastrellati statici; tileId=0x0CCA - graphic albero.
  • valore contiene il risultato descritto nella sezione Resi; il suo significato non coincide con serial.
var value = UO.GetTileLayer(1, 0x0CCA);
if (Truth(value == 1))
{
    UO.Print("Right-hand graphic");
}

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

2. Leggi la proprietà graphic di un oggetto trovato - funzione script

Parametri e flusso di esecuzione:

  • FindType restituisce serial. GetType lo trasforma in numerico graphic.
  • group=1 viene utilizzato per gli elementi; in tileId viene trasmesso graphic, non item.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(item != ""))
    {
        var graphic = UO.GetType(item);
        var value = UO.GetTileLayer(1, graphic);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

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

3. Leggi le proprietà del terreno nella classe personaggio - scenario

Parametri e flusso di esecuzione:

  • I primi due argomenti GetLandscapeTile sono il mondo attuale X/Y; la terza è la mappa attuale.
  • land[0] contiene graphic terre. group=0 seleziona i dati delle tessere del terreno. Per GetTileLayer/GetTileHeight il terreno dà 0.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var graphic = land[0];
            var value = UO.GetTileLayer(0, graphic);
            UO.Print(Convert.ToString(value));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: group (Any), tileId (Any)

Risultato: int / Integer.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public int GetTileLayer(InjectionValue group, InjectionValue tileId)

        {

            int tileGroup = NumberConversions.ToInt(group);

            int[] properties = bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)) ?? Array.Empty<int>();

            return tileGroup == 0 || properties.Length < 2 ? 0 : properties[1];

        }

UO.GetTileName

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

Firme C#

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

Legge il nome graphic dalla voce Tiledata.

Parametri

  • group - 0 - tavolato fondiario; 1 — tabella di graphic statico. L'implementazione considera qualsiasi gruppo non nullo come una seconda tabella; utilizzare 0 o 1.
  • tileId — Voci grafiche/type nei Tiledata, solitamente l'intero 0…65535. Questo non è il serial di un oggetto o un indice di statica all'interno di una cella.

Valore restituito

string - nome dai file Tiledata del gioco. Una stringa vuota significa un nome vuoto o un tileId non valido. Il nome è preso dalle risorse del gioco e non viene tradotto automaticamente nella lingua dell'interfaccia IDE. Questo non è il nome di un elemento specifico dal server.

Comportamento

  • Questo comando legge la voce di riferimento graphic; le coordinate del mondo non sono necessarie. group=0 e group=1 selezionano tabelle diverse anche se tileId è la stessa.
  • La proprietà viene letta dai dati graphic, non dallo stato corrente di un particolare elemento.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

var result = UO.GetTileName(1, 0x0CCA);
UO.Print("GetTileName: " + Convert.ToString(result));

1. Leggi la proprietà della statica nota graphic - script diretto

Parametri e flusso di esecuzione:

  • group=1 seleziona i dati piastrellati statici; tileId=0x0CCA - graphic albero.
  • valore contiene il risultato descritto nella sezione Resi; il suo significato non coincide con serial.
var value = UO.GetTileName(1, 0x0CCA);
if (Truth(value != ""))
{
    UO.Print(value);
}
else
{
    UO.Print("No tiledata name");
}

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

2. Leggi la proprietà graphic di un oggetto trovato - funzione script

Parametri e flusso di esecuzione:

  • FindType restituisce serial. GetType lo trasforma in numerico graphic.
  • group=1 viene utilizzato per gli elementi; in tileId viene trasmesso graphic, non item.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(item != ""))
    {
        var graphic = UO.GetType(item);
        var value = UO.GetTileName(1, graphic);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

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

3. Leggi le proprietà del terreno nella classe personaggio - scenario

Parametri e flusso di esecuzione:

  • I primi due argomenti GetLandscapeTile sono il mondo attuale X/Y; la terza è la mappa attuale.
  • land[0] contiene graphic terre. group=0 seleziona i dati delle tessere del terreno. Per GetTileLayer/GetTileHeight il terreno dà 0.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var graphic = land[0];
            var value = UO.GetTileName(0, graphic);
            UO.Print(Convert.ToString(value));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: group (Any), tileId (Any)

Risultato: string / String.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public string GetTileName(InjectionValue group, InjectionValue tileId)

            => bridge.GetTileDataName(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId));

UO.GetTileXYM

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

Firme C#

dynamic UO.GetTileXYM(object? x, object? y, object? map, object? tileStart, object? tileEnd, object? uoPath);

Legge il graphic ID abbinato dalla catena di oggetti della cella della scheda di gioco attualmente caricata.

Parametri

  • x — Coordinata X celle, int.
  • y — Coordinata Y celle, int.
  • map — Numero della carta; deve corrispondere a World.MapIndex e World.Map deve esistere.
  • tileStart — Bordo grafico inferiore abilitato.
  • tileEnd — Il bordo superiore incluso della grafica. L'intervallo inverso non viene riorganizzato e non produce corrispondenze.
  • uoPath - Il parametro di compatibilità viene convertito in string, ma il bridge corrente non lo utilizza e non carica l'altra cartella di file UO.

Valore restituito

Array int con quad piatti [graphic,x,y,z,graphic,x,y,z,...]. L'errore della mappa fornisce un array vuoto e un messaggio; anche nessuna corrispondenza dà come risultato un array vuoto.

Comportamento

  • Segue World.Map.GetTile(x,y).TNext e controlla tileStart<=Graphic<=tileEnd. I tipi di oggetto non vengono filtrati separatamente: è una catena di celle, non solo statica.
  • Il comando legge la geometria caricata del client. I dati di un'altra mappa/faccettatura non sono caricati. Il parametro uoPath non viene utilizzato per scaricare file; il numero di voci è uguale alla lunghezza dell'array/4.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetTileXYM(UO.GetX(), UO.GetY(), UO.WorldNum(), 0, 65535, "");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Tutti i grafici della cella corrente sono uno script diretto

Parametri e flusso di esecuzione:

  • Ogni voce occupa quattro int.
var tiles = UO.GetTileXYM(UO.GetX(),UO.GetY(),UO.WorldNum(),0,65535,"");
UO.Print(Convert.ToString(ArrayLength(tiles)/4));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. Stampa graphic e altezza - funzione script

Parametri e flusso di esecuzione:

  • Gli indici i e i+3 corrispondono a graphic e z dello stesso record.
return  RunScenario();
 object? RunScenario()
{
    var tiles = UO.GetTileXYM(UO.GetX(), UO.GetY(), UO.WorldNum(), 0, 65535, "");
    for (int i = (int)(0); i <= ArrayLength(tiles) - 1; i += (int)(4))
    {
        UO.Print(Convert.ToString(tiles[i]) + " " + Convert.ToString(tiles[i + 3]));
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

3. Intervallo inverso: classe di script

Parametri e flusso di esecuzione:

  • L'intervallo 100..99 non contiene alcun graphic e produce un array vuoto.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var tiles = UO.GetTileXYM(UO.GetX(), UO.GetY(), UO.WorldNum(), 100, 99, "");
        UO.Print(Convert.ToString(ArrayLength(tiles)));
        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: x (Any), y (Any), map (Any), tileStart (Any), tileEnd (Any), uoPath (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public InjectionValue GetTileXYM(InjectionValue x, InjectionValue y, InjectionValue map, InjectionValue tileStart, InjectionValue tileEnd, InjectionValue uoPath)

            => ToArray(bridge.GetTileXYM(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), NumberConversions.ToInt(tileStart), NumberConversions.ToInt(tileEnd), uoPath.ToString()));

UO.GetUserStatic

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

Firme C#

string UO.GetUserStatic(object? id);

Legge un record statico dell'utente salvato.

Parametri

  • id - int ID, ottenuto da AddUserStatic; non il graphic/type e non il serial del mondo.

Valore restituito

string: record serializzato salvato; sconosciuto ID restituisce una stringa vuota.

Comportamento

  • state.UserStatics.TryGetValue restituisce la stringa senza analizzarla. Notazione geometrica - "graphic|x|y|z|hue|map"; le vecchie voci di testo potrebbero contenere testo diverso.
  • Legge lo stato locale attuale. Non esiste alcun pacchetto, destinazione o aggiornamento automatico; le singole letture possono vedere stati diversi.
  • In un normale host client, questi dati di stato vengono presi dal gestore GetPersistentState e sono comuni a script/chat/macro dello stesso mondo/profilo e non appartengono a uno script. Un altro processo o un InjectionRuntimeState apparentemente separato ha uno stato diverso. Caricare/cancellare un profilo può sostituirlo; salvati serial vengono ancora confrontati con il mondo caricato.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

var result = UO.GetUserStatic(1);
UO.Print("GetUserStatic: " + Convert.ToString(result));

1. Chiamata diretta - sceneggiatura diretta

Parametri e flusso di esecuzione:

  • Legge un record statico dell'utente salvato.
UO.Print(UO.GetUserStatic(1));

2. Opzione esplicita: funzione dello script

Parametri e flusso di esecuzione:

  • state.UserStatics.TryGetValue restituisce la stringa senza analizzarla. Notazione geometrica - "graphic|x|y|z|hue|map"; le vecchie voci di testo potrebbero contenere testo diverso.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.UserStaticExists(1)))
    {
        UO.Print(UO.GetUserStatic(1));
    }

    return null;
}

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

3. Funzione di supporto completa: classe di script

Parametri e flusso di esecuzione:

  • Legge lo stato locale attuale. Non esiste alcun pacchetto, destinazione o aggiornamento automatico; le singole letture possono vedere stati diversi.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var records = UO.GetUserStatics();
        if (Truth(UO.GetArrayLength(records) > 0))
        {
            UO.Print(UO.GetUserStatic(records[0][0]));
        }

        return null;
    }

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

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: id (Any)

Risultato: string / String.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public string GetUserStatic(InjectionValue id)

            => state.UserStatics.TryGetValue(NumberConversions.ToInt(id), out string value) ? value : string.Empty;

UO.GetUserStatics

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

Firme C#

dynamic UO.GetUserStatics();

Legge lo stato.UserStatics.

Parametri

Non ci sono parametri.

Valore restituito

Matrice di stringhe [id, serializedText], ordinate per id. Ogni ID è int, serializedText - string; un dizionario vuoto fornisce un array vuoto.

Comportamento

  • Legge lo stato.UserStatics. La notazione geometrica viene memorizzata come "graphic|x|y|z|hue|map"; le voci di testo più vecchie AddUserStatic potrebbero avere un formato diverso. Queste sono voci di utenti locali, non tutte le mappe statiche.
  • Legge lo stato locale attuale. Non esiste alcun pacchetto, destinazione o aggiornamento automatico; le singole letture possono vedere stati diversi.
  • In un normale host client, questi dati di stato vengono presi dal gestore GetPersistentState e sono comuni a script/chat/macro dello stesso mondo/profilo e non appartengono a uno script. Un altro processo o un InjectionRuntimeState apparentemente separato ha uno stato diverso. Caricare/cancellare un profilo può sostituirlo; salvati serial vengono ancora confrontati con il mondo caricato.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetUserStatics();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Chiamata diretta - sceneggiatura diretta

Parametri e flusso di esecuzione:

  • Legge lo stato.UserStatics.
var records = UO.GetUserStatics();
UO.Print(UO.GetArrayLength(records));

2. Opzione esplicita: funzione dello script

Parametri e flusso di esecuzione:

  • Legge lo stato.UserStatics. La notazione geometrica viene memorizzata come "graphic|x|y|z|hue|map"; le voci di testo più vecchie AddUserStatic potrebbero avere un formato diverso. Queste sono voci di utenti locali, non tutte le mappe statiche.
return  RunScenario();
 object? RunScenario()
{
    var records = UO.GetUserStatics();
    if (Truth(UO.GetArrayLength(records) > 0))
    {
        UO.Print(records[0][0]);
        UO.Print(records[0][1]);
    }

    return null;
}

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

3. Funzione di supporto completa: classe di script

Parametri e flusso di esecuzione:

  • Legge lo stato locale attuale. Non esiste alcun pacchetto, destinazione o aggiornamento automatico; le singole letture possono vedere stati diversi.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var before = UO.GetUserStatics();
        UO.Wait(500);
        var after = UO.GetUserStatics();
        UO.Print(before);
        UO.Print(after);
        return null;
    }
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

UO.GetUserStatics() — UO.GetUserStatics()

Parametri: Nessun parametro.

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public InjectionValue GetUserStatics()

            => new InjectionValue(state.UserStatics.OrderBy(pair => pair.Key)

                .Select(pair => new InjectionValue(new[] { new InjectionValue(pair.Key), new InjectionValue(pair.Value) }))

                .ToArray());

UO.GetWorldCell

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

Firme C#

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

Legge i record estesi al suolo, i record fuori terra e gli oggetti del mondo caricati nell'area selezionata.

Parametri

  • x — cella X della mappa attualmente caricata; coordinate del mondo, non posizione all'interno del gump.
  • y — cella Y della mappa attualmente caricata; coordinate del mondo, non posizione all'interno del gump.
  • map — Numero della carta. Se questo argomento non è presente nel modulo selezionato, viene utilizzata la mappa corrente. Il vero client legge solo i riquadri dalla mappa attualmente caricata.

Valore restituito

Matrice di record. Ogni elemento result[i] ha il seguente formato:

Matrice di campi 11 di un record; gli indici iniziano con 0:

  • [0] kind — string: "terra", "statico" o "object".
  • [1] serial - int: serial voce dinamica; per terra/statico è 0.
  • [2] graphic - int: grafica type.
  • [3] x, [4] y - int: coordinate mondiali della cella.
  • [5] z - int: l'altezza della base nel mondo.
  • [6] hue - int: colore, vicino al suolo 0.
  • [7] flags - int: bit 32 bassi di flag di Tiledata.
  • [8] name - string: nome da Tiledata.
  • [9] layer - int: strato di attrezzature da Tiledata, vicino al suolo 0; non un indice statico.
  • [10] height - int: altezza graphic dai dati piastrellati, vicino al suolo 0; non la coordinata Z.

ArrayLength(risultato) - il numero di record, non il numero di celle e non il numero di passaggi del percorso. Il risultato potrebbe essere vuoto. Un x/y può avere più voci con diversi Z. The entry "object" has serial; la voce "statico" non ha un serial utilizzabile.

Comportamento

  • I dati si riferiscono alla mappa attualmente caricata. Un'altra carta o cella irraggiungibile risulta in un array vuoto. Le query dirette sui riquadri possono inoltre segnalare mancate corrispondenze della mappa; GetWorldCell e GetWorldTilesArray restituiscono immediatamente un array vuoto senza tale messaggio.
  • Gli indici degli array iniziano con 0. Controllare ArrayLength prima di leggere il campo. Z sta per altitudine mondiale; layer è la proprietà dell'attrezzatura da Tiledata e indice è il numero di serie della voce della cella.
  • La parte statica utilizza GetStaticTiles: la sua selezione attuale include anche Multi/Item. Un oggetto mondiale può inoltre apparire come "object" con serial; Non trattare ogni voce come un elemento unico.
  • GetWorldTilesArray limita la regione delle celle 1 000 000. Il superamento delle coordinate esterne a 0…65535/mappa esterna a 0…255 provoca un errore di comando anziché un array parziale. Per sondaggi frequenti, scegli una piccola area.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetWorldCell(UO.GetX(), UO.GetY());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Contare ed elencare i record: script diretto

Parametri e flusso di esecuzione:

  • GetWorldCell legge una cella; GetWorldTilesArray in questo esempio legge il quadrato 3×3 con i bordi abilitati.
  • cellule[i] è un array nidificato. piastrella[0] - categoria, [2] - graphic, [5] - Z.
var cells = UO.GetWorldCell(UO.GetX(), UO.GetY());
var i = 0;
while (Truth(i < ArrayLength(cells)))
{
    var tile = cells[i];
    UO.Print(tile[0] + ": " + Convert.ToString(tile[2]) + ", Z=" + Convert.ToString(tile[5]));
    i = i + 1;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Mostra solo le voci con l'elemento serial - funzione script

Parametri e flusso di esecuzione:

  • L'area viene selezionata in base alle coordinate, non al contenitore.
  • Il controllo kind="object" separa gli articoli seriali da quelli di massa/statici; [1] contiene serial.
return  RunScenario();
 object? RunScenario()
{
    var cells = UO.GetWorldCell(UO.GetX(), UO.GetY());
    var i = 0;
    while (Truth(i < ArrayLength(cells)))
    {
        var tile = cells[i];
        if (Truth(tile[0] == "object"))
        {
            UO.Print("Object serial: " + Convert.ToString(tile[1]));
        }

        i = i + 1;
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Selezionare Record all'altezza del carattere - Classe script

Parametri e flusso di esecuzione:

  • tile[5] e GetZ() vengono confrontati nelle stesse unità di altezza del mondo.
  • Uguaglianza Z filtra la base, ma non significa transitabilità o corrispondenza dell'intero pavimento.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var cells = UO.GetWorldCell(UO.GetX(), UO.GetY());
        var i = 0;
        while (Truth(i < ArrayLength(cells)))
        {
            var tile = cells[i];
            if (Truth(tile[5] == UO.GetZ()))
            {
                UO.Print(tile[8]);
            }

            i = i + 1;
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: x (Any), y (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public InjectionValue GetWorldCell(InjectionValue x, InjectionValue y)

            => GetWorldCell(x, y, new InjectionValue(bridge.WorldNumber));

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

Parametri: x (Any), y (Any), map (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public InjectionValue GetWorldCell(InjectionValue x, InjectionValue y, InjectionValue map)

            => BuildWorldCell(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), true);

UO.GetWorldNum

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

Firme C#

int UO.GetWorldNum();

Legge il numero della carta corrente dal modello client.

Parametri

Non ci sono parametri.

Valore restituito

int — indice della carta attuale del cliente, solitamente 0=Felucca, 1=Trammel, 2=Ilshenar, 3=Malas, 4=Tokuno, 5=Ter Mur. Il server dell'utente può utilizzare un diverso set di carte. 0 è una mappa a tutti gli effetti, non è un segno di errore.

Comportamento

  • I dati locali già ricevuti vengono letti. La richiesta non apre lo stato e non forza il server a inviare un aggiornamento. Dopo la morte, la transizione della mappa o l'eliminazione di un oggetto, i valori possono cambiare tra due chiamate.
  • C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

var result = UO.GetWorldNum();
UO.Print("GetWorldNum: " + Convert.ToString(result));

1. Visualizza il valore attuale del tuo personaggio - script diretto

Parametri e flusso di esecuzione:

  • La chiamata senza argomenti si riferisce a self. Il numero della carta attuale viene memorizzato in valore.
  • Convert.ToString converte il numero da emettere e non cambia il significato del risultato.
var value = UO.GetWorldNum();
UO.Print("GetWorldNum: " + Convert.ToString(value));

2. Utilizza valore nella convalida dell'applicazione - Funzione script

Parametri e flusso di esecuzione:

  • Il valore viene letto una volta senza argomenti. Il numero della carta corrente viene utilizzato nel calcolo o nella condizione mostrata.
  • Le soglie numeriche sono esempi di condizioni di script e non di nuovi limiti client. Il campo memorizza le unità server e le restrizioni sopra descritte.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetWorldNum();
    var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), value);
    UO.Print("Land record length: " + Convert.ToString(ArrayLength(land)));
    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

3. Guarda il cambiamento in un secondo: lezione di script

Parametri e flusso di esecuzione:

  • Entrambe le chiamate senza argomento leggono il loro valore corrente. UO.Wait(1000) dà una pausa in millisecondi tra gli scatti.
  • La variazione confrontata è il numero della carta attuale. Un esempio non cambia nulla al mondo e non aspetta all'infinito. Gli eventi entro questo secondo potrebbero essere persi.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.GetWorldNum();
        await Delay(1000);
        var after = UO.GetWorldNum();
        if (Truth(before != after))
        {
            UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        }

        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

UO.GetWorldNum() — UO.GetWorldNum()

Parametri: Nessun parametro.

Risultato: int / Integer.

Durante la chiamata:

La chiamata esegue il delegate del gestore memorizzato. Il metodo di registrazione lo crea durante la costruzione dell’API.

Codice interno di implementazione; non è uno script autonomo.

() => bridge.WorldNumber

Creazione API: Queste funzioni registrano l’API. Non vengono eseguite di nuovo a ogni chiamata del comando.


UO.GetWorldTilesArray

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

Firme C#

dynamic UO.GetWorldTilesArray(object? minX, object? minY, object? maxX, object? maxY, object? map);

Legge i record estesi al suolo, i record fuori terra e gli oggetti del mondo caricati nell'area selezionata.

Parametri

  • minX — Il primo bordo X del rettangolo, incluso; 0…65535.
  • minY — Il primo bordo Y del rettangolo, incluso; 0…65535.
  • maxX — Secondo confine X incluso; la più piccola/più grande delle due X viene selezionata automaticamente.
  • maxY — Secondo confine Y incluso; la più piccola/più grande delle due Y viene selezionata automaticamente.
  • map — Numero della carta. Se questo argomento non è presente nel modulo selezionato, viene utilizzata la mappa corrente. Il vero client legge solo i riquadri dalla mappa attualmente caricata.

Valore restituito

Matrice di record. Ogni elemento result[i] ha il seguente formato:

Matrice di campi 11 di un record; gli indici iniziano con 0:

  • [0] kind — string: "terra", "statico" o "object".
  • [1] serial - int: serial voce dinamica; per terra/statico è 0.
  • [2] graphic - int: grafica type.
  • [3] x, [4] y - int: coordinate mondiali della cella.
  • [5] z - int: l'altezza della base nel mondo.
  • [6] hue - int: colore, vicino al suolo 0.
  • [7] flags - int: bit 32 bassi di flag di Tiledata.
  • [8] name - string: nome da Tiledata.
  • [9] layer - int: strato di attrezzature da Tiledata, vicino al suolo 0; non un indice statico.
  • [10] height - int: altezza graphic dai dati piastrellati, vicino al suolo 0; non la coordinata Z.

ArrayLength(risultato) - il numero di record, non il numero di celle e non il numero di passaggi del percorso. Il risultato potrebbe essere vuoto. Un x/y può avere più voci con diversi Z. The entry "object" has serial; la voce "statico" non ha un serial utilizzabile.

Comportamento

  • I dati si riferiscono alla mappa attualmente caricata. Un'altra carta o cella irraggiungibile risulta in un array vuoto. Le query dirette sui riquadri possono inoltre segnalare mancate corrispondenze della mappa; GetWorldCell e GetWorldTilesArray restituiscono immediatamente un array vuoto senza tale messaggio.
  • Gli indici degli array iniziano con 0. Controllare ArrayLength prima di leggere il campo. Z sta per altitudine mondiale; layer è la proprietà dell'attrezzatura da Tiledata e indice è il numero di serie della voce della cella.
  • La parte statica utilizza GetStaticTiles: la sua selezione attuale include anche Multi/Item. Un oggetto mondiale può inoltre apparire come "object" con serial; Non trattare ogni voce come un elemento unico.
  • GetWorldTilesArray limita la regione delle celle 1 000 000. Il superamento delle coordinate esterne a 0…65535/mappa esterna a 0…255 provoca un errore di comando anziché un array parziale. Per sondaggi frequenti, scegli una piccola area.

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

object? result = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Contare ed elencare i record: script diretto

Parametri e flusso di esecuzione:

  • GetWorldCell legge una cella; GetWorldTilesArray in questo esempio legge il quadrato 3×3 con i bordi abilitati.
  • cellule[i] è un array nidificato. piastrella[0] - categoria, [2] - graphic, [5] - Z.
var cells = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
var i = 0;
while (Truth(i < ArrayLength(cells)))
{
    var tile = cells[i];
    UO.Print(tile[0] + ": " + Convert.ToString(tile[2]) + ", Z=" + Convert.ToString(tile[5]));
    i = i + 1;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Mostra solo le voci con l'elemento serial - funzione script

Parametri e flusso di esecuzione:

  • L'area viene selezionata in base alle coordinate, non al contenitore.
  • Il controllo kind="object" separa gli articoli seriali da quelli di massa/statici; [1] contiene serial.
return  RunScenario();
 object? RunScenario()
{
    var cells = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
    var i = 0;
    while (Truth(i < ArrayLength(cells)))
    {
        var tile = cells[i];
        if (Truth(tile[0] == "object"))
        {
            UO.Print("Object serial: " + Convert.ToString(tile[1]));
        }

        i = i + 1;
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Selezionare Record all'altezza del carattere - Classe script

Parametri e flusso di esecuzione:

  • tile[5] e GetZ() vengono confrontati nelle stesse unità di altezza del mondo.
  • Uguaglianza Z filtra la base, ma non significa transitabilità o corrispondenza dell'intero pavimento.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var cells = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
        var i = 0;
        while (Truth(i < ArrayLength(cells)))
        {
            var tile = cells[i];
            if (Truth(tile[5] == UO.GetZ()))
            {
                UO.Print(tile[8]);
            }

            i = i + 1;
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

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

Parametri: minX (Any), minY (Any), maxX (Any), maxY (Any), map (Any)

Risultato: dynamic / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public InjectionValue GetWorldTilesArray(InjectionValue minX, InjectionValue minY, InjectionValue maxX, InjectionValue maxY, InjectionValue map)

        {

            int firstX = Math.Min(NumberConversions.ToInt(minX), NumberConversions.ToInt(maxX));

            int lastX = Math.Max(NumberConversions.ToInt(minX), NumberConversions.ToInt(maxX));

            int firstY = Math.Min(NumberConversions.ToInt(minY), NumberConversions.ToInt(maxY));

            int lastY = Math.Max(NumberConversions.ToInt(minY), NumberConversions.ToInt(maxY));

            int world = NumberConversions.ToInt(map);

            if (firstX < 0 || firstY < 0 || lastX > ushort.MaxValue || lastY > ushort.MaxValue

                || world < 0 || world > byte.MaxValue)

                throw new NativeSubrutineException("World tile coordinates must be 0..65535 and the map must be 0..255.");

            if (((long)lastX - firstX + 1) * ((long)lastY - firstY + 1) > 1_000_000L)

                throw new NativeSubrutineException("World tile array is limited to 1,000,000 cells per call.");

            // Live world items have no per-result map field. Never combine the

            // current world's items with a request for a different map, or scan

            // every cell only to report the same unloaded-map failure repeatedly.

            if (world != bridge.WorldNumber)

                return new InjectionValue(Array.Empty<InjectionValue>());



            var result = new List<InjectionValue>();

            for (int cellX = firstX; cellX <= lastX; cellX++)

            for (int cellY = firstY; cellY <= lastY; cellY++)

            {

                InjectionValue cell = BuildWorldCell(cellX, cellY, world, false);

                if (cell.Kind == InjectionValueKind.Array)

                    result.AddRange(cell.Array);

            }



            foreach (int serial in bridge.GetWorldItems() ?? Array.Empty<int>())

            {

                int objectX = bridge.GetX(serial);

                int objectY = bridge.GetY(serial);

                if (objectX >= firstX && objectX <= lastX && objectY >= firstY && objectY <= lastY)

                    result.Add(BuildWorldTileRecord("object", serial, bridge.GetGraphics(serial), objectX, objectY,

                        bridge.GetZ(serial), bridge.GetColor(serial), 1));

            }

            return new InjectionValue(result.ToArray());

        }

UO.GetX

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

Firme C#

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

Legge il campo X dell'oggetto caricato o del carattere corrente.

Parametri

  • id è il Serial/ID dell'oggetto, non graphic/type. Numero, stringa esadecimale, nome standard self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse o nome AddObject. L'alias deve essere impostato; l'esistenza è controllata da Exists. La forma registrata senza argomenti utilizza self.

Valore restituito

int è la coordinata X. Per un oggetto sconosciuto, viene restituito 0. Anche lo zero è una coordinata valida. Misurato in celle per oggetti del mondo; Questi non sono pixel dello schermo.

Comportamento

  • Vengono letti gli ultimi dati già noti al client; la richiesta di aggiornamento non viene inviata al server.
  • Un oggetto sconosciuto e una proprietà non ancora recuperata possono avere un valore nullo/vuoto. Controlla Exists e le condizioni di una particolare azione.
  • Per un personaggio o un oggetto a terra, questa è la coordinata del mondo. L'oggetto all'interno del contenitore ha una posizione X/Y all'interno del gump; il comando non li traduce nelle coordinate mondiali del proprietario.
  • Viene letta la coordinata corrente dell'oggetto. I passaggi in attesa di conferma non vengono convertiti in calcoli di percorso da questo comando.

Esempio .csx

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

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

var result = UO.GetX();
UO.Print("GetX: " + Convert.ToString(result));

1. Leggi le tue coordinate - script diretto

Parametri e flusso di esecuzione:

  • La forma senza argomento seleziona self, il carattere corrente.
  • La posizione contiene la coordinata X, non serial.
var position = UO.GetX();
UO.Print("X: " + Convert.ToString(position));

2. Confronta con il carattere selezionato - funzione script

Parametri e flusso di esecuzione:

  • lasttarget dovrebbe puntare al personaggio o all'oggetto caricato a terra.
  • delta: differenza lungo un asse. Non è la lunghezza del percorso; il valore potrebbe essere negativo.
return  RunScenario();
 object? RunScenario()
{
    var other = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(other)))
    {
        var delta = UO.GetX(other) - UO.GetX();
        UO.Print("Difference: " + Convert.ToString(delta));
    }

    return null;
}

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

3. Ricorda il punto e confronta più tardi: classe di script

Parametri e flusso di esecuzione:

  • id="self" è una forma esplicita di selezione dei caratteri. UO.Wait=500 millisecondi.
  • Il confronto mostra la variazione solo nell'asse X. Le modifiche nell'altro asse o nella rotazione non vengono qui prese in considerazione.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.GetX("self");
        await Delay(500);
        var after = UO.GetX("self");
        if (Truth(before != after))
        {
            UO.Print("Coordinate changed");
        }

        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

UO.GetX() — UO.GetX()

Parametri: Nessun parametro.

Risultato: int / Integer.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

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

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

Parametri: id (Any/Integer/String)

Risultato: int / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

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

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

Parametri: id (Any/Integer/String)

Risultato: int / Integer.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

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

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

Parametri: id (Any/Integer/String)

Risultato: int / Integer.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

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

UO.GetY

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

Firme C#

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

Legge il campo Y dell'oggetto caricato o del carattere corrente.

Parametri

  • id è il Serial/ID dell'oggetto, non graphic/type. Numero, stringa esadecimale, nome standard self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse o nome AddObject. L'alias deve essere impostato; l'esistenza è controllata da Exists. La forma registrata senza argomenti utilizza self.

Valore restituito

int è la coordinata Y. Per un oggetto sconosciuto, viene restituito 0. Anche lo zero è una coordinata valida. Misurato in celle per oggetti del mondo; Questi non sono pixel dello schermo.

Comportamento

  • Vengono letti gli ultimi dati già noti al client; la richiesta di aggiornamento non viene inviata al server.
  • Un oggetto sconosciuto e una proprietà non ancora recuperata possono avere un valore nullo/vuoto. Controlla Exists e le condizioni di una particolare azione.
  • Per un personaggio o un oggetto a terra, questa è la coordinata del mondo. L'oggetto all'interno del contenitore ha una posizione X/Y all'interno del gump; il comando non li traduce nelle coordinate mondiali del proprietario.
  • Viene letta la coordinata corrente dell'oggetto. I passaggi in attesa di conferma non vengono convertiti in calcoli di percorso da questo comando.

Esempio .csx

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

Script C# autonomi

Ogni esempio può essere salvato come file separato .csx ed eseguito in IDE. Le funzioni oggetto UO e attesa forniscono l'host della sessione di gioco corrente. Sostituisci i nomi, le coordinate e gli indirizzi demo serial con i tuoi.

Esempio semplice

Esegui questo codice in un file .csx separato. Gli argomenti sono visibili nella chiamata; sostituisci nomi, serial e indirizzi di esempio con i tuoi.

Il risultato di una sola chiamata viene mostrato nel diario. Un numero non viene convertito in bool; per un array viene mostrato il numero di elementi.

var result = UO.GetY();
UO.Print("GetY: " + Convert.ToString(result));

1. Leggi le tue coordinate - script diretto

Parametri e flusso di esecuzione:

  • La forma senza argomento seleziona self, il carattere corrente.
  • La posizione contiene la coordinata Y, non serial.
var position = UO.GetY();
UO.Print("Y: " + Convert.ToString(position));

2. Confronta con il carattere selezionato - funzione script

Parametri e flusso di esecuzione:

  • lasttarget dovrebbe puntare al personaggio o all'oggetto caricato a terra.
  • delta: differenza lungo un asse. Non è la lunghezza del percorso; il valore potrebbe essere negativo.
return  RunScenario();
 object? RunScenario()
{
    var other = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(other)))
    {
        var delta = UO.GetY(other) - UO.GetY();
        UO.Print("Difference: " + Convert.ToString(delta));
    }

    return null;
}

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

3. Ricorda il punto e confronta più tardi: classe di script

Parametri e flusso di esecuzione:

  • id="self" è una forma esplicita di selezione dei caratteri. UO.Wait=500 millisecondi.
  • Il confronto mostra la variazione solo nell'asse Y. Le modifiche nell'altro asse o nella rotazione non vengono qui prese in considerazione.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.GetY("self");
        await Delay(500);
        var after = UO.GetY("self");
        if (Truth(before != after))
        {
            UO.Print("Coordinate changed");
        }

        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Implementazione del comando

C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.

UO.GetY() — UO.GetY()

Parametri: Nessun parametro.

Risultato: int / Integer.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

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

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

Parametri: id (Any/Integer/String)

Risultato: int / Any.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

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

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

Parametri: id (Any/Integer/String)

Risultato: int / Integer.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

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

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

Parametri: id (Any/Integer/String)

Risultato: int / Integer.

Durante la chiamata:

Codice interno di implementazione; non è uno script autonomo.

public int GetY(string id) => GetY(GetObject(id));
⚠️ **GitHub.com Fallback** ⚠️