Stalkersof 137 Опубликовано 10 Ноября 2013 Поделиться Опубликовано 10 Ноября 2013 Не все таки я не понимаю как это работает может кто-то объяснит. Вот прописываю вызов только этой функции нахожусь на локации предбанник т.е при старте. relation_registry.set_community_goodwill ("bandit", "actor", -5000) бандитыrelation_registry.set_community_goodwill ("military", "actor", 0) вояки Пререхожу на кордон У меня Бандиты изначально нейтральны становяться красными Вояки на кордоне же не меняют ориентации PS Хотя _Val_ может быть и прав Решил так сам выкручивайся. Freeplay Graphic Mod(FGM) Ссылка на комментарий
Artos 99 Опубликовано 10 Ноября 2013 Поделиться Опубликовано 10 Ноября 2013 @Stalkersof, мусорил бы ты "по теме", т.е. в топике по ковыряниям ТЧ... и заглянул бы в топик "Справочник по функциям и классам", дабы не гадать как нужно вызывать ту иль иную функцию. Для ТЧ пространство 'relation_registry' сильно ограничено и доступно только семейство функций "community_goodwill", которые оперируют именем группировки и идентификатором персоналии, относительно которого и работают. Ну а изменять в игре отношения целых группировок - это тебе не ЧН/ЗП... И если "изменяешь" что-то, то чтобы говорить об изменениях или их отсутствии - приводят все же нечто, с чем можно сравнивать. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Stalkersof 137 Опубликовано 10 Ноября 2013 Поделиться Опубликовано 10 Ноября 2013 Спасибо и на этом. Я обратился в тему что бы найти ответ почему и что я сделал не так. Вместо этого получил разные речи и почти ни одного ответа где я допустил ошибку. Хорошо больше не буду здесь писать. Freeplay Graphic Mod(FGM) Ссылка на комментарий
*Shoker* 322 Опубликовано 11 Ноября 2013 Поделиться Опубликовано 11 Ноября 2013 (изменено) @Stalkersof, попробуй вместо 0 указать 1500 или любое положительно число. (5000) relation_registry.set_community_goodwill ("military", db.actor:id (), 1500) по идее работает прямо на Кордоне. Скорее всего при 0 у тебя просто не изменяется никак отношение, и нужно брать число побольше. Если по умолчанию у тебя отношение со сталкерами -2000, то соответственно и пиши 2000, но это теория. Я не помню точно что там творится с отношением группировок в ТЧ, Вполне возможно что если ты перед этим перестреляешь кучу членов этой группировки, то даже этой функции будет недостаточно. Ну и если это не сработает, то есть совсем уж хардкорный вариант - помимо set_community_goodwill перебрать всех сталкеров данной группировки, которые есть в игре, и в ручную поставить им нейтральное отношение к игроку, правда тогда нужно проверить будут ли нейтралами свеже-появившиеся сталкеры. Изменено 11 Ноября 2013 пользователем *Shoker* 1 Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 11 Ноября 2013 Поделиться Опубликовано 11 Ноября 2013 (изменено) но это теория. Ни к теории, ни к практике это не имеет никакого отношения! Это пустые погадалки на кофейной гуще. , как будто-то от "перемены мест" изменится сумма... Не пора ли завязывать с подобными "советами", не имеющими никакого отношения ни к скриптам, ни к программированию?! Почему бы самим "советчикам" не опробовать на своей шкуре, потратив свое время, а не писать в публичный топик, засоряя и топик и мозги... Про формулу уже писалось (тут): Загляни в этот файл. config/creatures/game_relations.ltx Там в комментах разрабы написали полную формулу и там же все таблички, по которым вычисляются части этой формулы. Изменено 11 Ноября 2013 пользователем Artos 1 1 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Сталкер Лом 356 Опубликовано 13 Ноября 2013 Поделиться Опубликовано 13 Ноября 2013 (изменено) Здравствуйте, товарищи. Решил, дабы не забыть, как скрипты пишутся, сделать некролог для Сталкерской сети (как умирает сталкер, высылается сообщение об его смерти): -- Некролог (На основе работы тов. Weanchester) function necrolog(victim) local level_name = { ["zaton"] = "Затон", ["jupiter"] = "Окрестности завода Юпитер", ["pripyat"] = "Припять", ["garbage"] = "Свалка", ["l01_escape"] = "Кордон", ["l06_rostok"] = "Росток", ["marsh"] = "Нижние Болота", ["k01_darkscape"] = "Тёмная лощина", ["agroprom"] = "Окрестности НИИ Агропром" } local death_komment = { "Я знал, что он допрыгается...", "[Вырезано цензурой]", "Ещё один...", "Таак...", "Мдя, ни дня без этого.", "Одним больше, одним меньше...", "Все там будем", "Помянуть надо бы...", "Зона тебе пухом.", "Как в воду глядел - скопытился!" } local community = { ["actor"] = "Сталкер", ["stalker"] = "Сталкер", ["monolith"] = "Монолит", ["army"] = "Военные", ["bandit"] = "Бандит", ["killer"] = "Наемник", ["ecolog"] = "Эколог", ["dolg"] = "Долг", ["freedom"] = "Свобода", ["zombied"] = "Зомбированный" } local necrolog_text = "\\n%c[255,160,160,160]Погиб сталкер: %c[default]"..victim:character_name().."\\n%c[255,160,160,160]Группировка: %c[default]"..community[victim:character_community()].."\\n%c[255,160,160,160]Локация: %c[default]"..level_name[level.name()].."" local shans = math.random(1,100) local comment_text = death_komment[math.random(table.getn(death_komment))] if victim and IsStalker(victim) and shans>27 then db.actor:give_game_news(necrolog_text, "ui_inGame2_Necrolog", math.random(1000,3000), 3000) xr_sound.set_sound_play(db.actor:id(), "pda_tips") if shans>70 then db.actor:give_game_news(comment_text, "ui_inGame2_Necrolog", math.random(3500,6000), 3000) end end end То есть, если есть убитый сталкер и если выпадет число больше указанного (мол, помехи были и пр. пр., что может не дать ПДА отослать последнее сообщение), то отсылаем сообщение. Так же есть вероятность того, что из таблицы выберется фраза, которая будет "комментарием" какого-либо сталкера (там ещё поработать надо, но пока заставить бы это работать...). Делал я это скрипт на основе того, что есть на сталкерине (SoC. Сообщение о смерти сталкеров). Сделал вызов скрипта, как указанно в статье, в xr_motivator.script. Но беда - даже в разгар "Мамаего побоища" нет ни единого сообщения. Вылетов нет, синтаксис соблюдён, но сообщений тоже нет. Не подскажете, в чём может быть проблема? P.S. Чуть не оставил как есть комментарий второй сверху - получил по по ушам . Изменено 13 Ноября 2013 пользователем Сталкер Лом Работы на Artstation - https://www.artstation.com/artist/stalker_lom Ссылка на комментарий
Stalkersof 137 Опубликовано 13 Ноября 2013 Поделиться Опубликовано 13 Ноября 2013 -- новости о смерти сталкеров local level_name = { ["l01_escape"] = "Кордон", ["l02_garbage"] = "Свалка", ["l03_agroprom"] = "НИИ Агропром", ["l03u_agr_underground"] = "Подземелье НИИ Агропром", ["l04_darkvalley"] = "Тёмная долина", ["l04u_labx18"] = "Лаборатория X-18", ["l05_bar"] = "Бар", ["l06_rostok"] = "Дикая территория", ["l07_military"] = "Армейские склады", ["l08_yantar"] = "Янтарное озеро", ["l08u_brainlab"] = "Лаборатория X-16", ["dead_city"] = "Мёртвый город", ["l10u_bunker"] = "Лаборатория X-10", ["l10_radar"] = "Радар", ["l11_pripyat"] = "Припять", ["l12_stancia"] = "ЧАЭС", ["l12_stancia_2"] = "ЧАЭС", ["l12u_sarcofag"] = "Саркофаг", ["l12u_control_monolith"] = "Бункер управления Монолитом", ["atp_for_test22"] = "АТП", ["peshera"] = "Пещера", ["puzir"] = "Забытый лес", ["aver"] = "Лесная чаща", ["av_peshera"] = "Логово", ["limansk"] = "Лиманск", ["hospital"] = "Госпиталь", ["generators"] = "Генераторы", ["warlab"] = "Варлаб", ["red_forest"] = "Рыжий лес", ["lost_village"] = "Покинутая деревня", ["marsh"] = "Болота", ["zaton"] = "Затон", ["jupiter"] = "Юпитер", ["pripyat"] = "Припять", ["jupiter_underground"] = "Путепровод", ["labx8"] = "Х-8", ["cs_agroprom_underground"] = "Подземелье", ["predbannik"] = "Предбанник", ["garbage_old"] = "Кладбище техники", ["yantar_old"] = "Научная станция", ["swamp_old"] = "Мертвые топи" } local community = { ["stalker"] = "Одиночка", ["military"] = "Военные", ["bandit"] = "Бандит", ["killer"] = "Наемник", ["ecolog"] = "Эколог", ["dolg"] = "Долг", ["stranger"] = "Неизвестные", ["freedom"] = "Свобода", ["arena_enemy"] = "Участник арены", ["trader"] = "Торговец", ["monolith"] = "Монолит", ["zombied"] = "Зомбированный" } local death_komment = { "Я знал, что он допрыгается...", "[Вырезано цензурой]", "Ещё один...", "Таак...", "Мдя, ни дня без этого.", "Одним больше, одним меньше...", "Все там будем", "Помянуть надо бы...", "Зона тебе пухом.", "Как в воду глядел - скопытился!" } local dead_news = "" -- новости о смерти сталкеров function kill_npc_news(victim,who) if victim and IsStalker(victim) then dead_news = "%c[230,255,128,64]Погиб: "..victim:character_name().."\\nГруппировка: "..community[victim:character_community()].."\\nМесто гибели: "..level_name[level.name()].."" db.actor:give_game_news(dead_news,"ui\\ui_iconstotal",Frect():set(83,470,83,47),1000,3000) -- всегда local shans = math.random(1,100) if shans > 70 then dead_news = death_komment[math.random(table.getn(death_komment))] db.actor:give_game_news(dead_news,"ui\\ui_iconstotal",Frect():set(83,470,83,47),3000,3000) -- дополнительно не всегда end end end Вызов в xr_motivator.script function motivator_binder:death_callback(victim, who) имя файла.kill_npc_news(victim,who)--новости о смерти сталкеров -----................----- -----................----- end Сталкер ТЧ С паком локаций от кости. Ну как то так. Можно еще усовершенствовать сделать для сообщений иконки для каждой групировки усложнить выдачу сообщений. Сделать звуковое сопровождение. Упростить код и. тд 1 Freeplay Graphic Mod(FGM) Ссылка на комментарий
Real Wolf 34 Опубликовано 13 Ноября 2013 Поделиться Опубликовано 13 Ноября 2013 @Stalkersof,Можно. Конструкцию вида: death_komment[math.random(table.getn(death_komment))] Лучше заменить на: death_komment[math.random(#death_komment)] По звуку и иконке посмотри как сделано в news_manager. Там наглядно всё. 1 Ссылка на комментарий
Сталкер Лом 356 Опубликовано 14 Ноября 2013 Поделиться Опубликовано 14 Ноября 2013 (изменено) Real Wolf, Stalkersof, спасибо, конечно, за скрипт (ещё не проверял, но сейчас буду), но я всё же хотел узнать, почему не работал мой вариант - интересна причина, вдруг ещё раз попадётся на чём-то подобном. P.S. Ваш скрипт так же не выдаёт новости, видимо, дело не в нём... Изменено 14 Ноября 2013 пользователем Сталкер Лом Работы на Artstation - https://www.artstation.com/artist/stalker_lom Ссылка на комментарий
*Shoker* 322 Опубликовано 14 Ноября 2013 Поделиться Опубликовано 14 Ноября 2013 Если сам скрипт у тебя без ошибок (синтаксических) то на лицо не правильный вызов функции necrolog(victim) Покажи кусок из xr_motivator где ты её вызываешь. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Сталкер Лом 356 Опубликовано 14 Ноября 2013 Поделиться Опубликовано 14 Ноября 2013 function motivator_binder:death_callback(victim, who) -- Туча функций -- dynamic_news.necrolog(victim) -- Некролог в общий канал end Вот так, в конце функции. Работы на Artstation - https://www.artstation.com/artist/stalker_lom Ссылка на комментарий
*Shoker* 322 Опубликовано 14 Ноября 2013 Поделиться Опубликовано 14 Ноября 2013 (изменено) Хм, покажи пож-ста всю эту функцию под спойлером, мож где то в ней стоит return из за чего твой код просто не вызывается. Изменено 14 Ноября 2013 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Сталкер Лом 356 Опубликовано 14 Ноября 2013 Поделиться Опубликовано 14 Ноября 2013 (изменено) function motivator_binder:death_callback(victim, who) self:hit_callback(victim, 1, vector():set(0,0,0), who, "from_death_callback") if rx_ai then rx_ai.npc_death(self.object,who) end xrs_dyn_music.npc_table[self.object:id()] = nil xr_combat_ignore.fighting_with_actor_npcs[self.object:id()] = nil -- xrs_dyn_music.stop_combat(self.object:id()) --' Если игрок был с квестом от механика - фейлить его local st = db.storage[self.object:id()] local npc = self.object stalker_generic.remove_level_spot(npc, st) --' end -- if who:id() == db.actor:id() then xr_statistic.inc_killed_stalkers_counter() xr_statistic.set_best_monster(npc) end --' Загрузка историй для лагеря. local known_info = utils.cfg_get_string(st.ini,st.section_logic , "known_info", self.object, false, "", nil) printf("xr_info from death loaded!!!") xr_info.loadInfo(self.object, st.ini, known_info) --' Принудительно обнуляем анимейшн менеджер чтобы отдетачились приатаченные объекты if self.st.state_mgr ~= nil then self.st.state_mgr.animation:set_state(nil, true) end if self.st.reach_task then xr_logic.issue_event(self.object, self.st.reach_task, "death_callback", victim, who) end if self.st.death then xr_logic.issue_event(self.object, self.st.death, "death_callback", victim, who) end if self.st.active_section then xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "death_callback", victim, who) end sr_light.check_light(self.object) death_manager.drop_manager(self.object):create_release_item() db.delete_enemy( self.e_index ) self:clear_callbacks() --' Наносим небольшой импульс вперед. if(actor_stats.remove_from_ranking~=nil)then local community = character_community(self.object) if community == "zombied" or community == "monolith" then else actor_stats.remove_from_ranking(self.object:id()) end end release_body_manager.get_release_body_manager():moving_dead_body(self.object,true) dynamic_news.necrolog(victim) -- Некролог в общий канал end Или же если комментирование " -- ", то комментируется вся строка, а если " --' " то всё до end'а функции? Изменено 14 Ноября 2013 пользователем Сталкер Лом Работы на Artstation - https://www.artstation.com/artist/stalker_lom Ссылка на комментарий
*Shoker* 322 Опубликовано 14 Ноября 2013 Поделиться Опубликовано 14 Ноября 2013 Да не, это просто подсветка синтаксиса от другого языка видимо, либо просто глючит. Из того что могу посоветовать: 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, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Сталкер Лом 356 Опубликовано 14 Ноября 2013 Поделиться Опубликовано 14 Ноября 2013 В общем, решили таки проблему: всё в функции вызывалось, вот только метод db.actor:give_game_news почему-то молчал. Заменил на news_manager.send_tip(db.actor, necrolog_text , math.random(1,4), "necrolog", nil, nil) и вуаля: частичка сталкера из книг и АМК... Мораль: "Товарищ, видишь метод news_manager.send_tip используй его!" Спасибо всем. 1 Работы на Artstation - https://www.artstation.com/artist/stalker_lom Ссылка на комментарий
*Shoker* 322 Опубликовано 14 Ноября 2013 Поделиться Опубликовано 14 Ноября 2013 Возможно ты просто не правильно вызывал её: void give_game_news( -- выдать на экран сообщение string, -- само сообщение. Может содержать некоторые форматирующие элементы string, --текстура, из которой берется аватара "отправителя" Frect, --координаты и размеры вырезаемого из текстуры изображения int, --начало показа сообщения с текущего момента (в миллисекундах) int --длительность показа сообщения (в миллисекундах) ) В любом случае работает и ладно, а правильный вызов give_game_news можешь в том же news_manager глянуть. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 26 Ноября 2013 Поделиться Опубликовано 26 Ноября 2013 Возник внезапно очередной странный вопрос: а коллбэки в :net_destroy() вообще надо в nil устанавливать, или еще как-либо трогать ? Клиентский объект же вроде как в принципе уничтожается, так какие у него после этого могут быть коллбэки ? Очередной рудимент, или оно все-таки зачем-то надо ? Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Artos 99 Опубликовано 26 Ноября 2013 Поделиться Опубликовано 26 Ноября 2013 @Dennis_Chikin, ответ может быть относительно простым: а) уборщик мусора в Lua ассинхронен и б) "клиентский объект" - объект движка, а коллбэки, о которых ты упоминаешь, это методы/свойства иного объекта - объекта биндера (это уже Lua, т.е. дочерний от "клиентского"). Т.о. если программист движка, который писал коды для обработчиков коллбэков, не озаботился синхронизацией с порожденными Lua-объектами, то ... "Хочешь чтобы не воняло - спускай в туалете за собою, не дожидаясь что это сделает уборщица." Можно и более пространно порассуждать, но тут уже потребуется каждый коллбэк (его алгоритм) рассматривать по-отдельности, и... что-то можно отнести к рудиментам, а что-то потребует долгих рассуждений и пояснений, но никак не может быть отнесено к рудиментам. Иными словами, даже однократного срабатывания "ненужного/забытого" коллбэка может быть достаточно для фатальной ошибки (вылета). "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Zander_driver 10 335 Опубликовано 28 Ноября 2013 Поделиться Опубликовано 28 Ноября 2013 Наверно можно было это писать 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 выводит в лог, сколько их было использовано. log( string.rep("~",72) ) --/#~# log("Save Storehouse: size(%d)=[%d], keys=[%s] : BuildSav=[%s]", cnt_elm, cnt_bytes, table.size and table.size(storehouse), storehouse["BuildSav"], "") --/#~# log(string.format("Storehouse object count: %s",tostring(sh_counto))) log( string.rep("~",72) ) --/#~# 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. Ссылка на комментарий
Artos 99 Опубликовано 28 Ноября 2013 Поделиться Опубликовано 28 Ноября 2013 @Zander_driver, в исходном скрипте (se_stor.script) уже заложен вывод информации о кол-ве элементов хранения (cnt_elm): log("Save Storehouse: size(%d)=[%d], ...", cnt_elm, cnt_bytes, ... поэтому не стОит дублировать одно и то же... Ну а по сути сообщения, то (ИМХО): 1. Конечно можно вслепую уменьшить полезный объем каждого элемента хранилища и успокоиться, если не возникнет в игре ошибок... Однако, если не ясна причина возникновения ошибки, то никто не гарантирует, что при некотором изменении в игре, ошибка все же не возникнет. Исправлять нужно причину. а не пытаться подстраиваться под ситуацию. А вот для этого ты поленился даже строки лога об ошибке указать. 2. Уверен, что если тебе приходится сохранять "строки по 90-130 байт ... порядка нескольких тысяч штук." - то с оптимизацией в твоем моде явно нелады. В сэйве обычно хранят эксклюзивную информацию, которая характеризует именно текущее состояние в игре, а не абы все и вся, что зачем-то захотелось записывать. 1 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти