Desertir 202 Опубликовано 31 Декабря 2012 А что значит недоступны? Надо было все таки написать, но думал по коду было понятно. Недоступны в том плане, что этот метод function bug:get_sel_item() local sel_index = self.list:GetSelectedItem() local sel_item = self.list:GetItem(sel_index) return sel_item end возвращал nil. И в методе start, который вызывается при нажатии на элемент, стоит проверка на существование элемента. Так вот в главном меню (независимо от того, только мы запустили сталкер, или нажали Esc во время игрового процесса) в консоле я видел текст из элемента, на который нажимал. Когда же я запускал окно непосредственно в игре (а ля инвентарь), то в консоле зияли надписи "item not exist", что означало, что элемента несуществует. Кстати классы CUIListItemEx и CUIListItem, вообще говоря предназначены для создания скриптового класса на их основе. Чтоб прямо предназначены я не знал, хотя видел это в кодах компания-разработчик (признана нежелательной)*. Сейчас я это учел, создал свой класс взял класс у компания-разработчик (признана нежелательной)*, немного подкорректировал его. И... все заработало. Хотя я не знаю, из за чего точно, вот исправленный код class "my_item" (CUIListItemEx)function my_item:__init(text) super()self:SetWndRect(0,0,172,22)self.fn = CUIStatic()self.fn:SetAutoDelete (true)self:AttachChild(self.fn)self.fn:SetWndRect(0,4,172,22)self.fn:SetText(text)self.fn:SetFont(GetFontLetterica18Russian())self.fn:SetTextColor(255,216,186,140)endclass "bug" (CUIScriptWnd)function bug:__init(owner) super()self:Init(0,0,1024,768)self.bg = CUIFrameWindow()self.bg:Init("ui_tablist_textbox",128,128,256,320)self:AttachChild(self.bg)self.list = CUIListWnd()self.list:Init(138,138,172,172)self.list:EnableScrollBar(true)self.list:ShowSelectedItem(true)self:AttachChild(self.list)self:reset_list()self:Register(self.list,"list")self:AddCallback("list",ui_events.LIST_ITEM_CLICKED,self.start,self)if owner thenself.owner = ownerself.owner:GetHolder():start_stop_menu(self,true)self.owner:GetHolder():start_stop_menu(self.owner,true)elselevel.start_stop_menu(self,true)endendfunction bug:start()local sel_item = self:get_sel_item()if not sel_item then pcon("item not exist") return endlocal name = sel_item.fn:GetText()pcon(name)endfunction bug:reset_list(t)t = t or {"Kardon","Svalka","Agroprom","Bar","Yantar","Military","Pripyat","Chernobyl"}self.list:RemoveAll()for _,value in pairs(t) doself.list:AddItem(my_item(value))endendfunction bug:get_sel_item()local sel_index = self.list:GetSelectedItem()local sel_item = self.list:GetItem(sel_index)return sel_itemendfunction bug:OnKeyboard(dik,keyboard_action)CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)if dik == DIK_keys.DIK_ESCAPE thenif self.owner thenself:GetHolder():start_stop_menu(self.owner,true)self:GetHolder():start_stop_menu(self,true)elselevel.start_stop_menu(self,true)endelseif dik == DIK_keys.DIK_END thenself:reset_list({"Mechenyi","Shustryi","Sidorovich","Barman"})endreturn trueend Теперь в игре в консоль выводится именно то, что я и ожидаю - текст из элемента. Возможно заработало из за того, что в классе элемента создается статик, который приаттачивается к элементу (может так и надо делать?), и в итоге элемент остается где то в памяти, возможно еще чтото. Т.о. объекты то ты добавишь в обоих случаях, а вот поля в листинге (по которым и производится выбор) создаются только в 1-ом. Так что у тебя нет доступа потому, что нет собственно соответствия добавленных объектов полям листинга. Эээ, ну что это, я не по полям получаю объект элемента, я лишь так их сохраняю сохранял в объекте. Получаю то я штатными методами (см. начало этого поста) как в первом, так и во втором случае. Так же скажу, в обоих случаях индексы элементов были, т.е. существовали, и вполне реальные: 0, 1, 2 и т.д. Однако в одном случае по индексу мы получали реальный объект, а в другом случае nil. PS: имхо в скриптах с оконными классами очень трудно найти ошибку, т.к. у нас даже вылета не происходит, а в других случаях вылет без лога, лично мне иногда приходится гадать. ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 14 Января 2013 A.l.e.x.a.n.d.r., не обижайся, но если ты действительно знаешь, что означает это определение, то таких банальных вопросов бы и не было. Для того, чтобы действительно понять, что такое self нужно знать и понимать что такое класс, экземпляр класса, свойство, метод. self это сам объект, для которого вызван метод (object:method() - в классе в методе method объектом object является self) Для меня вопрос "зачем вообще нужен self?" все равно что "зачем нужно ООП?", складывается впечатление, что человек очень далек от программирования. Хотя конкретный, но в то же время расплывчатый, ответ на твой вопрос можно дать - self может быть использован для (почти) всего, смотря для чего класс. Да, в некоторых случаях self не используется, но с ходу такой класс я не придумаю, ибо это какойто класс-пустышка. PS: посмотри примеры в скриптах наконец! 1 ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 15 Января 2013 Раз поднялась тема про оптимизацию... Я давно думал об этом, но руки не дошли, да и все не упомнишь. Может есть желание у кого нибудь составить список проблемных мест в скриптах? Именно по файлам. В одну каску это почти нереально - прошелестить все скрипты, но вдруг уже знают глючные модули. ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 4 Февраля 2013 CRAZY_STALKER666, совершенно не верно. local helltime = 0 if helltime == 0 then Тут всегда будет истина, ты же сам пишешь, что переменная равна нулю, потом сравниваешь с нулем, так что эти строки бессмысленны. else helltime == 1 Что ты тут хочешь сделать? Начнем с того, что это приведет к вылету. Если ты хочешь сделать дополнительную проверку, если переменная всетаки не ноль, то это будет так elseif helltime == 0 then и далее по коду. Почитай про программирование и про язык луа побольше, а еще лучше не просто читать, но и понимать. Также, пойми суть, того, что ты хочешь сделать и что ты делаешь, если ты не понимаешь, то и получается такая нелепость. ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 2 Августа 2013 (изменено) @Saruman, да неужели? Все управление через биндинги в user.ltx прописано. @StafGlawer, что то мне подсказывает, что анбиндинг работает не по значению, а по клавише, типа такого "unbind kP", но таким методом не заблокировать весь пда, контакты и карта все равно останутся (мб еще чтото, залезь в настройки управления). Можно попробовать разбиндивать и их, только нужно получать правильные клавиши, например у меня открытие активных задач далеко не на клавишу P. А как получать, не подскажу, могу только запутать Вариант @Jurok'а из самых распространенных, в Солянке есть такая шняга с рюкзаком, якобы молния застряла (если ноги растут у этой идеи не из Солянки, уж извините, увидел именно в ней). Там проверяются инфопрошни, я уверен на 90% и как только получили инфопоршень открытия какого либо окна из ПДА его можно закрыть. Как - описано в справочнике по скриптам. Изменено 2 Августа 2013 пользователем Desertir 1 ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 3 Августа 2013 (изменено) @Сталкер Лом, я бы попробовал вынести за функцию таблицу с информацией, но наверняка это не поможет. Ты уверен, что именно из за этого вылетает? В рунете в основном советуют почистить диск, увеличить файл подкачки, сделать дефрагментацию. На счет работоспособности скрипта в целом. Так задумано, что выдаются все инфопоршни из таблицы? Дебаг? Если нет, то в теле последнего if'а надо бы поставить break. Да и вообще как то рандомно надо выбирать инфопоршень, если такой инфопоршень есть, выбрать другой случайный, чисто моя логика, то бишь ИМХО. PS: в справочнике вылетов такого еще нету/не нашел Изменено 3 Августа 2013 пользователем Desertir ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 3 Августа 2013 (изменено) Ого, а insert то я и не увидел, вот я шляпа. Тогда все очевидно... Если позволите, как бы я реализовал выдачу информации. local infoportions = {"info_1","info_2","info_3"} function load_game() --вызвать для удаления существующих\известных инфопорций for id,info in pairs(infoportions) do if db.actor:has_info(info) then table.remove(infoportions,id) end end end function give_rnd_info() --выдача случайного инфопоршня if not next(infoportions) then return end local chance = math.random(0,100) if chance < 20 then local id = math.random(#infoportions) db.actor:give_info_portion(infoportions[id]) table.remove(infoportions,id) end end Проверено под Lua for Windows 5.1.4 В критике не нуждаюсь, ибо ИМХО PS: пока я писал, автор ответил. Изменено 3 Августа 2013 пользователем Desertir 1 ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 25 Марта 2014 (изменено) Нету понимания видимости переменных... или страдает здравая логика. 1. Условие для iTimer никогда не сработает, потому что ты строчкой выше всегда определяешь его на 1000 условных попугаев (ок, микросекунд) больше, чем текущее время. Даже если предположить (а это не так, на сколько я помню), что функция time_global() вернет разные значения в 2-х подряд идущих строчках кода, пауза никак не может быть равна 1 секунде. Нужно использовать раздельную проверку (если nil то стартуем, иначе проверяем с текущим временем, если больше, ничего не делаем, если меньше, делаем свои черные дела) 2. Та же ошибка с interval_to_callback, только обратная. Ты объявляешь ее равной нулю (инициализируешь этим значением), а потом сразу проверяешь с текущим временем, которое никак не может быть меньше нуля, соответственно условие всегда выполняется. И где логика? 3. Это какие-то взаимоисключающие таймеры, ты и вызвать функцию пытаешься по таймеру и в ней же так же делаешь проверку по таймеру. Достаточно одного, а вот где, это уже другой вопрос. ЗЫ: и это не калбек (callback), как ты указал в комментариях, это чистый апдейт (я не про "апдейт актора", а про "апдейт" как смысл слова и функции), функция-калбек имеет совершенно иное значение. Это так, на всякий случай. Изменено 25 Марта 2014 пользователем Desertir ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 21 Апреля 2014 @mumie, чтото в скрипте у тебя мешанина, форум перетусовал? Если тебе нужны все сталкеры, которые в онлайне и ближе, чем некая дистанция, то можно перебирать таблицу db.storage (вроде она). Там хранятся не только сталкеры, так что придется проверять принадлежность. По хорошему, можно создать свою отдельную таблицу онлайновых сталкеров, в любом случае, объектов в этих таблицах будет не так много. В принципе, если тебе нужно, чтобы ГГ еще и смотрел в сторону непися, из скриптов это тоже можно сделать. ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 21 Апреля 2014 (изменено) Мысли в слух. Найти вектор между ГГ и каждым неписем (которые ближе Н метров) и найти направление взгляда ГГ. По хорошему, надо найти корреляцию, методом тыка найти коэффициент, при котором непись будет "под прицелом" и сравнивать с ним. Но это... не круто. ЗЫ: вроде есть правка движка, которая позволяет получить объект, на которого направлен прицел Поищи в X-Ray Extension или гдето там. Изменено 21 Апреля 2014 пользователем Desertir ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 27 Мая 2014 Во многих оконных скриптах в конструктор класса аргументом передается владелец или родитель экземпляра класса. Это можно почти везде найти. Проблема в определении косяка, это либо в конструктор передается nil, либо в нем нету инициализации поля self.owner. Ну или еще какая беда, типа родителя уже нету (удалилсо), но тут запись в лог наверное будет другой. ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 29 Июля 2014 function kick_art_begin(sobj,dir) local hit = hit() hit.direction = dir hit.direction.y = hit.direction.y + 1 hit.draftsman = db.actor hit.impulse = math.random(100,130) hit.power = 0 hit.type = hit.strike level.client_spawn_manager():add(sobj.id,65535,kick,hit) end function kick(hit,id,obj) obj:hit(hit) end Я так пинал его. Тут конечно надо подправить некоторые моменты, но это работает и в качестве примера вполне пойдет. 1 ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 10 Августа 2014 @Zander_driver, да, это строковые ключи, но они там не хранятся. По сути там ничего не храниться, есть метатаблица этой юзердаты, которая была "создана" в движке. У нее есть поле __index, который представляет из себя адрес функции, причем движковой, Сишной, и которая вызывается при попытке индексации (obj.some_field или obj.["some_field"], в общем случае, ключом может быть любое значение). Ей передается этот ключ (та самая строка) и уже по ней эта Сишная функция возвращает константу. Т.о. прочесть все доступные ключи, действительно, можно только из xrGame.dll Обратное преобразование так же невозможно. А читать байтово длл, да еще из Луа, ну это как копаться в стоге сена в поисках иголки. IO так и называется input\output. Читать байты нужно для своего формата, аля all.spawn (чисто пример). PS: hex редактором можно найти какйто список строковых значений, похожий на список clsid, но боюсь, я могу ошибаться, смещение для ТЧ 04 0046BF7C, прикола ради можно посмотреть. ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 10 Августа 2014 (изменено) Смещение отличается в разных версиях xrGame. Неужели? Наверное тогда я правильно сделал, что указал версию, или нет? На кой читать статические данные из скриптов? Раз они не изменяются динамически, hex редактором читаем и хардкодим в скрипты. И еще, разве это будет работать с сидами, которые мы добавили сами в скриптах? Это вот как раз про динамику. Изменено 10 Августа 2014 пользователем Desertir ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 11 Августа 2014 @Nazgool, да, мы идем разными путями к одному и тому же. Я поэтому и спросил, зачем читать их динамически? Вопрос был не "Зачем список clsid'ов?", а "Зачем читать статические данные из скриптов?". Важен академический интерес? Хорошо, но ИМХО этот способ применять в конечном продукте я бы не стал. 2 причины, подключение X-Ray Extensions и мы все равно не видим список, визуально, да, для кода задача решена, но для программиста какие ключи писать не ясно. Да, можно вывести в лог или еще что-нибудь, но тогда придется их куда то записать. И лично моя причина, читать так чтото из длл - жесть, для этого и существует hex редакторы. Но ладно. Так еще то вопрос у меня был, что с clsid'ами объявленными в скриптах, а не в движке? Есть вариант (может работает, а может и нет, так что без кода), подмена функции метатаблицы __newindex на свою с вызовом старой, в своей написать добавление этого ключа в некую глобальную таблицу, только надо найти место, где переопределять это дело. ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 20 Октября 2014 (изменено) @Zander_driver, это прикол?) Проверяй #vacant_pos на 0, если равно, брекай свой цикл - таблица пуста. Смысл в том, что в рандом нельзя передать 0. Может быть можно ранее до цикла проверить длину и сравнить с тем, сколько элементов надо удалить, будет мини-оптимизация. Изменено 20 Октября 2014 пользователем Desertir ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 17 Ноября 2014 (изменено) Lua поддерживает замыкания. Я бы удивился, если бы первый вариант не работал. Вполне нормальная ситуация, как и передача функции в качестве аргумента, у кого то это вызывает непонимание. Так что в таких ситуациях (когда мы создаем функцию гдето в другой функции и т.п.) использовать замыкания самое то. Одно из назначений замыканий - асинхронный код. Т.е. мы вызываем функцию, в нее передаем т.н. коллбэк (или каллбэк, как угодно) - другую функцию, но мы не можем с уверенностью сказать, в какой момент времени будет вызван этот коллбэк. При этом мы можем использовать замыкания - использовать в коллбэке переменные из области видимости, где он сам создается. Весьма банальный пример есть на википедии. Изменено 17 Ноября 2014 пользователем Desertir 2 ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 17 Ноября 2014 @Zander_driver, у меня все прекрасно сработало. class "my_SMALL_class" function my_SMALL_class:__init() self.test_field = 5 end function my_SMALL_class:Get_f() local f = function() return self end return f end local con = get_console() local my_obj = my_SMALL_class() local my_F = my_obj:Get_f() local x = my_F() con:execute("~~~"..tostring(x.test_field)) Код весьма странный, можно вполне замкнуть my_obj. Кстати, я считал, что не будет работать, пока не вспомнил, что это луабинд, и по факту селф это переменная. В яваскрипте например такое сканает только с объявлением переменной или с выкрутасами типа apply или bind, но не суть. Сборщик мусора вполне сам позаботится про замкнутые переменные. Это же не объект луа, а юзердата. Луа выполняет функцию "удерживания ссылки на замкнутую переменную". Но если по ссылке записать невесть что (из двигла) и пытаться чтото потом сделать с полученной переменной (метод вызвать), получится вылет, и скрипты тут ни при чем. 1 ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 5 Декабря 2014 @Barmolini, в секции можно написать my_cool_art и это будет артефактом, однако условие не пройдет. Пытаться чтото идентифицировать не по тому ключевому полю - глупо. Это как пробовать вычислить кошку среди собак по наличию хвоста и отсутствию крыльев. Смекаешь? Если кошка - изволь мяукать, в данном случае надо брать clsid или что там у нас. ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение
Desertir 202 Опубликовано 12 Декабря 2014 разве дельта, а не абсолютное значение ? По хорошему, любые линейные, да и, если надо, нелинейные(хотя имхо бред), формулы, которые описывают движение чего-либо, т.е. возрастание или убывание параметра (координаты или показатели здоровья/выносливости), должны быть зависимы от дельты. Очевидно, что использование константы приведет к моментальному восполнению сил на "быстрых" ПК, у которых FPS много больше 60 кадров, и наоборот, на "тормозах" мы будем ждать очень долго, пока пройдут эти овер9000 апдейтов. Вообще, думаю, это единственное назначение этой самой дельты, делать адекватное смещение. Ну ок, измерение FPS в некоторых случаях, больше вариантов мне на ум не приходит. 1 ТЧ 1.0004. SAP и Trans mod github Поделиться этим сообщением Ссылка на сообщение