Charsi 440 Опубликовано 28 Июня 2015 Поделиться Опубликовано 28 Июня 2015 @Simonov50, метод работает именно так - set(x, y, x+width, y+height). Т.е. если сначала ширина активной области окна была 420-0 = 420, то потом стала 420-200 = 220. И всё, что уехало правее 420 - уже не активно. Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
Simonov50 2 Опубликовано 28 Июня 2015 Поделиться Опубликовано 28 Июня 2015 @naxac, Прости засранца, я был сильно неправ (задолбали собственные ошибки). Сергей. метод работает именно так - 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: И это всё работает, но как совершенно не понятно.Это текст уже из моего скрипта, принцип прямо заимствован из скриптовдля Спавен мода Повелитель Зоны. Нужен был работающий лист-бокс. Ссылка на комментарий
naxac 2 447 Опубликовано 29 Июня 2015 Поделиться Опубликовано 29 Июня 2015 @Simonov50, доступ к экземпляру другого класса ты получаешь через self.lb_kv:GetItem(item_index). Точнее, этим методом ты и получаешь экземпляр класса lbx_kv, и далее можешь делать с ним всё, что угодно его методами. Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
RayTwitty 509 Опубликовано 29 Июня 2015 Поделиться Опубликовано 29 Июня 2015 (изменено) Но может есть другие варианты?По хорошему, на бы в самом движке перед созданием биндера проверять, а существует ли такой файл\функция вообще. Но если движок не вариант, значит на выходе в онлайн читаем секцию у объекта, в этой секции читаем параметр script_binding, разбиваем строку на [файл].[функция], далее известными способами проверяем наличие и вылетам если чего-то не хватает. В случае если всё окей, добавляем секцию в табличку "проверенных секций", чтобы несколько раз не сканировать одно и тоже. Изменено 29 Июня 2015 пользователем Shadows 1 Ссылка на комментарий
UnLoaded 313 Опубликовано 29 Июня 2015 Поделиться Опубликовано 29 Июня 2015 значит на выходе в онлайн читаем секцию у объекта, в этой секции читаем параметр script_binding, разбиваем строку на [файл].[функция], далее известными способами проверяем наличие и вылетам если чего-то не хватает. Ну тогда наверное проще будет: local obj_bind = obj:binded_object() if obj_bind then .... Если биндер смогли получить - значит все ок с файлом\ф-цией ? Ссылка на комментарий
RayTwitty 509 Опубликовано 29 Июня 2015 Поделиться Опубликовано 29 Июня 2015 @UnLoaded, не у всех объектов, выходящих в онлайн, должен быть биндер. Без чтения конфига не обойтись. 1 Ссылка на комментарий
Zander_driver 10 341 Опубликовано 30 Июня 2015 Поделиться Опубликовано 30 Июня 2015 значит на выходе в онлайн читаем секцию у объекта А как мы поймаем выход в онлайн, если у объекта не работает биндер? binder:net_spawn() в таком случае не вызывается тоже. Вообще конечно да. по идее такие вещи должны в движке проверяться, и тот факт что этого нет, это очередной косяк его разрабов. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Charsi 440 Опубликовано 30 Июня 2015 Поделиться Опубликовано 30 Июня 2015 @Zander_driver, с помощью level.client_spawn_manager():add( object_id, 0, spawn_callback ). Колбек на выход в онлайн вызывается после возможного binder:net_spawn(), поэтому на момент вызова уже будет известно, забинден ли объект. Проверка в движке всё же есть, но без обрушения игры. luabind::functor<void> lua_function; if (!ai().script_engine().functor(pSettings->r_string(section,"script_binding"),lua_function)) { ai().script_engine().script_log (ScriptStorage::eLuaMessageTypeError,"function %s is not loaded!",pSettings->r_string(section,"script_binding")); return; } Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
RayTwitty 509 Опубликовано 30 Июня 2015 Поделиться Опубликовано 30 Июня 2015 (изменено) Ещё такой вариант - перебрать вообще все секции и посмотреть у них параметры биндинга, ну и потом проверить наличие всего необходимого. Другими словами, отладка ещё до выхода объектов в онлайн. Изменено 30 Июня 2015 пользователем Shadows Ссылка на комментарий
Zander_driver 10 341 Опубликовано 30 Июня 2015 Поделиться Опубликовано 30 Июня 2015 (изменено) Ну про перебор уже говорилось ранее. Метод надежный в плане результата, но, кхм, не слишком удобный. Проверка в движке всё же есть, но без обрушения игры. Это какая версия движка? Я что-то не видел у себя никаких сообщений в лог, когда у меня в bind_physic_object.script синтаксическая ошибка оказалась. А на него ведь сотни и тысячи объектов на любой локации вешаются. level.client_spawn_manager():add( object_id, 0, spawn_callback ). Чтобы так проверить все объекты игры, тоже вообще-то перебор надо устраивать. тогда уж проще так while a < 65535 do local obj = alife():object(a) -- перебираем все объекты if obj then local section = obj:section_name() -- берем их секцию if ltx:line_exist(section, "script_binding") then -- смотрим нужен ли ему вообще биндер local binder_x = ltx:r_string(section, "script_binding") -- читаем что он хочет --- далее разбираем на файл.функция и проверяем что все нужное существует. end end end Изменено 30 Июня 2015 пользователем Zander_driver Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
RayTwitty 509 Опубликовано 30 Июня 2015 Поделиться Опубликовано 30 Июня 2015 (изменено) Ну про перебор уже говорилось ранее.Ранее говорилось про перебор объектов, я же написал про перебор _секций_. Секций всегда будет меньше, следовательно меньше нагрузка + их нельзя изменять\добавлять без перезагрузки игры. Чтобы так проверить все объекты игры, тоже вообще-то перебор надо устраивать. тогда уж проще такНу проверишь в начале уровня, дальше что? Если какой-нибудь новый объект в игре появится, снова проверка? На апдейте будешь делать?)) Изменено 30 Июня 2015 пользователем Shadows Ссылка на комментарий
Zander_driver 10 341 Опубликовано 30 Июня 2015 Поделиться Опубликовано 30 Июня 2015 Ранее говорилось про перебор объектов, я же написал про перебор _секций_ Кстати а как получить список всех существующих секций? Чтобы перебирать. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
NL-Vincenz 12 Опубликовано 30 Июня 2015 Поделиться Опубликовано 30 Июня 2015 (изменено) Подскажите скрипт динамической выдачи предметов? Платформа ТЧ! Хочу что-бы при старте игры ГГ выдавалось разная еда\оружие\медикаменты. Есть скрипт: function main () local r, r2 = math.random(0,4), math.random(0,2) if r == 0 then alife():create("wpn_bm16",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) for a=1,3 do alife():create("ammo_12x70_buck",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end elseif r == 1 then alife():create("wpn_mp5",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) for a=1,2 do alife():create("ammo_9x19_fmj",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end elseif r == 2 then alife():create("wpn_colt1911",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) for a=1,3 do alife():create("ammo_11.43x23_fmj",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end elseif r == 3 then alife():create("wpn_pm",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) for a=1,2 do alife():create("ammo_9x18_fmj",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end elseif r == 4 then alife():create("wpn_pb",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) for a=1,3 do alife():create("ammo_9x18_fmj",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end end if r2 == 0 then alife():create("antirad",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) for a=1,3 do alife():create("medkit",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end elseif r2 == 1 then alife():create("kolbasa",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) for a=1,3 do alife():create("bandage",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end elseif r2 == 2 then alife():create("bread",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) for a=1,3 do alife():create("conserva",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end end alife():create("wpn_knife",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) alife():create("grenade_rgd5",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end Но это совсем не то что я хочу. Изменено 30 Июня 2015 пользователем NL-Vincenz Ссылка на комментарий
Zander_driver 10 341 Опубликовано 30 Июня 2015 Поделиться Опубликовано 30 Июня 2015 @NL-Vincenz, Это не скрипт, это ужас... Почему бы не использовать что-нибудь вроде такого? function mmm() local items = { --- список итемов которые могут быть заспавнены kolbasa = {30, 5}, --- первое число - вероятность в процентах wpn_pm = {50, 1}, --- второе - максимально возможное количество bandage = {80, 10} } local pos = db.actor:position() local lv = db.actor:level_vertex_id() local gv = db.actor:game_vertex_id() for k, v in pairs(items) do if math.random(0, 100) < v[1] then local count = 1 if v[2] > 1 then count = math.random(1, v[2]) end local spawned = 0 while spawned < count do alife():create(k, pos, lv, gv, 0) spawned = spawned + 1 end end end end 1 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
RayTwitty 509 Опубликовано 30 Июня 2015 Поделиться Опубликовано 30 Июня 2015 (изменено) Кстати а как получить список всех существующих секций? Чтобы перебирать.Так просто наверно не получить. Я думаю, надо пропарсить system.ltx и все его вложения, найти все строки, которые обозначают секцию (по заданному шаблону), после чего, найденную секцию на всякий случай проверить при помощи section_exist, ну и добавить её в табличку. Далее, пройтись по этой табличке и посмотреть наличие нужного параметра в секциях. Правда, для чтения файла наверно понадобятся расширения RvP (io namespace). Изменено 30 Июня 2015 пользователем Shadows Ссылка на комментарий
vampirnik77 121 Опубликовано 30 Июня 2015 Поделиться Опубликовано 30 Июня 2015 Подскажите пожалуйста, как отловить в кого стреляет\выстрелил ГГ? Официальная страница проекта Neof-One Crew Ссылка на комментарий
Zander_driver 10 341 Опубликовано 30 Июня 2015 Поделиться Опубликовано 30 Июня 2015 колбек выстрела Shoker выкладывал в былые времена. Посмотри в справочнике по функциям и классам, там лежит. Если надо именно попадание - то можно вообще обойтись хит-колбеком неписей, мутантов, и тех кто тебе еще понадобится (если понадобится). Просто проверить кто нанес хит, и все. Если надо отследить так же случай "в кого-то стреляет, но не попадает" - тогда можно использовать связку вышеупомянутого колбека выстрела и вот такой функции, написанной по мотивам гравипушки. Денису спасибо. local cone_cmax = 0.8 * 0.999 local string_find, string_sub, string_match = string.find, string.sub, string.match local table_insert, table_remove = table.insert, table.remove local math_floor, math_random = math.floor, math.random local lobj_by_id = level.object_by_id local sim, gg = alife(), game_graph() local dev = device() local items_by_id, items_t, items_n = {}, {}, 0 -- найденые "бросаемые" предметы function validate_capture_obj(tartgergt) if IsStalker(tartgergt) and not tartgergt:alive() then return true elseif IsMonster(tartgergt) and not tartgergt:alive() then return true elseif get_clsid(tartgergt) == clsid.inventory_box then return true else return false end end function capture( cone, dist ) -- (cos угла захвата, дистанция) if dist then dist = dist + 0.5 -- смещение конуса захвата за спину актора else dist = 3.5 end local dist_min = 1.2 * dist local cone_max if cone then cone_max = 0.8 * cone else cone, cone_max = 0.999, cone_cmax end local id, v, rvec, r, cos_a, item local n -- scan_n = scan_n + 800 --if scan_n >= 65535 then scan_n, n = 1, 800 end -- перебор --for i = n, scan_n do -- плавный апдейт (поиск новых предметов) local i = 1 while i < 65535 do --- а у меня не плавный, т.к. это не пушка а гуи интерфейс. Если игрок полез всякие окошки открывать, значит бегать-прыгать он не собирается. --- и лучше хоть подвесить игру, но найти объект сразу v = lobj_by_id( i ) if v and (not items_by_id[i]) and events.validate_capture_obj(v) then table_insert( items_t, i ) items_n = items_n + 1 -- предмет подходит items_by_id[i] = true -- добавляем end --end i = i + 1 end n = 1 dist = dist * 1.1 local cam_v = dev.cam_pos:mad( dev.cam_dir, -2.0 ) while items_n >= n do id = items_t[n] v = lobj_by_id( id ) if v --[[and v:get_physics_shell() ]]then -- проверяем, что предмет ни куда не делся n = n + 1 -- следующий элемент rvec = v:center():sub( cam_v ) r = rvec:magnitude() if r < dist and r >= 3 then -- в радиусе захвата, но перед актором cos_a = rvec:dotproduct( dev.cam_dir ) / r if cone < cos_a then -- попадает в конус прицеливания if ( cos_a >= cone_max ) and ( r < dist_min ) then -- если предмет хотя бы не дальше от оси прицеливания, -- но ближе по расстоянию, чем уже выбранный dist_min, cone_max = r, cos_a item, target = v, id end end end else -- убирать из таблицы items_by_id[id] = nil table_remove( items_t, n ) items_n = items_n - 1 end end return item end функцию отбора подходящих объектов validate_capture_obj можно переписать под свои нужды, дистанцию захвата брать из конфига используемого оружия - дистанция стрельбы, а конус захвата очень узкий сделать. Так просто наверно не получить. Вдвоем с Дезертиром как-то раз пробовали подсчитать, сколько времени займет поиск существующих секций, если просто прогнать все возможные комбинации символов с длинной строки до 30, через ltx:section exist. Не помню уже точно что там получилось, но что-то близкое к годам. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
RayTwitty 509 Опубликовано 30 Июня 2015 Поделиться Опубликовано 30 Июня 2015 (изменено) @Zander_driver, а причем тут прогнать все возможные комбинации символов с длинной строки до 30, через ltx:section exist? Я построчное чтение файла предлагал вообще-то. поиск объектов на линии прицеливания или около нееПроще поставить xray-ex и заюзать трассировку лучей RayPick. Изменено 30 Июня 2015 пользователем Shadows Ссылка на комментарий
vampirnik77 121 Опубликовано 30 Июня 2015 Поделиться Опубликовано 30 Июня 2015 , Проще? А если Cop?) Официальная страница проекта Neof-One Crew Ссылка на комментарий
RayTwitty 509 Опубликовано 30 Июня 2015 Поделиться Опубликовано 30 Июня 2015 @vampirnik77, ну тогда используй скриптовый аналог)) Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти