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

Внимание. На форуме проводятся технические работы с боковым меню.

_Val_ _Val_

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

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

@Full Noob, 

level.client_spawn_manager():add(l_i_mod_repairkit.id, -1, mod_set_newkit_condition)

 

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

@Kirgudu, не помогло. Один фиг дебаговые сообщения о юзе предмета перестают появляться после использования комплекта.

12 часов назад, Full Noob сказал:

Методом тыка выяснил, что проблему вызывает колбэк на вход в онлайн комплекта:

Ну так выясняй дальше, у тебя в ф-ции кэллбэка всего 7 строк кода. Закомментил одну - проверил, и так пока не найдешь ошибку.

@AndreySol, не помогло. Я закомментил весь колбэк, но ничего не поменялось. Спасает только закомменчивание самой строчки "заведения" колбэка, но мне без него никак, так как при попытке сделать set_condition происходит краш:

Скрытый текст

[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...l.k.e.r\gamedata\scripts\secretsmod_functions.script:123: attempt to call method 'set_condition' (a nil value)

 

Изменено пользователем Full Noob
6 часов назад, Full Noob сказал:

так как при попытке сделать set_condition происходит краш:

А ты уверен что имеется такая экспортирования ф-ция: "set_condition"? 

@AndreySol, всмысле? Если ты имеешь в виду "а можно ли НЕ на оружии применить set_condition", то я отвечу: да, можно. Только что поменял запуск функции спавна открытого комплекта на простой obj:set_condition(0.5). Это сработало.

Если имелось в виду "можно ли получить condition НЕ оружия и перенести на другое НЕ оружие", то я уверен, что да (но это не точно). Но я попробовал написать так:

Скрытый текст

l_i_mod_repairkit = alife():create(t_s_sect, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
l_i_mod_repairkit:set_condition(0.5)

 

Результат можешь почитать в моём предыдущем посте.

Сильно пахнет маразмом. Появилась кое-какая мысль и я решил попробовать в конец колбэка на выход в онлайн дописать level.client_spawn_manager():remove(n_id,-1)

Получил довольно экзотический вылет:

Скрытый текст

stack trace:

0023:03C9D16A xrGame.dll
 
[error][     183]    : Невозможно создать файл, так как он уже существует.

 

Ещё эксперементировал с вторым ИД (который -1 сейчас). Пробовал и 0 и db.actor:id() (вроде что 0 что актор ид одинаковые насколько я знаю, но я так на всякий).

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

Всем добрый день. Вопрос по restriction_stock. Возможно ли к фиксированной InvMax добавлять числовые значения, полученные из функции через массив. Т.е имеем функцию проверки, одет ли костюм и если да, то какой. Отсюда находим кол-во дополнительного места для рюкзака и прибавляем к InvMax. Или же нужно оперировать в самой функции restriction_of_stock(ItemObj,Fix)?(Где я и застрял, т.к. при каждом вызове функции InvMax постоянно увеличивается). Моих знаний здесь не хватает... 

Здесь могла быть ваша реклама.

Здрасьте.

 

ТЧ 1.0006.

Есть мод с выводом статиков на HUD. Требуется поймать начало/конец катсцены и нажатие клавиш [Num +/-], чтобы временно скрыть статики. Как отследить указанные события? Может, есть проверка вроде hud_off() == true/false или отслеживание действия level.hide_indicators?

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

3 часа назад, Norman Eisenherz сказал:

Требуется поймать начало/конец катсцены

Любая кат-сцена откуда-то запускается, из логики какого-то объекта. Там и добавь скрытие индикаторов.

[COP] Мне нужно создать скрипт для поиска рандомного пустого смарта.Уже 3 неделю бъюсь. Помогите плз.

Всем привет. Есть функция, которая при нажатии на кнопку на gui начинает выполнять много других весёлых функций (с вероятностью 0,8 телепортировать актора в нужное место, после чего высчитывать вероятность, за сколько он до этого места "добрался"; с вероятностью 0,2 забрасывать его по другим координатам, где его ждут бандиты. Вдовесок - затемнение экрана, перемотка времени, сообщения о том, что актор добрался за N часов и т.п.

 

Практически всё работает хорошо, но, как говорится, есть нюанс: 
1) Иногда актора просто телепортирует в локацию (куда выставлена вероятность 0,8) без сообщения и без перемотки времени; 
2) Иногда эктора телепортирует в нужную локацию, но приходят два сообщения (например, "вы добрались за 2 часа" и "вы добрались за 3 часа") и время отматывается ажно на 5 часов вперёдт.

Вопрос: как это можно пофиксить? Я не ахти какой скриптер, так что, пожалуйста, подскажите, может, я что-то не дописал или ошибся в расчётах вероятности. Заранее спасибо!

 

Скрытый текст

function ui_map:button3_button_clicked()
if math.random(1,100) < 80 then
xr_effects.teleport_actor(nil, nil, {"way_to_f","look_to_f"})
level.add_pp_effector("black.ppe", 150, false)
if math.random(1,10) <= 3 then
news_manager.send_tip(db.actor, "arrived_to_farm_1_hour", 0, "default", 5000)
xr_effects.forward_game_time(nil, nil, {1}) 
end
if math.random(1,10) < 6 then
news_manager.send_tip(db.actor, "arrived_to_farm_2_hour", 0, "default", 5000)
xr_effects.forward_game_time(nil, nil, {2}) 
end
if math.random(1,10) >= 6 then
news_manager.send_tip(db.actor, "arrived_to_farm_3_hour", 0, "default", 5000)
xr_effects.forward_game_time(nil, nil, {3}) 
end
else
xr_effects.teleport_actor(nil, nil, {"random_event_vodokachka_way","random_event_vodokachka_look"})
news_manager.send_tip(db.actor, "arrived_to_vodokachka", 0, "default", 5000)
level.add_pp_effector("black.ppe", 150, false)
xr_effects.forward_game_time(nil, nil, {4})
end
self:HideDialog()
end

 

3 hours ago, Дмитрий Зверев said:

1) Иногда актора просто телепортирует в локацию (куда выставлена вероятность 0,8) без сообщения и без перемотки времени; 

Это потому что все 3 условия для сообщения отдельно вычисляют "вероятность". Може так выйти что не одно не сработает.

3 hours ago, Дмитрий Зверев said:

2) Иногда эктора телепортирует в нужную локацию, но приходят два сообщения (например, "вы добрались за 2 часа" и "вы добрались за 3 часа") и время отматывается ажно на 5 часов вперёдт.

А это уже потому что с таким кодом может сработать больше одного условия для сообщения.

 

Исправленный пример:

Spoiler

function ui_map:button3_button_clicked()
	if math.random(1,100) < 80 then
		xr_effects.teleport_actor(nil, nil, {"way_to_f","look_to_f"})
		level.add_pp_effector("black.ppe", 150, false)

		local rnd = math.random(1,10)	-- считаем "вероятность" один раз

		if rnd <= 3 then
		news_manager.send_tip(db.actor, "arrived_to_farm_1_hour", 0, "default", 5000)
		xr_effects.forward_game_time(nil, nil, {1}) 
		elseif rnd < 6 then
		news_manager.send_tip(db.actor, "arrived_to_farm_2_hour", 0, "default", 5000)
		xr_effects.forward_game_time(nil, nil, {2}) 
		elseif rnd >= 6 then
		news_manager.send_tip(db.actor, "arrived_to_farm_3_hour", 0, "default", 5000)
		xr_effects.forward_game_time(nil, nil, {3}) 
		end

	else
		xr_effects.teleport_actor(nil, nil, {"random_event_vodokachka_way","random_event_vodokachka_look"})
		news_manager.send_tip(db.actor, "arrived_to_vodokachka", 0, "default", 5000)
		level.add_pp_effector("black.ppe", 150, false)
		xr_effects.forward_game_time(nil, nil, {4})
	end

	self:HideDialog()
end

 

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

Мужики! Вот, проигрывается , для примера, любой звук:

local path = "characters_voice\\human_03\\stalker\\talk\\labux\\labux_28" -- string
local so = sound_object( path ) -- userdata
local pso = so:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) -- nil

ВОПРОС: как узнать, что этот звук в данный момент проигрывается и остановить его принудительно?

Что-то типа -->

если звук SO сейчас проигрывается то ОСТАНОВИТЬ проигрывание

Типа такого, но так, естественно, не работает...

if so:playing() then so:stop() end

 

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

@Баба ЯГА, 

local pso = so:play(db.actor, 0, sound_object.s2d)
if pso:playing() then pso:stop() end

 

  • Согласен 1
  • Полезно 1

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

2 часа назад, Kirgudu сказал:

@Баба ЯГА, 

local pso = so:play(db.actor, 0, sound_object.s2d) if pso:playing() then pso:stop() end


local pso = so:play(db.actor, 0, sound_object.s2d)
if pso:playing() then pso:stop() end

 

не пойдёт, pso возвращает nil , увы. Я написал это в первом своём посте, так не будет работать.

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

9 часов назад, Баба ЯГА сказал:

Я написал это в первом своём посте, так не будет работать.

В твоем посте и у Kirgudu вызываются разные методы для проигрывания звука. Как написал Kirgudu, должно работать.

  • Спасибо 1
4 часа назад, abramcumner сказал:

В твоем посте и у Kirgudu вызываются разные методы для проигрывания звука. Как написал Kirgudu, должно работать.

Да, ты прав, прошу прощения, я не заметил что в моём случае play_no_feedback, а в его - play. В любом случае, проблема решена ещё вчера двумя разными способа. Всем спасибо! Вопрос снимается.

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

Господа, время доброго!

У меня вот какой интересный вопросец. У меня реализован скрипт, читающий нетпакеты всех НПС, после чего имена всех мне интересующих записываются в таблицу:

Скрытый текст

for i = 1, 65535 do
		local sobj = alife():object(i)
		if (sobj) and IsNpcStalker(sobj) then --отсеиваем все объекты кроме интересующих:нейтралы, свобода, долг 
		local pk = get_netpk(sobj) --рабоатем с нетпакетом объекта
			if pk and pk:isOk() 
			then
				local data = pk:get() --тягаем нетпакет
				local charname = data.character_name --получаем имя объекта
				table.insert(tab,charname) --пишем имя в таблицу tab
			end	
		end
	end
end

 

Далее с разными целями я использую рандомные имена существующих НПС из таблицы следующим образом: 

Скрытый текст

function name_npc()
return tab[math.random(#tab)]
end

 

И вот какой у меня вопрос: каким образом в таблицу одновременно с именем_кличкой НПС записывать его Id? А после каким образом можно через функцию "name_npc()" прочитать только одну из двух переменных?

Таким образом я хочу реализовать фишку, что когда приходило бы сообщение в сталкерскую сеть от нпс: 

amk.send_tip("тело сообщения", testt.name_npc(), время, 15, "common_channel")

, то у этого НПС отнималось определенное кол-во денег, за СМС.

 

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

@_Sk8_AsTeR_, 

Скрытый текст

table.insert(tab, {id = sobj.id, name = data.character_name}) -- пишем id и имя в таблицу tab

function get_npc()
	return tab[math.random(#tab)]
end

local npc = testt.get_npc()
amk.send_tip("тело сообщения", npc.name, время, 15, "common_channel")
-- аналогично добавляем отъём денег по npc.id

 

 

  • Спасибо 1
  • Нравится 2

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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

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

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

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

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

Войти

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

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

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