Чувак на болоте прописать надо по типу других террейнов. И лог приложил бы. За ссылку спасибо, надеюсь это не то что я уже качал.
Artos, singapur22 дело таки в иной мистике. Облазил каждый конфиг оружия и проверил на наличие хоть одного слова knife в конфиге - не нашел. Облазил все итемсы и прочее - не нашел.... Я даже не знаю что и делать. Даже когда нету конфига и ОГФ модели вылет, вылет, вылет...
singapur22
Есть схем/алгоритмов, которые проверяют/перебирают предметы в рюкзаке актора.
Примеры возможных коллизий:
а) ограничитель веса/объема рюкзака - если вес/объем не задан и неизвестному весу/объему не проставлен дефолтный - вылет;
б) схема определяет кол-во предметов у актора и это кол-во используется для чего-то. Т.к. сепаратор по сути фейк - возможны фатальные последствия как от фейк-предмета (вспомним фейковые гранаты ...), так и от несовпадения кол-ва реальных предметов и общего кол-ва.
Собственно конфигом сепаратора можно попытаться нивелировать всевозможные коллизии, но ... моды развиваются и всех вариантов коллизий предусмотреть 'на будущее' - проблематично. Это и имел ввиду, т.е. необходимость проверять потребность исключений сепаратора их других схем/алгоритмов.
Artos А как ты собираешься возвращать сепаратор обратно в инвентарь? Чё за метод? Я такого не нашол. Правда можно через transfer_item, привязать к какому нить инвентарному ящику и трансферить в него и обратно. Только тогда понадобятся ящики на каждой локации ( с этим проблем нет), и производить проверку на локу и выдавать коду соответствующий ей ящик. А это уже усложняет код.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
АнархОПанк
Если игра ругается фатальным логом на отсутствие некой секции - то эта секция прописана где-то в кодах. То, что ты не можешь ее найти говорит только о том, что навыки поиска у тебя пока еще недостаточны. Помочь тебе виртуально в поисках не представляется возможным. Ищи и устраняй ошибку или ... сноси геймдату.
singapur22
При перемещении имел ввиду именно трансфер (transfer_item), хотя и недоделал этот вариант из-за неких глюков с определением parent_id ... Порой ящик не признавал себя 'родителем' ...
Ну насчет 'ящика на локации' - для меня нет проблемы в 'усложнении' кода. Т.к. в Симбионе используется менеджер оружия, да и во многих других модах использованы различные аналогичные схемы, то фейковый ящик на локации всегда имеется. Его то и можно использовать для сепаратора (да и для других целей!).
Если же просто дропить - то достаточно запоминать идентификатор объекта (если потребуется). Но ... и этого вроде как не потребуется, т.к дроп-тэйк идет 'за раз' с одним и тем же предметом.
singapur22
Посмотрев симбионовский вариант пояса и вспомнив свои ковыряния, вспомнились и мысли об оптимизации:
- проверять жив ли актр необязательно. Пояс и у мертвого актора имеется ... Т.о. эта проверка на апдейле из бинда актора излишня.
- собственно постоянный апдейт из бинда актора излишен. Ведь состав предметов на поясе у актора изменяется только при а) дропе (потеря предмета), б) тэйке(приобретении предмета) и в) при ручных перемещениях в открытых окнах инвентаря (трансфер).
Т.о. если по факту этих событий (дроп/тэйк/транчфер) перепроверять состав пояса - то до следующего события (дроп/тэйк/транчфер) периодический апдейт не имеет смысла. В симбионовсков варианте колбэк на апдейт отрегистрируется при его ненадобности, разгружая ресурсы. Собственно и апдейт-то не требуется, а требуется двух-тактный обработчик а) помещение сепаратора на пояс и б) идентификация пояса/предметов.
Прим: Как то не дошли руки, но есть подозрения что признак/метка 'поясного' должна быть у предмета (например в object_flags). Врядли разрабы это записывают в сторадж актору.
Artos
Не знал что код "сепаратора" есть в симбионе :-G (все никак руки не доходят скачать обновленную версию симбы)
---------------------
Вот такой вопрос есть - есть в нижеприведенном коде какой то фатальный изъян приводящий именно к тому глюку к
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
Artos Хм. И действительно, ведь в любом случае, пока инвентарь не будет закрыт, итерация не производится. Как и взятие с дропом работают от внешних источников. Я поработаю над этим.
Как то не дошли руки, но есть подозрения что признак/метка 'поясного' должна быть у предмета (например в object_flags). Врядли разрабы это записывают в сторадж актору.
Ты думаешь, что за столько лет этого так никто и не проверил?
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
Тут время - не показатель. Многие вещи зашорены и модмейкерам иль лень или недосуг ... Например, я это хотел перепроверить еще полгодика назад ...
Тут же вопрос из этой же 'зашоренной' серии: Чем КПК актора отличается от других?
Информация к размышлению: Секции предмета "КПК Меченый" нет в игре, но если КПК выкинуть (искусственно), то кроме надписи - все остальное как у стандартного КПК.
Для чего может быть использовано: При отсутствии своего КПК у актора - на миникартах исчезают метки враг/друг/нейтрал/труп. Можно управлять 'ослеплением' ГГ, а не тупо 'затирать' метки в конфигах.
Прим: Есть подозрение, что метка принадлежности ГГ хранится в object_flags КПК или аналогичном параметре.
Artos вылеты прошли когда я снес все конфиги и ОГФ модели от реаниматион прожект. Поствил арсенал мод (заменил только станд. модели) и вылеты начались опять.
erlik
По твоему куску кода сложновато оценивать его недостатки. Многие переменные 'из вне', что-то не ясно или может трактоваться двояко ...
Не ясно, например, почему нет выхода из цикла после 'Mina = true', что приводит к естественному 'Mina = false' по окончании цикла и выходе из приведенного куска кода.
Да и собственно 'if sItem ~= "mina" or (sItem == "mina" and not Mina) then' - нечто ведомое только тебе. Какое-то рандомное наполнение ящика по каким-то коэф-там ...
Собственно неясен и твой вопрос, в чем же заключаются твои начинающиеся непонятки? АнархОПанк
Мне, как думаю и остальным, как то все равно что ты там к себе копируешь/удаляешь, после чего имеешь проблемы.
Тебе ясно сказано:
Если игра ругается фатальным логом на отсутствие некой секции - то эта секция прописана где-то в кодах.
И если ты опять наступаешь на те же грабли, копируя себе куски чьих-то кодов - то НЕ найдя причины, т.е. некорректной секции/порядка чтения, ты будешь получать эти шишки. Или не занимайся тупым копированием или ищи причину. От того, что ты сюда будешь постить о своих шишках, твоя проблема сама не исправится. А просматривать твои соляношные коды и искать твою проблему никто не в состоянии, да и врядли захочет ...
Artos Мда. С трансфером оказалась плохая идея. Я почемуто думал, что инвентори боксы не относятся к алайфу. Оказалось всё иначе. Они как и другие при отдалении на расстояние алайфа переходят в оффлайн. А так как метод трансфера позволяет юзать только клиентские объекты, то и использование его в данном случае весьма затруднительно. Так что, лучше оставить как есть (спавн/удаление). Собсно, если убрать итератор с апдейта, и юзать его только в соответствующих случаях, то это будет уже не такая уж и проблема.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
Artos
Выхода из цикла нет потому, что прерывать цикл только из-за того что в ящик уже заспавнилась мина я не планировал - он прерывается естественным путем - когда закончится лимит итераций для счетчика for. А лимит итераций определяет рандом.
Условие if sItem ~= "mina" or (sItem == "mina" and not Mina) then такое по смыслу -
если предмет не мина то спавним обязательно. Если мина - то только в том случае если еще не спавнили - определяем это по значению флага Mina . Иначе - ничего не делаем.
Вот это все я и объединил в этом кусочке - проверял это условие в SCITE - вроде как он вполне рабочее.
На входе функция имеет такие аргументы function get_random_spawn(box, obj_name, lname, pos, lvid, gvid, coef)
юзердата ящика, имя владельца, имя уровня, позиция ящика, вертексы ящика, коэффициент (прибавляется к цифирьке num считанной из ини файла с со списком хабара и коэффициентами вероятности - например
num=0.5
coef = 0.1 - берется из таблицы
в итоге = 0.6
-------------------
Глюки - айди ящиков в которые спавнятся мины в некоторых случаях в таблице отсутствуют - проверял в том числе и выводом значений таблицы прямо перед юзом ящика - в ящике мина однако в таблице нет поля с айди этого ящика.
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
singapur22
ИМХО, что то тут не так.
Не задумывался как то о зависимости инвентори-боксов от алайфа (посмотрю) но то, что именно фейковый инвентори-бокс, ипользующийся для временного помещения в него оружия от всех неписей на локации, нормально работает - говорит том, что его можно использовать и для сепаратора.
Собственно фейковый инфентори-бокс спавнится один раз на локации. Где бы ГГ ни был в каком краю локации, все неписи, переходя конечно в он-лайн начинают подбирать себе подходящее оружие, отправляя излишки в фейк-ящик. Если бы он был зависим от алайфа - трансфер оружия приводил бы к неизбежным проблемам/вылетам.
В качестве сепаратора можно выбрать не "посторонний", а какой-нибудь из уже имеющихся у ГГ предметов, может в этом случае что-нибудь измениться в более конструктивную сторону?
И про "не очевидности" или как говорил Artos "варианты коллизий" - например, есть мод в котором "рюкзака" нет совсем, всё в(на) "поясе".
У меня то-же есть (давняя) проблема с поясом и инвентарём. Может поможете раз**50016ea8aab1bb10eeba**e = ctime
elseif time < ctime then
time = ctime + 3000
actor:inventory_for_each(del_separator)
separator_spawned = false
end
end
-- Перебор предметов инвентаря
function scan_inv(item)
local sect = item:section()
if sect == "separator" then
flag = 1
return
end
if flag == 1 then
if string.find(sect, "af_") then
insert_to_table(belt, sect)
end
end
end
-- Добавление в таблицу
function insert_to_table(tbl, sect)
if tbl[sect] == nil then
tbl[sect] = 1
else
tbl[sect] = tbl[sect] + 1
end
end
-- Удаление разделяющего предмета
function del_separator(item)
if item:section() == "separator" then
sim:release(sim:object(item:id()), true)
--dbglog("РАЗДЕЛИТЕЛЬ удалён")
end
end
-- Определение наличия предмета в одном из слотов
function slot_item(item)
for i=0, 12 do
local obj = actor:item_in_slot(i)
if obj and item:id() == obj:id() then
return i
end
end
return nil
end
-- Поднятие предмета
function on_item_take(item)
if item:section() == "separator" then return end
if (separator_spawned == true) then
actor:inventory_for_each(del_separator)
separator_spawned = false
end
--dbglog("Получен предмет [%s]", item:section())
end
-- Выброс предмета
function on_item_drop(item)
if item:section() == "separator" then return end
if (separator_spawned == true) then
actor:inventory_for_each(del_separator)
separator_spawned = false
end
--dbglog("Предмет [%s] выброшен/удалён/съеден", item:section())
end
[/code]
отредактировал(а) MRN$: 20-08-2010 20:08 GMT3 час. всё легко
erlik
Вот э**50016ea8aab1bb10eeba**/code] внушает подозрение на твои проблемы. Два аргумента в таблицу не вставляется 'за раз', хотя по стандартам LUA (массив, подмассив, значение) такая запись корректна. Но(!) не забываем, что в Сталкере свой интерпретатор.
Или ты спавнишь еще где-то в ящики или эта строка приводит к нефатальному прерыванию потока ...
Попробуй иначе, т.е. более 'штатно' типа: table.insert(mines[box.id], sobj.id)
MRN$
В свое время прорабатывал вариант реального предмета в качестве сепаратора, но ...
- при старте новой игры на поясе у ГГ ничего нет, а в слотах как минимум детектор, фонарь, ...
- не так много в игре предметов, которые могут помещаться на пояс. Обязательность наличия такого предмета у ГГ далека от '100% в любой ситуации'. Назови варианты для сепаратора, плз, подумаем.
Из твоего вопроса не ясно понятие 'фокуса' и соответственно его потеря. Собственно и вопрос то вероятно отпадет, если ты прочтешь уже сказанное: "Обновления/итерация по поясу при открытых окнах инвентаря НЕ должна производится".
Сорри, не люблю подобные вопросы обсуждать в ПМ, если на то нет причин. Ведь все что тут говорится/обсуждается может быть полезным не только 'болтающим'.
Artos В том то и дело. Спавню ящик за локацией (на значи**50016ea8aab1bb10eeba**n
get_console:execute(tostring(box))
return
end[/code]
Консоль заполняется постоянно выводимой nil.
Это говорит о том, что объект с данным айди находится в offline
Проверяю так. Меняю координаты спавна за локой, на координаты актора, и бокс начинает юзаться кодом.
----------------------------------------
Исправил скрипт пояса у себя в журнале. Теперь итерация юзается только в соответствующих случаях.
Итерацию за три цикла оставил.
отредактировал(а) singapur22: 20-08-2010 20:26 GMT3 час. Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
blackraven6
я не говорю что нету там просто спаун зомби а контролер это другое дело
Horrible area modВидео в журнале
--------------------------------------------------------------------
Важнейшая задача цивилизации - научить человека мыслить
singapur22
Хм, странности :-)
Когда-то я фейк-ящик спавнил обычным порядком и 'прятал' где-нить чтобы игроку не попадался ... Но все же изредка 'старрый' ящик кто-то находил.
После этого я его стал спанить в 'воздухе' (300 м) и подвешивать ... Но после сэйв-лоада ящик все одно падал на землю.
Сейчас использован обычный АМК-рюкзачок в качестве неюзаемого инвентори-бокса.
Во всех вариациях проблем пропадания фейк-бокса в офф-лайне не обнаруживалось ни разу хотя ГГ бегает по всей территории локаций, что неизбежно приволило бы к попаданию фейк-ящика за пределы алайфа.
Возможно первичный спавн далеко от ГГ не приводит к net_spawn'у ящика, пока ящик не окажется в пределах алайфа ... Нужно 'посмотреть' ... MRN$
Довольно неоптимальный поясной-код ... Ну да это на 'вкус и цвет'
Насчет 'фокуса':
Я у себя отказался от сканирования пояса именно по причине потери фокуса и перемещении предметов по ячейкам. Неудобно, когда торгуешь и при освобождении ячейки все остальные предметы перемещаются в рюкзаке. Избежать этого неудастся, т.к. предметы в рбкзаке (включая пояс и слоты) занимают свои места по индексам появления в инвентори. Если некий предмет исчез - освободился индекс и любая итерация изменит расположения предметов, заполняя освободившийся индекс/ячейку.
Собственно если нет причины сканировать пояс при открытых окнах инвентаря - прекращать сканирование и фокус не будет теряться.
ребят, можно вопрос, как во время игры убрать заспавненный объект?, например переход между локациями, или непися или еще что либо. Подскажите пожалуйста.
singapur22
Прочитал статью по поясу. ИМХО, стОит немного уточнить некоторые неявные моменты:
- т.к. имеется два варианта итерации по инвентори актора, то обратить внимание читателей именно на 'inventory_for_each', т.к. именно этот метод имеет порядок сканирования от рюкзака к слотам, в отличии от обычно употребляемого 'iterate_inventory'.
- при добавлении предмета в рюкзак (не в слот и не на пояс, есть и такие), добавляемый предмет получает последний индекс в рюкзаке, а итерация по рюкзаку начинается от первого 'в рюкзак попавшего'. Т.о. при сканировании вновь добавленный предмет оказыается последним в рюкзаке и первым перед предметами на поясе/в слотах, что и дает возможность отделить 'по сепаратору' предметы на поясе от 'рюкзачных'.
Mehanik Yar
Получить любым способом серверную изердату объекта, который требуется удалить, и удалить этот объект стандартным 'reliase'.
Вариантов получения серверного объекта (юзердаты) множество. По игровому идентификатору (ID), по Story_Id, по его имени ...
Artos
Спасибо за совет - все оказалось действительно так.
Метод table.insert() с тремя аргументами - таблица, позиция, значение - работает в сталкере некорректно. (с двумя - таблица, значение - глюков вроде не замечал.)
Зато mines[box.id] = sobj.id действует безуп**50016ea8aab1bb10eeba**
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
#Artos :
Вот э**50016ea8aab1bb10eeba**/code] внушает подозрение на твои проблемы. Два аргумента в таблицу не вставляется 'за раз'
Тут не может быть никаких двояких понимай :
table.insert (table, [pos,] value)
Вставляет элемент value в позицию pos в table, сдвигая вверх остальные элементы. Значение по умолчанию для pos равно n+1, где n это длина таблицы (см. §2.5.5), таким образом вызов table.insert(t,x) добавляет x в конец таблицы t.
Gun12
А ты проверь на сталке - и увидишь вопиющую разницу. С вариантом, где три аргумента - ведь по стандарту - table.insert (table, pos, value) где pos - указанная пользователем позиция вставки, - равнозначно table[pos] = value
Однако в реальном применении в скриптах сталкера все оказывается не таким стандартным. Увы.
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
Gun12
Ни о какий двояких пониманиях нет и речи. Речь о том, что классический LUA и его интерпретатор в Сталкере могут/имеют различия в реализации тех или иных методов. Мы уже не раз на это обращали внимание (вспомним хотя бы arg.n).
Т.о. для себя я уже вывел пару правил:
- если нет необходимости/целесообразности применять 'нештатные' для игры методы, стОит использовать те, что имеются в игре.
- если в игре появились проблемы/неясности от использования вроде бы стандартного для LUA метода, стОит испоьзовать тот вариант, который проверен кодами игры, т.е. использован разработчиками.
P.S. Собственно и даже стандартyая трактовка в данном случае все же НЕоднозначна!
table.insert(mines, box.id, sobj.id) - тут box.id НЕ индекс позиции, а значение, которое в свою очередь является субтаблицей, к воторую и заносится новое значение 'sobj.id'.
Т.о. в данной конкретной записи собственно и нет индекса/позиции по которому должна быть выполнена вставка, а задано значение/ключ субтаблицы, в которую должно быть выволнено добавление значения.
erlik
То, что метод 'table.remove()' работает некорректно НЕ замечал. Однако его использование должно быть аккуратным. Если подобным методом удалять строки массива 'на проходе' в цикле - то запросто можно получать некорректные варианты.
Как правило, я стараюсь или занилять позиции/строки, подчищая их потом, либо запоминая позиции, удалять их по выходе из циклов.
Artos
У меня цикла там нет. Как правило я тоже пользуюсь заниливанием - так как работает опять же всегда адекватно.
Кстати, если по доументации lua table.remove(t) - по умолчанию аргумента pos удаляет последний элемент таблицы, то почему разрабы для того же самого действия писали так
table.remove (t, table.getn (t)) ? Странные люди однако ...:-)
добавлено спустя 1 минуту
table.insert(mines, box.id, sobj.id) - тут box.id НЕ индекс позиции, а значение, которое в свою очередь является субтаблицей,
Вот тут ты не прав. Субтаблица будет только если сделать так
mines[box.id] ={}
table.insert(mines[box.id], sobj.id)
отредактировал(а) erlik: 20-08-2010 21:55 GMT3 час. Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
Artos
Ну дак я и проверяю if sItem == "mina" and not mines[box.id] then
если итемс равен "мина" и в таблице mines нет поля с индексом box.id (стандартный способ проверки), тогда в это поле записать айди - дабы не было перезаписи в одно и тоже поле. Но значение этого поля нигде не объявлено как таблица. Значение просто number.
Так что это
именно является проверкой на отсутствие мины в подмассиве (субтаблица mines[box.id]) конкретного ящика (с box.id) и (попыткой) добавление в этот подмассив общего массива mines нужного идентификатора мины.
ошибочная интерпретация. :-)
--------------------------------------------------------------------------------------------------------------
Кстати - а ящики у меня сами по себе в воздухе зависают при переспавне - без всяких перезаписей нетпакета.
отредактировал(а) erlik: 20-08-2010 22:20 GMT3 час. Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
Artos Лады. Сделаю уточнения.
И на счёт offline инвентори_бокса. Проверил более тесно. Привязка к алайфу подтверждается. Собсно я решил эту проблему. Достаточно задать ему постоянное нахождение в онлайн сразу после спавна:
Эта тема закрыта, публикация новых сообщений недоступна.
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.