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

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

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

@Alex535, а кто сказал, что это скрипт? Все эффекты контролёра внутри движка.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

@Shredder,В секции контроллёра указывается его иммунитет, параметры хита относительно актёра, модели, конфиги разные, звуки. Сам хит (параметры, эффекты, анимации) расписан где-то... аналогом расписан хит пси-излучения схемы sr_psy_antenna в скрипте sr_psy_antenna.script . Я лишь хочу указать тот же хит в пси-излучении этой схемы, что и при контролёре. 

 

Прекрати страдать ерундой. Всего в игре 12 типов урона:

burn = 0,
shock = 1,
strike = 2,
wound = 3,
radiation = 4,
telepatic = 5,
chemical_burn = 6,
explosion = 7,
fire_wound = 8,
wound_2 = 9,
physic_strike = 10,
max = 11

Предпоследние два в конфигах не используются, разве что упоминаются в actor.ltx. О последнем вообще ничего не известно.

ColR_iT

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

Alex535,

схема пси-антенны не имеет никакого отношения к контролёру. Эффект от антенны достаточно простой: постпроцесс + периодический спавн фантомов. Причём это всё сделано скриптами. Контролёр же управляется целиком и полностью движком, скриптового в нём вообще нет ни строчки. Поведение его и эффекты, связанные с ним, достаточно сложные: проверка видимости актора с его стороны, расстояния до актора, телепатические хиты, постэффекты, звуки, эффекторы камеры. Всего и не скажешь, поскольку оно там внутри, и как работает - до конца не ясно. Посему твоё желание сделать схему радара как у контролёра просто невыполнимо, да и смысла не имеет по большому счёту, поскольку радар - это не контролёр и не может иметь всех его особенностей поведения.

 

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

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

@Malandrinus, Хорошо. Значит, у контролёра тип хита -wound, следовательно - надо поставить его в sr_psy_antenna.script, и будет мне счастье. Только не могу понять, какой тип урона использует эта схема?

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

следовательно - надо поставить его в sr_psy_antenna.script,

Зачем его туда подставлять? У пси антенны уже прописан свой урон. Точно такое же влияние на пси здоровье, как и у контролера. Разве что оно постоянное, а не во время атаки. Вспоминайте Янтарь и Радар. Вам остается только заюзать схему sr_psy_antenna! Ну и по нужде прописать вывод всяких постэффектов как описал выше malandrinus. И получится не хуже атаки контролера, если не лучше.

ЗЫ: Это хит wound. Подробнее описано в том же самом sr_psy_antenna.script.

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

@volazar, Хорошо, я уловил это, но поменять урон можно точно. У этой схемы урон в виде типа wound  . Здоровье отнимается промежутками, у контроллёра - оно отнимается плавно. Получается, надо просто тупо изучить всё содержимое этого скрипта и самостоятельно редактировать параметры урона. Хорошо. Просто поставить хит у пси антенны на telepatic. 

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

Привет, извиняюсь за глупый вопрос, но как определить динамически позицию, левел и гэйм вертексы заспавненного объекта?
А теперь поясню:
В инвентаре есть item мы "съедаем" его и он спавниться на позиции ГГ, иак вот как можно с течением времени заспавнить на эти координаты другие объекты? Знаю что можно сделать так:
 

local pos = db.actor:position()
local vid = db.actor:level_vertex_id()  
local gvid = db.actor:game_vertex_id()
local obj=alife():create(spawn_item, pos, vid, gvid)
obj:position()

 

...но с obj:level_vertex_id() и obj:game_vertex_id() не срабатывает, и вообще нужно обратиться к координатам заспавненного объекта в другой функции запускающейся таймером. Весь код готов, в этом ничего сложного нет, а вот к динамическим  координатам обратиться мозгов не хватает.
Заранее спасибо!

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

mumie, не очень ясно что же такое "динамическая позиция", но всё же...

В данном случае, функции получения гейм- и левел- вертекса не будут работать, к слову функция определения позиции тоже, т.к. применимы они к онлайновому объекту, а у тебя obj - серверный, именно серверный объект возвращает функция create. Воспользуйся свойствами объекта position, m_game_vertex_id, m_level_vertex_id для получения координат, гейм- и левел-вертексов соответственно.
 

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

Всё работает, просто ты перепутал типы объекта. В игре у почти каждого объекта есть клиентская и серверная часть.

Функцией alife():create() ты создаёшь СЕРВЕРНЫЙ объект (а у него свои функции и свойства)
А уже в апдейте ты (как один из вариантов) получаешь клиентский объект для которого функции position(), level_vertex_id() и прочие существуют.

 

Собственно в твоём примере надо obj:position() заменить на obj.position

Аналогично   obj:game_vertex_id() на obj.m_game_vertex_id

 

Откуда я это знаю? Открываешь scripts\lua_help.script

Дальше ты должен знать название класса серверного объекта предмета который ты спавнишь (это уже сам как нить найдёшь), но в принципе этим можно пренебречь поскольку функции практически одинаковы для всех объектов.

 

Допустим ты спавнишь сталкера, у него серверный класс это class cse_alife_creature_abstract

Ищешь его в lua_help.script

 

local obj=alife():create(spawn_item, pos, vid, gvid)

 

В obj будет хранится именно объект серверного класса. 

Вообще если посмотришь этот класс то увидишь что функций position() и прочих в нём нету.

Однако в замен есть СВОЙСТВА 

 

C++ class cse_alife_creature_abstract : cse_alife_dynamic_object_visual {
    property group;
    property id;
    property m_game_vertex_id;
    property m_level_vertex_id;
    property m_story_id;
    property online;
    property parent_id;
    property position;
    property script_version;
 

 

...

И вот тут ты как раз можешь получить свою позицию.

local pos = obj.position

 

Чтобы в дальнейшем не путаться советую серверные объекты обозначать как sobj или типа того, просто чтобы самому была видна разница.

Ну а клиентский объект можно получить через функцию

local obj = level.object_by_id(<id-объекта>)

 

Почему не сделать так?

 

local sobj = alife():create(spawn_item, pos, vid, gvid)

local obj = level.object_by_id(sobj.id)

obj:position()

Потому что когда ты спавнишь объект, создаётся его серверная часть (sobj)

однако клиентской (obj) ещё не существует, она будет создана лишь на следующих апдейтах. 

 

PS: Извиняюсь за кривой пост, когда копирую текст он копируется вместе с задним фоном и форматированием. Забыл как выключить это.

 

 

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

Доброго времени суток. Может тут кто-нибудь ответит. Подскажите, плз, есть ли возможность в ЗП вычислить на каком game vertex't лежит  level vertex ? Имея только level vertex. (В пределах левела, конечно)

 

Когда умрёшь, увидишь кнопки

"О'кей" и "Главное меню"
Под ними "Новая" и "Выход"

И неактивная "Назад"

 

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

На сколько я знаю, только методом перебора:

 

 
----
-- Получение ближайшего гейм-вертекса по левел-вертексу
function anomalies_manager:get_game_vertex(lv)
local lname = level.name()
local new_gv = 0
local min_dist = 100000 
local pos = level.vertex_position(lv)
for a = self.game_vertex_min, self.game_vertex_max do 
g1 = game_graph():vertex(a):game_point()
if g1:distance_to(pos)<min_dist then 
min_dist = g1:distance_to(pos) 
new_gv = a
end 
end
return new_gv
end

 

 

self.game_vertex_min, self.game_vertex_max соответственно минимальный и максимальный гейм вертексы для текущего уровня.

Ссылка на комментарий
Всем доброго времни суток. Есть n кол-во кнопок. 
for id=1,n do
btn = CUIButton()
btn:SetWindowName("Button_"..id)
btn:InitTexture("button_tex_"..id)
btn:Init(id*50,id*50,50,50)
self:Register(btn)
self:AttachChild(btn)
self:AddCallback("Button_"..id,ui_events.WINDOW_LBUTTON_DB_CLICK, self.function, self)
end

 

Как определить какая из этих n-ных кнопок была нажата?

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

АuReN, например так:

self:AddCallback("Button_"..id,ui_events.WINDOW_LBUTTON_DB_CLICK, self:get_callback_by_id(id))

function class_name:get_callback_by_id(btn_id)
	return function()
		get_console():execute("load ~~обрабатываем кнопку "..btn_id)
	end
end

 

 

 

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

Что-то совсем не в ту сторону заносить советчиков стало... 

 

 

АuReN, по сути у тебя уже все есть и нужно только нормально расписать строку: 

self:AddCallback("Button_"..id,ui_events.WINDOW_LBUTTON_DB_CLICK, self.function, self)

а точнее саму функцию (self.function), которую вызывает коллбэк при двойном клике по каждой кнопке.

Если все хочется одной функцией сделать, то это может быть, например так: 

self:AddCallback("Button_"..id,ui_events.WINDOW_LBUTTON_DB_CLICK, function() self:OnBtnClick(id) end, self)

Ну а уже в этой 'OnBtnClick', которая в том же классе(!), и делай что нужно с получаемым аргументом, соответствующим индексу нажатой кнопки:

 

function  MyClass:OnBtnClick(id)

    news_manager.send_tip( db.actor, "нажата " .. tostring(id)

end

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Да? А ты пробовал? Ничего, что при нажатии на любую кнопку id в функции OnBtnClick(id) будет всегда равен последнему. Т.к. в каждой функции ты оставил ссылку на одну и ту же переменную, значение которой в конце цикла будет равно последнему числу. Поэтому, ещё неизвестно, кого куда занесло...

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

Shredder, советую подучить матчасть (в частности о таком понятии как "замыкания", aka "closures") или хотя бы, прежде чем кидаться репликами, самому проверить на практике...  :crazy:

 

Данный код давным давно применяется в моем моде, да и не только в нем.

Суть установки коллбэка - НЕ выполнять его в самом цикле, а именно задавать нужную функцию, которая должна сработать при нажатии кнопки (иль ином событии с нею).

Т.о. в самом цикле (предполагаю он выполняется в InitControls) регистрируются имена объектов для последующей установки на эти объекты( по их именам) коллбэков.

Предложенный выше вариант, для всех кнопок устанавливает единый обработчик, которому передается индекс нажатой кнопки... Что и требуется автору вопроса.

Но, и ни что не мешает и каждой кнопке назначить собственный обработчик.

В общем думаем головою, а не ... руками. ;-)

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

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

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

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

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

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

Войти

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

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

×
×
  • Создать...