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

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

Тема для обсуждения скриптов всего и всех в серии игр 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/

@losiara, у меня нет исходников 1.0004, но думаю, этот код не менялся. Судя по вылету, что-то запросило информацию о группировке из строки communities, которой там нет. Т.е. в communities указано меньше группировок.

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

Товарищи скриптеры, прошу помощи.

 

1. Как вообще отключить системный респавн в чистом ТЧ?

2. Правильно ли я понимаю, что респавн вызывается ТОЛЬКО из smart_terrain.script в функции se_smart_terrain:call_respawn()?

3. И достаточно ли для отключения респавна полностью закомментировать строку se_respawn.spawn( self.gparams.respawn )?

 

Просьба знающих ответить по пунктам.

1. se_respawn.script:

-- Обновление в офлайне

function se_respawn:update()

cse_alife_smart_zone.update( self )

--'printf("RESPAWN: [%s] se_respawn update_offline", tostring(self:name()))

self:execute()

end

Здесь с этим можно что-нибудь сделать.

 

2. нет, неправильно. Это заполнение синих ящиков патронами от пм и воткой.

 

3. недостаточно.

  • Спасибо 1

Dennis_Chikin, в каком-то уроке видел вызов респавнера из рестриктора:

 

%=respawner_spawn(имя респавнера)% - соответственно, функция из xr_effects.script, которая как раз и вызывает se_respawn.spawn. Выходит, урок неправильный? (Сейчас проверить не могу, ибо на работе).

 

Тогда выходит надо комментировать все вызовы функций se_respawn:execute, se_respawn:update, se_respawn:update_online в se_respawn.script?

 

П.С. Тогда верно ли, что респавн вызывается из bind_respawn.script, строчкой  self.se_respawn:update_online()? И достаточно ее закомментировать для того, чтобы системный респавн не вызывался вообще?

 

 

Мне собственно что нужно: полностью вырубить системный респавн НПС и мутов, но оставить возможность вызова конкретного респавнера скриптово в необходимый момент времени.

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

bind_respawn.script - это при заходе на локацию.

xr_effects.script - это если вызывается еще откуда-то (из непися, дверей, ворон и прочих лампочек).

 

соответственно, убираешь то, что тебе не нужно, и оставляешь то, что нужно.

 


 

Что-то я переутомился, что-ли...

	self.dir1 = npc:direction()
	local npc_pos = npc:position()
	local n = 1

	local lvid1, pos
	local dir = self.dir1
	for i = r1, r1 + 10, 2 do
		lvid1 = level.vertex_in_direction( npc_pos, dir, i )

		if lvid1 ~= npc_lvid then
			pos = level.vertex_position( lvid1 )

			log( "info", "r1: %s, i: %s, lvid: %s, dist: %s", r1, i, lvid1,
				pos:distance_to( npc_pos ) )
	end	end
r1: 7.8898077011108, i: 7.8898077011108, lvid: 43, dist: 229.41188049316

r1: 7.8898077011108, i: 9.8898077011108, lvid: 43, dist: 229.41188049316

r1: 7.8898077011108, i: 11.889807701111, lvid: 43, dist: 229.41188049316

r1: 7.8898077011108, i: 13.889807701111, lvid: 43, dist: 229.41188049316

r1: 7.8898077011108, i: 15.889807701111, lvid: 43, dist: 229.41188049316

r1: 7.8898077011108, i: 17.889808654785, lvid: 43, dist: 229.41188049316

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

 

 

Что-то я переутомился, что-ли...

 

 

что за проверка

 

if lvid1 ~= npc_lvid then

 

параметр npc_lvid это npc:level_vertex_id()?

Да. А есть разница ?

Мне нужно, банально, какой-нибудь вертекс там, куда смотрит непись. Не прямо под носом, и не очень далеко. Любой, блин.

Вертекс, который в 300 метрах сзади непися - это что-то явное не то.

 

upd: однако, и вправду переутомился.

в vertex_in_direction() должна быть не позиция, а npc_lvid.

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

не совсем понял использование lvid1 = level.vertex_in_direction( npc_pos, dir, i )

 

npc_pos - должен быть npc:level_vertex_id()

 

dir - заменяет вектор

 

i - это радиус в пределах которого будет двигаться нпс.


т.е npc_pos и дожен стать точкой куда двинется нпс.

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

 

 

level.vertex_in_direction( npc_pos, dir, i )

 

Т.е. получается, что

level.vertex_in_direction( npc_pos, dir, 17 )

возвращает вертекс на расстоянии 229 метров? Чудеса.


 

 

lvid1 = level.vertex_in_direction( npc_pos, dir, i )

 

Только сейчас обратил внимание. Почему npc_pos? Тут нет ошибки? Разве первый параметр не должен быть вертекс, а не позиция?

 

 

bind_respawn.script - это при заходе на локацию.

Так все-таки я так и не въехал до конца. Что и где конкретно надо закомментить, чтобы отрубить системный респавн? Если нетрудно, разжуй пожалуйста :)

Только сейчас обратил внимание.

Ага, видимо, холода на всех действуют...

 

системный респавн

если именно регулярный, который в локациях где актора сейчас нет - тогда self:execute()

в se_respawn:update()

 


npc:accessible_nearest() в каком случае 1 возвращает ? -1 я уже видел, nil - тоже. Что у него еще припасено ?

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

 

 

если именно регулярный, который в локациях где актора сейчас нет

А есть и другой? Под системным респавном я всегда подразумевал стандартный респ НПС и мобов.

Поднял один вопрос о выполнении скриптов в игре без паузы, в связи со срочностью дам здесь ссылку на вопрос: http://www.amk-team.ru/forum/topic/5525-soc-kovyriaemsia-v-fajlakh/?p=1062559

Очень нужна помощь. Спасибо.

 

Гм. Чем дальше в лес, тем толще партизаны...

lvid1 = level.vertex_in_direction( npc_lvid, self.dir[1], i )

С разных исходных позиций:

targets[1], r1,i: 9.4276762008667,9.4276762008667, lvid: 29341, dist: 0.65685898065567

targets[1], r1,i: 9.0319900512695,9.0319900512695, lvid: 30935, dist: 9.6079540252686

targets[1], r1,i: 9.4302082061768,9.4302082061768, lvid: 31782, dist: 0.99326068162918

 

Какой смысл задавать ему расстояния ?

А есть и другой? Под системным респавном я всегда подразумевал стандартный респ НПС и мобов.

Все-таки это погода.

Есть и другой.

 

bind_respawn.script

Как видно из когда, работает только на текущей локации. Где se_respawn:update() не работает. Делает

function respawn_binder:update( delta )
	object_binder.update( self, delta )
	self.se_respawn:update_online()
end
Есть еще xr_effects.script - когда кто-то где-то прописал что-нибудь типа %respawner_spawn(что:попало)%
  • Спасибо 1

@MJRamon, создай файл dik_hot_key.script . В нем напиши:

 

 

local con = nil -- переменная для объекта консоли
local con_command = "mm_net_player_name" -- консольная команда
local def_value = "_" -- значение по умолчанию - символ подчеркивания

function update()
    if not con then -- инициализируем схему
        con = get_console() -- кешируем консоль
        con:execute( con_command .." ".. def_value ) -- инициализируем дефотлным значением, т.к. кнопка не нажата
        for k,v in pairs(_G[script_name()]) do -- перебираем функции в текущем файле
             -- v это функция     и её имя является кодом клавиши
            if type(v)=='function' and DIK_keys[string.upper(k)] then
                local key = "k"..string.gsub(k,"dik_","") -- формируем ключ и
                con:execute("bind_console "..con_command.." "..k.." "..key) -- биндим кнопку на него
            end
        end
    else
        -- получаем из консоли значение параметра для нашей команды
        local str = con:get_string(con_command)
        -- если оно не является значением по умолчанию
        -- и в этом файле есть функция с таким именем, то выполняем её
        if str~=def_value and this[str] then
            this[str]()
            con:execute(con_command.." "..def_value) -- записываем значение по умолчанию
        end
    end


end

function dik_numpad0()
news_manager.send_tip(db.actor,"нажали кнопку numpad0")
end

function dik_numpad1()
news_manager.send_tip(db.actor,"нажали кнопку numpad1")
end

function dik_numpad2()
news_manager.send_tip(db.actor,"нажали кнопку numpad2")
end

 

 

 

Далее зайди в bind_stalker.script и найди строчку "function actor_binder:update(delta)". Внутри этой функции вызови твою функцию  dik_hot_key.update()

@MJRamon, создай файл dik_hot_key.script . В нем напиши:

Спасибо. Файл скрипта никак подключать не нужно? Файл запрашивается вызовом одноименной функции?

И еще - где взять полный список обозначения клавиш, и можно ли использовать комбинации? 

Изменено пользователем Eugen81
Не нужно полностью цитировать посты.

 

 

Какой смысл задавать ему расстояния ?

 

Не понятно, что именно тебя удивляет? Насколько я понимаю, vertex_in_direction() возвращает самый ближний, валидный, вертекс к той точке, которая находится на запрашиваемом расстоянии от переданного вертекса и в указанном направлении. Если с разных исходных позиций - это значит передача первым параметром разных вертексов, то закономерно, что и результат возвращается разный. Или ты что-то другое имел ввиду?

@MJRamon, Достаточно положить файл  dik_hot_key.script в папку gamedata\scripts и вызвать его в bind_stalker.script.

Полный список(из lua_help.script):

 

 

    const DIK_0 = 11;
    const DIK_1 = 2;
    const DIK_2 = 3;
    const DIK_3 = 4;
    const DIK_4 = 5;
    const DIK_5 = 6;
    const DIK_6 = 7;
    const DIK_7 = 8;
    const DIK_8 = 9;
    const DIK_9 = 10;
    const DIK_A = 30;
    const DIK_ADD = 78;
    const DIK_APOSTROPHE = 40;
    const DIK_APPS = 221;
    const DIK_AT = 145;
    const DIK_AX = 150;
    const DIK_B = 48;
    const DIK_BACK = 14;
    const DIK_BACKSLASH = 43;
    const DIK_C = 46;
    const DIK_CAPITAL = 58;
    const DIK_CIRCUMFLEX = 144;
    const DIK_COLON = 146;
    const DIK_COMMA = 51;
    const DIK_CONVERT = 121;
    const DIK_D = 32;
    const DIK_DECIMAL = 83;
    const DIK_DELETE = 211;
    const DIK_DIVIDE = 181;
    const DIK_DOWN = 208;
    const DIK_E = 18;
    const DIK_END = 207;
    const DIK_EQUALS = 13;
    const DIK_ESCAPE = 1;
    const DIK_F = 33;
    const DIK_F1 = 59;
    const DIK_F10 = 68;
    const DIK_F11 = 87;
    const DIK_F12 = 88;
    const DIK_F13 = 100;
    const DIK_F14 = 101;
    const DIK_F15 = 102;
    const DIK_F2 = 60;
    const DIK_F3 = 61;
    const DIK_F4 = 62;
    const DIK_F5 = 63;
    const DIK_F6 = 64;
    const DIK_F7 = 65;
    const DIK_F8 = 66;
    const DIK_F9 = 67;
    const DIK_G = 34;
    const DIK_GRAVE = 41;
    const DIK_H = 35;
    const DIK_HOME = 199;
    const DIK_I = 23;
    const DIK_INSERT = 210;
    const DIK_J = 36;
    const DIK_K = 37;
    const DIK_KANA = 112;
    const DIK_KANJI = 148;
    const DIK_L = 38;
    const DIK_LBRACKET = 26;
    const DIK_LCONTROL = 29;
    const DIK_LEFT = 203;
    const DIK_LMENU = 56;
    const DIK_LSHIFT = 42;
    const DIK_LWIN = 219;
    const DIK_M = 50;
    const DIK_MINUS = 12;
    const DIK_MULTIPLY = 55;
    const DIK_N = 49;
    const DIK_NEXT = 209;
    const DIK_NOCONVERT = 123;
    const DIK_NUMLOCK = 69;
    const DIK_NUMPAD0 = 82;
    const DIK_NUMPAD1 = 79;
    const DIK_NUMPAD2 = 80;
    const DIK_NUMPAD3 = 81;
    const DIK_NUMPAD4 = 75;
    const DIK_NUMPAD5 = 76;
    const DIK_NUMPAD6 = 77;
    const DIK_NUMPAD7 = 71;
    const DIK_NUMPAD8 = 72;
    const DIK_NUMPAD9 = 73;
    const DIK_NUMPADCOMMA = 179;
    const DIK_NUMPADENTER = 156;
    const DIK_NUMPADEQUALS = 141;
    const DIK_O = 24;
    const DIK_P = 25;
    const DIK_PAUSE = 197;
    const DIK_PERIOD = 52;
    const DIK_PRIOR = 201;
    const DIK_Q = 16;
    const DIK_R = 19;
    const DIK_RBRACKET = 27;
    const DIK_RCONTROL = 157;
    const DIK_RETURN = 28;
    const DIK_RIGHT = 205;
    const DIK_RMENU = 184;
    const DIK_RSHIFT = 54;
    const DIK_RWIN = 220;
    const DIK_S = 31;
    const DIK_SCROLL = 70;
    const DIK_SEMICOLON = 39;
    const DIK_SLASH = 53;
    const DIK_SPACE = 57;
    const DIK_STOP = 149;
    const DIK_SUBTRACT = 74;
    const DIK_SYSRQ = 183;
    const DIK_T = 20;
    const DIK_TAB = 15;
    const DIK_U = 22;
    const DIK_UNDERLINE = 147;
    const DIK_UNLABELED = 151;
    const DIK_UP = 200;
    const DIK_V = 47;
    const DIK_W = 17;
    const DIK_X = 45;
    const DIK_Y = 21;
    const DIK_YEN = 125;
    const DIK_Z = 44;
    const MOUSE_1 = 256;
    const MOUSE_2 = 512;
    const MOUSE_3 = 1024;

 

 

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

 

 

Не понятно, что именно тебя удивляет? Насколько я понимаю, vertex_in_direction() возвращает самый ближний, валидный, вертекс к той точке, которая находится на запрашиваемом расстоянии от переданного вертекса

 

Вот так и не понял: ближний к той, или ближний к этой. То одно, то другое. Вот что мне делать, чтобы получить который не ближе 10, но не дальше 20 метров оттуда, откуда смотрим ? С горя уже начал пробовать высчитать координаты "руками", а потом попросить ближайший доступный. Так и там - то -1, то nil, то 1 откуда-то лезет.

@MJRamon, Достаточно положить файл  dik_hot_key.script в папку gamedata\scripts и вызвать его в bind_stalker.script.

Спасибо, все прекрасно работает. Однако в итоге вся глобальная идея, которая могла бы оказаться отличным зрелищем, провалилась :(

Дело в том, что все это нужно для стримов, где зритель мог влиять на события: используя программу RutonyChat я отправляю команду на нажатие клавиши в игре. Вот только нажатие клавиш подобным образом срабатывает в любом другом приложении, но не в окне Сталкера. Печально, очень печально.

Изменено пользователем Eugen81
Добавлено Eugen81,

Правила цитирования.

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

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

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

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

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

Войти

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

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

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