IT UO Topic multis houses - 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
Oggetti compositi del mondo: case e altri multi, loro parti e posizione sulla mappa.
| Argomento | Comandi e spiegazioni |
|---|---|
| GetMultis | UO.GetMultis |
| Multi Parts | UO.GetMultiAllParts |
| Parts at Position | UO.GetMultiPartsAtPosition |
| IsHouse | UO.IsHouse |
UO.GetMultis · UO.GetMultiAllParts · UO.GetMultiPartsAtPosition · UO.IsHouse
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 items = UO.GetMultis();
UO.Print(Convert.ToString(ArrayLength(items)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Parametri, risultato e tutti gli scenari
var houses = UO.GetMultis();
if (Truth(ArrayLength(houses) == 0))
{
return null;
}
var parts = UO.GetMultiAllParts(houses[0]);
UO.Print(Convert.ToString(ArrayLength(parts)));
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;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetMultiAllParts(object? multiID);Legge i record di un componente di una casa.
-
multiID— Seriale/ID di un oggetto specifico: int, stringa decimale/esadecimale o set alias self, backpack, lasttarget, lastobject o nome AddObject. Questo non è graphic/type. Dovrebbe esserci ID caricato a casa in HouseManager.
Matrice<Matrice>. Ogni riga contiene i campi 9: [0] graphic/type componenti, [1] hue, [2] mondo X, [3] mondo Y, [4] mondo Z, [5] multiOffsetX - offset X da multi, [6] multiOffsetY - offset Y, [7] multiOffsetZ - offset Z, [8] multiSerial - serial a casa. Nessun componente: array vuoto. La grafica non è ID; I singoli componenti statici non hanno qui il proprio serial.
- Vengono letti i dati già scaricati dal client. Il comando non apre il contenitore, non sposta elementi né scarica oggetti dall'intero server.
- Array - array con indici a partire da 0. Salvalo in var, controlla ArrayLength prima di accedere. Gli elementi potrebbero scomparire dal mondo dopo aver scattato una foto: controlla Exists(serial) prima di agire.
- Vengono restituiti i componenti noti e non eliminati HouseManager. Mappe statiche e terreni separati non sono inclusi in questo elenco. Le righe sono un'istantanea; l'ordine fisso o l'ordinamento Z non sono promessi.
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.
var multis = (object?[])UO.GetMultis();
if (multis.Length > 0) {
var parts = (object?[])UO.GetMultiAllParts(multis[0]);
UO.Print("Parts: " + parts.Length);
}Parametri e flusso di esecuzione:
- Innanzitutto, viene selezionata una casa caricata.
- La lunghezza è il numero di componenti, non la loro altezza o il numero di case.
var houses = UO.GetMultis();
if (Truth(ArrayLength(houses) == 0))
{
return null;
}
var parts = UO.GetMultiAllParts(houses[0]);
UO.Print(Convert.ToString(ArrayLength(parts)));
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:
- parts[0] è la prima riga dell'array. Il suo [0] - type, [2]/[3]/[4] - mondo X/Y/Z.
- Gli indici [5]/[6]/[7] contengono invece offset relativi.
return RunScenario();
object? RunScenario()
{
var houses = UO.GetMultis();
if (Truth(ArrayLength(houses) == 0))
{
return null;
}
var parts = UO.GetMultiAllParts(houses[0]);
if (Truth(ArrayLength(parts) > 0))
{
var part = parts[0];
UO.Print("Type: 0x" + Hex(part[0]));
UO.Print(Convert.ToString(part[2]) + "," + Convert.ToString(part[3]) + "," + Convert.ToString(part[4]));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
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:
- [8] è serial a casa, [7] è l'offset dei componenti Z.
- Non passare part[0] a un comando che prevede serial a casa: si tratta di graphic di un componente separato.
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 houses = UO.GetMultis();
if (Truth(ArrayLength(houses) == 0))
{
return null;
}
var parts = UO.GetMultiAllParts(houses[0]);
var i = 0;
while (Truth(i < ArrayLength(parts)))
{
var part = parts[i];
UO.Print("Multi: 0x" + Hex(part[8]) + ", offset Z: " + Convert.ToString(part[7]));
i = i + 1;
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
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: multiID (Any)
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetMultiAllParts:bridge.GetMultiAllParts(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Codice interno di implementazione; non è uno script autonomo.
case "getmultiallparts":
return new InjectionValue((bridge.GetMultiAllParts(Arg(0)) ?? Array.Empty<int[]>())
.Select(part => new InjectionValue((part ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray())).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetMultiPartsAtPosition(object? x, object? y);Legge i componenti delle case nella cella del mondo specificata.
-
x— Coordinata del mondo X della cella della mappa corrente, non l'offset all'interno della casa. -
y— Coordinata mondiale Y della cella. Vengono restituiti i componenti di tutte le case caricate in questa cella, a tutte le altezze Z.
Matrice<Matrice>. Ogni riga contiene i campi 9: [0] graphic/type componenti, [1] hue, [2] mondo X, [3] mondo Y, [4] mondo Z, [5] multiOffsetX - offset X da multi, [6] multiOffsetY - offset Y, [7] multiOffsetZ - offset Z, [8] multiSerial - serial a casa. Nessun componente: array vuoto. La grafica non è ID; I singoli componenti statici non hanno qui il proprio serial.
- Vengono letti i dati già scaricati dal client. Il comando non apre il contenitore, non sposta elementi né scarica oggetti dall'intero server.
- Array - array con indici a partire da 0. Salvalo in var, controlla ArrayLength prima di accedere. Gli elementi potrebbero scomparire dal mondo dopo aver scattato una foto: controlla Exists(serial) prima di agire.
- Vengono restituiti i componenti noti e non eliminati HouseManager. Mappe statiche e terreni separati non sono inclusi in questo elenco. Le righe sono un'istantanea; l'ordine fisso o l'ordinamento Z non sono promessi.
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.GetMultiPartsAtPosition(UO.GetX(), UO.GetY());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parametri e flusso di esecuzione:
- X/Y: la posizione attuale del personaggio.
- La lunghezza è il numero di componenti, non la loro altezza o il numero di case.
var parts = UO.GetMultiPartsAtPosition(UO.GetX(), UO.GetY());
UO.Print(Convert.ToString(ArrayLength(parts)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Parametri e flusso di esecuzione:
- parts[0] è la prima riga dell'array. Il suo [0] - type, [2]/[3]/[4] - mondo X/Y/Z.
- Gli indici [5]/[6]/[7] contengono invece offset relativi.
return RunScenario();
object? RunScenario()
{
var parts = UO.GetMultiPartsAtPosition(UO.GetX(), UO.GetY());
if (Truth(ArrayLength(parts) > 0))
{
var part = parts[0];
UO.Print("Type: 0x" + Hex(part[0]));
UO.Print(Convert.ToString(part[2]) + "," + Convert.ToString(part[3]) + "," + Convert.ToString(part[4]));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
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:
- [8] è serial a casa, [7] è l'offset dei componenti Z.
- Non passare part[0] a un comando che prevede serial a casa: si tratta di graphic di un componente separato.
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 parts = UO.GetMultiPartsAtPosition(UO.GetX(), UO.GetY());
var i = 0;
while (Truth(i < ArrayLength(parts)))
{
var part = parts[i];
UO.Print("Multi: 0x" + Hex(part[8]) + ", offset Z: " + Convert.ToString(part[7]));
i = i + 1;
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
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.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetMultiPartsAtPosition:bridge.GetMultiPartsAtPosition(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Codice interno di implementazione; non è uno script autonomo.
case "getmultipartsatposition":
return new InjectionValue((bridge.GetMultiPartsAtPosition(Arg(0), Arg(1)) ?? Array.Empty<int[]>())
.Select(part => new InjectionValue((part ?? Array.Empty<int>()).Select(value => new InjectionValue(value)).ToArray())).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetMultis();Elenco degli oggetti caricati riconosciuti dal client come home/multi.
Non ci sono parametri.
L'array è serial di elementi del mondo per i quali IsHouse restituisce 1. Un Array vuoto se non sono presenti tali oggetti. Queste sono le case ID, non un elenco di componenti grafici, non coordinate e non un elenco di tutte le case sul server.
- Vengono letti i dati già scaricati dal client. Il comando non apre il contenitore, non sposta elementi né scarica oggetti dall'intero server.
- Array - array con indici a partire da 0. Salvalo in var, controlla ArrayLength prima di accedere. Gli elementi potrebbero scomparire dal mondo dopo aver scattato una foto: controlla Exists(serial) prima di agire.
- I dati vengono letti dagli elementi del mondo caricati. Per i componenti di una casa, utilizzare GetMultiAllParts(serial).
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.GetMultis();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Parametri e flusso di esecuzione:
- Non ci sono parametri; vengono selezionati gli elementi domestici/multipli caricati.
- Lunghezza - numero di record/ID. Questo non è l'importo dell'importo in pile. L'elenco vuoto dà 0.
var items = UO.GetMultis();
UO.Print(Convert.ToString(ArrayLength(items)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Parametri e flusso di esecuzione:
- Non ci sono parametri; vengono selezionati gli elementi domestici/multipli caricati.
- elementi[i] — numerico serial. Hex viene utilizzato solo per l'output. Il ciclo non accede all'ultimo indice.
return RunScenario();
object? RunScenario()
{
var items = UO.GetMultis();
var i = 0;
while (Truth(i < ArrayLength(items)))
{
UO.Print("0x" + Hex(items[i]));
i = i + 1;
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
string Hex(object? value) => Convert.ToInt64(value).ToString("X");
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 ci sono parametri; vengono selezionati gli elementi domestici/multipli caricati.
- Vengono controllate due cose diverse: il record nell'istantanea e l'esistenza dell'oggetto adesso. L'ordine senza una cernita esplicita non significa vicinanza.
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 items = UO.GetMultis();
if (Truth(ArrayLength(items) > 0))
{
var first = items[0];
if (Truth(UO.Exists(first)))
{
UO.Print(UO.GetName(first));
}
}
else
{
UO.Print("Empty list");
}
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: Nessun parametro.
Risultato: dynamic / Any.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetWorldItems:bridge.GetWorldItems(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsHouse:bridge.IsHouse(id).
Codice interno di implementazione; non è uno script autonomo.
case "getmultis":
return new InjectionValue(bridge.GetWorldItems().Where(id => bridge.IsHouse(id) != 0).Select(id => new InjectionValue(id)).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.IsHouse(object? objID);Controlla il multi flag per un oggetto caricato: una casa, una nave o un'altra struttura multi-tile.
-
objID— Obbligatorio serial/ID di un oggetto specifico: int, stringa esadecimale o alias self, backpack, lasttarget, lastobject, lastcontainer, laststatus, finditem, lastcorpse o nome AddObject. Questo non è graphic/type. Il nome non specificato si risolve in 0; il comando non apre alcuna nuova destinazione.
int 1: un elemento con l'attributo IsMulti. int 0 - oggetto normale, oggetto mobile, sconosciuto o remoto. Il nome non limita il risultato alle case: una nave può anche dare 1. La squadra non restituisce il proprietario di casa, regione o zona.
Il risultato del comando è un flag numerico: 1 significa una condizione soddisfatta, 0 significa una condizione non soddisfatta. Dopo var risultato = comando(...) controlla se (risultato != 0) o se (risultato == 0). Salva il risultato di una chiamata: una chiamata ripetuta può eseguire nuovamente l'azione o leggere lo stato che è già cambiato.
- Viene letto il modello client locale; Non ci sono richieste al server, nessuna attesa o spostamento.
- Il risultato si riferisce al momento della lettura. Dopo UO.Wait o altra azione, l'oggetto e i suoi flag potrebbero cambiare.
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.IsHouse(UO.GetSerial("lasttarget"));
UO.Print("IsHouse: " + Convert.ToString(result));Parametri e flusso di esecuzione:
- target dovrebbe contenere il serial dell'oggetto multiplo, non il graphic del singolo muro.
- 1 significa classe multi; Ciò non è la prova che la struttura sia un edificio residenziale.
var target = UO.GetSerial("lasttarget");
if (Truth(UO.IsHouse(target)))
{
UO.Print("Loaded multi structure");
}
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:
- Innanzitutto viene verificata la presenza, quindi mobile viene eliminato.
- Uno zero senza Exists potrebbe significare nessun oggetto, piuttosto che un oggetto ordinario.
return RunScenario();
object? RunScenario()
{
var target = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(target)))
{
if (Truth(UO.IsNPC(target) == 0))
{
if (Truth(UO.IsHouse(target)))
{
UO.Print("Multi");
}
else
{
UO.Print("Ordinary item");
}
}
}
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:
- self è mobile, quindi il primo risultato è 0 anche all'interno della casa.
- Per testare un costrutto, passa il proprio serial; la squadra non sta cercando una casa attorno al personaggio.
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 selfIsMulti = UO.IsHouse("self");
var selectedIsMulti = UO.IsHouse("lasttarget");
UO.Print("Self: " + Convert.ToString(selfIsMulti));
UO.Print("Selected object: " + Convert.ToString(selectedIsMulti));
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: objID (Any)
Risultato: int / Integer.
Durante la chiamata:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsHouse:bridge.IsHouse(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Codice interno di implementazione; non è uno script autonomo.
case "ishouse": return new InjectionValue(bridge.IsHouse(Arg(0)));