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

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

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


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

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

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

 

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

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

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


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

Не все таки я не понимаю как это работает может кто-то объяснит.

Вот прописываю вызов только этой функции нахожусь на локации предбанник т.е при старте.

relation_registry.set_community_goodwill ("bandit", "actor", -5000) бандиты
relation_registry.set_community_goodwill ("military", "actor", 0) вояки

Пререхожу на кордон

У меня Бандиты изначально нейтральны становяться  красными

Вояки на кордоне же не меняют ориентации

PS

Хотя _Val_ может быть и прав :) Решил так сам выкручивайся.

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

@Stalkersof, мусорил бы ты "по теме", т.е. в топике по ковыряниям ТЧ... и заглянул бы в топик "Справочник по функциям и классам", дабы не гадать как нужно вызывать ту иль иную функцию.

Для ТЧ пространство 'relation_registry' сильно ограничено и доступно только семейство функций "community_goodwill", которые оперируют именем группировки и идентификатором персоналии, относительно которого и работают. Ну а изменять в игре отношения целых группировок - это тебе не ЧН/ЗП...

И если "изменяешь" что-то, то чтобы говорить об изменениях или их отсутствии - приводят все же нечто, с чем можно сравнивать.

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Спасибо и на этом. Я обратился в тему что бы найти ответ почему и что я сделал не так. Вместо этого получил разные речи и почти ни одного ответа где я допустил ошибку. Хорошо больше не буду здесь писать.

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

@Stalkersof, попробуй вместо 0 указать 1500 или любое положительно число. (5000)

relation_registry.set_community_goodwill ("military", db.actor:id (), 1500) по идее работает прямо на Кордоне.

Скорее всего при 0 у тебя просто не изменяется никак отношение,  и нужно брать число побольше.

Если по умолчанию у тебя отношение со сталкерами -2000, то соответственно и пиши 2000, но это теория.

 

Я не помню точно что там творится с отношением группировок в ТЧ, 

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

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

Изменено пользователем *Shoker*
  • Не нравится 1

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий
  *Shoker* писал(а):
но это теория.

Ни к теории, ни к практике это не имеет никакого отношения! Это пустые погадалки на кофейной гуще.  :crazy: , как будто-то от "перемены мест" изменится сумма...

Не пора ли завязывать с подобными "советами", не имеющими никакого отношения ни к скриптам, ни к программированию?! Почему бы самим "советчикам" не опробовать на своей шкуре, потратив свое время, а не писать в публичный топик, засоряя и топик и мозги...

 

Про формулу уже писалось (тут):

  malandrinus писал(а):

Загляни в этот файл. config/creatures/game_relations.ltx Там в комментах разрабы написали полную формулу и там же все таблички, по которым вычисляются части этой формулы.

Изменено пользователем Artos
  • Нравится 1
  • Не нравится 1

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Здравствуйте, товарищи.

Решил, дабы не забыть, как скрипты пишутся, сделать некролог для Сталкерской сети (как умирает сталкер, высылается сообщение об его смерти):

  Скрипт (Показать)
Изменено пользователем Сталкер Лом

Работы на Artstationhttps://www.artstation.com/artist/stalker_lom

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

@Stalkersof,
Можно. 

Конструкцию вида:

death_komment[math.random(table.getn(death_komment))]

Лучше заменить на:

death_komment[math.random(#death_komment)]

По звуку и иконке посмотри как сделано в news_manager. Там наглядно всё.

  • Нравится 1
Ссылка на комментарий

Real Wolf, Stalkersof, спасибо, конечно, за скрипт (ещё не проверял, но сейчас буду), но я всё же хотел узнать, почему не работал мой вариант - интересна причина, вдруг ещё раз попадётся на чём-то подобном.

P.S. Ваш скрипт так же не выдаёт новости, видимо, дело не в нём...
 

Изменено пользователем Сталкер Лом

Работы на Artstationhttps://www.artstation.com/artist/stalker_lom

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

Если сам скрипт у тебя без ошибок (синтаксических) то на лицо не правильный вызов функции necrolog(victim)

Покажи кусок из xr_motivator где ты её вызываешь.

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий
function motivator_binder:death_callback(victim, who)
-- Туча функций --

	dynamic_news.necrolog(victim)  -- Некролог в общий канал
end

Вот так, в конце функции.

Работы на Artstationhttps://www.artstation.com/artist/stalker_lom

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

Хм, покажи пож-ста всю эту функцию под спойлером, мож где то в ней стоит return из за чего твой код просто не вызывается. 

Изменено пользователем *Shoker*

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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


  Код (Показать)
Изменено пользователем Сталкер Лом

Работы на Artstationhttps://www.artstation.com/artist/stalker_lom

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

Да не, это просто подсветка синтаксиса от другого языка видимо, либо просто глючит.

Из того что могу посоветовать:

1) Все таблицы из necrolog(victim) вынеси за пределы функции (перед ней например, или в начале скрипта), т.к содержимое таблиц у тебя

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

 

2)  

["agroprom"] = "Окрестности НИИ Агропром",
}

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

-- Некролог (На основе работы тов. Weanchester)
function necrolog(victim)
 get_console():execute("kill_msg")
 get_console():execute(victim:name())
 ...

При смерти сталкеров у тебя в консоли должна появляться строка kill_msg и имя погибшего сталкера.

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

if victim and IsStalker(victim) and shans>27 then
     get_console():execute("send_msg")
     db.actor:give_game_news(necrolog_text, "ui_inGame2_Necrolog", math.random(1000,3000), 3000)
  • Нравится 1

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

В общем, решили таки проблему: всё в функции вызывалось, вот только метод db.actor:give_game_news почему-то молчал. Заменил на news_manager.send_tip(db.actor, necrolog_text , math.random(1,4), "necrolog", nil, nil)  и вуаля: частичка сталкера из книг и АМК...

 

2389686.jpg

 

Мораль: "Товарищ, видишь метод news_manager.send_tip используй его!" :)

Спасибо всем.

 

  • Нравится 1

Работы на Artstationhttps://www.artstation.com/artist/stalker_lom

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

Возможно ты просто не правильно вызывал её:

void give_game_news( -- выдать на экран сообщение
string, -- само сообщение. Может содержать некоторые форматирующие элементы
string, --текстура, из которой берется аватара "отправителя"
Frect, --координаты и размеры вырезаемого из текстуры изображения
int, --начало показа сообщения с текущего момента  миллисекундах)
int --длительность показа сообщения  миллисекундах)
) 

В любом случае работает и ладно, а правильный вызов give_game_news можешь в том же  news_manager глянуть. 

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

Возник внезапно очередной странный вопрос: а коллбэки в :net_destroy() вообще надо в nil устанавливать, или еще как-либо трогать ? Клиентский объект же вроде как в принципе уничтожается, так какие у него после этого могут быть коллбэки ?

 

Очередной рудимент, или оно все-таки зачем-то надо ?

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

@Dennis_Chikin, ответ может быть относительно простым: а) уборщик мусора в Lua ассинхронен и б) "клиентский объект" - объект движка, а коллбэки, о которых ты упоминаешь, это методы/свойства иного объекта - объекта биндера (это уже Lua, т.е. дочерний от "клиентского"). Т.о. если программист движка, который писал коды для обработчиков коллбэков, не озаботился синхронизацией с порожденными Lua-объектами, то ... "Хочешь чтобы не воняло - спускай в туалете за собою, не дожидаясь что это сделает уборщица."

Можно и более пространно порассуждать, но тут уже потребуется каждый коллбэк (его алгоритм) рассматривать по-отдельности, и... что-то можно отнести к рудиментам, а что-то потребует долгих рассуждений и пояснений, но никак не может быть отнесено к рудиментам. Иными словами, даже однократного срабатывания "ненужного/забытого" коллбэка может быть достаточно для фатальной ошибки (вылета).

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Наверно можно было это писать Artos`у в личку, но, думаю что хранилищами se_stor.script не только я пользуюсь. И значит кто-то еще может напороться на обнаруженный мною баг, которого сам автор по видимому не заметил.

Условия возникновения: имея кучу всяких данных в таблице, которые хотелось бы сохранить, перевожу таблицу в строку. Получаются строки по 90-130 байт. записываю их в хранилище - порядка нескольких тысяч штук. При попытке сохранения игры получаю вылет, как несложно было установить - в результате переполнения нет-пакета какого то из объектов.

Копаться в se_stor.script и искать где там ошибка в алгоритме подсчитывающем надо или еще нет, переходить к следующему объекту, мне было лень :) поэтому просто уменьшил предельный размер пакета, чтобы был запас куда гарантированно влезут мои строки. Вот так:
Близко к началу файла

--/#!# лимит (bytes) на один stor-объект (мах.длина строк)
local MAX_PACKET_LENGHT = 7800  ---(iSSVer > 7 and 16200) or 8000 --/ для CS&CoP увеличен!
local sh_counto = 0

И все заработало как часы, спасибо Артосу который всегда отвечает на вопросы ;)

Конечно, стоит оговориться - данное значение применимо для ТЧ, в других версиях движка размер пакета другой. и полагаю может не гарантировать бесперебойную работу если сохранять строки бОльшего размера. может быть будет нужен запас побольше. sh_counto - добавленный мною счетчик созданных объектов, в конце работы save_storehouse выводит в лог, сколько их было использовано.

  лог (Показать)
  • Нравится 2

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

@Zander_driver, в исходном скрипте (se_stor.script) уже заложен вывод информации о кол-ве элементов хранения (cnt_elm):

 log("Save Storehouse: size(%d)=[%d], ...", cnt_elm, cnt_bytes, ...

поэтому не стОит дублировать одно и то же...

 

Ну а по сути сообщения, то (ИМХО):

1. Конечно можно вслепую уменьшить полезный объем каждого элемента хранилища и успокоиться, если не возникнет в игре ошибок... Однако, если не ясна причина возникновения ошибки, то никто не гарантирует, что при некотором изменении в игре, ошибка все же не возникнет. Исправлять нужно причину. а не пытаться подстраиваться под ситуацию. А вот для этого ты поленился даже строки лога об ошибке указать.

2. Уверен, что если тебе приходится сохранять "строки по 90-130 байт ... порядка нескольких тысяч штук." - то с оптимизацией в твоем моде явно нелады. В сэйве обычно хранят эксклюзивную информацию, которая характеризует именно текущее состояние в игре, а не абы все и вся, что зачем-то захотелось записывать.

  • Нравится 1

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

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

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

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

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

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

Войти

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

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

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