Перейти к контенту

Рекомендуемые сообщения

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

  Информация (Показать)

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

  Читать рекомендуется. (Показать)

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий

Ужасно. Неизвестно что делается неизвестно когда с неизвестно чем.

 

Ну и что хотим получить в результате ?

Еще раз подумать над вот этим вот вопросом, а потом уже думать, как это сделать.

 

Очевидно, что "есть" ничего не надо совсем. Ну и темку про использование предметов почитать.

  • Согласен 1
Ссылка на комментарий
  Dennis_Chikin писал(а):

Ужасно. Неизвестно что делается неизвестно когда с неизвестно чем.

Вот переделал все для демонстрации бага на стандартных вещах и без "лишних" функций.

Вызов бага показан в функции test_bug.Остальное привел для полноты данных.

  код (Показать)
Ссылка на комментарий

эта функция alife():release() не удалит клиентский предмет сразу, вызывая actor:object("conserva") второй раз ты получаешь тот же самый предмет и пытаешься его удалить ещё раз. Т.е. тебе нужно пройтись по предметам инвентаря, и удалить "conserva" именно в цикле

Ссылка на комментарий

@antihumanist, Вот простой тест

                      local id = i[1]
                        local s = alife():object(id)
                        alife():release(s, true)
                        local o = level.object_by_id(id)
                        if o then
                            inv_system.game_message("exist")
                        else
                            inv_system.game_message("not exist")
                        end

И знаете какое сообщение выводится? :) "exist".

alife():release() вообще с клиентским объектом ничего не делает, ни сразу ни потом. Она удаляет СЕРВЕРНЫЙ объект. И да, делает это именно сразу. А уже по факту удаления серверного, движок делает так чтобы и клиентский исчез, но произойдет это через некоторое время.

а db.actor:object() возвращает клиентский объект. и если вы удалили его серверный аналог, клиентский - в ЭТОТ ЖЕ момент - еще продолжает существовать, вот вам и выдается тот же, который вы пытаетесь удалить повторно.

 

Вообще удобно бывает держать под рукой сформированную таблицу предметов в инвентаре, содержащую среди прочего их id.

Изменено пользователем 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.

Ссылка на комментарий
  Shredder писал(а):

вызывая actor:object("conserva") второй раз ты получаешь тот же самый предмет

Хуже того, вызывая actor:object() мы получаем какой попало предмет. В зависимости от текущей погоды на марсе (ага, у нас там наверняка еще всякие "перепаковщики", "удалялщики артефактов" и еще черт знает какая ересь, неизвестно что, как и когда делающая).

  Zander_driver писал(а):

Вообще удобно бывает держать под рукой сформированную таблицу предметов в инвентаре, содержащую среди прочего их id.

Угум. Менеджер инвентаря, через который (и только через него) делается ВСЕ.

Ссылка на комментарий

Приветствую. Подскажите по скрипту. Дело такое: создал в спавне level_changer и хочу до определённого момента его удалить. Написал такую функцию:

  Показать

Вроде всё работает, переход удаляется. Когда нужно вернуть переход, пытаюсь восстановить его через alife():create, но никак не выходит (либо вылет, либо переход не появляется). Подскажите, как правильно прописать alife():create( , чтоб работало как надо?
 

Ссылка на комментарий

Насчёт синтаксиса логики - скоро выложу правленные функции parse_condlist и parse_infop, которые позволят писать вот так

{+infop1 =func1} {+infop2 =func2} section1 %+infop3%

Это будет восприниматься как если бы вы написали

{+infop1 =func1} section1 %+infop3%, {+infop2 =func2} section1 %+infop3%

Дополнительно к этому попробую сделать выявление одинаковых и взаимоисключающих условий, а также предотвратить повторный вызов функций в таких ситуациях:

{=gulag_inactive(esc_lager)} section1, {!gulag_inactive(esc_lager) +esc_infop1} section2
Изменено пользователем Полтергейст
Ссылка на комментарий

@Grif_on, Чтобы заспавнить правильно левел ченджер нужно использовать net-packet, иначе ничего не получится.

А действительно ли нужно его удалять? Его же можно просто дизаблить

  • Спасибо 1
  • Согласен 1
Ссылка на комментарий

 

 

  Shredder писал(а):
Чтобы заспавнить правильно левел ченджер нужно использовать net-packet

@Grif_on, спавн LC через скрипт:

 

  Показать

 

  • Спасибо 1

Ранее был известен под ником BoBaH_671.

Ссылка на комментарий
  Полтергейст писал(а):

{+infop1 =func1} {+infop2 =func2} section1 %+infop3%

Так почему бы сразу не сделать уже function = condition и section = condition ?

Или вообще

[section]

condition1 =

condition2 =

...

action1 =

action2 =

...

Ссылка на комментарий

Dennis_Chikin

  Цитата

Так почему бы сразу не сделать уже function = condition и section = condition ?

Или вообще

Во-первых - надо оставлять совместимость. Никто не будет переписывать всё ранее наработанное только потому, что какой-то другой синтаксис лучше. Во-вторых, если так сделать, тогда будет дублирование условий. Оно и в существующем варианте есть (это то, от чего я в своём варианте избавляюсь), но так его ещё больше будет. Теперь надо будет условия писать для КАЖДОГО action отдельно, и конструкция {+info} section2 %=action4 +info2% разрастётся до

[section1]
section2 = info
action4 = info
info2 = info
и это ещё один из самых "безобидных" примеров.

В-третьих, синтаксис самих ini-файлов (деление на секции и строки) накладывает свои ограничения. Чем компактнее запись, и чем лучше она умещается в одну строку без дублирования - тем лучше.

Изменено пользователем Полтергейст
  • Нравится 1
Ссылка на комментарий

В дублирование нет ничего плохого. Зато есть четкая форма записи: условие, секция, действие.

Сейчас у тебя будет несколько условий - придется разбирать ДНФ или строить ее при написании.

От дублирования условий всегда можно избавиться написав функцию, в которой проверить инфопорции, другие функции как только захочешь.

 

{=gulag_inactive(esc_lager)} section1, {!gulag_inactive(esc_lager) +esc_infop1} section2
Конкретно здесь вторая проверка !gulag_inactive лишняя - она точно истина, иначе ушли бы на секцию section1
  • Согласен 1
Ссылка на комментарий

abramcumner

  Цитата

В дублирование нет ничего плохого. Зато есть четкая форма записи: условие, секция, действие.

В чём выражается "нечёткость" однострочной формы записи? Это обычное if-then-elseif-else, просто записанное с использованием спец. символов - скобок, процентов, двоеточий и +-=. То, что реализация её разбора кривовата - это уже проблемы этой реализации, а не самой формы записи. И кстати, если писать всё в виде action1 = condition1 - всё равно спецсимволы никуда не денутся. Может их будет чуть меньше, но не намного.
  Цитата

От дублирования условий всегда можно избавиться написав функцию, в которой проверить инфопорции

Ну и что, не одно - так другое. Намного проще избавиться от дублирования, один раз подправив реализацию разбора condlist'ов, чем по сто раз писать костыли, которые будут обходить её недостатки.

 

  Цитата

Конкретно здесь вторая проверка !gulag_inactive лишняя - она точно истина, иначе ушли бы на секцию section1

Ну тогда так:

{=gulag_inactive(esc_lager) -esc_infop1} section1, {=gulag_inactive(esc_lager) +esc_infop1} section2
Изменено пользователем Полтергейст
Ссылка на комментарий
  Полтергейст писал(а):
В чём выражается "нечёткость"

Вот это стремно выглядит...

{+infop1 =func1} {+infop2 =func2}

Так и хочется подумать - а чего тут не хватает?

Изменено пользователем _Val_
  • Согласен 1
Ссылка на комментарий

Как программисту мне твоё нововведение нравится: условия в фигурных скобочках объединяются по "and", фигурные скобочки между собой по "or". Правильно я понял?

 

Как пользователю, который пишет и читает логику, не нравится.

Нечеткость не однострочной формы, а то что фигурных скобочек станет несколько - непонятно, то ли пропустили секцию, то ли так и хотели.

Разбирать условия станет сложнее.

 

С условиями в логике есть вполне определенные сложности. Как доказательство подойдет то, что ты не "упростил" gulag_inactive.

Исходный пример:

{=gulag_inactive(esc_lager)} section1, {!gulag_inactive(esc_lager) +esc_infop1} section2
Программистский вариант:

{=gulag_inactive(esc_lager)} section1, {+esc_infop1} section2
человеческий(мне программисткий ближе :) ) вариант:

{=gulag_inactive(esc_lager)} section1, {=gulag_active(esc_lager) +esc_infop1} section2
или так:

{!gulag_active(esc_lager)} section1, {=gulag_active(esc_lager) +esc_infop1} section2
Убрать двойное отрицание, чтобы мозг не ломать на пустом месте и в каждом переключении указывать полные условия.

 

С предотвращением повторного вызова полностью согласен. Вроде не сложно делается - завести таблицу {[токен] = |ложь, истина, нил|}

За значением токена лезть в таблицу, если "нил" - вычислить.

Изменено пользователем abramcumner
Ссылка на комментарий

Программистский вариант - неправильный по сути, ибо в обоих случаях должно проверяться gulag_active(esc_lager), а у тебя переход во вторую секцию чисто по поршню.

Ссылка на комментарий

@_Val_, это не так, поскольку при оригинальном разборе проверка второго условия происходит только если первое не сработало. А значит, неявным образом учитывается результат проверки первого условия. 

 

  abramcumner писал(а):

Как программисту мне твоё нововведение нравится: условия в фигурных скобочках объединяются по "and", фигурные скобочки между собой по "or". Правильно я понял? Как пользователю, который пишет и читает логику, не нравится. Нечеткость не однострочной формы, а то что фигурных скобочек станет несколько - непонятно, то ли пропустили секцию, то ли так и хотели.

Можно для «or» использовать не пробел, а ввести дополнительный разделитель (чтобы было проще читать - вообще неиспользуемый в логике в настоящее время символ, можно с опциональными пробелами вокруг него), который однозначно будет указывать на новый тип конструкции.

Те пользователи, которые привыкли писать по-старому и не хотят разбираться с новыми возможностями (как вариант - вообще не в курсе этих возможностей), так и продолжат писать по-старому. А кто захочет - будет использовать, наперёд зная, что означает данное написание.

Изменено пользователем Kirgudu
  • Согласен 2

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

Ссылка на комментарий
@_Val_, нет. Сначала проверяется первое условие: неактивный гулаг. Если он неактивен уходим на секцию1. Если активен, проверяем дальше. Соответственно проверять второй раз активность смысла нет - он же точно активен.
Ссылка на комментарий

abramcumner

  Цитата

Правильно я понял?

Да.

 

  Цитата

Нечеткость не однострочной формы, а то что фигурных скобочек станет несколько - непонятно, то ли пропустили секцию, то ли так и хотели. Разбирать условия станет сложнее.

Оно-то так, только сделать с этим вряд ли что-то можно. Оставлять как есть - значит дублировать условия или писать костыли. Менять на мой вариант - не всем понятно будет. Делать что-то совсем иное - будет проблемы с совместимостью. Остаётся только вводить новые спецсимволы для группировки действий, но почти все и так уже заняты, а именно ({},@%=!~:|). Можно попробовать ввести #, $, *, & или ?. & и * по понятным причинам лучше не использовать. Из оставшихся больше подходит ?.

 

Вот как-то так это будет выглядеть:

  Цитата

{+info1} ? {+info2} section_new

Но опять же, может быть что-то непонятно тем, кто пишет логику - новый вариант будет непривычен, а также начнутся проблемы с копипастой новых конструкций в моды со старыми скриптами.

Изменено пользователем Полтергейст
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...