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

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

Тема для обсуждения скриптов всего и всех в серии игр 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
Ссылка на комментарий
https://www.amk-team.ru/forum/topic/6185-skriptovanie/

Вешать на циклическую проверку в апдейте, и ждать, когда этот самый local repair_kit = db.actor:object("repair_kit_weapon") появится.

 

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

local tasks_list = {}	-- имя, группа( 50, 200, 1000, 5000 ), функция --

local t50, t200, t1000, t5000 = {}, {}, {}, {}		-- группы { строка для wathdog, функция }
local t50n, t200n, t1000n, t5000n = 0, 0, 0, 0		-- функций в группе
local t50i, t200i, t1000i, t5000i = 1, 1, 1, 1		-- текущая функция в группе
local t50t, t200t, t1000t, t5000t = 0, 0, 0, 0		-- время следующего обновления
local t50q, t200q, t1000q, t5000q = 50, 200, 1000, 5000	-- через сколько обновлять


function task_add( tname, tgroup, f )
	if ( tgroup or 200 ) == 200 then t200n = t200n + 1; table_insert( t200, { f, tname } )
	elseif tgroup == 1000 then t1000n = t1000n + 1; table_insert( t1000, { f, tname } )
	elseif tgroup == 5000 then t5000n = t5000n + 1; table_insert( t5000, { f, tname } )
	elseif tgroup == 50 then t50n = t50n + 1; table_insert( t50, { f, tname } )
	end
end

function task_del( tname, tgroup )
	-- log( "info", "task_delete, task: [%s], gp: %s", tname, ( tgroup or "any" ) )
	if tgroup or 200 == 200 then
		for i = 1, t200n do
			if t200[i][2] == tname then
				t200n = t200n - 1; table_remove( t200, i ); return
	end	end	end
	if tgroup or 1000 == 1000 then
		for i = 1, t1000n do
			if t1000[i][2] == tname then
				t1000n = t1000n - 1; table_remove( t1000, i ); return
	end	end	end
	if tgroup or 5000 == 5000 then
		for i = 1, t5000n do
			if t5000[i][2] == tname then
				t5000n = t5000n - 1; table_remove( t5000, i ); return
	end	end	end
	for i = 1, t50n do
		if t50[i][2] == tname then t50n = t50n - 1; table_remove( t50, i ) end
	end
end

и

function actor_binder:update( delta )
...
	if t200i == 0 then	-- ни чем не заняты ?
		if global_time_ms >= t200t then t200t, t200i = global_time_ms + t200q, 1
			-- kostri_update()	-- используем этот цикл под что-нибудь полезное
		end
	else
		gp_fn =  t200[t200i]	-- выполняем последовательно что там еще есть
		if gp_fn then t200i, amk.oau_watchdog = t200i + 1, gp_fn[2]; gp_fn[1]()
		else t200i = 0		-- и используем остаток

	end	end

 

Блин ничего не понял :P , я в скриптах просто не очень шарю пока. Завтра попробую разобраться если смогу.

А чё за global_time_ms?

Expression : fatal error

Function : CScriptEngine::lua_error
File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
Line : 73
Description :
Arguments : LUA error: ...e.r. - hardcore\gamedata\scripts\bind_stalker.script:204: attempt to perform arithmetic on global 'global_time_ms' (a nil value)

 

Таймер вроде как работает т.к. при изменении global_time_ms на time_global() не вылетает, но тайм глобал в минутах или как? Я написал 20 и в итоге ждать пришлось, так и не дождался. А что такое global_time_ms игра получается не знает.

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

А это чтобы 2 раза не вставать.

local global_time_ms = time_global(), ну или типа того...

 

Проверок-то 4 штуки, на 50, 200, 1000 и 5000ms, да и внутри не по разу используется.

У меня почемуто через тайм_глобал не работает) Я сделал так:

local need_to_repair_weapon = nil

local repairconditionfornew = 0
local repairprocess = 0

 

function actor_binder:use_obj(obj)
if obj:section()=="repair_kit_weapon" then
repairconditionfornew = obj:condition()
alife():create("repair_kit_weapon",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
need_to_repair_weapon = 20
repairprocess = 1
end
end

 

if repairprocess==1 then
need_to_repair_weapon = need_to_repair_weapon-1
if need_to_repair_weapon<1 then
hm_repair.action_repair(repairconditionfornew)
need_to_repair_weapon = 0
repairprocess = 0
end
end

 



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

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

Блин решил попробовать сделать ремкомплект оружием которое нельзя поместить в слот и который используется на K, но как его использовать на К? Видел в солянке ДМХ были как в зп так называемые ГОРЯЧИЕ КЛАВИШИ на юз аптеки консервы антирада и бинта вроде на F1-F4, вот мне также надо только с ремкомплектом. Почитал про назначение скриптам горячих кнопок там походу только через меню работать будет, да и не понятно даже что надо писать что не надо. Написал в актор_биндер.апдейт:

if DIK_keys.DIK_K==1 then
	if db.actor:object("repair_kit_weapon") then
		hm_repair.action_repair()
	end
end

в итоге когда я достаю оружие у меня треск потому что сразу автоматом срабатывает ремкомплект как будто я нажимаю постоянно К. Может объясните что как писать прально )

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

Почитал про назначение скриптам горячих кнопок там походу только через меню работать будет, да и не понятно даже что надо писать что не надо.

Не то, видать, читал. Почитай это: Назначение скриптам горячих кнопок. Часть 3.

А по поводу состояния предмета - если он у тебя на классе антирада, то помимо скриптового "obj:set_condition...", нужно писать кондишен в объект через нет_пэкет,

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

Я не умею нет-пакеты юзать, но спасибо по статье сделал работает, но вот только не мог бы ты обьяснить что из этого надо а что нет? Тут просто не очень хорошие пояснения, мне бы лишнее убрать если оно тут есть.

@Full Noob, лишнего в статье нет ничего. Если тебе нужно только нажатия отлавливать, делай по первому варианту - и всё.

Заранее извиняюсь, если было - ткните куда копать. Как скриптово узнать, что открыта вкладка КПК "Карта"? Дано: прикручиваю к своей сборке установку своих меток на карте в КПК из адддона Shadows'а 0.6 к РМА... Так вот, всё работает, но эти кнопки установки-удаления меток рисуются поверх всех окон и вкладок КПК... Ранее уже сталкивался с подобным, решения не нашёл. Заранее спасибо всем.

@Капрал Хикс, вроде при открытии каждой вкладки выдается свой поршень, но вот где именно и с правками ли движка - не знаю.

  • Нравится 1

Ребята, подскажите, если знаете:

Как скриптово реализовать отключения звука (чтоб вообще тишина была)?

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

 

 

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

Вот у меня тут вопросик опять по ремкомплекту возник: как отрисовать на худе что-либо? Мне нужно отрисовать на худе иконку ремкомплекта и его состояние(если он имеется в наличии). Возомжно ли это? Просто он у меня будет спрятан в слоте 4 и посмотреть состояние можно будет только в ящике т.к по непонятной причине если самому запихнуть предмет из инвентаря в слот 4 то игра вылетает без лога, что не даёт просто возвращать его в рюкзак на юзе. Из за этого и пришлось ему юз на K прикручивать.

Рано я возрадовался... Все инфопоршни вкладок в КПК, кроме ui_pda, не работают. Похоже, без движковых правок тут всё же не обойтись. А жаль...

Поставить лог на actor_binder:info_callback(), и посмотреть, что реально когда выдается.

Проверил через мобилу модмейкера от Singapur22 выдачу нужного мне поршня ui_pda_map_global - не выдаётся он. ui_pda - выдаётся исправно, тот нет. P.S. В Shadows Addon кнопки меток кстати тоже поверх всех вкладок и окон висят.

! Cannot find saved game ~ z_mod: Инициализация z_uprising...

! Cannot find saved game ~ z_uprising: передали предустановки.
! Cannot find saved game ~ z_mod:on_item_take: поимели detector_simple
! Cannot find saved game ~ z_mod:on_item_take: поимели device_torch
! Cannot find saved game ~ z_mod:on_item_take: поимели novice_outfit
! Cannot find saved game ~ z_mod:on_item_take: поимели wpn_binoc
! Cannot find saved game ~ z_mod:on_item_take: поимели device_pda
! Cannot find saved game ~ z_uprising: ЛОГирование ВКЛючено.
! Cannot find saved game ~ z_uprising: ОК!
! Cannot find saved game ~ z_mod:on_info: инфопорш esc_kill_gunslinger
! Cannot find saved game ~ z_mod:on_info: инфопорш storyline_actor_start
! Cannot find saved game ~ z_mod:on_info: инфопорш global_dialogs
! Cannot find saved game ~ z_mod:on_info: инфопорш level_changer_icons
! Cannot find saved game ~ z_mod:on_item_take: поимели bolt
Intro start 8633
* MEMORY USAGE: 311336 K
! Cannot find saved game ~ z_mod:on_info: инфопорш esc_trader_hello_played
! Cannot find saved game ~ z_mod:on_info: инфопорш ui_talk
! Cannot find saved game ~ z_mod:on_info: инфопорш ui_trade_hide
! Cannot find saved game ~ z_mod:on_info: инфопорш esc_trader_experienced
! Cannot find saved game ~ z_mod:on_info: инфопорш esc_trader_tutorial_chosen
! Cannot find saved game ~ z_mod:on_info: инфопорш esc_trader_can_leave
! Cannot find saved game ~ z_mod:on_info: инфопорш tutorial_wounded_start
! Cannot find saved game ~ z_mod:on_info: инфопорш ui_talk_hide
! Cannot find saved game ~ z_mod:on_info: инфопорш ui_trade
! Cannot find saved game ~ z_mod:on_info: инфопорш ui_talk
! Cannot find saved game ~ z_mod:on_info: инфопорш ui_trade_hide
! Cannot find saved game ~ z_mod:on_info: инфопорш ui_car_body
! Cannot find saved game ~ z_mod:on_info: инфопорш ui_car_body_hide
- Disconnect
! Cannot find saved game ~ z_mod:on_item_drop: дропнули bolt
! Cannot find saved game ~ z_mod:on_item_drop: дропнули device_pda
! Cannot find saved game ~ z_mod:on_item_drop: дропнули wpn_binoc
! Cannot find saved game ~ z_mod:on_item_drop: дропнули novice_outfit
! Cannot find saved game ~ z_mod:on_item_drop: дропнули device_torch
! Cannot find saved game ~ z_mod:on_item_drop: дропнули detector_simple
- Destroying level

 

 

+

! Cannot find saved game ~ z_mod:on_info: инфопорш ui_pda
! Cannot find saved game ~ z_mod:on_info: инфопорш ui_pda_events
! Cannot find saved game ~ z_mod:on_info: инфопорш ui_pda_contacts
! Cannot find saved game ~ z_mod:on_info: инфопорш ui_pda_ranking
! Cannot find saved game ~ z_mod:on_info: инфопорш ui_pda_actor_info
! Cannot find saved game ~ z_mod:on_info: инфопорш ui_pda_encyclopedia
! Cannot find saved game ~ z_mod:on_info: инфопорш ui_pda_hide
 

@Капрал Хикс, кстати, да. Через раз появляются.


! Cannot find saved game ~ z_mod:on_info: инфопорш ui_pda_map_local ещё.
Похоже, или только первый раз срабатывают. Или - по времени. Но явно - не получится нормально отслеживать и использовать.

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

Похоже, или только первый раз срабатывают. Или - по времени. Но явно - не получится нормально отслеживать и использовать.

Выдается только в первый раз потому, что в последующие разы она уже есть у ГГ. Можно при получении инфопорции дизейблить ее, тогда она будет выдаваться и во второй раз, и в третий. Или в декларацию инфопорций прописать дизейбл остальных.
  • Нравится 1

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

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

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

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

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

Войти

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

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

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