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

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

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

@Graff46, с оригинальным движком скорее всего никак. Там одни места берут имя из серверного объекта и его теоретически можно поменять через нетпакет, а другие места берут имя из клиентской части и туда доступа вроде нет.

 

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

Никто не подкинет функцию скриптового спавна по story id (ТЧ, если важно)? Искал и не нашел подобных упоминаний такой функции нигде. Может где-то в модах есть, но не знаю где. Беда в том, что скриптовым спавном, в отличие от олл.спауна, к имени объекта добавляются еще цифры и некоторые функции перестают работать т.к не могут обработать это имя. Может быть спавн по "сид-у", а не имени секции, решит эту проблему?

Ссылка на комментарий
7 минут назад, dsh сказал:

ты вот это имеешь ввиду

Возможно. Надо попробовать. Сейчас проверю.

 

@dsh, нет, не совсем. Это спавн уже зашитого объекта в спаун (только заранее удаленного), я так понимаю? А мне надо по координатам без участия олл.спауна.

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

@HellRatz, каким макаром? story_id имеет отношение к уже существующему объекту, либо в игровом мире, либо в all.spawn. Т.ч. что бы обратиться по story_id, объект должен уже быть в одном из этих мест или в обоих.

 

5 minutes ago, HellRatz said:

А мне надо по координатам.

Ну, можно сначала переспаунить из all.spawn, как я показал, а потом телепортировать на нужные координаты, если у тебя хотя бы xray extensions.

 

Ссылка на комментарий
4 минуты назад, dsh сказал:

Т.ч. что бы обратиться по story_id, объект должен уже быть в одном из этих мест или в обоих.

В общем суть. Есть, допустим, npc_1, заспавненный через олл.спаун, которого обрабатывает скрипт. Именно по этому имени. Если заспавнить его через скрипт, то его имя внутри игры уже будет не npc_1, а, какой-нибудь npc_1_20945, следовательно скрипт уже не может подхватить этого НПСа с таким именем.

То есть я так понимаю, заспавнить объект по стори_айди, без его предварительного вшивания в спавн, - не реально?

 

Тогда плохо. Ладно. @dsh, напишу в личку тогда в чем суть проблемы, дабы тут не разводить? Может быть глянешь мельком, поможешь. А сей вопрос тогда отменяется.

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

@HellRatz, если грамотно написать пакет для спаунящегося, то будет всё работать и со спауном из скрипта.

За нпс, не знаю, а вот с техникой проблем нет. Хотя, если спавн нпс сделать персональным на уровне корня класса, то тоже должно проканать.

andreyholkin.gif

rod_cccp.gif

 

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

Например (ЗП) спавн техники для скрипта. Как в ТЧ будет работать незнаю...

[zat_boat_car_3]                                    
GroupControlSection   = spawn_group
discovery_dependency  =
$spawn                = "vehicles\zat_boat_car_3"
cform                 = skeleton
class                 = HELCAR
visual                = physics\vehicles\boat\boat_car.ogf
actor_visual          = physics\vehicles\boat\boat_car.ogf
cost              = 250000
ef_equipment_type     = 3
ph_mass              = 10000
wallmark_section      = explosion_marks
script_binding        = bind_physic_object_helcar.init
story_id           = zat_boat_car_3

 

Например как в ЗП спавнят Сидоровича-нпса скриптом:


[sidor]:m_trader
$spawn            = "respawn\esc_trader_test"
character_profile = obj_trader
spec_rank         = master
community         = trader
story_id = obj_trader
custom_data = scripts\escape\esc_trader.ltx
 

andreyholkin.gif

rod_cccp.gif

 

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

Всем добрый день! Такой вопрос: может ли ЛУА получать текстовые значения из конфига .xml. Например, в коде у меня есть надпись " RU", а в xml файле 

 

<string id="st_currency">
        <text>RU</text>
    </string>


как получить эту самую ссылку из скрипта? Заранее признателен.

Изменено пользователем Den “Angry Wolf” Koslov
Ссылка на комментарий
3 часа назад, Den “Angry Wolf” Koslov сказал:

удалять все объекты из инвентаря ГГ определенного класса, сразу одним махом?

Можно все что невозможно, Зона жеж...
Как одна из кучи возможностей:

db.actor:inventory_for_each(function(item)
if item:section() == "секция_обжекта" then
alife():release(item, true)
end
end)

Ну или так:

if db.actor:object("секция_обжекта") ~= nil then
local obj = alife():object(db.actor:object("секция_обжекта"):id())
if obj then
alife():release(obj)
end
end

Вариации самих Разрабов можно отыскать в файле xr_effects.script для Арены хотя бы.
Ну а если правильно описать зачем это Вам и для каких условий, то точно подскажут верное решение.
А удалять по классу немного нелепо имхо - ибо один класс может содержать множество построенных на его настройках обжектов.

  • Согласен 1
Ссылка на комментарий
10 часов назад, gam сказал:

А удалять по классу немного нелепо имхо

Спасибо большое за примеры кода. Дело в том, что я создаю новый класс через движок, специально для этой цели. Идея заключается в следующем. Хотел реализовать, что-то на подобии команды  "удалить весь хлам в инвентаре" при этом хламу дать свой класс, чтобы не перечислять секции item'ов, так как мне нужно сделать так, чтобы остальные предметы снаряжения в рюкзаке оставались на своих местах. Хлам - это фишка геймплея.Так что я не совсем уверен если подойдут имена секций. По моему так скрипт будет игру сильнее нагружать ради проверки на весь хлам. 

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

2 вопроса:

1. Можно-ли через скрипты получать\устанавливать опьянение ГГ в ТЧ с X-Ray extension

2. Почему не работает db.actor:set_actor_position(ya_old) Отсюда:

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

function effct() -- ЭТА ВЫЗЫВАЕТСЯ НИЖЕ!
local npc = level_object_by_sid(926) 
	local pos, dir = npc:position(), npc:direction()
	local v = vector():set(pos)
	v.x = pos.x + 3 * math.cos(dir:getH())
	v.z = pos.z + 3 * math.cos(dir:getH())	
	db.actor:object('device_torch'):switch_torch(true)
	db.actor:set_actor_position(v)
	db.actor:set_actor_direction(-npc:position():sub(v):getH() )
end

function pred_mon(act, npc) -- ВЫЗЫВАЕМАЯ Ф-ЦИЯ!
	function _off () -- ВЛОЖЕННАЯ Ф-ЦИЯ! ВЫЗЫВАЕТСЯ НИЖЕ!
		local npc = level_object_by_sid(926)
		db.actor:set_actor_position(ya_old) -- НЕ РАБОТАЕТ, НО ОШИБОК НЕ ВЫЗЫВАЕТ
		ya_old = nil
		switch_offline_id(npc:id())
	end

	local a = db.storage[npc:id()].enemy
	if (a) and (a:section() == "dv_nom_x18_attack" or a:id() == 0) then
		_G.ya_old = vector():set(db.actor:position())
		effct() -- ОНА ВВЕРХУ
		nt.timer(2000, _off) -- ТУТ ВЫЗЫВАЕТСЯ (ЧЕРЕЗ 2 СЕК) ВЛОЖЕННАЯ Ф-ЦИЯ
		return true
	end
end

Функция из таймера вызывается корректно (НПС в оффлайн переходит и таймер "проверенный"), но возвращаться ГГ на своё место ни как не хочет!

 

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

Это не нужно заворачивать в вектор:

_G.ya_old = db.actor:position()

Не?

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

Ранее был известен под ником BoBaH_671.

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

@Overfirst На всякий случай. Таким способом создаём новый вектор с параметрами заданного, что бы после манипуляций с исходным векторам не получилось неожиданностей. В луа переменные хранят ссылки на объекты и если объект где-то изменился - то и значение переменной после этого тоже изменится, такая трабла с таблицами бывает бесит. Также смотри как тут, у разрабов, utils.vector_copy_by_val()

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

[ЗП, СоС]

Как заставить нпс скриптом перезарядить оружие, которое держит в руках (с анимацией и прочим)?

Смотрел как сделано у @Bak в AI Additions, но так до конца и не понял.

Вроде используется такая штука, после кучи проверок:

    npc:set_item(object.aim_force_full1,wpn)

Пытаюсь сделать по аналогии, типа так:

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

-- добавление недостающих команд для оружия
if not object.aim_force_full1 then
    object.aim_ready1 = object.drop+1                   -- eObjectActionAimReady1 = 12
    object.aim_ready2 = object.aim_ready1+1             -- eObjectActionAimReady2 = 13
    object.aim_force_full1 = object.aim_ready2+1        -- eObjectActionAimForceFull1 = 14
    object.aim_force_full2 = object.aim_force_full1+1   -- eObjectActionAimForceFull2 = 15
end


local target_obj    = level.get_target_obj()
local npc           = target_obj
local wpn           = npc and npc:active_item()
if npc and wpn then
    log("reloading wpn -- start --")


    -- 1 -- Либо так: --
    -- npc:set_item( object.reload, wpn )
    -- npc:set_item( object.reload1, wpn )
    -- npc:set_item( object.reload2, wpn )


    -- 2 -- или так:
    npc:set_item( object.aim_force_full1, wpn )


    log("reloading wpn -- end --")
end

 

Ничего "не выходит" - нпс просто стоит "как ни в чем не бывало".

Или парой строк скрипта не обойтись (нужно писать схему поведения, добавлять в планировщик и т.д.)?

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

Возможно кому-то известно как динамически менять текстуру для модели оружия? Предположим есть 3 текстуры калаша: новый, ржавый и сильно ржавый в зависимости от состояния. Есть ли возможность как-то менять текстуру через скрипт?

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

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

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

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

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

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

Войти

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

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

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