Перейти к контенту

Скриптование


Svoboда

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

1. Как средствами LUA реализовать JUMP (или "адресуемый" renurn) ?
2. Функция wait() в Сталкере (или в LUA?) реально работает?
 
Уважаемые долгожители!  (Всех Вам благ и долгих лет!) Не пожалейте для новичка аптечки.
(Мозги уже совсем раком встали - видать контролёру не понравился.)

 

Суть проблемы:

Есть объект (один) - Timer (фактически - будильник), основа взята из amk.script к ТЧ.

Существует некое множество объектов (npc и т.п.), желающих этот Timer использовать.

Задача: вернуть управление  в конкретную точку.  Не представляю в принципе как реализовать???

 Нужен пример кода на  LUA для функций типа:

-- function return_to_caller(return_point, true)  end --  или иной вариант

-- function jump(return_point) end

------[[ return_point = list_name.func_name() ]]-------------------- 

 

P.S. Всем ветеранам с новичка причитается пиво (много!) Вы главное "ни куда не девайтесь"!

Изменено пользователем Dennis_Chikin

Поделиться этим сообщением


Ссылка на сообщение

Двумя постами раньше Dennis_Chikin писал:
Не подойдёт? ... Другое - против идеологии языка, и в общем-то трудно представить: зачем бы оно.
 
Не просто подойдет, а просто обалдеть!!! :good:
Результат работы первой строки иначе как глюком (в LUA) не назовёшь. По полочкам ещё не разложил, хотя в какую сторону думать понятно.
 
  Но каков результат его использования!  Применив стандартные средства языка Вы фактически спасли LUA от позора - непригодность для описания акторов (теория акторов/actor/обмен сообщениями - отсутствие стандартных средств поддержки) и, как следствие, непригодность для описания многоагентных систем. Фактически всякий актор может быть определён как самостоятельный поток (программный) высшего логического уровня. В LUA- идеологии можно было пытаться "городить огород" из отдельных "шунков", что в принципе неверно. Либо, как и сделано в игре, "дописывать язык" за счёт подключения собственных Си, ЕХЕ и т.п. модулей.
 
зачем бы оно - Сталкер полноценная (почти) многоагентная система, где каждый "живой" персонаж является актором (кроме объекта "actor"!) и имеет собственный поток (цепочка: obj_id, Logic, xr_logic, binders, bind_tipe_obj). Понятно, что луашные "шунки" авторы использовать не стали. Логическая дыра (возможность взаимодействия потоков) на уровне LUA ни куда не делась. Вы её фактически закрыли. Теперь стало возможным реализовать в игре два отсутствующих у акторов свойства (по определению обязательных!) - способность обмениваться сообщениями и способность воспроизводить себе подобных.
Примеры применения:
1. Gamer (достаточно прокачанный), подходит к любому новичку (выбранному по своему усмотрению) и в процессе обмена сообщениями может научить его стрелять и т.п. При этом авторам игры/мода ничего, кроме общих правил, заранее прописывать не нужно. Замечу, что сами диалоги это лишь имитация такого обмена. Инфопоршны это вообще иная песня. Они, как и Action, должны быть конкретно прописаны заранее (т.е. предусмотрены авторами).
2. Собака-самка (белый цвет) после контакта с псом-самцом (тёмный цвет) может вызвать спавн дополнительных особей в своём гулаге. Если Gamer их заранее не отстреляет, то так и произойдёт. 
 
Ещё раз подчеркну, авторам нужно лишь описать общие принципы (взаимодействия) для классов акторов. и всё!!! После этого зона реально будет жить собственной (уникальной в каждом компьютере) жизнью. При этом Gamer сможет эффективно воздействовать на ход её развития. А жизнь эта - бесконечна (пока не выключили компьютер :D).
 
P.S. Уважаемые, подскажите ни разу не программисту, как подключить спойлер (в личку или на mail). Портянка вместо поста не есть хорошо.

текст["/"spoiler]

Изменено пользователем Dennis_Chikin

Поделиться этим сообщением


Ссылка на сообщение

Как подключить/зарегистрировать новый скрипт ?

В gamedata\script\ положил, а игра его не видит (нет в пространстве имён).

 

Извиняюсь за "сложность" вопроса, но более подходящего места не обнаружил.

Заранее спасибо за помощь!

Изменено пользователем Simonov50

Поделиться этим сообщением


Ссылка на сообщение

@Nazgool,

При обычной загрузке лист сразу транслируется, и если присутствует текст обращения к несуществующей

функции будет вылет. То есть, вариант проверки "если есть лист, тогда обратиться к функции не срабатывает".

Если "спрятать" текст (mu_call="Имя_скрипта"..".".."имя_функции".."()"), то вылета не будет, но команда dostring(mu_call)

не проходит. Видимо в игре недоступна? Пытаюсь найти вариант загрузки в два этапа. Обычным образом загрузить мой 1_й лист, мой второй лист (с обращением к функции) спрятать в другом каталоге, если присутствует некий третий лист,(наличие функции в котором и проверяется), то подключить мой второй лист. Но как это сделать не представляю.

Изменено пользователем Simonov50

Поделиться этим сообщением


Ссылка на сообщение

@Dennis_Chikin,

Спасибо !!! Всё в тему, но кому классика, а кому откровение.

Если я верно понял, то нужно засовывать в инфопоршень, а вытаскивать с помощью xr_effects.

Ни когда с инфопоршнями не работал. Пойду читать xr_effects.

Ещё раз спасибо.

@Nazgool,

Круг задач определён уровнем моих незнаний и для понимания нормальным человеком слишком обширен.

Пока есть только цель - сделать "переносной" скрипт (из мода в мод).

Воткнул его, он сам быстренько посмотрел ресурсы и "сказал" что (и где) надо доделывать руками.

Скрипт чисто модерский - простенький инструментарий (будет когда-нибудь?).

Про _G всё понял, а вот про защищённый режим (на уровне игры) услышал впервые! Где читать?

Спасибо за помощь - иду учить мат.часть.

Поделиться этим сообщением


Ссылка на сообщение

так здесь все еще проще:

Именно на таком варианте у меня и вылетало, а нужно именно так, как вы мне подсказали в предыдущем посте - через блок, прятать имя функции в переменной, отдельно проверять наличие листа и только при его наличии проверять функцию. Я встроил опрос внутрь своего класса (для менюшки), и всё заработало - спасибо! Но теперь вопросов стало ещё больше !!!

 

В варианте if another_script.myfunc then another_script.myfunc() вылета не может быть в принципе.

 

Как сделать вывод в свой файл ?

Начал с local file = io.open("mu_file.txt", "a")

Но на все попытки найти io или openfile возвращает nil.

Специально установил чистую, лиценз.версию - результат тот же.

 

Что бы понять нужно посмотреть, но для этого сначала нужно написать...

и так далее по заколдованному кругу ... - сильно достаёт!

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

 

Движок править. Брать исходники, и править. dc

Изменено пользователем Dennis_Chikin

Поделиться этим сообщением


Ссылка на сообщение

В варианте if another_script.myfunc then another_script.myfunc() вылета не может быть в принципе.

У меня вылетало именно на if another_script.myfunc при фактическом отсутствии листа another_script .

Вылет во время начальной загрузки (another_script = nil value). Ошибка фиксировалась именно при наличии в тексте связки

лист.функция (через точку). Присутствие условия (if) не спасало, т.к. сочетание лист.функция транслировалось целиком.

Поделиться этим сообщением


Ссылка на сообщение

возможно ли заспаунить скриптом обьект прямо из папки meshes?

Теоретически можно запустить скрипт из любой папки, но для этого должен быть нестандартный движок (с библиотеками Lua) и самое главное - этот скрипт должен делать строго то же самое, что делается при нормальном спавне. Кроме лишнего гемора ни чего не даёт!

Я анализировал подобный вариант на предмет "сунул" в игру/мод новый каталог со всеми ресурсами (что бы не затрагивать игру), а потом ... Но подключать, то его к существующим скриптам (руками или програмой ) всё равно придётся!

 

 

@Карлан,

Спасибо, именно так я и сделал, теперь работает.

 

@Dennis_Chikin,

Движок править. Брать исходники, и править. dc

 

Чувствовал, что в подобное вляпаюсь!

Но, если я правильно понимаю, скрипты сделанные мной после такой правки, у других работать не будут?

Не порекомендуете ли Вы мне какой-либо базовый набор (.bin) игры, в котором функции записи/чтения в файл работают и при этом он широко применяется модерами.

У меня есть один "правленый" XR3DA.exe c работающим выводом в файл, но там "криво" работает наследование у брони и артефактов. Возникают "случайные" вылеты при вставке его в мод, где у "новых" вещей не прописаны все параметры (в расчёте на наследование).

Есть ещё пяток с форсированным рендерингом, но с ними перегреваются GTX-680 (3 минуты заставки), периодические вылеты при большом количестве аддонов к оружию и при "частом" _update_delta. Вывод в файл в половине из них тоже не работает - видно, как авторы модов заменяли его выводом на консоль.

Изменено пользователем Simonov50

Поделиться этим сообщением


Ссылка на сообщение

Этот комментарий к своему посту Вы прочитали

Приношу извинения, если сделал что-то некорректно, но именно на этот комментарий я и отвечал.

 

Ваш же пост я не просто прочитал, а принял к исполнению!

Не сделав этого я так и останусь "слепым".

За предложенную помощь отдельное Спасибо, но пока по делу спрашивать не готов (оставил резерв на будущее).

Пока нагуглил luacap-2012-02-20 (как я понял он включает предложенное Вами). В чистом виде "Lua от RvP" не нашел.

Сейчас ищу отдельно расширитель Lua или более позднюю версию luacap.

Ещё раз приношу извинения. С уважением, Сергей.

Поделиться этим сообщением


Ссылка на сообщение

Если интересно

Огромное спасибо !!!

Не просто интересно а много больше того, о чём я мог мечтать (учитывая реалии - я по специальности не программист).

Но пока подключать не к чему.

Если подключить к любой "базе" (exe + dll+ ... = /bin), коих даже у меня 7 штук,

то сделанное мой будет нормально работать только у одного пользователя из семи (не нарушив то, что было раньше - обязательное условие!).

 

То есть, надо брать наиболее распространённую версию и плясать от неё.

На сегодня "лицензионка" для этого явно не годится (имхо).

Да и модить через Старфорсе при обилии собственных ошибок - беспредел (не вытерплю!).

Требуется имхо человека, который реально в этом "варится", а не стороннего наблюдателя (типа меня).

Еще раз спасибо за действенную помощь.

Сергей.

 

P.S.

Исхожу из того, что "имхо оно и в африке имхо".

Любое имхо имеет право быть ... , ни к чему не обязывает, не наказуемо и т.д.

Изменено пользователем Simonov50
  • Не нравится 1

Поделиться этим сообщением


Ссылка на сообщение

 

 

Эта сборка совместима со всеми официальными версиями ТЧ.

Спасибо !

Но это сборка люкс, а все мои XR3DA.exe  - "г..."

Хотелось бы ещё и ссылочку на проверенный профессионалами "открытый" экземпляр (с нефорсированным рендером).

Сергей.

Поделиться этим сообщением


Ссылка на сообщение

class CUIScriptWnd - Не могу сдвинуть окно вправо

self:SetWndRect(Frect():set(0,0,420,530)) - работает
self:SetWndRect(Frect():set(200,0,420,530)) - уже не работает

Изображение сдвинулось верно - всё на своих местах, без смещений.
Но, у элементов в правой части окна, которые оказались за пределами "старых" координат, исчезли калбаки,

не работают едитбоксы.  На наведение курсора кнопки и чекбоксы реагируют - подсвечиваются.
Левая часть окна работает нормально.

ХМЛ - просто россыпь в пределах "старых" координат, без фреймов и наложений. В скрипте ничего не аттачилось.
В моём понимании CUIScriptWnd главный в связке, а CScriptXmlInit драйвер-исполнитель, я дал команду главному и мимо.
Явно что-то упустил из вида, что ?

Поделиться этим сообщением


Ссылка на сообщение
подскажите:

Загляни пожалуйста в личную переписку.

Сергей.

@Simonov50,

Frect():set(x1, y1, x2, y2) - первые две - координаты верхнего левого угла, третья и четвёртая - нижнего правого. Вроде, так.

Во первых не так,    а главное -  где ответ на  вопрос ?  

Изменено пользователем Simonov50
  • Не согласен 1

Поделиться этим сообщением


Ссылка на сообщение

@naxac

Прости засранца, я был сильно неправ (задолбали собственные ошибки).

Сергей. :blush:


 

 

метод работает именно так - set(x, y, x+width, y+height).

 

Спасибо ! Понял всё. У меня минимум 3 ошибки:
1. Неверно выбрал метод для сдвига.
2. В моём "поминальнике" ошибка (width, height вместо x2, y2)
3. Не перепроверив незаслуженно обидел человека.

 

Поскольку, читал (и конспектировал) все Ваши предыдущие ответы, рискну
задать очень важный для меня ворос - не понимаю суть.

(непонятки прономерованы в спойлере)

 


class "lbx_kv" (CUIListItemEx)  -- Скриптовой лист-бокс, + к основному
function lbx_kv:__init() super()
self.text = CUIStatic()   -- имя только .text (фишка, игра слов)
self:AttachChild(self.text)  -- дополняем класс
-- класс "висит в воздухе", не связан с экраном (и с XML)
end

class "kovir" (CUIScriptWnd)
-- bla_bla --

self.lb_kv = xml:InitList("lbx_wnd_kv:list",self) -- основной лист-бокс
self:Register(self.lb_kv, "lbox_kv")   -- для калбака
-----

function add_string(name) записываем строку
local _itm = lbx_kv()   -- указатель на скрипт.класс
_itm.text:SetText(name)   -- пишем name в доп.статик !!!

1)Как это через статик добраться до класса (с другими методами !) ???

self.lb_kv:AddItem(_itm)  -- пишем в основной лист kovir.lb_kv

2) ??? что пишем ???  в основной лист (ему нужен тип "string")
end

-- Читаем строку, именно здесь важно имя  .text  (фишка, игра слов)
--  индекс берём с основного листа, а текст из дополнительного статика

name = self.lb_kv:GetItem(index).text:GetText() ????

3) ???  здесь self== kovir:    но!!!  .text из другого класса!!! == lbx_kv:

И это всё работает, но как совершенно не понятно.
Это текст уже из моего скрипта, принцип прямо заимствован из скриптов
для Спавен мода Повелитель Зоны. Нужен был работающий лист-бокс.

 

 

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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