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

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

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


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

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

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

 

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

 

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

 

Вопросы которые будут удалятся, следовательно их задавать не нужно:
-- Где находится та или иная функция?
Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;
-- Как сделать что-то/то-то?
С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;
-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.
-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.
Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов?
В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос.

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


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

Даже не знаю куда писать... Либо сюда, либо сразу в справочник, но суть в чём:

 

Есть код 1:

local s = get_hud():GetCustomStatic("static")
if not s then
    s = get_hud():AddCustomStatic("static")
end

s:wnd():SetText("text")
И код 2:

get_hud():AddCustomStatic("static", true):wnd():SetText("text")
Первый код вешает апдейт актора, а второй нет. Почему так? Исходники смотрел, там вроде всё нормально.

 

З.Ы. второй аргумент AddCustomStatic означает, что сначала будет произведен поиск статика с таким же именем и в случае успеха, он будет возвращен вместо создания нового (т.е. эквивалент функции GetCustomStatic).

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

2 7.9: однозначно, нет.

 

2 Shadows: а проверки с логом добавить ?

s = get_hud():AddCustomStatic("static") - вот здесь статик точно возвращается ?

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

2 Shadows: а проверки с логом добавить ? s = get_hud():AddCustomStatic("static") - вот здесь статик точно возвращается ?

local s = get_hud():AddCustomStatic("static")
if s and s:wnd() then
	log1("yes")
else
	log1("no")
end
--> yes

Да и во втором варианте кода же работает.

 

SDrawStaticStruct* CUIGameCustom::AddCustomStatic			(LPCSTR id, bool bSingleInstance)
{
	if(bSingleInstance){
		st_vec::iterator it = std::find(m_custom_statics.begin(),m_custom_statics.end(), id);
		if(it!=m_custom_statics.end())
			return &(*it);
	}
	
	CUIXmlInit xml_init;
	m_custom_statics.push_back		(SDrawStaticStruct());
	SDrawStaticStruct& sss			= m_custom_statics.back();

	sss.m_static					= xr_new<CUIStatic>();
	sss.m_name						= id;
	xml_init.InitStatic				(*m_msgs_xml, id, 0, sss.m_static);
	float ttl						= m_msgs_xml->ReadAttribFlt(id, 0, "ttl", -1);
	if(ttl>0.0f)
		sss.m_endTime				= Device.fTimeGlobal + ttl;

	return &sss;
}

 

 

@7.9, нет, там метод.

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

Может у тебя в биндере дальше переменная s используется?

Не используется.

 

так на какой строчке биндер вешается?

s:wnd():SetText("text")

 

Причем именно на апдейте надо это делать. При единичном вызове все нормально работает почему-то.

 

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

Задай zoom_enabled = off в конфиге. Хотя не уверен, что сработает в ЧН, но в ТЧ 100% пашет.
  • Спасибо 1
Ссылка на комментарий

Причем именно на апдейте надо это делать. При единичном вызове все нормально работает почему-то.

Проверь перед зависанием вызывался Add или Get.

 

И что будет, если вариант 2 переписать в виде:

local s = get_hud():AddCustomStatic("static", true)
s:wnd():SetText("text")
Ссылка на комментарий
,может глупый вариант, но всё же. В первом коде есть условие, а второй вызывается от какого-нибуть чего-нибудь там. Да хоть от булки хлеба.

svarog2741.gif

 

НС - шлак, солянки - шлак.

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

Всем привет. Не знаю, может не  в тему пишу - как сделать (в ТЧ), что бы при получении ГГ нескольких определенных инфопоршней на экране появлялось опред. сообщение? Спасибо.

 

 

 

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

local t_info, t_info_any, t_info_n = {}, {}, 0

function add_on_info( f, nfo )	-- ( функция, инфо ), либо f для любых инфо
	if nfo then
		local t = t_info[nfo]
		if t then table_insert( t, f )
		else t_info[nfo] = { f }
		end
	else t_info_n = t_info_n + 1; t_info_any[t_info_n] = f
	end
end

function actor_binder:info_callback( npc, nfo )
	for i = 1, t_info_n do t_info_any[i]( nfo, npc ) end
	local t = t_info[nfo]
	if t then
		for i = 1, #t do t[i]( nfo, npc ) end
	end

	ltasks_proceed()		-- Сюжет
	ltasks_process_info( nfo )	-- Отметки на карте
end

 

local sms_t = {	-- info, текст; todo	-- сделать проверку живости авторов
	["sms_pulya"]		= "sms_pulya_text",
	["sms_lukash"]		= "sms_lukash_text",
	["sms_serega"]		= "sms_serega_text",
	["sms_borov"]		= "sms_borov_text",
	["sms_volk"]		= "sms_volk_text",
	["sms_shurup"]		= "sms_shurup_text",
	["sms_dan"]		= "sms_dan_text",
	["sms_new_dan1"]	= "sms_new_dan1_text",
	["sms_new_dan2"]	= "sms_new_dan2_text",
	["mitya_dead_sms_sidor"] = "Здорово Меченый, это Сидор,зайди есть посылка любопытная" }

function send_sms( sms )
	if sms_t[sms] then
		actor:give_info_portion( sms )
		amk_tip( game.translate_string( sms_t[sms] ), nil, nil, 30 )
	end
end


-- was: wawka

function add_krysyk_pomer_treasure()
	treasure_manager.get_treasure_manager():give_treasure( "esc_secret_village_rucksack" )
end


function check_bes_dead()
	if actor:has_info( "val_pula_ammo_start" ) and actor:dont_has_info( "val_pula_ammo_done" ) then
		timer_start( "send_sms", math_random( 20, 30 ), "sms_pulya" )
		timer_start( "send_sms", math_random( 50, 60 ), "sms_lukash" )
		timer_start( "send_sms", math_random( 70, 80 ), "sms_serega" )
	end
end

...

info_f = {
	["gar_hellcar_umer"]		= check_bes_dead,	-- по-моему, это info ни кто не генерит
	["bandit_krisyk_umer"]		= check_krysyk_dead,
	["esc_vagon_wounded_umer"]	= check_tolik_dead,
	["mil_freedom_member0018_umer"]	= check_maks_dead,
	["gar_dm_novice_umer"]		= check_yurik_dead,
	["marsh_dan_umer"]		= marsh_dan_umer,
	["ucen_talk_est"]		= marsh_dan_umer2,
	["mil_dolg_phase1"]		= mil_dolg_attack1,
	["mil_dolg_after_explode"]	= mil_dolg_attack2,
	["mitya_dead"]			= check_mitya_dead,
	["shadowman_zver_have"]		= check_shadowman_zver,
	["shadowman_zver_fail"]		= check_shadowman_zver,
	["grab_stal1_dead"]		= on_death_info,
	["grab_stal2_dead"]		= on_death_info,
	["grab_stal3_dead"]		= on_death_info,
	["grab_stal4_dead"]		= on_death_info,
	["grab_stal5_dead"]		= on_death_info,
	["tutorial_wounded_give_info"]	= esc_shustryi,
	["tutorial_wounded_start"] 	= esc_shustryi,
	["esc_blocpost_pust"]		= esc_desant_heli_1,
	["esc_btr_killed"]		= esc_desant_heli_2
} -- /info_f

info_f_invcl = {}


function on_inv_close()
	for k, f in pairs( info_f_invcl ) do
		if f and actor:has_info( k ) then f() end
	end
end


function on_info( nfo, something )
	log( "info", "on_info: %s, %s", nfo, to_str( something ) )
	if something and something.name then
		log( "info", "on_info, name: %s", something:name() )
	end
	local f = info_f[nfo]
	if f then f( nfo, something ) end
end

...
bind_stalker.add_on_info( on_info )

 

https://dl.dropboxusercontent.com/u/27871782/storyline.script

 

P.S. Таймеры - не нужны !

На самом деле тот же actor:give_game_news() задержку сам умеет, без всяких таймеров. Так что здесь осталось только по тому, что переносилось когда-то незадумываясь над смыслом переносимого.

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

@Outfater,

local porsh = {

1 поршень, второй поршень}

 

Function hhy() -- на апдейт

if has_info("porsh") then

Дальше сам.

 

P.S. мог ошибиться, так как писал с телефона.

Изменено пользователем svarog2741
  • Спасибо 1

svarog2741.gif

 

НС - шлак, солянки - шлак.

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

@k01jan, тем что один поршень - одна функция.

@svarog2741, а куда прописать local porsh и дальше ? Function hhy() -- на апдейт - тоже не совсем понял - hhy произвольно, или именно так? И что значит на апдейтif has_info("porsh") then - тут всё понятно с условием, а куда его писать, в конец биндера под функцию, или в любую скрипт-папку?

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

 

 

 

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

а куда прописать local porsh

в тот же скрипт, где функция проверки.

И что значит на апдейт

Функция update в bind_stalker.script

hhy произвольно, или именно так?

 

да, произвольно.
  • Спасибо 1

svarog2741.gif

 

НС - шлак, солянки - шлак.

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

@svarog2741, в разделе function actor_binder:update(delta) перед последним эндом сделал так:

repack_ammo.on_update()
if xrs_ai then xrs_ai.actor_update(delta)
end
if rx_ai then rx_ai.actor_update()
end

function test_prosto()
local testporsh = {"test1","test1","test3"}
if has_info("testporsh") then smski.poluchil_porsh
end

end

---------------------------------------------------------------------------
function actor_binder:save(packet)
if rx_ai then rx_ai.actor_save(packet) end
art_hit.save()

то что выделено жирным - это моё, остальное уже было.  "test1" - инфопоршень. Правильно?
 
p.s. Нет, не правильно. Сделал так:
function test_prosto
local porsh = {"test1","test1","test3"}
if has_info("porsh") then smski.poluchil_porsh
end
Получаю вылет:
[error]Arguments     : LUA error: ...r\stalker Тени Чернобыля\gamedata\scripts\sak.script:8: attempt to index local 'actor' (a nil value)
Потом закоммент. строку с функцией, все равно тот же вылет. Что не так?
Изменено пользователем Outfater

 

 

 

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

@Outfater, так правильно, ты вшил одну функцию в другую. Вынеси в отдельный скрипт и всё.


Товарищ, Struck, если я где-то накосячил или обидел тебя извини, но не надо под каждым моим постом ставить "Не нравится". Если не согласен с моим вариантом, напиши свой. 

  • Не нравится 1

svarog2741.gif

 

НС - шлак, солянки - шлак.

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

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

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

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

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

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

Войти

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

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

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