Перейти к содержанию

Рекомендуемые сообщения

MWSE - "расширитель скриптов Мирровинда"

Описание функций MWSE:
https://mwse.github.io/MWSE/apis/tes3/

Настройки игры, Game Settings (глобальные переменные):
GMST List https://mwse.github.io/MWSE/references/gmst/

MWSE, начиная с версии 2.1, поддерживает простой и быстрый скриптовый язык Lua.

Уроки задумывались как справочник, идут в целом по усложнению, но читать можно с любого места.

Самая лучшая книга по Lua от его создателя: Р.Иерусалимски, Программирование на языке Lua

Руководство на русском языке:  https://lua.org.ru/contents_ru.html

Сокращенное руководство: https://lua.org.ru/m...little-lua-book

 

*** Урок 1: Сообщения ***  

  Показать контент

 

*** Урок 2: События ***  

  Показать контент

 

 

*** Урок 3: Клавиши ***

  Показать контент

 

Ну что, готовы к чему-то побольше, навроде циклов?

 

*** Урок 4: Казначей в локации ***  

  Показать контент

 

 

***Урок 5 Кровати-Двери-Сундуки ***

  Показать контент

 

Кого создать?

 

*** Урок 6: Bторой муж для Тойвалэ Отрален***

  Показать контент

 

 

Типы tes3объектов (tes3.objectType)

  Показать контент

 

 

***Урок 7: Что от чего происходит в мире tes3 ***

  Показать контент

 

 

Тут последняя версия уроков, а также рассортированное описание TES3 классов:

https://yadi.sk/d/pNaDhws2m1-6AA

 

См.ниже в теме:

 

Урок 8: "Как создать / прочитать текстовый файл"

Урок 9: "Как создавать окна, меню, кнопки в Морровинд"

Урок 10: "Разговоры"

Изменено пользователем mintmike
Ссылка на комментарий
Поделиться на другие сайты

У кого вопросы по lua-базовым вещам читайте в руководстве вот эти разделы:

 

3.4 – Выражения, все виды операторов
3.4.9 – Конструкторы таблиц (как создавать {...} таблицы)
3.4.8 – Приоритет операторов (что быстрее выполнится + или >= и т.п)
3.5 – Правила видимости (создание/удаление локальных переменных)

Ссылка на комментарий
Поделиться на другие сайты

Спасибо огромное за дельный мануал!! Жаль нет лайков у постов. Хотелось бы еще узнать больше о создании собственных новых навыках.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо! Добавил ссылку на последнюю версию уроков, а также более удобно рассортированную документацию  по TES3 классам в txt виде.

 

 

https://www.fullrest.ru/forum/topic/3105-prosby-o-perevode-plaginov-ili-perevedite-po/?p=997387

  Цитата
https://www.nexusmods.com/morrowind/mods/47111

Я смотрю, набирает популярность и уже включен в требования некоторых многообещающих плагинов, например, https://www.nexusmods.com/morrowind/mods/47480

 

 

Очень интересный плагин про маг эффекты. Добавлят заклинания управления погодой, призыва существ из Tamriel Rebuilt, телепортации в города за пределами Вварденфелла, просмотр состояния противника, а также функции для добавления собственных эффектов и заклинаний.

 

Использует недокументированную (ещё) функцию addMagicEffect, которая позволяет добавлять новые эффекты. Примеры использования можно посмотреть в скриптах мода.

tes3.addMagicEffect
{
name,             -- string,
id,               -- number, EffectID
description,      -- string, описние
lighting          -- vector3, цвет свечения, RGB
icon,             -- string, путь к иконке
particleTexture , -- string, путь к текстуре частиц
baseCost,         -- 1.0f по умолчанию
school,           -- 0 по умолчанию
size,             -- 1.0f по умолчанию
sizeCap,          -- 1.0f по умолчанию
speed,            -- 1.0f по умолчанию
castSound,        -- string, звуки
boltSound
hitSound,
areaSound,
castVFX,          -- сами эффекты, PhysicalObject
boltVFX,
hitVFX,
areaVFX,
allowEnchanting,  -- дальше идут флаги (true/false)
allowSpellmaking,
appliesOnce,
canCastSelf,
canCastTarget,
canCastTouch,
casterLinked,
hasContinuousVFX,
hasNoDuration,
hasNoMagnitude,
illegalDaedra,
isHarmful,
nonRecastable,
targetsAttributes,
targetsSkills,
unreflectable,
usesNegativeLighting
onTick,
onCollision
}

Можно надеяться, что появится и функция типа addNewSkill ...

Изменено пользователем mintmike
Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...

Урок 8: "Как создать / прочитать текстовый файл"

--=== Функции Lua для работы с файлами ===--
io.input()    -- задаём файл для чтения
io.output()   -- задаём файл для записи
io.read()     -- читаем строку из файла
io.write()    -- пишем строку в файл

Для примера посчитаем количество строк и слов в интересующем нас файле, пусть он называется inp.txt

 

Запускать программу будем на компиляторе lua53.exe (последняя версия).

 

1. Скачаем, если у вас его нет. Скачать можно тут: http://luabinaries.s...t/download.html

 

2. Создаём в одном каталоге с lua53.exe новый текстовый файл с текстом программы, например "prog.lua":

io.output('out.txt') -- задаём файл с результатом
io.input('inp.txt')  -- откуда будем читать

local str = io.read() -- читаем первую строку из файла
local snum = 0 -- количество строк
local wnum = 0 -- количество слов

while str do        -- цикл исполняется пока str не равно nil
  snum = snum + 1   -- увеличиваем счётчик строк на 1
  for s in str:gmatch("[%w'-]+") do -- для каждой найденной в строке цепочки цифро-букв, "'" и "-"
    if s:find("%a") then            -- если цепочка имеет хотя бы одну букву
      wnum = wnum + 1               -- увеличиваем счётчик слов на 1
    end
  end
  str = io.read()   -- читаем следующую строку
end
io.write('Всего строк в файле ',snum,'\n') -- выводим результат в файл
io.write('Bсего слов в файле ',wnum,'\n')  -- \n -- служебный символ перехода на новую строку
print('Всего строк в файле',snum,' всего слов в файле',wnum)

Замечание: все файлы должны лежать в одной папке.

 

3. Перетаскиваем мышкой нашу программу "prog.lua" на lua53.exe и отпускаем, рядом появляется наш файл с результатом "res.txt".

 

4. Для повторных запусков можно создать prog.bat файл, и запускать нашу програму нажатием на него

lua53 prog.lua
cmd
Изменено пользователем mintmike
Ссылка на комментарий
Поделиться на другие сайты

Спасибо огромное за ваш труд! Ждем еще новых уроков!

 

Интересует, как привязать константу к новому навыку. Когда я увеличиваю простым скриптом константу - растет и новый навык в меню

Ссылка на комментарий
Поделиться на другие сайты

  В 4/3/2020 в 9:32 AM, aL☢ сказал:

Спасибо огромное за ваш труд! Ждем еще новых уроков!

 

Интересует, как привязать константу к новому навыку. Когда я увеличиваю простым скриптом константу - растет и новый навык в меню <- это интересно.

Насколько я понял, нужно привязать значение скила к одной из игровых констант

В модуле \MWSE\lib\OtherSkills\common.lua, функция updateSkillList  выводит список скилов.

Нужно, чтобы значение скила обновлялось в соответствии с константой:

this.updateSkillList = function ()
...
for i,skill in pairs(this.otherSkills) do
 if skill.active == "active" then
  if skill.name == "<имя скила>" then skill.value = tes3.gmst.<имя константы>  -- << вставить вот эту строку
...

Если нужна помощь, пиши лс

Ссылка на комментарий
Поделиться на другие сайты

Про что сделать следующий сложный урок? (не более 2 вариантов в ответе, или свои варианты)

 

1. Как правильно подключить и использовать mcm (Настройка Модов в Главном меню)

2. Как создавать окошки и кнопочки. Внедрим кнопку в окно с диалогом с нпс. По нажатию он будет нам отвечать про погоду и силу ветра.

3. Как заставить нпс`а: упасть на кровать и лежать на ней ничком.

4. Появляется и исчезает бог (Вивек, например), все сбегаются к месту силы.

5. Как работает самый частый пакет ии: AIWander (шататься окрест)

6. Как работает  AIActivate. Как заставить нпс`а выйти на улицу, а Фаргота бегать по кругу.

7. Выделить стат-ку из редактора и посмотреть: сколько и каджитов и орков на Ввардэнфелле и чем они занимаются, какой ср.уровень, скорость, магия.

 

... итак, ваш выбор?

 

Но сначала простой урок номер 9: "Как создавать окна, меню, кнопки в Морровинд"

 

  Показать контент

 

Изменено пользователем mintmike
Ссылка на комментарий
Поделиться на другие сайты

Урок 10: "Разговоры"

 

Сегодня мы:

1. Создадим модуль, который будет штамповать нам окна

2. Используя этот модуль, сотворим окно для разговора с НИП'ом (Не Игровым Персонажем)

3. Внедрим кнопку в MenuDalogue (в основное окно для диалогов в Морровинде)

4. Добавим функции для ответа: "кто вы?", "который час?", "как погода?"

 

 

 

  Показать контент

 

 

Последняя версия планина "Morrowind-Dialogues"  https://gitlab.com/Scoommich/morrowind-dialogues

Изменено пользователем mintmike
Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...

MWSE Lua

продолжает обзаводиться новыми объектами, событиями и возможностями ;-D

 

Что нового?

Новые функции появились (~ за первое полугодие 2020) :

 

tes3.createObject - создает объект и возврящает его. Созданный объект будет частью сохраненной игры. Поддерживаемые типы объектов - это те, которые имеют свою собственную функцию создания, такую как, например, tes3activator.

 

tes3.findClosestExteriorReferenceOfObject - Используя ту же функцию двигателя, что и заклинания «Ванильное вмешательство», размещает первую ссылку на данный объект во внешнем мире.

tes3.getLastExteriorPosition - Возврящает последнюю запомненную позицию игрока в экстерьере (снаружи)

tes3.togglePOV - Вызывает переключение POV игрока в следующем кадре симуляции и возвращает, если игрок ранее был от третьего лица. Несколько вызовов в одном кадре не будут складываться.

tes3.force1stPerson - Принудительно вводит POV (Область зрения) игрока от первого лица в следующем кадре симуляции и возвращает true, если POV было изменено.

 

 

= Новые события =

 

barterOffer Это событие вызывается, когда игрок делает потенциально успешное бартерное предложение. Потенциально успешный означает, что обе стороны имеют необходимые средства для совершения сделки.

calcSunDamageScala  используется при расчете количества урона, применяемого к магическому эффекту солнечного урона.

containerClosed  Это событие возникает, когда контейнер закрыт.

crimeWitnessed  Это событие происходит, когда актером засвидетельствовано преступление.

detectSneak  Это событие вызывается всякий раз, когда актер проверяет, могут ли они обнаружить, что другой актер подкрался.

filterBarterMenu  Это событие возникает, когда элемент в бартерном меню фильтруется.

determineAction  Это событие возникает, когда актер определяет действие в боевом сеансе.

determinedAction  Это событие возникает, когда актер определил действие в боевом сеансе.

filterInventory  Это событие возникает, когда предмет в инвентаре фильтруется.

filterInventorySelect  Это событие возникает, когда для предмета выбран фильтр инвентаря.

filterBarterMenu  Это событие возникает, когда элемент в бартерном меню фильтруется.

filterSoulGemTarget  Это событие происходит, когда цель самоцвета души фильтруется.

infoGetText  Это событие возникает, когда извлекается текст объекта диалога.

infoResponse  Это событие срабатывает при срабатывании ответа диалога.

isGuard  Событие isGuard срабатывает всякий раз, когда игровой движок проверяет, является ли объект NPC охранником. Статус охраны может быть изменен. Это само по себе не заставит NPC вести себя как охранник.

itemDropped   Что-то уронили

itemTileUpdated  Это событие срабатывает при срабатывании ответа диалога.


lockPick  Это событие срабатывает при взломе замка.

objectInvalidated  Это событие возникает, когда ссылка недействительна. Это включает в себя удаление из памяти. Это событие может быть использовано для безопасного удаления ссылок из таблиц.

postInfoResponse  Это событие возникает сразу после обработки ответа диалога.

preLevelUp  Это событие запускается как раз перед тем, как уровень игрока поднимется.

projectileHitObject  Событие projectileHitObject возникает, когда снаряд сталкивается с объектом.

trapDisarm  Это событие срабатывает, когда ловушка обезвреживается.

 

 

= Объекты =

 

Нижереченные сущности пребывали в коде и ранее, но теперь описаны в документации и к ним имеется доступ:

 

tes3birthsign
Объект, представляющий знак рождения.

tes3region
Структура, которая содержит информацию о регионе.

tes3regionSound
Структура, которая содержит информацию о звуке региона.

tes3static
Статический игровой объект.

tes3statistic
Структура, которая содержит статистическую информацию, относящуюся к текущим и базовым значениям статистики, таким как здоровье, усталость, магия, атрибуты или навыки.

tes3weather
Структура, которая содержит базовую информацию о погоде, которая используется для наследования структур погоды.

 

 

= Доступ к NIF =   

 

Расширился доступ к NIF мешам и узам сцены. Типы можно найти в таблице tes3.niType.

 

niObject - Самый базовый NIF объект.
Самый базовый объект, из которого получены почти все структуры NetImmerse.

niAmbientLight
Объект, который представляет окружающий свет. Этот объект довольно прост и не имеет местоположения, направления или затухания.

niCamera
Объект, представляющий камеру. Положение и ориентация определяются родительскими свойствами.

niDirectionalLight
Объект, который представляет свет со светом, движущимся в заданном направлении. Свет может быть направлен в любом направлении, вращая свет.

niCollisionSwitch
Объект, который указывает, включена ли система столкновений.

niDynamicEffect
Базовый класс для динамических эффектов, таких как NiLights или эффекты проецируемых текстур.

niFormatPrefs
Класс, представляющий набор предпочтений для форматов текстур. Эти предпочтения определяют уровни точности пикселей.


niGeometryData
Объекты NiGeometryData содержат данные геометрии, необходимые для визуализации объекта NiGeometry. Когда создается объект на основе NiGeometry, фактические данные геометрии сохраняются в прикрепленном объекте NiGeometryData.

niLight
Базовый класс, который представляет источники света в графе сцены. Это включает в себя окружающий, рассеянный и зеркальный цвета света, а также его интенсивность.

NiNode
Базовый класс, представляющий узлы графа сцены. Узел может иметь любое количество дочерних узлов.

niObjectNET
Объект, который имеет имя, дополнительные данные и контроллеры.

niPick
Класс, используемый в системе пересечения комплектации в игровом движке. Используя луч, движок выполняет операции выбора на графе сцены или любом поддереве. При заданном луче и поддереве поддерево пересекается, и совпадающие узлы добавляются в массив.

niPickRecord
Вложенный класс NiPick, в котором хранятся результаты предыдущих операций выбора для использования игровым движком.

niPixelData

Представляет 2D-массивы значений пикселей, а также пирамиды с несколькими уровнями mipmap, каждый из 2D-массивов значений пикселей. Также содержит информацию, представляющую формат пикселей и размеры массивов.

Изменено пользователем mintmike
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Просьба подробнее рассказать в рамках уроков, как работать с таблицами :)

 

Например, есть вот такой код:

local function transferItems(e)
    local cell = tes3.getPlayerCell()
    local sack = tes3.createReference{object="sack_id", position=tes3.player.position, orientation=tes3.player.orientation, cell=cell}
    for _, stack in pairs(tes3.player.object.inventory) do
        tes3.transferItem{from=tes3.player, to=sack, item=stack.object, count=stack.count, playSound=true}
    end
end

local function initialized(e)
    event.register("keyUp", transferItems, { filter = tes3.scanCode.backspace } )
end

event.register("initialized", initialized)

Идея в том, что такой код переносит все объекты из инвентаря персонажа в контейнер. А хотелось бы, что переносил все, кроме экипированных.

 

Один умный человек посоветовал создать таблицу, в которую прописать экипированные предметы.

Вопрос - а какие элементы таблицы нужно использовать в этом случае? И какие можно использовать в принципе?

 

В уроке номер 6 мы создали таблицу для Аррилла. Но почему именно эти значения мы туда прописали?

 

 

В общем, прошу подробнее остановиться на таблицах :)

 

p.s. Пункт 3.4.9. руководства я читал, но понятнее не стало :scratch:

Изменено пользователем -=ChieF=-
Ссылка на комментарий
Поделиться на другие сайты

  Цитата
Вопрос - а какие элементы таблицы нужно использовать в этом случае? И какие можно использовать в принципе?

Айди и количество объектов. Будет что-то вроде

for _, stack2 in pairs (tes3.player.object.equipment) do 
EquipmentList [_] =
{
ObjId = stack2.object.id
Amount = stack2.count 
}
end

Таблица -- это, грубо говоря, таблица в экселе. Есть строки (0, 1, 2 и т. д.), есть столбцы. Вместо столбцов -- все свойства объекта. То есть айди, имя, вес, etc.

 

Изменено пользователем Муурн Шепард
Ссылка на комментарий
Поделиться на другие сайты

  В 7/7/2020 в 4:54 PM, -=ChieF=- сказал:

В уроке номер 6 мы создали таблицу для Аррилла. Но почему именно эти значения мы туда прописали?

 

Потому как функция tes3.createReference {...}   требует передать ей именно эти значения

 

createReference

{

object    -- указать кого создавать (tes3physicalObject|string)

position -- указать в каком месте создавать (tes3vector3|table)

orientation -- оринетация по сторонам света (tes3vector3|table)

cell -- где создавать, то есть в какой ячейке мира (tes3cell|string|table)

scale: -- масштаб созданного объекта, не обязательно указывать, по умолчанию 1 (number)

}

 

Также как tes3.transferItem -- просит передать ей откуда, куда, какой item и в каком количестве перемещать.

 

В шапке темы есть ссылка скачать рассортированное описание tes3 функций (файл tes3.txt)

 

Вот в доках пример

 

  В 7/7/2020 в 4:54 PM, -=ChieF=- сказал:

Идея в том, что такой код переносит все объекты из инвентаря персонажа в контейнер. А хотелось бы, что переносил все, кроме экипированных.

Идея отличная, осталось сделать фильтр по надетым на ГГ вещам. Ну ещё можно прикрутить меню и будет готовый плагин.

 

 

Фильтр можно сделать так:

   local equip = {} -- создаём новую пустую таблицу
   for i, node in pairs(tes3.player.object.equipment) do
     -- запоминаем id и ссылки на надетые на ГГ вещи
     equip[node.object.id] = node
   end
   
   for i, stack in pairs(tes3.player.object.inventory) do
     -- проверяем по id, если вещь не запомнена в equip, то сбрасываем её в sack
     if not equip[stack.object.id] then
       tes3.transferItem
       {
        from = tes3.player,
        to = sack,
        item = stack.object,
        count = stack.count,
        playSound = true
       }
     end
   end
   tes3.messageBox("Вещи сброшены")
Изменено пользователем mintmike
Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Здравствуйте, если еще есть кто живой в этой теме, то может быть он мне поможет разобраться.

 

Я перебираю объекты в инвентаре, выбираю там броню и пытаюсь узнать класс брони(легкая, средняя, тяжелая), но у меня в результате выдает nil. Может кто может мне объяснить что я делаю не так.

for i, stack in pairs(tes3.player.object.inventory) do
  if (stack.object) then
    if (stack.object.objectType == tes3.objectType.armor) then
      tes3.messageBox{ message = "armorClass=" .. tostring(stack.object.armorWeightClass)}
    end
  end
end

 

Изменено пользователем borivit
Ссылка на комментарий
Поделиться на другие сайты

  В 9/18/2023 в 5:35 PM, mintmike сказал:

Не находит armorWeightClass, должно быть просто weightClass 

Показать  

Завтра буду дома, попробую. Но у меня такая же история и с weaponType хотя здесь проще т.к. почти все id имеют указание на тип оружия и можно просто искать нужное через id.

P.S.: А можно ли как-то вытянуть все значения и ключи относящиеся к объекту? Чтобы можно было увидеть какие есть у объекта свойства и соответственно тогда будет понятно как их узнать.

P.S.S.: Только что до читался что через for  можно посмотреть все ключи и значения. Завтра попробую. О результатах напишу.

 

Всех приветствую.

С weightClass заработало:) а для оружия нужно писать просто type.

Это не совсем по теме, но может вы знаете как отключить показ названия и характеристик оружия. Я доступ отключил, а название и характеристики не получается отключить.

  Цитата

P.S.S.: Только что до читался что через for можно посмотреть все ключи и значения. Завтра попробую. О результатах напишу.

Показать  

Ничего с этой затеей не вышло т.к. pairs нельзя запускать внутри pairs.

У меня есть еще одна маленькая проблемка. Хочу сделать создание объекта при активации другого объекта, а потом при активации того же объекта удалить созданный объект, но lua почему-то ругается на createReference хотя 1н раз объект создается и 1н раз он удаляется, а потом уже ничего не создается.

local function basurero(e)
  if (e.target.object.id == "A_RZZ_active_bell_01") then
    if (saco == nil) then
      local cell = tes3.getPlayerCell()
      local vector_pos = tes3vector3.new(-346, 250, 25)
      local vector_orient = tes3vector3.new(0, 0, 25)
      basura = tes3.createReference{object="A_RZZ_basura", position=vector_pos, orientation=vector_orient, cell=cell}
      saco = true
    else
      saco = nil
      tes3.deleteObject(basura)
    end
  end
end
event.register("activate", basurero)

Ошибку выдает такую: invalid 'object' parameter privided 

 

  В 9/19/2023 в 4:47 PM, borivit сказал:

Ошибку выдает такую: invalid 'object' parameter privided 

Показать  

Я так понимаю что удаляется полностью объект и потому выдает эту ошибку. В tes3 конструкторе для точно такой же операции(placeAtPC) я использовал disable и setdelete, а здесь я нашел только disable, а setdelete нет или может я не увидел.

P.S.: я нашел в tes3reference  - myObject:delete() там пишут что ссылка помечается как удаленная и потом полностью удаляется - это похоже на setdelete в tes3. Завтра буду пробовать.

 

  В 9/19/2023 в 6:51 PM, borivit сказал:

P.S.: я нашел в tes3reference  - myObject:delete() там пишут что ссылка помечается как удаленная и потом полностью удаляется - это похоже на setdelete в tes3. Завтра буду пробовать.

Показать  

Это сработало.  Вместо tes3.deleteObject(basura) я вставил basura:delete() и теперь все работает

Как через lua запретить показ содержимого контейнера, а потом показать это содержимое после нажатия кнопки в меню?

Изменено пользователем borivit
Ссылка на комментарий
Поделиться на другие сайты

  В 9/20/2023 в 1:54 PM, borivit сказал:

Как через lua запретить показ содержимого контейнера, а потом показать это содержимое после нажатия кнопки в меню?

Показать  

Например, перемещать или сделать disable предметы, а по нажатии кнопки снова переместить или enable. Кстати, при удалении вещей из контейнера/инвентаря, лучше делать это в следующем кадре (меньше шансов вылета на рабочий стол):

            timer.delayOneFrame(function()
                local pgn = tes3.getItemCount{reference = tes3.player, item = 'pouch_gold'}
                if pgn > 0 then
                    tes3.removeItem{reference = tes3.player, item = 'pouch_gold', count = 1}
                end
            end)

 

  В 9/19/2023 в 4:47 PM, borivit сказал:

Ничего с этой затеей не вышло т.к. pairs нельзя запускать внутри pairs.

Показать  

Сделайте серез функцию, которая вызывается внутри pairs  и в ней будет свой pairs. Вообще говоря pairs внутри pairs можно

  Цитата

Это не совсем по теме, но может вы знаете как отключить показ названия и характеристик оружия

Показать  

Возможно есть в моде Descriptive Descriptions, там дополняются описания предметов

Изменено пользователем mintmike
Ссылка на комментарий
Поделиться на другие сайты

Как удобно распечатать таблицу, чтобы посмотреть все содержимое, все ключи и значения? Есть удобная функция deepToString(value, maxDepth) для распечатки в лог содержимого таблицы (взято из OpenMW util.lua)

value - сама таблица

maxDepth - максимальная глубина вложенных таблиц, до которой будет распаковываться и печататься в строку содержимое value

-- Implementation can be found in `resources/vfs/openmw_aux/util.lua`.

local aux_util = {}

local function deepToString(val, level, prefix)
    local level = (level or 1) - 1
    local ok, iter, t = pcall(function() return pairs(val) end)
    if level < 0 or not ok then
        return tostring(val)
    end
    local newPrefix = prefix .. '  '
    local strs = {tostring(val) .. ' {\n'}
    for k, v in iter, t do
        strs[#strs + 1] = newPrefix .. tostring(k) .. ' = ' .. deepToString(v, level, newPrefix) .. ',\n'
    end
    strs[#strs + 1] = prefix .. '}'
    return table.concat(strs)
end

-- Works like `tostring` but shows also content of tables.
-- @function [parent=#util] deepToString
-- @param #any value The value to convert to string
-- @param #number maxDepth Max depth of tables unpacking (optional, 1 by default)
                
function aux_util.deepToString(value, maxDepth)
    return deepToString(value, maxDepth, '')
end
                
--...
                
return aux_util

 

Изменено пользователем mintmike
Ссылка на комментарий
Поделиться на другие сайты

  Цитата

Например, перемещать или сделать disable предметы, а по нажатии кнопки снова переместить или enable. Кстати, при удалении вещей из контейнера/инвентаря, лучше делать это в следующем кадре (меньше шансов вылета на рабочий стол):

Показать  

Это не совсем то что я имел ввиду. Видимо я не правильно изложил вопрос. Мне нужно при активации контейнера получить вместо окна с содержимым контейнера, мое окно с кнопками.

Я здесь нашел такую функцию:

local tomb = tes3.getReference("A_RZZ_chest_tomb") --контейнер
tes3.player:activate(tomb) --открывает содержиме контейнера

это работает как activate в tes3 конструкторе, но у меня не получается запретить показ или закрыть меню с содержимым при стандартной активации т.е. как отследить меню контейнера при его активации и сразу же его закрыть? или может можно его запретить по событию? Кстати -> myObject:clearActionFlag(flagIndex)  - это не помогло.

И я никак не могу понять как правильно заполнять поле buttons и callbackParams

tes3ui.showMessageMenu({ id = ..., buttons = ..., callbackParams = ..., cancels = ..., cancelText = ..., cancelCallback = ..., header = ..., message = ..., customBlock = ..., page = ..., pageSize = ... })
 

  Цитата

Как удобно распечатать таблицу, чтобы посмотреть все содержимое, все ключи и значения? Есть удобная функция deepToString(value, maxDepth) для распечатки в лог содержимого таблицы (взято из OpenMW util.lua)

Показать  

Благодарю, еще не попробовал, но обязательно испытаю:)

Как работает menu:destroy? Я почему-то не могу найти описания. Я заметил что когда запущено мое меню и меню контейнера, то если я закрываю свое меню, закрывается и меню контейнера.

P.S.: я нашел описание myObject:destroy(), но мне это не очень помогло, я так понимаю что вместо myObject нужна переменная с объектом окна, но как найти id окна контейнера, а потом получить его объект я пока незнаю или может я не в ту сторону копаю.

Изменено пользователем borivit
Ссылка на комментарий
Поделиться на другие сайты

Рассказываю что у меня получилось:)

1. Заменить меню контейнера на свое при его активации 

local function eActivate(e)
    if (e.target.object.id == "A_RZZ_chest_tomb") then
		if (not RZZ_activate) then
			timer.delayOneFrame(function()
				if tes3ui.menuMode then tes3ui.leaveMenuMode() end --закрываем контейнер
				myMenuShow() --Открываем меню
			end)
			return false
		end
		RZZ_activate = nil --метка активации контейнера
	end
end
event.register("activate", eActivate)

2. Открыть контейнер при нажатии кнопки своего меню

local function abrirRZZ()
	local tomb = tes3.getReference("A_RZZ_chest_tomb")
	cerrarMenu() --закрываем свое меню
	timer.delayOneFrame(function()
		RZZ_activate = true --метка активации контейнера
		tes3.player:activate(tomb) --открываем контейнер
	end)
end

3. Убрать helpMenu т.е. окошко всплывающее при наведении прицела на предмет

local function onUIObjectTooltip(e)
	if string.find(e.reference.id,'muestra') then --выборка нужных предметов
		e.tooltip.absolutePosAlignX = 4
		e.tooltip.absolutePosAlignY = 4
	else
		e.tooltip.absolutePosAlignX = nil
		e.tooltip.absolutePosAlignY = nil
	end
end
event.register("uiObjectTooltip", onUIObjectTooltip)

Теперь оталось выяснить как отследить запуск заклинания, как запустить проклятие, как остановить выполнение заклинания, как телепортироваться в нужное место и тогда я свой плагин полностью переведу на lua:)

Изменено пользователем borivit
Ссылка на комментарий
Поделиться на другие сайты

  В 9/23/2023 в 11:59 AM, borivit сказал:

Теперь оталось выяснить как отследить запуск заклинания, как запустить проклятие, как остановить выполнение заклинания, как телепортироваться в нужное место и тогда я свой плагин полностью переведу на lua:)

Показать  

Здорово )

spellCast

spellCasted

Список маг эффектов

Пример телепорта:

    local result = tes3.positionCell {
      reference = a.id,
      cell = c,
      position = a.lpoint,
    }
Ссылка на комментарий
Поделиться на другие сайты

  Цитата
Показать  

Благодарю:)

Я пытаюсь поставить пометку и после телепортировать главного героя, но пометка телепортируется вместе с ним. Как это можно исправить?

 

  В 9/23/2023 в 5:09 PM, borivit сказал:

Я пытаюсь поставить пометку и после телепортировать главного героя, но пометка телепортируется вместе с ним. Как это можно исправить?

Показать  

Вопрос снят:) Сделал свою пометку и теперь не портит стандартную пометку.

Теперь мой плагин полностью работает на lua за исключением запрета активации некоторых предметов т.к. это удобнее через конструктор.

Благодарю вас за помощь:) Если возникнут еще вопросы, то буду писать сюда:)

P.S.: Интересный глюк нарисовался, я когда открываю контейнер через свое меню и беру оттуда предмет, то после закрытия контейнера мое меню уже не открывается, а просто открывается контейнер, а когда возвращаешь предмет на место, то после закрытия контейнера опять начинает открывается мое меню.

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...