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

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

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

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

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, форум АМК съел моё старое имя и не хочет отдавать о_О

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

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

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

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

 

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

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

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

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

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

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

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



-- Некролог (На основе работы тов. 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. Чуть не оставил как есть комментарий второй сверху - получил по по ушам :) .

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

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

Ссылка на комментарий
-- новости о смерти сталкеров
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
Ссылка на комментарий

@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, форум АМК съел моё старое имя и не хочет отдавать о_О

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

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





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'а функции?  :blink:

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

Работы на 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 выводит в лог, сколько их было использовано.

    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.

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

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

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

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

 

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

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

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

  • Нравится 1

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

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

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

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

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

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

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

Войти

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

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

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