Artos 99 Опубликовано 11 Сентября 2012 Поделиться Опубликовано 11 Сентября 2012 (изменено) serega-gamer, что-то не нашел твоего вопроса в топике по CoP ... пока отвечу тут: - если и нет схемы "use" в CoP, то ничего не мешает ее и портировать или просто самому нужным путем обрабатывать коллбэк 'use_callback'; - в CoP и CS вместо инфопоршней на открытие различных окошек (инфентаря/ящика/трупа/...) работают вызоывы из функции actor_menu_mode. Эта функция имеется в двух скриптах actor_menu.script и pda.script, и обе вызываются из движка. Т.о. отслеживая аргумент 'mode' по логике этой функции можно определять моменты от(за)крытия окошек и в частности при обыске трупа (mode==4). Struck, как сделано в Симбионе там и смотри, не копипастить же кучку скриптов в этот топик ... И что-то не вижу где мною даны конкретные ("как говоришь") коды, а то как именно ты делаешь и не получается - нам неведомо. Раз не получается - значит "не так как тебе надо" делаешь, и или разбирайся самостоятельно или показывай как делаешь. Изменено 11 Сентября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Zander_driver 10 334 Опубликовано 11 Сентября 2012 Поделиться Опубликовано 11 Сентября 2012 Может ли кто поделиться инфой об этих методах класса game_object enum MovementManager::EPathType path_type() void set_path_type(enum MovementManager::EPathType) enum DetailPathManager::EDetailPathType detail_path_type() void set_detail_path_type(enum DetailPathManager::EDetailPathType) // enum MonsterSpace::EMentalState mental_state() enum MonsterSpace::EMentalState target_mental_state() void set_mental_state(enum MonsterSpace::EMentalState); // enum MonsterSpace::EBodyState body_state() enum MonsterSpace::EBodyState target_body_state() void set_body_state(enum MonsterSpace::EBodyState); // enum MonsterSpace::EMovementType movement_type() enum MonsterSpace::EMovementType target_movement_type() void set_movement_type(enum MonsterSpace::EMovementType); //movement void movement_enabled(boolean); // enable_movement bool movement_enabled(); // Что они вообще делают, для каких объектов применимы, какие аргументы просят/возвращают (и что это вообще такое?). Может быть кто то примером использования поделится... Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
Artos 99 Опубликовано 11 Сентября 2012 Поделиться Опубликовано 11 Сентября 2012 Zander_driver, довольно странный вопрос, полностью подходящий для топика "Справочник по функциям и классам". Примеров использования практически всего перечисленного в самих кодах игры немало, набери поиск по ключевому слову и смотри примеры. На вики давно имеется достаточно подробное описание и по этим методам Описание класса game object. Часть II. В чем конкретно то проблема? Нужен обобщающий тутор по этим методам (тогда в справочник, плз) или какая-то конкретная загвоздка/непонятка - тогда и задавай конкретный вопрос по конкртеному методу. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
TYOPA 0 Опубликовано 12 Сентября 2012 Поделиться Опубликовано 12 Сентября 2012 (изменено) Мужики, выручайте. Создал окно, в нём переключатель (InitCheck). вот скрипт: function main() super_dlg = ui_obmen_active.obmen_active() level.start_stop_menu(super_dlg,true) end class "obmen_active" (CUIScriptWnd) function obmen_active:__init(owner) super() self.owner = owner self:InitControls() self:InitCallBacks() end function obmen_active:__finalize() end function obmen_active:InitControls() self:Init(0,0,1000,750) local xml = CScriptXmlInit() xml:ParseFile("ui_obmen_active.xml") xml:InitStatic("background", self) self:Register(xml:Init3tButton("btn_cancel",self), "btn_cancel") if db.actor:object("wpn_svu") then xml:InitCheck("check_svu", self) --xml:InitCheck("check_svu", self) end end function obmen_active:InitCallBacks() self:AddCallback("btn_cancel", ui_events.BUTTON_CLICKED, self.cancel, self) self:AddCallback("check_svu", ui_events.CHECK_BUTTON_SET, self.check_svu, self) end function obmen_active:cancel() self:GetHolder():start_stop_menu(self, true) end function obmen_active:check_svu() news_manager.send_tip(db.actor, "Галочка ОК!!!", nil, nil, 300) --self:GetHolder():start_stop_menu(self, true) end но функция check_svu не вызывается, при установки метки. Что не так? Изменено 12 Сентября 2012 пользователем ColR_iT Ссылка на комментарий
Desertir 202 Опубликовано 12 Сентября 2012 Поделиться Опубликовано 12 Сентября 2012 (изменено) У тебя просто инициализация этого чекера, а регистрировать на каллбеки кто будет? Замени xml:InitCheck("check_svu", self) на self:Register(xml:InitCheck("check_svu", self), "check_svu") PS: разобрался бы сначала в оконных классах, чем просто копировать с примера. Изменено 12 Сентября 2012 пользователем ColR_iT ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
TYOPA 0 Опубликовано 12 Сентября 2012 Поделиться Опубликовано 12 Сентября 2012 Заменил, но всё равно вызов не происходит. Пытался сделать как у ПЫСов в меню опций, но в скрипте ui_mm_opt_sound.script просто инициализация. Я из какого скрипта происходит отслежка установки влажка я не нашёл. потому и обатился на форум. p.s. Desertit изучение паралельно с практикой. Ссылка на комментарий
Desertir 202 Опубликовано 12 Сентября 2012 Поделиться Опубликовано 12 Сентября 2012 ПЫСы их знают, какие каллбеки нужны. Сейчас порылся, для чекера в ui_mp_main.script стоит BUTTON_CLICKED, а не CHECK_BUTTON_SET. Используй поиск по файлам в Notepad++ например, лучший друг в изучении скриптов и конфигов. ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
boryan67 38 Опубликовано 13 Сентября 2012 Поделиться Опубликовано 13 Сентября 2012 Всем доброго дня и здоровья. В целях отработки навыков работы с модулем m_netpk, поставил себе учебно-тренировочную задачу заспавнить полупустую пачку патронов. По событию спавню патроны и сохраняю в переменной их ID. local sobj = sim:create(ammo, vector():set(temp.position.x,temp.position.y,temp.position.z), temp.lv, temp.gv) if sobj then SobjID2 = sobj.id -- сохраняем id end Из биндера вызывается процедура перевода объекта в оффлайн/онлайн и внесения изменений в количество патронов в пачке. function update2() if not SobjID2 then return end if not State2 then State2=0 end local sobj = alife():object(SobjID2) -- получаем серверный объект if sobj then local obj = level.object_by_id(sobj.id) -- получаем клиентский объект -- ждем появления в онлайне if State2==0 then if obj then State2=1 local sim = alife () if sim ~= nil then sim:set_switch_online (obj:id (), false) sim:set_switch_offline (obj:id (), true) end end -- ждем появления в оффлайне elseif State2==1 then if not obj then set_params2() --прописываем данные State2=2 end -- проверяем данные elseif State2==2 then local ver = ver_params2() if ver then State2=3 -- проверка успешна else State2=1 -- ошибка, перезапись end -- переводим в онлайн elseif State2==3 then local sim = alife () if sim ~= nil then sim:set_switch_online (sobj.id, true) sim:set_switch_offline (sobj.id, false) end -- удаляем переменные SobjID2=nil State2=nil end end end Процедура записи параметров. -- установка параметров function set_params2() if not SobjID2 then return end local sobj = alife():object(SobjID2) if sobj then pk = get_netpk(sobj) if pk:isOk() then -- читаем пакет local data = pk:get() -- устанавливаем данные ammo_num=15 -- записываем данные data.upd.ammo_left = ammo_num data.ammo_left = ammo_num -- записываем пакет pk:set(data) end end end Процедура проверки не представляет особого интереса, обычное чтение и сравнение. Вроде работает, пачка появляется, "исчезает" и появляется вновь с заданными параметрами. Но, эпизодически объект не возвращается в онлайн. Объект существует, на него можно установить метку, но онлайнового объекта нет. Всем, кто может проконсультировать по данному вопросу заранее благодарен. Дополнительная проверка показала, что грубейшая ошибка была допущена как раз в процедуре проверки факта установки желаемых значений количества патронов в пачке и перезапуска установки оных. Как обычно, то, что считаешь несущественным, оказывается главенствующим. Сейчас проблемка устранена, но остается открытым вопрос - почему не всегда данные, прописанные нет-пакетом, нормально применяются и приходится их перезадавать повторно? Где тут "собака порылась"? В неправильном использовании модуля? Некорректной подачи данных в него? Особенности Сталкера? Хотелось бы разобраться (насколько возможно) в подоплеке этого дела. Ведь пример чисто академический и простейший. При более сложных операциях, подозреваю, можно устроиться в еще более замысловатые ситуации. Информация: ТЧ 1.0004, объект спавнится в непосредственной близости от ГГ. Ссылка на комментарий
AndreySol 215 Опубликовано 13 Сентября 2012 Поделиться Опубликовано 13 Сентября 2012 (изменено) Такой вот вопрос. Внес такие строки в код класса se_outfit (файл se_item.script): function se_outfit:__init(section) super(section) self.b_set = false -- это end function se_outfit:STATE_Write(packet) --- и это if not self.b_set then local actor = db.actor if actor and news_manager then news_manager.send_tip(actor, "STATE_Write для: "..tostring(self.id), nil, nil, 30000) end self.b_set = true end ---- cse_alife_item_custom_outfit.STATE_Write(self, packet) end Ожидал, при спауне броника увидеть сообщение 1 раз - в __init переменную проинициализировали false, в первом вызове STATE_Write установили в true, все - больше сообщение появлятся не должно. Однако при спауне броника в игре, сообщение выдается 2 раза подряд. Почему ? Думал до этого так - при создании игрового объекта, создается объект класса se_outfit, представляющий серверную часть объекта, ну инициализируется там как положено и в дальнейшем существует до выхода из игры или загрузки сохранения. А тут получается что объект класса создается дважды ? Объясните, что к чему ! Изменено 13 Сентября 2012 пользователем AndreySol Ссылка на комментарий
_Призрак_ 11 Опубликовано 13 Сентября 2012 Поделиться Опубликовано 13 Сентября 2012 (изменено) boryan67 Что же вас всех тянет к нет-пакетам! Для работы с нет пакетом нужно его создать, написать в него, прочитать. Да и банально - это же грязный хак. При кривых руках могут быть проблемы Изменено 13 Сентября 2012 пользователем _Призрак_ Freedom Ссылка на комментарий
Artos 99 Опубликовано 13 Сентября 2012 Поделиться Опубликовано 13 Сентября 2012 (изменено) _Призрак_, что-то не ясна суть твоей реплики ... получился набор слов. понятных наверное только тебе. boryan67, если не вдаваться далеко в дебри теории, то основная проблема у многих начинающих (да и не только) модмейкеров при работе с нет-пакетами в том, что не задумываются в какие моменты нужно считвать параметры объекта в пакет, и как/когда заставить объект принять (считать) заданные/измененные значения. Единого простенького рецепта тут нет, основная проблема связана с параметром 'object_flags', а точнее в том, как задано в игре для каждого конкретного объекта его существование в он-офф-лайне. Есть те, которым прописано быть всегда в оффлайне. Есть те, кому всегда быть в онлайне. Есть те, у которых замысловатая логика перевода офф- он- лайн ... Почему то мало кто задумываается, а как происходит перевод в оффлайн и/или обратно в онлайн, и думают все это делается шаблонно, т.е. отдал команду - получил требуемый результат... Именно с этим связаны недопонятки: "почему не всегда данные, прописанные нет-пакетом, нормально применяются и приходится их перезадавать повторно?" . Напомню, что у серверных объектов существуют методы can_switch_offline и can_switch_online, и, если посмотреть в модах (АМК, SIMBION, ...), то в указанных методах для восстребованных классов объектов в их конструкторах добавлены строки кода, которые как раз и управляют флагами, точнее влияют на процессы перевода объекта в то или иное состояния, не давая сбиваться алгоритму. Не буду тратить время на расписывание всего и вся - кому нужно, смотрите и думайте для чего в указанных модах добавлены if amk.convert_npc... или if db.is_switchings... Т.о. ответ заключается в том, что нужно не просто создать/прочитать/записать нет-пакет, но и заставить соответствующий гейм-объект считать (синхронизировать) данные со своей серверной копией. Если этого не сделать - приходится "перезадавать повторно" (и может не раз). ;-) AndreySol, не нужно, нарушая правила портала, дублировать вопросы (чуть меняя форму вопроса). Задал вопрос - жди, когда кто-то захочет на него дать ответ. Изменено 13 Сентября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Scarabay 98 Опубликовано 15 Сентября 2012 Поделиться Опубликовано 15 Сентября 2012 Привет всем! Вот в ЗП есть 4 хот-кея...Они являются слотами? Можно как-нибудь отследить, что в них находится (аптечка, антирад и т.д.)? Благодарю. Мой YouTube-канал Ссылка на комментарий
AndreySol 215 Опубликовано 15 Сентября 2012 Поделиться Опубликовано 15 Сентября 2012 Такой вопрос по биндерам: создали мы свой класс биндера для какого-нить предмета, прибиндили в ltx-файле, все работает. В классе биндера объявим переменную (свойство): class "new_binder" (object_binder) function new_binder:__init(obj) super(obj) self.b_var1 = false -- наша переменная (свойство) end Далее, можем получить этот объект класса: local obj = npc:object("ля-ля-ля") if obj then local obj_bind = obj:binded_object() if obj_bind then local text = "параметр: object:id() - "..tostring(obj_bind.object:id()) -- есть доступ к свойству класса news_manager.send_tip(db.actor, text, nil, nil, 30000) end end А вот как получить эту самую self.b_var1 ? Пробовал obj_bind.b_var1 - вылет. Ссылка на комментарий
KD87 718 Опубликовано 15 Сентября 2012 Поделиться Опубликовано 15 Сентября 2012 (изменено) AndreySol, инкапсуляция, скорее всего. Попробуй создать метод-геттер для этого свойства. Изменено 15 Сентября 2012 пользователем KD87 Ссылка на комментарий
Artos 99 Опубликовано 15 Сентября 2012 Поделиться Опубликовано 15 Сентября 2012 (изменено) Scarabay, хоткеи и слоты - совершенно разные сущности. Хоткеу - клавиша/кнопка иль их комбинвация, при нажатии на которую вызывается некое действие в приложении (игре). Хоткеев в игре гораздо больше чем 4 (загляни в общее игровое меню), просто ты спрашиваешь про те, которые отвечают за выполнение действий с некими объектами (использовать аптечку, съесть консерву ...). Т.о. невозможно отследить что находится в хоткеях, Да и собственно, интересующие тебя хоткеи просто напросто, при их активизации, определяют наличие у актора первого подходящего для них объекта и выполняют с ним соотв.действие. Все эти аптечки, антирады, бинты и еда ни в каких слотах не находятся, а (не)имеются у актора в рюкзаке (инвентаре). Требуется определить наличие предметов(?) - итерация по рюкзаку тебе поможет. AndreySol, с чего ты взял, что нечто полученное методом obj:binded_object() является твоим исходным биндером ("new_binder") ? Требуется узнать свойство конкретного биндера - ну так и обращайся к нему, а не неизвестно к чему-то. Изменено 15 Сентября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Struck 61 Опубликовано 16 Сентября 2012 Поделиться Опубликовано 16 Сентября 2012 Struck, как сделано в Симбионе там и смотри, не копипастить же кучку скриптов в этот топик ... И что-то не вижу где мною даны конкретные ("как говоришь") коды, а то как именно ты делаешь и не получается - нам неведомо. Раз не получается - значит "не так как тебе надо" делаешь, и или разбирайся самостоятельно или показывай как делаешь. Как делаю - думаю всем понятно, просто передаю (victim, who) в коллбек и все. Я долго рассматривал кучку скриптов и пытался делать по аналогии - не вышло(делал, относительно говоря, копипастом). Мне нужен только алгоритм отлавливания клсида оружия и все, пока только вырисовывается громоздкий код по отлавливанию смертельного хита(его типа) и в связи с этим я лишь "предполагаю" какое оружие могло быть в момент убийства. Хотелось бы как-нибудь наверняка знать...кодов я не прошу :ny_ph34r_1: (пока) Ссылка на комментарий
RayTwitty 509 Опубликовано 16 Сентября 2012 Поделиться Опубликовано 16 Сентября 2012 (изменено) Привет всем! Вот в ЗП есть 4 хот-кея...Они являются слотами? Можно как-нибудь отследить, что в них находится (аптечка, антирад и т.д.)? Благодарю. function item_in_fast_slot(slot_id) local section = get_console():get_string("slot_"..slot_id) if section then return db.actor:object(section) end end Проверяет есть ли в слоте быстрого использования предмет. В функцию передавать номер слота (1-4). На всякий случай добавил проверку наличия секции (вроде предмета в слоте может и не быть?). З.Ы. если нужно конкретный итем проверять, то можно чуть переделать функцию. Изменено 16 Сентября 2012 пользователем Shadows 1 Ссылка на комментарий
Stiingray 4 Опубликовано 16 Сентября 2012 Поделиться Опубликовано 16 Сентября 2012 (изменено) Подскажите, как можно проверить оружие, нахоядщееся в слоте на наличие конкретного прицела, например wpn_addon_scope_night? Для ЗП. С началом вроде все ясно: if db.actor:item_in_slot(3) ~= nil and db.actor:item_in_slot(3):section() == "wpn_ak74" then local wpn = db.actor:item_in_slot(3) А вот дальше, как я понимаю стандартными функциями игры здесь не обойтись. Можно ли сделать желаемую проверку с помощью функции Get_Data_Weapon из sm_net_utils от Artos? Изменено 16 Сентября 2012 пользователем Stiingray Ссылка на комментарий
Artos 99 Опубликовано 16 Сентября 2012 Поделиться Опубликовано 16 Сентября 2012 (изменено) Stiingray, давайте не засорять топики повторяющимся вопросом (#4338, #4511, #4356) на который пока нет положительного ответа. Вот тут: #4528 мною дан некоторый 'ответ', и с тех пор пока новой информации нет ни от кого. А некий упомянутый тобою sm_net_utils , мне, например, неизвестен, и если он сделан на базе устаревшего m_net_utils.script, то вообще советую его уже не использовать. Заменой ему идет m_netpk.script (инфу смотри в этом же топике), но и он не даст желаемого результата ... если только в его помощью в параметрах из 'abstract' поковыряться... Struck, а если не копипастить бездумно а подумать? Ведь алгоритм довольно прост! Если имеется информация о "кто убил" (who), то, как уже писАл выше, ничего не мешает проверить "человек ли это" и наличие активного предмета у него в руках. Если таковой предмет имеется - он (предмет) и имеет твой искомый клсид. Изменено 16 Сентября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Struck 61 Опубликовано 17 Сентября 2012 Поделиться Опубликовано 17 Сентября 2012 (изменено) Artos, аргх, я ведь и говорю что именно так и делал, но мне нужно отследить тип хита, т.к. допустим я кидаю гранату и достаю ПМ, проверяю секцию активного слота в момент смерти - высветится ПМ, а не граната, ясно? И да, я над этим довольно долго думал и эксперименитровал, и вот пришлось только через отслежку хита делать, думал есть какой-то более рациональный способ. Изменено 17 Сентября 2012 пользователем ColR_iT Жирным шрифтом писать абсолютно не за чем! Устное предупреждение. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти