IT UO Topic world geometry - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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.
| 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 |
UO.X · UO.Y · UO.Z · UO.GetX · UO.GetY · UO.GetZ
UO.GetWorldCell · UO.GetMapCell · UO.IsWorldCellPassable · UO.GetSurfaceZ · UO.GetNextStepZ · UO.GetWorldTilesArray
UO.GetLandscapeTile · UO.GetLandTileAt · UO.GetLandTileData · UO.GetLandTilesArray · UO.GetLandTilesArrayEx
UO.GetStaticArt · UO.GetStaticTileAt · UO.GetStaticTileData · UO.GetStaticTiles · UO.GetStaticTilesArray · UO.GetStaticTilesArrayEx · UO.ReadStaticsXY · UO.PrivateGetTile · UO.GetTileXYM · UO.GetLayerCount
UO.GetTileFlags · UO.GetTileHeight · UO.GetTileLayer · UO.GetTileName · UO.IsWaterTile · UO.IsTreeTile · UO.IsMineTile · UO.ConvertIntegerToFlags
UO.AddUserStatic · UO.ClearUserStatics · UO.GetUserStatic · UO.GetUserStatics · UO.RemoveUserStatic · UO.UserStaticExists
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.
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;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;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.AddUserStatic(object? staticItem, object? worldNum);
int UO.AddUserStatic(object? graphic, object? x, object? y, object? z, object? hue, object? map);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.
-
staticItem: valore numerico graphic o testo precedente. -
worldNum- indice della scheda per la registrazione o statico locale. -
graphic— ID statico da0a65535. -
z— altezza. Quando aggiunto a Pathfinder, il valore è limitato all'intervallo di byte con segno. -
hue- hue; quando aggiunto, limitato all'intervallo da0a65535. -
map— indice della mappa; per l'elaborazione manager, l'intervallo è limitato a0–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.
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.
-
-
UO.AddUserStatic('tree', 0)- poichétreenon è 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
ze hue0del 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.
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.
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;
}
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: staticItem (Any), worldNum (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1, bridge.WorldNumber). -
InjectionScript.Runtime.NumberConversions.TryStr2Int:NumberConversions.TryStr2Int(arguments[0].String, out graphic). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.AddUserStatic:AddUserStatic(graphic, bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), bridge.GetZ(bridge.Self), 0, map). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
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));
}Parametri: graphic (Any), x (Any), y (Any), z (Any), hue (Any), map (Any)
Risultato: int / Integer.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.Register [AddUserStatic]. -
InjectionScript.Runtime.InjectionApiUO.AddUserStatic:AddUserStatic( NumberConversions.ToInt(values[0]), NumberConversions.ToInt(values[1]), NumberConversions.ToInt(values[2]), NumberConversions.ToInt(values[3]), NumberConversions.ToInt(values[4]), NumberConversions.ToInt(values[5])). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[0]).
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])))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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.
-
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.
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.
- 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.
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.
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));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));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;
}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;
}
}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:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.CheckPortableLineOfSight:CheckPortableLineOfSight(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), Arg(5), Arg(6)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
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);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ClearUserStatics();Rimuove tutte le voci di runtime statiche dell'utente e gli oggetti del gestore statico locale.
Non ci sono parametri.
void: nessun valore restituito.
- State.UserStatics e gli oggetti manager vengono cancellati. I file della mappa caricati e gli elementi del real server non vengono eliminati.
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.
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();Parametri e flusso di esecuzione:
- Rimuove tutte le voci di runtime statiche dell'utente e gli oggetti del gestore statico locale.
UO.ClearUserStatics();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;
}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;
}
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: Nessun parametro.
Risultato: void / Unit.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClearUserStatics:bridge.ClearUserStatics().
Codice interno di implementazione; non è uno script autonomo.
case "clearuserstatics": state.UserStatics.Clear(); bridge.ClearUserStatics(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.ConvertIntegerToFlags(object? group, object? value);Analizza una maschera numerica di flag di riquadro in un array di nomi di enumerazione TileFlag.
-
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.
Matrice di stringhe denominate diverse da zero TileFlag i cui bit sono completamente presenti nella maschera. La maschera 0 produce un array vuoto.
- 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.
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.
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));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;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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: group (Any), value (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ConvertTileFlags:bridge.ConvertTileFlags(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
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());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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.
-
xfrom— Coordinata X del punto iniziale. -
yfrom— Coordinata Y del punto iniziale. -
xto— La coordinata di assegnazione X. -
yto— La coordinata di assegnazione Y.
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.
- 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.
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.
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));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);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;
}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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: xfrom (Any), yfrom (Any), xto (Any), yto (Any)
Risultato: int / Integer.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.GetDistance:GetDistance(Arg(0), Arg(1), Arg(2), Arg(3)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDistance:bridge.GetDistance(Arg(0)).
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)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetDistance(object? id);
int UO.GetDistance(object? x, object? y);
int UO.GetDistance(object? id1, object? x2, object? y2);
int UO.GetDistance(object? x1, object? y1, object? x2, object? y2);Misura la distanza nelle celle in base alle differenze X/Y massime. Questa è una stima geometrica senza pathfinding.
-
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.
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).
- 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.
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.
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));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;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;
}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;
}
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: id (Any/Integer/String)
Risultato: int / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDistance:bridge.GetDistance(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Codice interno di implementazione; non è uno script autonomo.
case "getdistance": return new InjectionValue(bridge.GetDistance(Arg(0)));Parametri: id (Any/Integer/String)
Risultato: int / Integer.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDistance:bridge.GetDistance(id).
Codice interno di implementazione; non è uno script autonomo.
public int GetDistance(int id) => bridge.GetDistance(id);Parametri: id (Any/Integer/String)
Risultato: int / Integer.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
InjectionScript.Runtime.InjectionApiUO.GetDistance:GetDistance(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Codice interno di implementazione; non è uno script autonomo.
public int GetDistance(string id) => GetDistance(GetObject(id));Parametri: x (Integer), y (Integer)
Risultato: int / Integer.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
InjectionScript.Runtime.InjectionApiUO.GetDistance:GetDistance(bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), x, y). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
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);Parametri: id1 (Any), x2 (Any), y2 (Any)
Risultato: int / Integer.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(obj1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(obj1). -
InjectionScript.Runtime.InjectionApiUO.GetDistance:GetDistance(x1, y1, NumberConversions.ToInt(x2), NumberConversions.ToInt(y2)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x2).
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));
}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);
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetLandTileAt(object? x, object? y);
dynamic UO.GetLandTileAt(object? x, object? y, object? map);Restituisce il record catastale esteso della cella selezionata.
-
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.
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.
- 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.
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.
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));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;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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: x (Any), y (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetLandTileAt. -
InjectionScript.Runtime.InjectionApiUO.GetLandTileAt:GetLandTileAt(x, y, new InjectionValue(bridge.WorldNumber)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
Codice interno di implementazione; non è uno script autonomo.
public InjectionValue GetLandTileAt(InjectionValue x, InjectionValue y)
=> GetLandTileAt(x, y, new InjectionValue(bridge.WorldNumber));Parametri: x (Any), y (Any), map (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetLandTileAt. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLandscapeTile:bridge.GetLandscapeTile(cellX, cellY, world). -
InjectionScript.Runtime.InjectionApiUO.BuildWorldTileRecord:BuildWorldTileRecord("land", 0, land[0], cellX, cellY, land[1], 0, 0).
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>());
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetLandTileData(object? tile);Legge il record di riferimento del terreno esteso da Tiledata.
-
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.
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.
- 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.
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.
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));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;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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: tile (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.BuildTileData:BuildTileData(0, Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Codice interno di implementazione; non è uno script autonomo.
case "getlandtiledata":
return BuildTileData(0, Arg(0));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetLandTilesArray(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileType);Cerca le tessere terreno in graphic/type in un rettangolo.
-
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.
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.
- 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.
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.
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));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;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;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;
}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:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.FindPortableTiles:FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, false). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
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);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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.
-
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.
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.
- 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.
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.
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));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;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;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;
}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:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.FindPortableTiles:FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), false). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::ArrayArg:ArrayArg(5).
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);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetLandscapeTile(object? x, object? y, object? map);Legge la terra di una cella della carta corrente.
-
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.
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.
- 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.
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.
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));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;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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: x (Any), y (Any), map (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetLandscapeTile. -
InjectionScript.Runtime.InjectionApiUO.ToArray:ToArray(bridge.GetLandscapeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map))). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLandscapeTile:bridge.GetLandscapeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
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)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetLayerCount(object? x, object? y, object? worldNum);Conta i record di geometria non terrestre in una cella.
-
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.
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.
- 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.
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.
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));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));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;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;
}
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: x (Any), y (Any), worldNum (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticTiles:bridge.GetStaticTiles(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
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);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetMapCell(object? x, object? y, object? worldNum);Legge graphic, bandiere di altezza e terra in un quadrato della mappa.
-
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.
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).
- 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.
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.
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));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;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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: x (Any), y (Any), worldNum (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLandscapeTile:bridge.GetLandscapeTile(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
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());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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.
-
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.
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].
- 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.
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.
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));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));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;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;
}
}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:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsOnline:bridge.IsOnline(). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(4). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CheckWorldStep:bridge.CheckWorldStep(Arg(0), Arg(1), Arg(5), Arg(2), Arg(3), Arg(4)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
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));
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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.
-
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.
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.
- 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.
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.
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));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;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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: objType (Any), hue (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticArt:bridge.GetStaticArt(ResolveType(arguments[0]), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1).
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());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetStaticTileAt(object? x, object? y, object? index);
dynamic UO.GetStaticTileAt(object? x, object? y, object? map, object? index);Restituisce un record esteso di un record sopra il suolo della cella selezionata.
-
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.
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.
- 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.
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.
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));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;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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: x (Any), y (Any), index (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetStaticTileAt. -
InjectionScript.Runtime.InjectionApiUO.GetStaticTileAt:GetStaticTileAt(x, y, new InjectionValue(bridge.WorldNumber), index). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
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);Parametri: x (Any), y (Any), map (Any), index (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetStaticTileAt. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticTiles:bridge.GetStaticTiles(cellX, cellY, NumberConversions.ToInt(map)). -
InjectionScript.Runtime.InjectionApiUO.BuildWorldTileRecord:BuildWorldTileRecord("static", 0, statics[offset], cellX, cellY, statics[offset + 1], statics[offset + 2], 1).
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>());
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetStaticTileData(object? tile);Legge la voce di riferimento esteso statico graphic da Tiledata.
-
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.
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.
- 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.
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.
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));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;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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: tile (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.BuildTileData:BuildTileData(1, Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Codice interno di implementazione; non è uno script autonomo.
case "getstatictiledata":
return BuildTileData(1, Arg(0));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetStaticTiles(object? x, object? y, object? map);Legge le voci sopra il suolo in una cella della mappa corrente.
-
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.
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.
- 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.
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.
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));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;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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: x (Any), y (Any), map (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetStaticTiles. -
InjectionScript.Runtime.InjectionApiUO.ToArray:ToArray(bridge.GetStaticTiles(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map))). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticTiles:bridge.GetStaticTiles(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
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)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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.
-
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.
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.
- 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.
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.
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));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;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;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;
}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:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.FindPortableTiles:FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, true). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
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);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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.
-
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.
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.
- 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.
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.
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));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;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;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;
}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:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.FindPortableTiles:FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), true). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::ArrayArg:ArrayArg(5).
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);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetSurfaceZ(object? x, object? y, object? worldNum);Legge l'altezza media della superficie del terreno in una cella.
-
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.
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.
- 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.
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.
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));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));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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: x (Any), y (Any), worldNum (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetSurfaceZ:bridge.GetSurfaceZ(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Codice interno di implementazione; non è uno script autonomo.
case "getsurfacez":
return new InjectionValue(bridge.GetSurfaceZ(Arg(0), Arg(1), Arg(2)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetTileFlags(object? group, object? tileId);Legge la maschera di bit della proprietà graphic dalla voce Tiledata.
-
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.
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.
- 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.
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.
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));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;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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: group (Any), tileId (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetTileFlags. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileFlags:bridge.GetTileFlags(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group).
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))));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetTileHeight(object? group, object? tileId);Legge l'altezza graphic dalla voce Tiledata.
-
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.
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.
- 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.
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.
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));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));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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: group (Any), tileId (Any)
Risultato: int / Integer.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetTileHeight. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileDataProperties:bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)).
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];
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetTileLayer(object? group, object? tileId);Legge il numero del livello dell'apparecchiatura dalla voce Tiledata.
-
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.
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.
- 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.
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.
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));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;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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: group (Any), tileId (Any)
Risultato: int / Integer.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetTileLayer. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileDataProperties:bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)).
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];
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.GetTileName(object? group, object? tileId);Legge il nome graphic dalla voce Tiledata.
-
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.
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.
- 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.
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.
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));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;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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: group (Any), tileId (Any)
Risultato: string / String.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetTileName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileDataName:bridge.GetTileDataName(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group).
Codice interno di implementazione; non è uno script autonomo.
public string GetTileName(InjectionValue group, InjectionValue tileId)
=> bridge.GetTileDataName(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetTileXYM(object? x, object? y, object? map, object? tileStart, object? tileEnd, object? uoPath);Legge il graphic ID abbinato dalla catena di oggetti della cella della scheda di gioco attualmente caricata.
-
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.
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.
- 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.
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.
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));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;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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: x (Any), y (Any), map (Any), tileStart (Any), tileEnd (Any), uoPath (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetTileXYM. -
InjectionScript.Runtime.InjectionApiUO.ToArray:ToArray(bridge.GetTileXYM(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), NumberConversions.ToInt(tileStart), NumberConversions.ToInt(tileEnd), uoPath.ToString())). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileXYM:bridge.GetTileXYM(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), NumberConversions.ToInt(tileStart), NumberConversions.ToInt(tileEnd), uoPath.ToString()). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x). -
InjectionScript.Runtime.InjectionValue.ToString:uoPath.ToString().
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()));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.GetUserStatic(object? id);Legge un record statico dell'utente salvato.
-
id- int ID, ottenuto da AddUserStatic; non il graphic/type e non il serial del mondo.
string: record serializzato salvato; sconosciuto ID restituisce una stringa vuota.
- 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.
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.
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));Parametri e flusso di esecuzione:
- Legge un record statico dell'utente salvato.
UO.Print(UO.GetUserStatic(1));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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: id (Any)
Risultato: string / String.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetUserStatic. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(id).
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;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetUserStatics();Legge lo stato.UserStatics.
Non ci sono parametri.
Matrice di stringhe [id, serializedText], ordinate per id. Ogni ID è int, serializedText - string; un dizionario vuoto fornisce un array vuoto.
- 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.
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.
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));Parametri e flusso di esecuzione:
- Legge lo stato.UserStatics.
var records = UO.GetUserStatics();
UO.Print(UO.GetArrayLength(records));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;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;
}
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
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());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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.
-
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.
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.
- 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.
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.
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));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;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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: x (Any), y (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetWorldCell. -
InjectionScript.Runtime.InjectionApiUO.GetWorldCell:GetWorldCell(x, y, new InjectionValue(bridge.WorldNumber)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
Codice interno di implementazione; non è uno script autonomo.
public InjectionValue GetWorldCell(InjectionValue x, InjectionValue y)
=> GetWorldCell(x, y, new InjectionValue(bridge.WorldNumber));Parametri: x (Any), y (Any), map (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetWorldCell. -
InjectionScript.Runtime.InjectionApiUO.BuildWorldCell:BuildWorldCell(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), true). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
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);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetWorldNum();Legge il numero della carta corrente dal modello client.
Non ci sono parametri.
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.
- 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.
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.
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));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));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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: Nessun parametro.
Risultato: int / Integer.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [GetWorldNum]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
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.WorldNumberCreazione API: Queste funzioni registrano l’API. Non vengono eseguite di nuovo a ogni chiamata del comando.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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.
-
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.
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.
- 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.
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.
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));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;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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: minX (Any), minY (Any), maxX (Any), maxY (Any), map (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetWorldTilesArray. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(minX). -
InjectionScript.Runtime.InjectionApiUO.BuildWorldCell:BuildWorldCell(cellX, cellY, world, false). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetWorldItems:bridge.GetWorldItems(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(serial). -
InjectionScript.Runtime.InjectionApiUO.BuildWorldTileRecord:BuildWorldTileRecord("object", serial, bridge.GetGraphics(serial), objectX, objectY, bridge.GetZ(serial), bridge.GetColor(serial), 1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetGraphics:bridge.GetGraphics(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetColor:bridge.GetColor(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
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());
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetX();
int UO.GetX(object? id);Legge il campo X dell'oggetto caricato o del carattere corrente.
-
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.
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.
- 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.
int x = UO.GetX();
UO.Print($"X = {x}");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.
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));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));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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: Nessun parametro.
Risultato: int / Integer.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetX. -
InjectionScript.Runtime.InjectionApiUO.GetX:GetX("self").
Codice interno di implementazione; non è uno script autonomo.
public int GetX() => GetX("self");Parametri: id (Any/Integer/String)
Risultato: int / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Codice interno di implementazione; non è uno script autonomo.
case "getx": return new InjectionValue(bridge.GetX(Arg(0, bridge.Self)));Parametri: id (Any/Integer/String)
Risultato: int / Integer.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetX. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(id).
Codice interno di implementazione; non è uno script autonomo.
public int GetX(int id) => bridge.GetX(id);Parametri: id (Any/Integer/String)
Risultato: int / Integer.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetX. -
InjectionScript.Runtime.InjectionApiUO.GetX:GetX(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Codice interno di implementazione; non è uno script autonomo.
public int GetX(string id) => GetX(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetY();
int UO.GetY(object? id);Legge il campo Y dell'oggetto caricato o del carattere corrente.
-
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.
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.
- 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.
int y = UO.GetY();
UO.Print($"Y = {y}");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.
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));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));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;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;
}C# distingue maiuscole e minuscole. Usare il nome UO esatto. Confrontare i flag numerici con 0; usare bool solo se la firma restituisce bool.
Parametri: Nessun parametro.
Risultato: int / Integer.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetY. -
InjectionScript.Runtime.InjectionApiUO.GetY:GetY("self").
Codice interno di implementazione; non è uno script autonomo.
public int GetY() => GetY("self");Parametri: id (Any/Integer/String)
Risultato: int / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Codice interno di implementazione; non è uno script autonomo.
case "gety": return new InjectionValue(bridge.GetY(Arg(0, bridge.Self)));Parametri: id (Any/Integer/String)
Risultato: int / Integer.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetY. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(id).
Codice interno di implementazione; non è uno script autonomo.
public int GetY(int id) => bridge.GetY(id);Parametri: id (Any/Integer/String)
Risultato: int / Integer.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.GetY. -
InjectionScript.Runtime.InjectionApiUO.GetY:GetY(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Codice interno di implementazione; non è uno script autonomo.
public int GetY(string id) => GetY(GetObject(id));