API Basic Structure uk - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
Structure / New / fields
ClassicUO • Basic
Structure об’єднує типізовані поля, наприклад X, Y і Z, в одне значення. Рушій підтримує структури даних із копіюванням значень; нижче описано підтримувану частину, а не весь Structure із VB.NET.
Точний синтаксис
[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
Параметри
TypeName / Public / Private— Унікальне просте ім’я типу на рівні файлу або всередині Module. Типово Public. Private дозволено лише в Module; ззовні ім’я такого типу недоступне. Публічний тип модуля: ModuleName.TypeName. Ключові слова та назви полів не перекладаються.field / FieldType— Унікальне ім’я поля, As і підтримуваний скалярний тип, Enum або інша Structure. Поля публічні; приймаються Public, Dim і VAR. Типи: Integer/Long/Short/Byte, Single/Double/Decimal, String, Boolean/Bool, Object/Variant. Цілі псевдоніми мають 32 біти зі знаком. Вкладені структури не можуть утворювати цикли.Dim / New— Dim value As TypeName та New TypeName() створюють типове значення без виконання коду користувача. New потребує порожніх дужок. Аргументи X/Y/Z не передаються: задайте поля після створення. Dim copy = value отримує значення виразу. Префікс UO. не потрібний.value.field / copy— Поля читаються й записуються через крапку, включно з route.Start.X. Запис перевіряє тип поля й оновлює значення, що його містить. copy = value копіює скалярні та вкладені значення: зміна copy.X не змінює value.X. Типи структур мають бути сумісними.ByVal / ByRef— ByVal передає копію. ByRef копіює на вході та записує назад на виході; оновлення повертається змінній виклику, зокрема полю, яке можна записувати. Указуйте модифікатор явно; без нього діють наявні правила Basic. Return може повернути структуру, Function — оголосити As TypeName.
Повертає
Оголошення й присвоєння не мають результату (Unit). New та функції зі структурним результатом повертають значення структури, представлене як Object у спостереженні рушія; відображення містить ім’я типу. Числові координати — кількості, а не Boolean. Порівняння = та <> повертають 1/True або 0/False. Результати прикладів: рядки "1445:1447:1690:0", "10:15:24", "2:4:2:2".
Поведінка
- Перевірка оголошень передує ініціалізаторам. До 256 типів на скрипт, 1–256 полів у кожному, до 32 рівнів вкладеності. Дублікати, невідомі типи полів, цикли та перевищення меж дають SC030. Доступ Private перевіряється під час розв’язання імен.
- Типові поля: ціле/Enum — 0, дробове — 0, Boolean — 0/False, String — порожній рядок, Object/Variant — Unit до присвоєння. Вкладені структури мають власні типові значення. Ініціалізатори полів в оголошенні не підтримуються: присвойте значення після створення.
- Object і масиви зберігають посилання при копіюванні структури. Копії можуть спільно використовувати List, Dictionary або масив. Скалярні й вкладені поля змінюються незалежно, а зміни вмісту спільної колекції видимі обом копіям. List зберігає значення структури на момент додавання.
- = порівнює той самий оголошений тип і відповідні поля; <> дає протилежний результат. Поля-посилання порівнюються за тотожністю. Це розширення рушія, не загальне правило для всіх структур VB.NET. Кешовані хеші й набір уже перевірених пар запобігають повторному розгортанню спільних вкладених значень.
- Підтримуються публічні типізовані поля, доступність типу в Module, New(), присвоєння, параметри й результат функції. Методи всередині Structure, власні конструктори, ініціалізатори, властивості, успадкування та приватні поля не підтримуються. WITH .field та array[index].field не підтримуються: прочитайте елемент у змінну, змініть її й запишіть назад. Оголошення можна винести до Include.
Приклади
1. Координати й незалежна копія
# original отримує X=1445 та Y=1690; Z лишається 0. copy отримує значення; copy.X += 2 змінює лише копію. New Position() створює empty із Z=0. Чотири поля дають 1445:1447:1690:0. Це збережені координати; скрипт не рухає персонажа.
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
Пояснення параметрів і виконання:
original отримує X=1445 та Y=1690; Z лишається 0. copy отримує значення; copy.X += 2 змінює лише копію. New Position() створює empty із Z=0. Чотири поля дають 1445:1447:1690:0. Це збережені координати; скрипт не рухає персонажа.
2. Вкладений маршрут, ByVal і ByRef
# Route містить Start і Finish типу Position. Shift(point ByVal, dx ByVal) додає dx до X копії й повертає Position. point:=route.Start, dx:=5 дають shifted.X=15, а route.Start.X лишається 10. Advance(route ByRef, dx ByVal) додає 4 до Finish.X та записує Route назад: 24. Main повертає 10:15:24; усі допоміжні процедури наведено.
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
Пояснення параметрів і виконання:
Route містить Start і Finish типу Position. Shift(point ByVal, dx ByVal) додає dx до X копії й повертає Position. point:=route.Start, dx:=5 дають shifted.X=15, а route.Start.X лишається 10. Advance(route ByRef, dx ByVal) додає 4 до Finish.X та записує Route назад: 24. Main повертає 10:15:24; усі допоміжні процедури наведено.
3. Збережене значення і спільна колекція
# Entry містить значення Point та Object Items. first.Point.X=2, first.Items — List() з одним рядком. snapshots.Add(first) зберігає значення. Після second=first зміна second.Point.X=4 не змінює збережене 2. second.Items.Add("ingot") змінює спільний List, тому first.Items.Count()=2. saved=snapshots[0] дозволяє прочитати поля елемента. Результат: 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
Пояснення параметрів і виконання:
Entry містить значення Point та Object Items. first.Point.X=2, first.Items — List() з одним рядком. snapshots.Add(first) зберігає значення. Після second=first зміна second.Point.X=4 не змінює збережене 2. second.Items.Add("ingot") змінює спільний List, тому first.Items.Count()=2. saved=snapshots[0] дозволяє прочитати поля елемента. Результат: 2:4:2:2.
Внутрішні функції: від виклику до результату
Structure об’єднує типізовані поля, наприклад X, Y і Z, в одне значення. Рушій підтримує структури даних із копіюванням значень; нижче описано підтримувану частину, а не весь Structure із VB.NET.
1. Build / PrepareDefault
Перевірка оголошень передує ініціалізаторам. До 256 типів на скрипт, 1–256 полів у кожному, до 32 рівнів вкладеності. Дублікати, невідомі типи полів, цикли та перевищення меж дають SC030. Доступ Private перевіряється під час розв’язання імен.
declarations -> field types -> visibility -> cycle/depth checks -> immutable defaults
Код проєкту: external/InjectionScript/src/InjectionScript/Runtime/StructureCatalog.cs; функція Build / PrepareDefault.
2. VisitNewStructure
Dim value As TypeName та New TypeName() створюють типове значення без виконання коду користувача. New потребує порожніх дужок. Аргументи X/Y/Z не передаються: задайте поля після створення. Dim copy = value отримує значення виразу. Префікс UO. не потрібний.
resolve TypeName -> prepared default value; no procedure call
Код проєкту: external/InjectionScript/src/InjectionScript/Runtime/Interpreter.cs; функція VisitNewStructure.
3. WithField / SetVar
Поля читаються й записуються через крапку, включно з route.Start.X. Запис перевіряє тип поля й оновлює значення, що його містить. copy = value копіює скалярні та вкладені значення: зміна copy.X не змінює value.X. Типи структур мають бути сумісними.
resolve path -> coerce field -> replace path -> assign new root value
Код проєкту: external/InjectionScript/src/InjectionScript/Runtime/ObjectTypes/StructureObject.cs; функція WithField / SetVar.
4. CreateArgumentWriter
ByVal передає копію. ByRef копіює на вході та записує назад на виході; оновлення повертається змінній виклику, зокрема полю, яке можна записувати. Указуйте модифікатор явно; без нього діють наявні правила Basic. Return може повернути структуру, Function — оголосити As TypeName.
ByVal: value copy; ByRef: value copy -> callee -> caller slot write-back
Код проєкту: external/InjectionScript/src/InjectionScript/Runtime/Interpreter.cs; функція CreateArgumentWriter.
5. ValueEquals
= порівнює той самий оголошений тип і відповідні поля; <> дає протилежний результат. Поля-посилання порівнюються за тотожністю. Це розширення рушія, не загальне правило для всіх структур VB.NET. Кешовані хеші й набір уже перевірених пар запобігають повторному розгортанню спільних вкладених значень.
type identity -> cached hash -> distinct field pairs; reference members keep identity
Код проєкту: external/InjectionScript/src/InjectionScript/Runtime/ObjectTypes/StructureObject.cs; функція ValueEquals.
Оголошення й присвоєння не мають результату (Unit). New та функції зі структурним результатом повертають значення структури, представлене як Object у спостереженні рушія; відображення містить ім’я типу. Числові координати — кількості, а не Boolean. Порівняння = та <> повертають 1/True або 0/False. Результати прикладів: рядки "1445:1447:1690:0", "10:15:24", "2:4:2:2".