Malandrinus 615 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 спавн происходит в метре от актора, и сам объект появляется на земле. Надо сразу после создания объекта и до выхода его в онлайн обнулить флаг серверного объекта use_ai_location. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
CRAZY_STALKER666 36 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 (изменено) Спавню НПЦ вот так local obj=alife():create("gar_nano",db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id())local params=netpack_write.read_stalker_params(obj)params.custom="[logic]\ncfg = scripts\\ep\\gar\\gar_nano.ltx"params.sid=30198netpack_write.write_stalker_params(params,obj) Потом пытаюсь удалить(через диалог с другим НПЦ) function del()local sim = alife()local se_obj = sim:story_object(30198)if se_obj thensim:release(se_obj, true)endend Но ничего не происходит... Где я ошибаюсь? P.S Выводил при спавне SID - через новости на ПДА - всё хорошо. При удалении поставил брейкпойнтый вот так local sim = alife()local se_obj = alife():story_object(30198)news_manager.send_tip(db.actor, "stage 1", 0, "default", 10000)if se_obj thennews_manager.send_tip(db.actor, "stage 2", 0, "default", 10000)sim:release(se_obj, true)end Доходит лишь до первого... Изменено 23 Июня 2016 пользователем CRAZY_STALKER666 Не соответствует правилам. Ссылка на комментарий
TIGER_VLAD 361 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 обнулить флаг серверного объекта use_ai_location Вот так пробовал на ТЧ: s_obj= alife():create("energy_drink", pos, db.actor:level_vertex_id(), db.actor:game_vertex_id()) s_obj:use_ai_locations(false) Не получается. Вылетает. Ссылка на комментарий
Malandrinus 615 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 @CRAZY_STALKER666, проблема при назначении SID нетпакетом в том, что он при этом не вписывается в глобальный реестр SIDов и соответственно не будет искаться функциями получения по SID и не будет работать в логике. В XE для прописывания SIDа была специальная функция, которая одновременно с назначением и регистрировала SID в реестре, а на ванильном движке вписанный скриптом SID не заработает до перезагрузки сейва. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
CRAZY_STALKER666 36 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 В XE для прописывания SIDа была специальная функция, которая одновременно с назначением и регистрировала SID в реестре XE - что это такое? И как мне тогда быть? М.б как всегда есть готовые решения? В том те TT2 использовался тот же функционал, что и у меня и не было таких проблем... Не соответствует правилам. Ссылка на комментарий
Malandrinus 615 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 Вот так пробовал на ТЧ: На ТЧ нет функции use_ai_locations для установки, только для получения значения. Надо использовать нетпакеты. XE - что это такое? X-Ray extensions 1 Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Nazgool 250 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 (изменено) @CRAZY_STALKER666, В крайнем случае, если стоит расширение lua, можно и самому организовать свой динамический аналог game_story_ids.И там хранить типа sid-ов объектов.Я так делал когда-то.Если интересно. Изменено 23 Июня 2016 пользователем Nazgool Ссылка на комментарий
CRAZY_STALKER666 36 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 @Nazgool, нет времени изобретать велосипед... Может кому интересно будет, как я разобрался с проблемой, мало ли... Решил так - просто для этого НПЦ спавн идет через all.spawn, там прописал story_id и тогда всё удаляется прекрасно прекрасно... Не соответствует правилам. Ссылка на комментарий
Nazgool 250 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 Этот вариант я тоже тогда рассматривал.Но если ты будешь спавнить что-то через секцию alife():create("any_section", vector():set(... и т.д. и нужно будет это позже удалять.Снова for i=1,65534 ? Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 Если непись и вообще объект онлайновый - только что расписывал в соседней теме, как его получить, скажем, по info. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
CRAZY_STALKER666 36 Опубликовано 24 Июня 2016 Поделиться Опубликовано 24 Июня 2016 @Nazgool, не понял, о чем ты... Вроде проблема исчерпана Не соответствует правилам. Ссылка на комментарий
Nazgool 250 Опубликовано 24 Июня 2016 Поделиться Опубликовано 24 Июня 2016 (изменено) @CRAZY_STALKER666, Если ты будешь спавнить все объекты, которым необходимо назначать sid через all.spawn, то тогда я ни о чем. Я о том что будет, если будешь спавнить что-то по имени секции динамически, т.е. (например) alife():create("stalker", vector():set ... bla-bla И тебе позже нужно будет найти именно этого сталкера из кучи остальных, так же заспавненных. Изменено 24 Июня 2016 пользователем Nazgool Ссылка на комментарий
CRAZY_STALKER666 36 Опубликовано 24 Июня 2016 Поделиться Опубликовано 24 Июня 2016 @Nazgool, Всё, понял. Более не пригодиться задавать sid через скрипт, разве что для рестрикторов, но там проблем таких нету... Добавлено Dennis_Chikin, 24 Июня 2016 Вот именно для рестрикторов sid вообще не нужен. Не соответствует правилам. Ссылка на комментарий
TIGER_VLAD 361 Опубликовано 24 Июня 2016 Поделиться Опубликовано 24 Июня 2016 Всем привет. Такую штуку заметил, напрягать стало: когда ГГ в присяде обыскивает труп, тайник или начинает диалог с НПС, он сам поднимается. Вот на видео видно: . Можно как-то это отключить? А то есть ситуации, где эта фишка очень мешает(например спрятался за что-то, хп на 0, в приседе идешь к трупу, обыскиваешь - а ГГ в этот момент сам встает и открывается для противника получая маслину). Ссылка на комментарий
PTB 8 Опубликовано 24 Июня 2016 Поделиться Опубликовано 24 Июня 2016 @TIGER_VLAD, Честно говоря не знаю но по моему в двиг лезть надо. В жизни много плохих моментов. Пытайся избавляться от них ! Ссылка на комментарий
Nazgool 250 Опубликовано 24 Июня 2016 Поделиться Опубликовано 24 Июня 2016 (изменено) Более не пригодиться задавать sid через скрипт Вот это и плохо. Ты сам себя ограничиваешь в тех возможностях, которые люди придумали спустя много лет использования box-версии. Вот смотри. Что такое назначение sid-а в исходном варианте? В all.spawn-е ты создаешь секцию и прописываешь в ней story_id. Кроме этого тебе нужно зарегистрировать этот sid в game_story_ids.ltx. А что такое этот game_story_ids? Это жестко фиксированное хранилище, основываясь на котором возможен поиск по alife():story_object(sid), и без которого все твои назначенные sid-ы будут до лампочки. Не знаю как это выглядит, но подозреваю что достаточно запутанно и не очень удобно. До настоящего времени люди старались, делали, и как сказал Чебурашка - "строили, строили и наконец построили". Построили так, что можно и обойтись без всего того, что ты делаешь по "старой технологии". Что же есть нового, чтобы больше не смотреть на all.spawn, как на спасательный круг в твоём случае? Как можно назначить sid "не отходя от кассы"? 1. В расширение X-Ray extensions есть метод alife():assign_story_id. 2. Есть универсальные хранилища. By Malandrinus например. 2а. Если всё то что сказано выше сложно, то есть самый простой вариант - расширение lua by RvP, о чем я и хотел тебе сказать несколько постов назад. Так вот о самом простом, последнем варианте ( и втором тоже). Есть стандартное фиксированное хранилище (game_story_ids), а есть возможность сделать такое же, но динамическое хранилище. Теперь подробнее. Например создаем сталкера: local sobj = alife():create("stalker", vector():set ... bla-bla Пока этот сталкер существует, для него остаются неизменными name и id sobj:name() sobj.id Поэтому можно "запоминать" его либо по name, либо по id. Имя для динамически заспавненных объектов составляется из имени секции и его id (Для данного варианта) sobj:name() == 'stalker' .. sobj.id Зачем такая сложность, проще запомнить его id, оно же и так уникально. И вот теперь сама фишка того, что люди и придумали. Ты можешь сохранять id так : 1 (приоритетно) . Используя хранилище Malandrinus-а local sobj = alife():create("stalker", vector():set ... bla-bla ogse_unist.set_value('my_sid_kakoj_to_stalker', sobj.id , "number") 2. Используя только расширение by RvP писать эти id в свой файл посредством библиотеки io. Пишу налету, без всяких там разборок, криво, косо, на эмоциях, но это всё равно должно работать, и для наглядности хватит. В папке gamedata\config создать файл "my_sid.ini" (например) В _g.script добавить my_sid = {} my_sid_path = getFS():update_path("$game_config$", "my_sid.ini") function load_my_sid() local sim = alife() for line in io.lines(my_sid_path) do local k,v = line:match('([%w_]+)=([%w_]+)') v = tonumber(v) if sim:object(v) then -- для очиски от несуществующих на всяк my_sid[k] = v end end end function save_my_sid() local sim = alife() local f = io.open(my_sid_path, 'w') for k, v in pairs(my_sid) do if sim:object(v) then -- для очиски от несуществующих на всяк f:write(k..'='..v..'\n') end end f:flush() f:close() end Для запуска пока достаточно и в bind_stalker.script после function actor_binder:net_spawn(data) пишешь load_my_sid() и после function actor_binder:net_destroy() добавляешь save_my_sid() И наконец само использование где-то в скриптах : local sobj = alife():create("stalker", vector():set ... bla-bla my_sid.my_sid_kakoj_to_stalker = sobj.id Теперь в любой момент, ты можешь не перебирая for i=1,65534 которое может не лагать только на мощных системах, определить id своего объекта сталкера Либо по первому варианту local id_my_stalker = ogse_unist.get_value('my_sid_kakoj_to_stalker' , 0 , "number") Либо по второму local id_my_stalker = my_sid.my_sid_kakoj_to_stalker И найти сам объект local obj = alife():object(id_my_stalker) -- по прочтённому id А теперь удаляй или что ты с ним хочешь сделать. Изменено 24 Июня 2016 пользователем Nazgool 1 3 Ссылка на комментарий
Zander_driver 10 334 Опубликовано 26 Июня 2016 Поделиться Опубликовано 26 Июня 2016 @Nazgool, Фууух. Насилу собрала массив То что зачистили одно поле ещё не значит что буду валить всё то, что так тяжело строила.Ты сам как думаешь, такое поведение - нормально? Все эти своевольности запросто могут не совпадать с замыслом программиста, и быть ему не известны, т.к. не сообщаются очевидно. В итоге код работает не так как хотел программист, что выливается в лишние часы на отладку и выяснение причин. Мракобесие короче. Создавалось чтобы поощрить лень программиста, а я почитав это, дико затосковал по языкам где надо обязательно заранее объявить каждую переменную и указать ее тип... И не дай бог ты указал тип integer и стал туда записывать результат деления - будешь обруган компилятором самыми последними программистскими словами. Настоящее программирование - оно там а Луа это пардон, детский сад, в моем представлении. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
Nazgool 250 Опубликовано 27 Июня 2016 Поделиться Опубликовано 27 Июня 2016 (изменено) @Zander_driver, На самом деле всё не так уж и плохо. Оператор '#' прекрасно работает с "правильными" массивами. Осталось только нам научиться работать с массивами также правильно table.insert и table.remove сделаны специально для этого и должны помочь. А поведение оператора '#' и его будущее в других случаях до сих пор не так однозначно. В PiL3 об этом написано в разделе 3.5. Оператор длины Особенно мне "нравиться" фраза самого автора:"поэтому большую часть времени оператор длины безопасен для использования" Как тебе такое? Изменено 27 Июня 2016 пользователем Nazgool Ссылка на комментарий
Desertir 202 Опубликовано 27 Июня 2016 Поделиться Опубликовано 27 Июня 2016 По идее для этого есть метаметод __len, можно его определить по-своему. Только вот Луа нужна 5.2 ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Nazgool 250 Опубликовано 27 Июня 2016 Поделиться Опубликовано 27 Июня 2016 (изменено) Да, в 5.1 не хватает этого метода. Впрочем можно написать функцию типа : function table.len(t) local n = 0 for _ in ipairs(t) do n = n + 1 end return n end А заодно не хватает __pairs и __ipairs. Да и goto, при аккуратном использовании, помогает крепко сокращать код Изменено 27 Июня 2016 пользователем Nazgool Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти