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

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

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

 

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

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

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

 

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

@Malandrinus,  Ну допустим я хочу изменить эти параметры , они же наверняка где-то прописаны. Так же как и параметры схемы sr_psy_antenna.

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

@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

 

 

 

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


self:AddCallback("Button_"..id,ui_events.WINDOW_LBUTTON_DB_CLICK, loadstring("имя_скрипта.on_db_click('" .. id .. "')"))

 

function on_db_click(id)

get_console():execute("load ~~~нажата " .. id)

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

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

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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