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

[SoC] Ковыряемся в файлах

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

 

 

Вынести в скрипты через xray-extensions или исходники - но что-то такого как не было, так и нет.

Конкретно на тех исходниках, на которых я основываюсь это есть, у скриптера может быть затык в экспорте нового класса, но именно экспорт свойств и методов это уже интуитивно ясно, если не касаться lua policies для особых случаев, это я к тому, что классы эти готовы и все недостающие свойства из классов вертексов и графов можно добавить.

 

 

 

Таблица соотвествия левел-вертекса гейм-вертексу лежит в level.gct, в движке класс CGameLevelCrossTable.

Это ты про то, где он из чанка читает? Тогда все понятно.

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

@Карлан, из класса вертексов можно узнать только левел-вертекс граф-поинта. Пока я так и делаю - но это не даёт возможности узнать именно максимальный вертекс, получается меньшее число.

 

Graph Viewer же.

Вот, это то, что нужно, благодарю. А то разбирать каждую локацию в формат СДК ради одной цифры - это тоже так себе мазохизм)

 

П.с.: нужно мне это и для аномалий, и для валидации путей нпс.

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

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

Подскажите про оригинальный таймер с выводом на экран, как на ЧАЭС1. Нужно его взвести на n времени а потом выполнить ф-цию. Где глянуть пример?

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

@BoBaH_671, т.е мне всю локацию рестриктором накрывать? На ЧАЭС1 так и сделано? А скриптового решения без амк-функций нет?

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

мне всю локацию рестриктором накрывать?

Не обязательно. Можно поставить небольшой рестриктор где угодно с логикой вроде

[logic]

active = sr_idle

[sr_idle]

on_info = {+infoportion} sr_timer

[sr_timer]

...

Рестрикторы все равно всегда в онлайне, при получении инфопоршня включится таймер. Само собой, будет работать только в пределах одной локации.

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

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

@naxac, @BoBaH_671, спасибо. Кстати, нашёл на каких-то полумёртвых сайтах и скриптовый таймер, не знаю, работает или нет.

 

 

"Таймер"
"Вариант без вывода на худ"
Код
local iTimer
function Start_Timer_5_minutes() --/ (пере)запуск таймера (из диалога)
iTimer = time_global() + 5*1000 --/ взводим таймер на 5cek
end

function Timer_N_minutes() --/ вызывается из ':update' сталкер-биндера
if iTimer and iTimer < time_global() then --/ проверка текущего значения
iTimer = nil --/ выключаем таймер
скрипт.функция() --/ выполняем действие
end
end
"Вариант с выводом на худ"
Код
local iTimer
local last
function start_timer_minutes_test(seconds)
if last~= nil then
iTimer = time_global()+last --/ взводим таймер на остаток времени last
else
iTimer = time_global() + 7*1000 --/ взводим таймер например 7 сек.
end
end

function timer_n_minutes_test() --/ вызывается из ':update' сталкер-биндера
if iTimer then
last=iTimer-time_global() -- присваиваем переменной остаток времени до конца работы таймера
if iTimer < time_global() then
iTimer = nil --/ выключаем таймер
last=nil
СКРИПТ.ФУНКЦИЯ--/ выполняем действие
end
end
end

-- выводим значение таймера в обратном отсчете на худ
function hud_static() --/ вызывается из ':update' сталкер-биндера
local hud = get_hud()
local st
if iTimer then
st = hud:GetCustomStatic("hud_timer")
if st==nil then
hud:AddCustomStatic("hud_timer", true)
st = hud:GetCustomStatic("hud_timer")
end
if last~=nil then
local hours = math.floor(last/3600000)
local minutes = math.floor(last/60000 - hours*60)
local seconds = math.floor(last/1000 - hours*3600 - minutes*60)
local text = string.format("%02d:%02d:%02d",hours,minutes,seconds) -- выводим время в формате 00:00:00
--local text=string.format("%.f",last/1000)
st:wnd():SetTextST(text)
end
else
if hud:GetCustomStatic("hud_timer")~=nil then
hud:RemoveCustomStatic("hud_timer")
end
end
end
---------------------------------------------

 

 

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

@dPlayer, от тебя здесь только утаивают тот факт, что время (и вообще все состояние) таймера не сохраняется. Иными словами при перезагрузке в рестрикторе, или выходе за пределы этого рестриктора у тебя этот таймер перезапустится (так как в обоих случаях предполагается что ты в него зайдешь вновь) и начнет отсчет сначала. Проведи эксперимент на той же ЧАЭС, когда таймер начнется подожди минуты две, и сохранись/загрузись, поймешь о чем я.

 

По таймерам, возьми готовый модуль таймеров, точно знаю, что у @Malandrinus'a есть в коробке худовый таймер. sr_timer сам по себе чудесен, в том смысле, что его кастомизация не позволяет настроить сохранение, где-то оно действительно не нужно (х-16, и то я бы там сделал речардж пси-каски, но если мы уже в рестрикторе бегаем, то конечно сохранять нужно), а где-то без него никак (выброс на ЧАЭС).

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

@dPlayer, >>Таймеры<<

 

Менеджер универсальных таймеров (SHoC:6/7(118),CS:8(124),SCoP:12(128))
m_timers.script
==============================================================================================
Модуль (скрипт) реализует в игре удобный интерфейс для работы с таймерами различного назначения (реального и игрового времени).
Для работы требуются скрипты "Расширения Lua"(lua_extension) и "Общие полезные функции" (lua_helper).
Для хранения в сэйвах игры табличных данных запущенных таймеров может использоваться модуль "Универсальное хранилище" (se_stor),
в противном случае данные сохраняются в pstor актора (что может вызвать переполнение при интенсивном использовании таймеров).

--/---------------------------------------------------------------------
Подключение:
1. Скопировать в папку скриптов игры скрипт: m_timers.script;
2. Добавить в биндер актора (см. bind_stalker.script) вызовы событий "сохранение игры", "загрузки сохранения" и запуска обновлений модуля;
3. Добавить в _g.script инициализацию дополнительного функционала (lua_extension и lua_helper).
4. (настоятельно рекомендуется) Подключить модуль "Универсальное хранилище" (se_stor).

Примечание:
В комплекте файл '_g_ADD.script является строками, которые требуется добавить в исходный _g.script.
Файл bind_stalker.script от оригинальной версии игры SHoC v.1.0006 дан в качестве рабочего примера.
В файл bind_stalker.script добавляются строки (в три разных метода биндера) отмеченные знаком --/#+# и имеющие подстроки 'm_timers.'

Использование:
1. Запрос существования (запущенного) таймера (по имени):
timer_exists("my_timer_name") --/ boolean
2. Получение объекта таймера (по имени):
get_timer("my_timer_name") --/ object from class 'RealTimer|GameTimer'
3. Получение текущего значения таймера:
get_timer("my_timer_name"):get_time_rest()
4. Удаление запущенного таймера:
get_timer("my_timer_name"):remove()
5. Таймер на игровом экране (HUD-Timer) допускается в единственном экземпляре:
get_hud_timer() --/ object 'HUD-Timer' from class 'RealTimer'
6. quick-таймеры не имеют имен и недоступны извне.
7. Имена таймерам выдаются автоматически и эксклюзивны.
При необходимости имя может быть задано при запуске таймера (см.ниже).


8. Запуск таймера производится одной из соответствующих функций start_XXX_timer:
start_real_timer - таймер реального времени;
start_game_timer - таймер игрового времени;
start_quick_timer - таймет реального или игрового времени без возможности сохранения;
start_hud_timer - таймер реального времени с HUD-дом на игровом экране;
start_multi_timer - цикличный таймер.

- 1-й аргумент - время в секундах;
- 2-й аргумент - функция, которая будет вызвана таймером по окончании времени;
- 3-й аргумент - параметры передаваемые таймеру;
- 4-й аргумент - (опционально):
-- для 'real' и 'game' таймеров - имя таймера;
-- для 'hud' - тип hud'а (с текстурой или только текст);
-- для 'multi' - тип времени (реальное или игровое).
Имя таймера (кроме 'hud') может быть задано так (заменяется "выданное имя"):
start_real_timer(0.5, "my_file.my_func"):set_name("my_timer_name") --/ 0.5 real-seconds + (re)set name

Функция может быть задана прямым указанием или строкою или таблицей.
При отсутствии указанной функции и наличии 3-го аргумента (параметров) будет вызван внутренний обработчик.
Внутренний обработчик позволяет при соответствующих именах параметров выполнять:
а) выдача инфопоршня или нескольких:
start_game_timer(3*60, nil, {info_id = "my_infoportion"}) --/ 3 game-minutes
б) Вывод сообщения на экран (через news_manager):
start_real_timer(5*60, nil, {tip = {"Text tip_RT"}})
в) Вывод строки в лог:
start_quick_timer(8, nil, {log = "test QT8"})
г) Вывод звука:
start_quick_timer(8, nil, {snd = "device\\pda\\pda_sos"})
и др.

Примеры использования:
start_real_timer(6, "my_file.my_func") --/ 6 real-seconds
start_real_timer(5*60, nil, {tip = {"st_tip", "Text test_RT"}}, "RT_test") --/ 5 real-minutes + set name
start_real_timer(0.5, "my_file.my_func"):set_name("my_timer_name") --/ 0.5 real-seconds + (re)set name
start_game_timer(3*60, nil, {info_id = "my_infoportion"}) --/ 3 game-minutes
start_hud_timer (10*60, nil, {log = "test_HT"}) --/ 10 real-minutes
start_hud_timer (45, nil, {log = "caption_HT"}, "blowout") --/ 45 real-seconds + text caption
start_hud_timer (45, nil, {log = "only_text_HT"}, false) --/ 45 real-seconds + only text-time
start_quick_timer(4, my_file.my_func) --/ 4 real-seconds + call function
start_quick_timer(8, nil, {info_id = "my_infoportion"}, log = "tip QT8"}) --/ 8 real-minutes + log
start_multi_timer(2*60, nil, {log = "tip_MR"}) --/ 120 real-seconds + log + cyclical
start_multi_timer(3*60, nil, {tip = {nil, "tip_MG"}, log = "tip_MG"},true) --/ 120 game-minutes + tip + log + cyclical
--/ для объекта таймера доступны:
timer:id() --/ чтение(получение) идентификатора запущенного таймера (не путать с игровыми идентификаторами объектов!)
timer:name() --/ чтение(получение) имени запущенного таймера
timer:set_name(timer_name) --/ установка/изменение имени таймера
timer:restart(time_sec, action, properties, timer_name) --/ перезапуск работающего таймера (аргументы аналогичгы запуску)
timer:get_time_rest() --/ получение оставшегося времени работающего таймера (real mseconds or game seconds)
timer:get_time_end() --/ получение времени (число mseconds), когда таймер сработает
timer:get_time_end(true) --/ получение времени (строка), когда таймер сработает
timer:get_property(property) --/ чтение значения параметра заданного таймеру
timer:set_property(property,value) --/ установка/замена параметра заданного таймеру
timer:remove() --/ удаление таймера

--/---------------------------------------------------------------------
Artos (22.09.2013)

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

Привет, есть вопрос касательно Умного Мародера 1.5...

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


Как правильно сделать кондишн, чтобы состояние было рандомным при выпадении?

 

Добавлено Kirgudu,

Перенёс из "уроков по модостроению"

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

@Kirgudu, нашел почти ту же функию в funcs.scr, но она почему то не работает

local a

if select_string=="otf" then
a = level.object_by_id(tonumber(params_string))
a:set_condition((math.random(25)+40)/100)
end

 

Как ее включить?

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

@Badmodst74, вопрос из разряда "У меня автомобиль не заводится. Как завести?" с количеством потенциальных ответов, приближающимся к бесконечности; всегда такие нравились. Но телепаты традиционно в отпуске.

Судя по знакомому коду, эта функция из мода типа AMK или OGSM и предназначена для срабатывания по истечении таймера определённого типа ("otf"). Таймер запускал? Id конкретного предмета ему передал? Никому, кроме тебя, сие не известно.

А проще всего будет поискать в модулях своей сборки места использования метода set_condition(...) (легко делается разными средствами, например TC) и там, где оно явно связано с установкой состояния брони, заменить расчёт аргумента на простой math.random(), как предложено в примере выше. Сложности в этом нет никакой, вполне можно справиться самостоятельно.

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

В ТЧ ведь можно на клавишу tab повешать любое действие, хоть скрипт, не выходя в главное меню? Как это сделать, где-то тут ведь обсуждалось, не могу найти(

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

@Kober(BRUC), спасибо, хотя как раз клавишу tab автор пропустил)

@Kober(BRUC), да в принципе, это то. что мне нужно, но вариант от Руси для моих ковыряшек подходит больше)

moderator_global_small.png HellRatz, спасибо.

Изменено пользователем dPlayer
Ссылка на комментарий
@dPlayer,т.е. это не то что вам нужно? Если так, то пользователь с аватаркой Ёжика в Тумане выкладывал что-то про клавишу Tab. Было это где-то в 2012 году. Это усе что могу подсказать.
  • Спасибо 1
Ссылка на комментарий

Что-то не могу сообразить, как отпустить мужика из логики в свободное плавание? И если у него в кастом_дате будет написан какой-либо смарт, он туда попрётся?

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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