Kirgudu 1 314 Опубликовано 20 Августа 2018 @AndreySol, например, ряд функций в xr_conditions.script - is_alive, is_alive_one, is_alive_all, actor_alive и др. Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 24 Сентября 2018 @_Sk8_AsTeR_, потому что советы надо применять с умом, а не тупо копируя. Если у тебя из диалога вызывается функция, например, такого вида: function my_func(fs, ss, dn, pi) -- какие-то действия end где fs и ss - это первый и второй собеседники, а ты внутри функции пишешь, ничего не меняя, npc:object("medkit)", ежу понятно, что переменной npc неоткуда взяться, а искомый персонаж содержится в одной из переменных fs и ss. Если самостоятельно не получается, не надейся на телепатов - покажи диалог, покажи функцию, и тогда кто-нибудь сможет дать более конкретный совет. 2 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 24 Сентября 2018 (изменено) @_Sk8_AsTeR_, если отвечать по существу вопроса, и если функция give_message_proposed_items вызывается во фразе НПС, тогда: function give_message_proposed_items(first_speaker, second_speaker) if first_speaker:object("medkit") ~= nil then -- предмет есть else -- предмета нет end end Только тебе вместо "medkit" надо ещё передать в функцию, какой именно предмет ты запрашиваешь, ведь до собственно проверки ты случайным образом берёшь его из таблицы допустимых предметов. Это первое. А второе - по-хорошему, тебе надо генерить фразы диалога так, чтобы они шли списком: либо "мне нужно 1. это; 2. это; 3. это" от имени ГГ, либо "у меня есть 1. это; 2. это; 3. это" от имени НПС, и с дальнейшим выбором нужного пункта игроком. Рекомендую взять здесь в скриптах «Чистого Неба» модуль guiders.script и посмотреть, как там реализовано формирование диалога с доступными для перехода точками и выбор из них нужной. Впрочем, не исключено, что кто-нибудь посоветует что-то попроще. Изменено 24 Сентября 2018 пользователем Kirgudu 1 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 25 Сентября 2018 Не стоит игнорировать возможность поискать самому ответы на простые вопросы. Например, поиск в скриптах оригинала по слову «friend» даёт массу интересных результатов, в том числе dialogs.is_friend(first_speaker, second_speaker) и dialogs.is_not_friend(first_speaker, second_speaker). Также много полезной информации даст поиск по «enemy» и «relation». 2 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 12 Октября 2018 Странный вопрос. Если используешь что-то в инвентаре, то предмет этот уже имеется и спавнить его не нужно. Разве что при использовании одного должно заспавниться что-то другое - тогда примерно так: function my_spawn() -- спавн в инвентаре local item = alife():create(section, vector(), 0, 0, db.actor:id()) -- или спавн где-то снаружи -- local item = alife():create(section, position, level_vertex_id, game_vertex_id) if item ~= nil then level.client_spawn_manager():add(item.id, 0, function (id, obj) obj:set_condition(condition) end) end end Понятно, что значения section, condition и др. надо где-то задать. Ну а саму функцию следует вызвать из коллбэка на использование. 1 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 2 Ноября 2018 3 часа назад, Змея сказал: как заспавнить НПС скриптом с одновременным присваиванием СИДа? Через нет-пакет. Например, с использованием модуля m_netpk от Артоса: local obj = alife():create(section, pos, lvid, gvid) if obj then local pk = get_netpk(obj, 1) if pk:isOk() then local data = pk:get() data.story_id = p.sid pk:set(data) end end Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 2 Ноября 2018 (изменено) @AndreySol, если порыться в самом модуле, можно увидеть, что свойство story_id входит в массив state свойств класса net_cse_alife_object. В то же время в классе net_cse_abstract есть position, direction и др. свойства, но вот именно story_id там нет. Думаю, значение story_id должно прекрасно устанавливаться без дополнительных плясок с бубном, требующихся при работе с абстрактной частью пакета. Мне кажется, что в сопроводиловке к модулю Артос просто описАлся. Но если я не прав - с удовольствием посыплю голову пеплом. В таком случае в той же сопроводиловке написано, как нужно действовать. 10 часов назад, Змея сказал: Как функцию спавна писать в скрипте? Я предложил почти готовый код спавна, в который надо только подставить нужные значения. Если угодно - обрамить дополнительно в функцию. Ну и подключить перед этим модуль, разумеется, а как это сделать - подробно написано в соответствующей теме и в документации к модулю. Помощь помощи рознь. Можно расжевать и положить в рот, а можно дать наводку и научить питаться самостоятельно. Предпочитаю делать второе. P.S. По логике: если брать мой пример выше, то содержимое кастом даты можно установить так: --... local data = pk:get() data.custom_data:setString("логика и проч.") --... Изменено 2 Ноября 2018 пользователем Kirgudu 1 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 4 Ноября 2018 @Overfirst, твой пример можно сделать ещё проще, без повторного поиска в массиве: --... if v.id == choice then --... А про табуляции отпиши в "вопросы и предложения", сюда админы могут и не заходить. 1 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 5 Ноября 2018 @Norman Eisenherz, и при чём же тут логическая цепочка? Когда мы пишем "for k, v in pairs(...)", на каждой итерации в переменную k попадает ключ (в нашем случае, например, "good"), а в переменную v - значение (в нашем случае {["price"] = 25*k, ["id"] = 912}), остаётся только сравнить. Возможно, имеет смысл почитать какую-либо литературу по Lua. Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 22 Ноября 2018 @Fenrir02, был такой Dynamic campfire mod от kstn. Посмотри, как там реализовано, и переработай под свои нужды. Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 28 Ноября 2018 @dPlayer, как вариант - событие on_item_take, дальнейший анализ взятого и выдача инфопорции при необходимости. Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 28 Ноября 2018 @dPlayer, ну конечно. Вот сюда: actor_binder:on_item_take (obj). А дальше через секцию объекта или по другим нужным критериям. Возможно, метод @Charsi более оптимален, но это я подтвердить или опровергнуть не могу. Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 22 Декабря 2018 @Heymon, WinMerge. 1 1 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 7 Января 2019 @Graff46, не всё взял, если не ошибаюсь, вот и появились неверные значения. Например, после spawn_story_id должно быть, емнип, чтение визуала (net_cse_alife_dynamic_object_visual). Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 7 Января 2019 (изменено) Вообще, в m_netpk и у меня были связанные с актором непонятки. В этом модуле существуют два класса актора: "net_cse_alife_creature_actor" для ТЧ и "net_se_actor" для ЧН/ЗП. И если с первым классом всё, в принципе, понятно, то, как я обнаружил года полтора назад, для класса "net_se_actor" прописан конструктор от первого класса, "net_cse_alife_creature_actor". Насколько это правомерно с точки зрения языка Lua - сказать не могу, тут нужна помощь специалистов. Собственно, из-за неуверенности и невозможности в то время всё проверить я и не стал ничего править в модуле самостоятельно, хотя стоило, наверное, задать вопрос здесь. @Graff46, по конкретному наполнению нет-пакета актора и смещениям не подскажу - нет сейчас возможности порыться в коде. Но если моё предположение верное, и единственное, почему модуль валится - неверный конструктор, тогда стоит попробовать это исправить и посмотреть, что будет. Ведь что даёт запись двух одинаковых функций "function net_cse_alife_creature_actor:__init(...)" подряд? А то, что первая перезатирается второй, и при инициализации класса для ТЧ начинает вызываться конструктор для ЧН/ЗП. Update: Цитата game_death_time: table: 14A05EA8 -- Тут вроде сбилось? Нет, тут CTime в виде таблицы, всё правильно. А вот дальше должны быть update-свойства, разве нет? Не помню. (вспомнил: конечно не должны. тут только state-часть) Изменено 7 Января 2019 пользователем Kirgudu Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 7 Января 2019 Хм, ну ты ж не написал, что у тебя вылет не при чтении пакета, а при записи в лог. Я тут, кстати, скачал m_netpk и посмотрел код. Обрати внимание, как читаются свойства в классе "net_cse_ph_skeleton": for _,prop in ipairs(self.st_props) do ret[prop.name] = this["_r_"..prop.type](pk) end --/ hooks 'bones' if bit_and(ret.skeleton_flags, 4) ~= 0 then --/ check 'skeleton' ... Сначала из первой группы свойств, а затем, на основании флагов, из второй и третьей. Ты же в своей переработке все свойства читаешь всегда. Не приведёт ли это к ошибке в один прекрасный момент? Я б всё-таки попробовал исправить конструктор класса для ЧН/ЗП и проверить чтение нет-пакета актора самим модулем... Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 7 Января 2019 (изменено) Цитата Ну не знаю, у меня заполнение вроде верное Потому что соотв. флаг присутствует. Может ли он отсутствовать - понятия не имею, никогда этим не интересовался. Но потенциально твой код допускает ошибку (если, конечно, считать, что код Артоса верен). Ладно, дальше сам, мне тут сложно теоретизировать без игры. Изменено 7 Января 2019 пользователем Kirgudu Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 11 Апреля 2019 @Norman Eisenherz, у тебя id заспавненных предметов есть уже сразу после спавна. Зачем корячить ещё и какой-то поиск по десяткам тысяч объектов? local spawn1 = alife():create( "box_ex", vector():set( (act_pos.x + 1), (act_pos.y), (act_pos.z) ), act:level_vertex_id(), act:game_vertex_id() ) local spawn2 = alife():create( "box_eq", vector():set( (act_pos.x), (act_pos.y), (act_pos.z + 1) ), act:level_vertex_id(), act:game_vertex_id() ) local box_1_id = spawn1.id local box_2_id = spawn2.id Возможно, требуется сделать что-то другое, кроме как получить id предметов (например: заспавнить 2 предмета, дождаться выхода в онлайн обоих, после чего что-то сделать с их клиентскими объектами), но тогда опиши человеческим языком, что именно. Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 11 Апреля 2019 (изменено) @Norman Eisenherz, разных способов можно придумать. Например: Скрытый текст local spawned = {} function spawn() local act = db.actor local item = { "bandage", "medkit" } for _,v in ipairs(item) do local spawn = alife():create(v, act:position(), act:level_vertex_id(), act:game_vertex_id()) table.insert(spawned, {id = spawn.id, obj = spawn}) level.client_spawn_manager():add(spawn.id, -1, test_msg) end end function test_msg(id, obj) if #spawned == 2 then for _,v in ipairs(spawned) do news_manager.send_tip(db.actor, "obj_section: " .. v.obj:section() .. ", v.id: " .. v.id) end end end Кроме того, существует перегрузка метода: level.client_spawn_manager ():add(spawn.id, -1, spawn_callback, arg) где arg - дополнительный аргумент, в который можно передать что угодно, в том числе произвольную таблицу, как совершенно справедливо заметил @AndreySol. Тогда колбэк будет выглядеть так: function spawn_callback(arg, id, obj) -- переданный дополнительный аргумент идёт первым end Изменено 11 Апреля 2019 пользователем Kirgudu 1 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 314 Опубликовано 10 Июля 2019 (изменено) local timer, delta = 0, 10000 local function check_and_execute() if timer < time_global() then timer = time_global() + delta return action_func() end return false end function action_func() -- что-то делаем -- при необходимости прервать цикл добавляем: -- return true end -- запуск level.add_call(check_and_execute, function() end) Изменено 11 Июля 2019 пользователем Kirgudu Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Поделиться этим сообщением Ссылка на сообщение