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

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

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

@Norman Eisenherz если важно получить время, то скорее всего без правок движка никак. Или хотя бы расширить кастрированные луашные пространства имен ("лайтовые правки движка") - io, os и т.д. Вроде давно были эти библиотеки внедренные в xrLua.dll или проброшенные туда, без правки основного движка (xrGame.dll, .exe etc). Суть наводки - может быть можно будет получить текущее время системы в мс и уже это ловить на сталкерском апдейте вместо time_global().

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

Вопрос, как повесить функцию на взрыв гранаты (платформа ЗП, граната Ф-1 или РГД-5).  Например кидаем гранату и после взрыва используется аптечка (антирад, еда) или в месте взрыва появляется какой-нибудь предмет (мутант)?     

Или повесить функцию на исчезновение болта (после того как кинем, болт исчезает и на его месте пояляется предмет или используется предмет из инвентаря.

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

Есть мод на умное выпадение частей монстров, если в кость запчасти попала пуля, часть не выдаётся. Так вот там кости учитываются по номерам. Вопрос - где номера эти костей в моделях смотреть? Как эта нумерация высчитывается?

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

@ted.80 , благодарю. Нашёл тулзу для просчёта, dump_ogf. Позволяет узнать всё о модели.

https://synthira.ru/load/drugie_igry/s_t_a_l_k_e_r/s_t_a_l_k_e_r_2/dump_ogf/24-1-0-3265

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

Как добавить в скрипт проверку, что в опциях игры нажата определённая кнопка-"флажок"? Сама кнопка в опциях "Игра" успешно добавлена, флажок работает.

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

[ТЧ 1.0006]
Задача: добавить субтитры к звуку "val_rob_guard_jeer" – угроза от охранника на ферме в ТД после покупки "гаусски за 800".

 

В [xr_meet] приветствия вычитываются по шаблону "расстояние | анимация@звук | …" – добавлять в логику действие %…% без правок скрипта бесполезно.
Попытался просто вывести название звука в сообщение в указанных ниже местах скрипта – никакой реакции.

 

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

 

[Edit] После перезапуска игры обработался вызов meet_manager.sound. Снимаю вопрос.

 

Spoiler
[xr_meet.script]
function action_meet_wait:execute ()
	
				xr_sound.set_sound(self.object, meet_manager.sound, nil, idle_timeout)
				sms(meet_manager.sound)				-- тут


function Cmeet_manager:update()
	
		self.state,self.sound = self.state_zone,self.sound_zone
	else
		self.state,self.sound = self:process_meet()
	end

	sms(self.sound)					-- тут

 

 

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

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

Шпаргалка

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

Снова нужна помошь, опять Новый Арсенал 7, соотв. ОГСР 2020г.
Мне нужно найти и удалить один предмет в инвентаре из нескольких одинаковых, когда делаю так:
 

local item, sil_items
		db.actor:iterate_ruck(
			function(dummy, item)
				if item.section == sil_sect then
					table.insert(sil_items, item:id())
				end
			end
		)
		if sil_items[1] ~= nil then 
			db.actor:mark_item_dropped(level.object_by_id(sil_items[1]))
			alife():release(alife():object(sil_items[1]))
		else
			return
		end

получаю ошибку вида "attempt to index a local sil_items (a nil value)"
Что я натворил не так?!

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

AMD FX-8100 (Bulldozer) , 28GB DDR3-1600, AFOX GeForce GTX1050Ti и нормально сталкерим в НА5.1, НА7, OGSE-0693, OGSR, НС2016, OLR, OFFLIFE, CoC, LADC, CoP Gunslinger, ShoC GA, Legend Return, Anomaly, CS OGSM!

Мозг состоит на 80 процентов из жидкости, и мало того, что она тормозная, так многим еще конкретно не долили...@Denikius136
Black_Raven.gif
 

Ссылка на комментарий
12 часов назад, Black_Raven_03 сказал:
local item, sil_items

 

Налицо ошибка объявления переменной. В таком виде движок ничего не знает о том, что sil_items - это таблица, и считает, что это простая переменная, значение по умолчанию которой - nil. Индексировать действительно нечего. Чтобы исправить ситуацию, достаточно в первой строке написать так:

12 часов назад, Black_Raven_03 сказал:
local item, sil_items = nil, {}

 

то есть присвоить начальные значения переменным явным образом.

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

@Black_Raven_03 При таких условиях можно прямо указать предмет:

local item = db.actor:object(sect)

if item then

   alife():release( alife():object( item:id() ) )

end

 

Перебор инвентаря пригодится при удалении нескольких предметов с одинаковой секцией.

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

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

Шпаргалка

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

@Norman Eisenherz , забыл написать (мой косяк) - размер-то таблицы меняется, при этом нужно будет (позже, когда с одним тестовым отработаю) удалять только часть (больше одного, но не все) серверных предметов для этой таблицы.
@Kirgudu , м-да, как ты и написал, мне с самого начала следовало явно проинициализировать переменные (хреново мои мозги поздно вечером работают).

  • Нравится 1
Скрытый текст

AMD FX-8100 (Bulldozer) , 28GB DDR3-1600, AFOX GeForce GTX1050Ti и нормально сталкерим в НА5.1, НА7, OGSE-0693, OGSR, НС2016, OLR, OFFLIFE, CoC, LADC, CoP Gunslinger, ShoC GA, Legend Return, Anomaly, CS OGSM!

Мозг состоит на 80 процентов из жидкости, и мало того, что она тормозная, так многим еще конкретно не долили...@Denikius136
Black_Raven.gif
 

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

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

Смотрел скрипты чн с мини игрой, так и не понял как там отслеживается смерть вороны.

Хочу сделать что-то наподобие достижения, гг убил 50 ворон.

«Если долго мучиться, что-нибудь получится»
Охотник за артефактами|Crow Game Killer
img.php?nick=Pavel2000&sert=2&text=t0

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

@Pavel_2000 в ЧН и ЗП колбэк bind_crow.crow_binder:death_callback вполне себе работает.
В ТЧ - наверное, подключать примерно аналогичный биндер.

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

Всем привет.
Решил для себя изучить модели поведения персонажей.
В качестве эксперимента, была выбрана доработка существующего скрипта xr_kamp.
Идея: NPC во время дождя должны перемещаться в укрытие, а не сидеть пятой точкой в грязи; при этом, если дождь слабый, они двигаются в укрытие пешком, а если сильный - бегом. Все, как у людей, в общем.
Добавил оператор, эвалуатор: пока оператор пустой, корректно отрабатывает переключение со схемы на схему.
Стоило добавить в оператор логику смены положения - нпс начали втыкать: просто встают, стоят и смотрят в одну точку; более того - переключение схем не происходит.
Предваряя вопросы: укрытие возвращается корректно, не nil, lvid выводится корректно.

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

Код:
 

-- Персонаж бежит в укрытие, если начался дождь
class "action_move_to_cover" (action_base)

function action_move_to_cover:__init (npc_name,action_name,storage) super (nil,action_name)
  self.a = storage
end

function action_move_to_cover:initialize()
  action_base.initialize(self)
  
  -- Эти строки во всех схемах
  self.object:set_desired_position()
  self.object:set_desired_direction()

  -- Очищаю анимации жратвы и бряцанья на гитаре (как минимум, надеюсь, что корректно очищаются)
  self.object:clear_animations()
  
  -- Разрешаю движение
  self.object:movement_enabled(true)
  
  -- Двигаться линейно
  self.object:set_detail_path(move.line)
  
  -- не знаю, что это, во всех схемах есть
  self.object:set_path_type(game_object.level_path)  
  
  -- Меняю состояние тела на бегущее (мб, неправильно?)
  self.object:set_body_state(move.run) 
  
  -- Тип движения - бег (пока идет отладка, позже планировал добавить и шаг)
  self.object:set_movement_type(move.run)  
  
  -- Бежит спокойно, без паники
  self.object:set_mental_state(anim.free)  
  
  -- не знаю, что это, на разных форумах по AI рекомендовано, не знаю - нужно ли тут
  self.object:remove_all_restrictions()
  
  -- Запрещаю нпс издавать звуки и вступать в диалог с ГГ
  xr_sound.set_sound(self.object, nil)
  stop_play_sound(self.object)
  self.object:disable_talk()
end

function action_move_to_cover:execute ()
  action_base.execute (self)	
  local npc = self.object
  
  if npc then
    -- Получил ближайшее укрытие к персонажу
    local cover = ogsm_respawn.get_nearest_hide(npc)
    if cover then
      -- Получил данные об укрытии
      local area = cover.obj
      local lvid = area:level_vertex_id()
      
      -- Отправляю NPC на указанную точку
      state_mgr.set_state(npc,"raid")
      utils.send_to_nearest_accessible_vertex(npc, lvid)     
    end    
  end
end

function action_move_to_cover:finalize ()
  action_base.finalize (self)
end

 

Изменено пользователем AkkurDev
Добавлено  Опричник,

Перемещено.

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

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

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

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

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

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

Войти

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

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

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