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

Скриптование


Svoboда

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

Здравствуйте.

Решил вернуть имена и описания для каждого тайника (как это было в ТЧ): в trasure_mananger.script заменил в функции CTreasureManager:give_treasure(treasure_id, spawn) локальную local text = "Тайник\\n%c[255,155,238,23]" на local text = "%c[255,238,155,23]"..game.translate_string(self.name).."\\n".."%c[default]"..game.translate_string(self.description).

После функцию function CTreasureManager:__init()

function CTreasureManager:__init()


    self.name = utils.cfg_get_string(ini, section, "name", nil, true, "")
    self.description = utils.cfg_get_string(ini, section, "description", nil, true, "")
    self.items_spawned = false
    self.check_time = nil
    self.secrets = {}
    self.secret_restrs = {}
    self.items_from_secrets = {}
end

 

Добавил файл-описания st_trasure.xml из ТЧ и сделал чтоб его читала игра, но при начале новой игры получаю вылет:

 

FATAL ERROR

[error]Expression : !m_error_code
[error]Function : raii_guard::~raii_guard
[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
[error]Line : 748
[error]Description : ...l.k.e.r. - Зов Припяти\gamedata\scripts\utils.script:170: attempt to concatenate local 'section' (a nil value)


stack trace:

001B:69737365 nvd3dum.dll

 

Как я понял, нужно для каждого тайника в st_trasure.xml нужно создать секцию описания name и description? Или не в ту сторону копать начал и описания от таких манипуляций я не получу?

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

Поделиться этим сообщением


Ссылка на сообщение

Здравствуйте. 

Вот, ЗП энциклопедию для ПДА создал - радовался. Не долго, правда: "Как статьи то выдавать?" - вопрос повис в воздухе и не хочет решаться. Знаю, проще всего сделать так: Сидор отправляя нас на задание, предупреждает, что там будут Слепые псы, их нужно опасаться, ведь у нас из оружия - только ПМ и т.д. В конце диалога выдать инфопоршень, по появлению которого у нас появляется статья в ПДА. Так - работает (да и с чего бы не работать?). Но если выдавать статьи только по заданию, то посинеешь их делать (ведь статей то явно перевалит за сотню, вместе с "дневником"), решил выкрутиться так же, как я выкрутился когда то с тайниками: при обыске NPC, есть вероятность того, что мы обнаружим наводку на тайник. Решил сделать аналогичное, но для инфопоршней.

 

function finding_info(npc)
local rnd_tbl = {
	"Mutant_boar_info",
	"Flesh_info",
	"Pseudo_flesh_info",
	"Bloodsucker_info",
	"Himera_info_info",
	"Pseudodog_info_info",
	"Psy_dog_info",
	"Dog_info",
	"Rotan_info",
	"Tushkano_info",
	"Giant_info",
	"Izlom_info",
	"Zombie_info",
	"Zombied_info",
	"Poltergeist_tele_info",
	"Poltergeist_flamer_info",
	"Snork_info",
	"Cat_info",
	"Cat_bayun_info",
	"Crow_info",
	"Burer_info",
	"Controller_info",
	"Rat_info",
	"Rats_wolf_info",
	"Escape_info",
	"Garbage_info",
	"Marsh_info",
	"Darkscape_info",
	"Agroprom_info",
	"Darkvalley_info",
	"Agroprom_u_info",
	"Rostok_info",	
	"Bar_info",
	"Monolith_info",
	"Military_stalkers_info",
	"Freedom_info",
	"Duty_info",
	"Stalkers_info",
	"Bandits_info",
	"Clear_sky_info",
	"Military_info",
	"Ecolog_info",
	"Killers_info"
}

    if math.random(0,100) > 1 then --Такой шанс дал, дабы не валить толпы народа
        for k,v in pairs(rnd_tbl) do 
	    if not has_alife_info(v) then --Если такого инфопоршня нет, то...
	        table.insert(rnd_tbl, v)  --...Выдаём его
	    end
	end
    end
end

 


И Старина Сталкер ЗП вылетает с логом о том, что у него не хватает памяти:

FATAL ERROR

[error]Expression : !m_error_code
[error]Function : raii_guard::~raii_guard
[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
[error]Line : 748
[error]Description : not enough memory


stack trace:

 

Не подскажете, в чём причина неработоспособности скрипта? За ответ буду благодарен.

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

Поделиться этим сообщением


Ссылка на сообщение

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

 

 


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

Это когда ты играешь долгое время и память забивается, тогда - да, я бы винил подкачку и т.п., А сейчас: НИ, спавн бандоса и зомбированного, первый стреляет из ПБ во второго, тот обижается и даёт в зубы прикладом + раздаёт "в щи" контрольные пол-рожка. Ничего затратного, тем более, что и симуляция "спит" один час с НИ, а только потом начинает "кушать" ресурсы, творя своё великое дело! (как то громко вышло, хе-хе :russian_ru: ...)

P.S. Не объясните, почему таблицы лучше выносить за скрипт? А то мы без образования, скрипты без азбуки изучать пытаемся...

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

Поделиться этим сообщением


Ссылка на сообщение

azrael1325, скрипт работает и инфопоршни выдаёт. Правда, при первом обыске был небольшой лаг (доля секунды игра "висела"), при втором уже подобного не было, но это не критично. А с тем, что под конец игры информация будет выдаваться реже, придётся смириться, до тех пор, пока не наберусь опыта в "скриптовом деле". Благодарю за подсказку.

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

Поделиться этим сообщением


Ссылка на сообщение

Здравствуйте.

Есть ли проверки на то, существует ли парт-тексутра(определённая область в текстуре, которая записывается в .xml - "научного" названия не знаю, называю так)?

Нужно мне это для такой ситуации: если есть текстура с определённым именем (она будет в размерах больше), то загрузить её. Если нет, то загрузить текстуру другую (меньшего размера). Текстуры подгружаю в GUI.

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

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

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

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



-- Некролог (На основе работы тов. 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

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

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

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

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

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

Поделиться этим сообщением


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

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

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

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

Поделиться этим сообщением


Ссылка на сообщение
(изменено)





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

Поделиться этим сообщением


Ссылка на сообщение

В общем, решили таки проблему: всё в функции вызывалось, вот только метод 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

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Здравствуйте.

Сделал функцию, которая выдаёт ГГ инфопоршень при переходе на локацию (ну, тут видно):





function create()
    local level = level.name()

    if not db.actor:has_info("dynamic_anoms_to_"..level) then
	db.actor:give_info_portion("dynamic_anoms_to_"..level)
    end
end

Всё нормально: посетили Затон, получили поршень dynamic_anoms_to_zaton - как и надо. Но в какой-то момент нужно эти поршни удалить...

Если у меня было бы 3-4 локации, то можно было бы прописать проверку, подобие "если ГГ имеет поршень посещения Затона, Янова и Припяти, то удалить их", но у меня лок уже с десяток и, надеюсь, будет больше. Перечислять все можно, но вдруг есть ещё какой-то способ? Допустим, можно ли удалить поршни, если в их названии есть какая-то буквенная часть, допустим, "dynamic_anoms_to_"?

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

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

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Снова помощи просим.

Вопрос возник, касательно таблиц: как их пополнять? Я сделал так:

создал пустую таблицу вне функции



local tbl_locs = {}

и после посещения локации пополняю таблицу вот так



local level = level.name()

tbl_locs["level"] = true

Но после посещения Затона и Янова, при вызове функции по удалению инфопоршней игра вылетает, жалуясь на то, что таблица пустая ( attempt to concatenate field '?' (a nil value) ). Не подскажете, как правильно пополнять таблицы и, на будущее, удалять данные из них?

P.S. Чую, я и не таблицу вовсе пополнял, а что-то другое творил, но в скриптах искал примеры и наткнулся на нечто вышеописанное, подумал, что это и есть пополнение таблицы...

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

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

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

J.A.A., погляди в bind_stalker.script функции use_inventory_item(obj) и anabiotic_callback2() - в этих функциях при сне\приёме анабиотика включается\выключается звук.

Примерно это будет выглядеть так:

--Выключение звука
_G.mus_vol = get_console():get_float("snd_volume_music")
_G.amb_vol = get_console():get_float("snd_volume_eff")
get_console():execute("snd_volume_music 0")
get_console():execute("snd_volume_eff 0")
--Ворачиваем всё обратно
get_console():execute("snd_volume_music "..tostring(_G.mus_vol))
get_console():execute("snd_volume_eff "..tostring(_G.amb_vol))
_G.amb_vol = 0
_G.mus_vol = 0

 

 

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

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

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Gkchp, В оригинале ЗП эта схема отключена. Включаем так: заходим в файл modules.script, ищем строчки

load_scheme("ph_door",				"ph_door",		stype_item)
load_scheme("ph_idle",				"ph_idle",		stype_item)
load_scheme("ph_hit",				"ph_hit",		stype_item)
load_scheme("ph_on_hit",			"ph_on_hit",		stype_item)
load_scheme("ph_button",			"ph_button",		stype_item)
load_scheme("ph_code",				"ph_code",		stype_item)
load_scheme("ph_death",				"ph_on_death",		stype_item)
load_scheme("ph_minigun",			"ph_minigun",		stype_item)
--load_scheme("ph_target",			"ph_target",		stype_item)
load_scheme("ph_oscillate",			"ph_oscillate",		stype_item)

И после этих строк вставляем подключение схемы ph_sound:

load_scheme("ph_sound",                         "ph_sound",         stype_item) --Загрузка модуля матюгальника

Теперь можно использовать схему.

Но я когда у себя начал использовать схему, то немного был недоволен тем, что в этой схеме звук воспроизводится как в ТЧ - по путям, с указанием параметров в логике, а не по .ltx, как это сделано в ЗП.

Иными словами, в оригинальной схеме, чтобы отыграть звук его нужно прописать, по-моему в sound_theme.script в виде конструкции

ph_snd_themes["gar_seryi_shooting"] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}

, в то время как в ЗП используется поддержка .ltx файла, что, считаю удобным. После правки у меня убились два параметра - random и looped за ненадобностью - эти и другие параметры настраиваются в .ltx файле.

Ссылка: http://rghost.ru/55973662

Пример использования на матюгальнике на Кордоне:

[logic]
active = ph_sound@idle
on_hit = hit
 
[ph_sound@idle]
sound      = esc_roadblock_megafon_idle
on_signal = sound_end|ph_idle@wait
 
[ph_idle@wait]
on_timer = 85000|ph_sound@idle

 

 

Логика очень упрощена и сводится к тому, что рупор воспроизводит звук и на 85 секунд уходит "отдыхать", дабы не орать беспрестанно. А если у тебя радио в баре Скадовск, то там можно и без пауз петь.

Настройка звуков делается в файле script_sound_<локация>.ltx вот так:

;В секции list_script_sound_<локация> ставишь указание новой секции:

esc_roadblock_megafon_idle

 

;И в конце файла пиши

 
[esc_roadblock_megafon_idle]
type = 3d
npc_prefix = false
path = characters_voice\scenario\escape\esc_roadblock_megafon_idle_ ;Тут указывается путь до файла, чтоб выбирался рандомно делай названия esc_roadblock_megafon_idle_ 1, esc_roadblock_megafon_idle_ 2 и т.д., а в пути указывай как тут
shuffle = rnd
idle = 3,5,100

 

 

Ну и пара полезных статеек на эту тему:

Про ph_sound - http://stalkerin.gameru.net/wiki/index.php?title=Настройка_логики._Часть_4#.D0.A1.D1.85.D0.B5.D0.BC.D0.B0_ph_sound

Про настройку .ltx фала - http://stalkerin.gameru.net/wiki/index.php?title=CoP._Разбор_звуковых_конфигов_в_script_sound_***

 

 

По переключению схем:

[logic]
active = ph_button@deactivated

[ph_button@activated]
anim = off

on_game_timer = 5 |  ph_sound

[ph_button@deactivated]
anim = idle
on_press = ph_button@activated % +zat_a2_radio_on%

tooltip = radio_on

[ph_sound]
snd = zat_a2_bar_radio
looped = true
min_idle = 50
max_idle = 100
random = false

on_use = ph_button@deactivated %-zat_a2_radio_on%

tooltip = radio_off

 

 

Попробуй так. И погляди в статьях выше примеры как переключают схемы.

Изменено пользователем Black Hawk
Не работали спойлеры из-за отсутствия названия скрытого текста.
  • Нравится 1

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

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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

AMK-Team.ru

×
×
  • Создать...