API Basic Structure de - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

Structure / New / fields

ClassicUO • Basic

Structure fasst typisierte Felder wie X, Y und Z zu einem Wert zusammen. Unterstützt werden Datenstrukturen mit Wertkopien; der gesamte VB.NET-Sprachumfang ist damit nicht gemeint.

Genaue Syntax

[Public | Private] Structure TypeName
    [Public | Dim | VAR] field As FieldType
End Structure
Dim value As TypeName
Dim value = New TypeName()
copy = value
value.field = expression
Sub Change(ByRef value As TypeName)
Function Copy(ByVal value As TypeName) As TypeName

Parameter

  • TypeName / Public / Private — Eindeutiger einfacher Typname auf Datei- oder Module-Ebene. Standard: Public. Private ist nur innerhalb eines Module erlaubt; außerhalb ist dieser Typname nicht zugänglich. Öffentlicher Modultyp: ModuleName.TypeName. Schlüsselwörter und Feldnamen werden nicht übersetzt.
  • field / FieldType — Eindeutiger Feldname, As und ein unterstützter skalarer Typ, Enum oder eine andere Structure. Felder sind öffentlich; Public, Dim und VAR sind möglich. Typen: Integer/Long/Short/Byte, Single/Double/Decimal, String, Boolean/Bool, Object/Variant. Ganzzahl-Aliase verwenden vorzeichenbehaftete 32 Bit. Keine zyklischen Strukturfelder.
  • Dim / New — Dim value As TypeName und New TypeName() erzeugen den Standardwert ohne Skriptaufruf. New verlangt leere Klammern: X/Y/Z werden danach zugewiesen. Dim copy = value übernimmt den Ausdruckswert. Kein UO.-Präfix.
  • value.field / copy — Punktzugriff liest und schreibt Felder, auch route.Start.X. Schreiben prüft den Feldtyp und ersetzt den umgebenden Wert. copy = value kopiert skalare und verschachtelte Strukturwerte; copy.X verändert value.X nicht. Strukturtypen müssen kompatibel sein.
  • ByVal / ByRef — ByVal übergibt eine Wertkopie. ByRef kopiert beim Eintritt und schreibt beim Verlassen zum Aufrufer zurück, auch in ein beschreibbares Feldargument. Modifier ausdrücklich angeben; ohne sie gelten die bisherigen Basic-Regeln. Return kann eine Struktur zurückgeben; Function kann As TypeName deklarieren.

Rückgabewert

Deklaration und Zuweisung liefern Unit. New und entsprechende Funktionen liefern einen Strukturwert, in Laufzeitbeobachtungen als Object mit dem deklarierten Typnamen dargestellt. Koordinaten sind Zahlenwerte, keine Boolean-Flags. = und <> liefern 1/True oder 0/False. Die Beispielergebnisse sind Strings: "1445:1447:1690:0", "10:15:24", "2:4:2:2".

Verhalten

  • Prüfung vor Initialisierern: maximal 256 Strukturtypen, je 1–256 Felder und 32 Verschachtelungsebenen. Doppelte/unbekannte Feldtypen, Zyklen und überschrittene Grenzen erzeugen SC030. Private-Zugriffe werden bei der Namensbindung geprüft.
  • Standardfelder: Ganzzahl/Enum 0, Gleitkomma 0, Boolean 0/False, String leer, Object/Variant Unit bis zur Zuweisung. Verschachtelte Felder haben eigene Strukturstandardwerte. Feldinitialisierer in der Deklaration sind nicht unterstützt; Werte danach setzen.
  • Object- und Array-Felder behalten Referenzen beim Kopieren. Kopien können denselben List-, Dictionary- oder Array-Inhalt teilen. Skalare und verschachtelte Werte ändern sich unabhängig; Änderungen an einer gemeinsamen Sammlung sind gemeinsam sichtbar. List speichert den Strukturwert zum Zeitpunkt des Hinzufügens.
  • = vergleicht denselben deklarierten Typ und die Felder, <> liefert das Gegenteil. Referenzfelder vergleichen Identität. Dies ist eine Engine-Erweiterung, keine allgemeine Aussage über VB.NET-Strukturen. Gespeicherte Hashwerte und bereits geprüfte Paare begrenzen die Arbeit bei gemeinsam genutzten verschachtelten Werten.
  • Unterstützt: öffentliche typisierte Datenfelder, Module-Sichtbarkeit, New(), Zuweisung, Parameter und Rückgabe. Keine Strukturmethoden, eigenen Konstruktoren, Feldinitialisierer, Eigenschaften, Vererbung oder privaten Felder. WITH .field und array[index].field werden nicht unterstützt: Element in eine Variable lesen, ändern und zurückschreiben. Deklarationen können in Include-Dateien liegen.

Beispiele

1. Koordinaten und unabhängige Kopie

# original bekommt X=1445, Y=1690; Z bleibt 0. copy übernimmt den Wert; copy.X += 2 ändert nur die Kopie. New Position() erzeugt empty mit Z=0. Rückgabe: 1445:1447:1690:0. Das Skript speichert Koordinaten und bewegt keinen Charakter.
Option Explicit On
Structure Position
    Public X As Integer
    Public Y As Integer
    Public Z As Integer
End Structure

Sub Main()
    Dim original As Position
    original.X = 1445
    original.Y = 1690
    Dim copy = original
    copy.X += 2
    Dim empty = New Position()
    Return CStr(original.X) & ":" & CStr(copy.X) & ":" & CStr(copy.Y) & ":" & CStr(empty.Z)
End Sub

Erläuterung der Parameter und Ausführung:

original bekommt X=1445, Y=1690; Z bleibt 0. copy übernimmt den Wert; copy.X += 2 ändert nur die Kopie. New Position() erzeugt empty mit Z=0. Rückgabe: 1445:1447:1690:0. Das Skript speichert Koordinaten und bewegt keinen Charakter.

2. Verschachtelte Route, ByVal und ByRef

# Route enthält Start und Finish vom Typ Position. Shift(point ByVal, dx ByVal) addiert dx zum X der Kopie und gibt Position zurück. point:=route.Start, dx:=5 ergibt shifted.X=15; Start.X bleibt 10. Advance(route ByRef, dx ByVal) addiert 4 zu Finish.X und schreibt Route zurück: 24. Main liefert 10:15:24. Alle Hilfsprozeduren sind enthalten.
Option Explicit On
Structure Position
    Public X As Integer
    Public Y As Integer
End Structure
Structure Route
    Public Start As Position
    Public Finish As Position
End Structure

Function Shift(ByVal point As Position, ByVal dx As Integer) As Position
    point.X += dx
    Return point
End Function

Sub Advance(ByRef route As Route, ByVal dx As Integer)
    route.Finish.X += dx
End Sub

Sub Main()
    Dim route As Route
    route.Start.X = 10
    route.Finish.X = 20
    Dim shifted = Shift(point:=route.Start, dx:=5)
    Advance(route:=route, dx:=4)
    Return CStr(route.Start.X) & ":" & CStr(shifted.X) & ":" & CStr(route.Finish.X)
End Sub

Erläuterung der Parameter und Ausführung:

Route enthält Start und Finish vom Typ Position. Shift(point ByVal, dx ByVal) addiert dx zum X der Kopie und gibt Position zurück. point:=route.Start, dx:=5 ergibt shifted.X=15; Start.X bleibt 10. Advance(route ByRef, dx ByVal) addiert 4 zu Finish.X und schreibt Route zurück: 24. Main liefert 10:15:24. Alle Hilfsprozeduren sind enthalten.

3. Gespeicherter Wert und gemeinsame Sammlung

# Entry enthält Point als Wert und Items als Object. first.Point.X=2, Items erhält List() mit einem Text. snapshots.Add(first) speichert den Wert. second=first und second.Point.X=4 ändern das gespeicherte 2 nicht. second.Items.Add("ingot") ändert die gemeinsame Liste: first.Items.Count()=2. saved=snapshots[0] ermöglicht den Feldzugriff. Ergebnis: 2:4:2:2.
Option Explicit On
Structure Position
    Public X As Integer
End Structure
Structure Entry
    Public Point As Position
    Public Items As Object
End Structure

Sub Main()
    Dim first As Entry
    first.Point.X = 2
    first.Items = List()
    first.Items.Add("ore")
    Dim snapshots = List()
    snapshots.Add(first)

    Dim second = first
    second.Point.X = 4
    second.Items.Add("ingot")
    Dim saved = snapshots[0]
    Return CStr(first.Point.X) & ":" & CStr(second.Point.X) & ":" & CStr(saved.Point.X) & ":" & CStr(first.Items.Count())
End Sub

Erläuterung der Parameter und Ausführung:

Entry enthält Point als Wert und Items als Object. first.Point.X=2, Items erhält List() mit einem Text. snapshots.Add(first) speichert den Wert. second=first und second.Point.X=4 ändern das gespeicherte 2 nicht. second.Items.Add("ingot") ändert die gemeinsame Liste: first.Items.Count()=2. saved=snapshots[0] ermöglicht den Feldzugriff. Ergebnis: 2:4:2:2.

Interne Funktionen: vom Aufruf zum Ergebnis

Structure fasst typisierte Felder wie X, Y und Z zu einem Wert zusammen. Unterstützt werden Datenstrukturen mit Wertkopien; der gesamte VB.NET-Sprachumfang ist damit nicht gemeint.

1. Build / PrepareDefault

Prüfung vor Initialisierern: maximal 256 Strukturtypen, je 1–256 Felder und 32 Verschachtelungsebenen. Doppelte/unbekannte Feldtypen, Zyklen und überschrittene Grenzen erzeugen SC030. Private-Zugriffe werden bei der Namensbindung geprüft.

declarations -> field types -> visibility -> cycle/depth checks -> immutable defaults

Projektquelle: external/InjectionScript/src/InjectionScript/Runtime/StructureCatalog.cs; Funktion Build / PrepareDefault.

2. VisitNewStructure

Dim value As TypeName und New TypeName() erzeugen den Standardwert ohne Skriptaufruf. New verlangt leere Klammern: X/Y/Z werden danach zugewiesen. Dim copy = value übernimmt den Ausdruckswert. Kein UO.-Präfix.

resolve TypeName -> prepared default value; no procedure call

Projektquelle: external/InjectionScript/src/InjectionScript/Runtime/Interpreter.cs; Funktion VisitNewStructure.

3. WithField / SetVar

Punktzugriff liest und schreibt Felder, auch route.Start.X. Schreiben prüft den Feldtyp und ersetzt den umgebenden Wert. copy = value kopiert skalare und verschachtelte Strukturwerte; copy.X verändert value.X nicht. Strukturtypen müssen kompatibel sein.

resolve path -> coerce field -> replace path -> assign new root value

Projektquelle: external/InjectionScript/src/InjectionScript/Runtime/ObjectTypes/StructureObject.cs; Funktion WithField / SetVar.

4. CreateArgumentWriter

ByVal übergibt eine Wertkopie. ByRef kopiert beim Eintritt und schreibt beim Verlassen zum Aufrufer zurück, auch in ein beschreibbares Feldargument. Modifier ausdrücklich angeben; ohne sie gelten die bisherigen Basic-Regeln. Return kann eine Struktur zurückgeben; Function kann As TypeName deklarieren.

ByVal: value copy; ByRef: value copy -> callee -> caller slot write-back

Projektquelle: external/InjectionScript/src/InjectionScript/Runtime/Interpreter.cs; Funktion CreateArgumentWriter.

5. ValueEquals

= vergleicht denselben deklarierten Typ und die Felder, <> liefert das Gegenteil. Referenzfelder vergleichen Identität. Dies ist eine Engine-Erweiterung, keine allgemeine Aussage über VB.NET-Strukturen. Gespeicherte Hashwerte und bereits geprüfte Paare begrenzen die Arbeit bei gemeinsam genutzten verschachtelten Werten.

type identity -> cached hash -> distinct field pairs; reference members keep identity

Projektquelle: external/InjectionScript/src/InjectionScript/Runtime/ObjectTypes/StructureObject.cs; Funktion ValueEquals.

Deklaration und Zuweisung liefern Unit. New und entsprechende Funktionen liefern einen Strukturwert, in Laufzeitbeobachtungen als Object mit dem deklarierten Typnamen dargestellt. Koordinaten sind Zahlenwerte, keine Boolean-Flags. = und <> liefern 1/True oder 0/False. Die Beispielergebnisse sind Strings: "1445:1447:1690:0", "10:15:24", "2:4:2:2".


en · ru · uk · fr · de · it · es · zh-tw · ja · ko

Basic