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

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


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

Nekt

 

Присоединяюсь к просьбе Monnoroch. Как эти схемы вызывать, желательно из совершенно левого файла? И как потом вернуть обратно, как было?

Мои работы:

Ночные прицелы + смена ножевого слота

AI вертолетов + ПЗРК

Soul Cube

 

Работаю только с ТЧ. С ковырянием ЧН/ЗП не связываюсь ни в какой форме. Совсем.

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

Может глупый вопрос,но можно ли делать math.random(-1,-2)?

 

Еще глупый вопрос (просто нигде такого не встречал)

Можно ли так:

local t = {2 + my_function(),3 + my_function()}

или так:

local t = {my_function(2),my_function(3)}

 

Подозреваю,что да,но на всякий случай спрошу=)

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

Monnoroch

В таком виде может и не понять, а вот math.random(-2,-1) точно можно.

Мои работы:

Ночные прицелы + смена ножевого слота

AI вертолетов + ПЗРК

Soul Cube

 

Работаю только с ТЧ. С ковырянием ЧН/ЗП не связываюсь ни в какой форме. Совсем.

Ссылка на комментарий
Может глупый вопрос,но можно ли делать math.random(-1,-2)?

нельзя, будет ошибка с вылетом и сообщением "interval is empty".

 

Можно ли так:

local t = {2 + my_function(),3 + my_function()}

или так:

local t = {my_function(2),my_function(3)}

А что тут вообще криминального? Обычный массив, обычные значения для его инициализации. Это получится.

 

Я тебе искренне советую найти мой пост "тестирование скриптов без обрушения" и наладить подобный полигон. Для ТЧ он работает как часы. Ответ на подобные вопросы у тебя будет занимать секунд 20.

 

Добавлено через 32 мин.:

Как эти схемы вызывать, желательно из совершенно левого файла? И как потом вернуть обратно, как было?

Есть там такая вещь, называется generic схемы. Или вроде как они же называются универсальными. generic схемы как раз и отвечают за панику, бой и пр. Выброс в АМК походу тоже реализован как такая схема. Суть универсальной схемы в том, что даже если непись находится под управлением гулага или свой собственной логики он прервётся, сделает что надо и затем вернётся к выполнению старой задачи.

Схема - это весьма загадочная штука. Про схемы можно почитать здесь

Я пока не всё понял, но попробую изложить в двух словах то, что мне уже понятно.

Чисто технически схема - это файл скрипта, содержащий определенный набор функций и классов.

Например, там должна быть функция add_to_binder с определённым списком аргументов, которая присобачит эту схему. Куда? Пока не знаю =)

далее в схеме есть два ключевых класса

первый - это условие (или евалуатор), унаследованный от property_evaluator

второй - это действие (или action), унаследованный от action_base

Точнее, там может быть набор таких классов.

в евалуаторе главным является один метод evaluate, фактически, весь класс существует ради этого метода. Метод возвращает true, если надо перейти в новое состояние. Например, начался выброс и надо делать ноги в укрытие.

action - это тоже класс, который существует главным образом ради одного своего метода execute. Это собственно то действие, которое и будет выполнено.

Действий там может быть несколько и условий несколько. Например,

выброс приближается - оглядеться

выброс начался - даём дёру

выброс продолжается - продолжаем прятаться

и т.д.

и соответственно существуют классы евалуаторов и действий на каждую пару.

Ну и как-то там эти классы регистрируются.

Это пока всё, что понял

 

добавлено:

надо ещё зарегистрировать схему в файле modules.script. Это делается функцией load_scheme

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

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

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

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

 

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

Активировать свою свою схему в нужный момент - ничего сложного.

 

Потребуется использовать эвалуатор такого вида (простейший вариант):

class "my_evaluator" (property_evaluator)
function my_evaluator:__init(npc,name,storage) super (nil,name)
    self.st = storage
    self.st.active = false
end
function my_evaluator:evaluate()    
    return self.st.active == true
end

Переключать из своего скрипта можно будет так:

 

db.storage[npc:id()][my_scheme].active = true -- включаем
db.storage[npc:id()][my_scheme].active = false -- выключаем

my_scheme тут - это название схемы, указанное в modules.script

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

Руся, Мне писал по кастом статикам, (кстати очень помогло :good2: )вот выкладываю ....

Вывод на экран текста (картинки, видео даже, если видео в формате ogm) - это всё функции кастом статиков.

 

То есть, в том худе который в ролике показан, на экран выводится картинка (кастом статик) экранчика, ещё отдельно - картинка шкалы вертикальной, и третья картинка - стрелка, которая перемещается. Двигает стрелку скрипт, который учитывает радиоактивность того места, где стоит игрок, или количество навешенных на игрока радиоактивных артефактов. Это я сейчас всё говорю про дозиметр, в кардиограмме отдельный скрипт.

 

А накопленная радиация - хранится в скрипте в виде отдельного параметра, как вычисляется сейчас не суть, главное, что её вывод на экран - это просто работа с кастом статиком экранчика, вывод поверх кастом статика текста, который можно задать как переменной, так и вручную, любой текст вывести.

 

Эти функции есть в скрипте, где перечислены ВСЕ игровые функции, выводимые движком в игру. Скрипт называется lua_help.script, лежит он в папке gamedata\scripts оригинальной игры. Он сам по себе ничего не делает - там только информация для ознакомления. Названия функций, типы их параметров перечисляются. Ну вот например, строки скрипта со строки 6429 по 6438:

 

 

Код

C++ class CUIGameCustom {

function AddCustomMessage(string, number, number, number, CGameFont*, number, number);

function AddCustomMessage(string, number, number, number, CGameFont*, number, number, number);

function GetCustomStatic(string);

function RemoveCustomStatic(string);

function RemoveCustomMessage(string);

function AddCustomStatic(string, boolean);

function CustomMessageOut(string, string, number);

function RemoveDialogToRender(CUIWindow*);

function AddDialogToRender(CUIWindow*);

 

 

чтобы использовать эти функции, надо прописать в файле кастом статиков (файл gamedata\config\ui\ui_custom_msgs.xml) новый кастом статик, с указанием текстуры. Глянь файл - там много кастом статиков. У некоторых прописана текстура, причём можно задать размер кастом статика не равный размеру текстуры, и заставить игру "растянуть" картинку до указанного тобой размера параметром stretch = 1. Можно прямо в кастом статике (в этом же xml-файле) задать текст - его шрифт, размер (у каждого шрифта есть свой размер, например шрифт22 и шрифт16 - раззные по размеру). А можно всё это задать скриптом, а не в xml-файле. Главное - чтобы кастом статик сам по себе существовал, и всё. Шрифт, текст, текстуру, её размер и положение на экране - всё можно задавыать и МЕНЯТЬ скриптом в любой нужный момент игры. Тут нужны команды которые можно видеть в строках lua_help.script начиная со строки 5989 до строки 6040:

 

 

Код

C++ class CUIButton : CUIStatic {

CUIButton ();

 

function SetHighlightColor(number);

function GetTextY();

function Enable(boolean);

function SetHeight(number);

function GetText();

function GetColor() const;

function GetWidth() const;

function GetClipperState();

function DetachChild(CUIWindow*);

function SetPPMode();

function SetFont(CGameFont*);

function IsShown();

function Show(boolean);

function GetHeight() const;

function SetWidth(number);

function GetTextX();

function IsEnabled();

function ResetPPMode();

function GetHeading();

function GetFont();

function SetStretchTexture(boolean);

function EnableTextHighlighting(boolean);

function ClipperOn();

function IsAutoDelete();

function SetAutoDelete(boolean);

function SetTextX(number);

function SetTextColor(number, number, number, number);

function SetWndPos(number, number);

function AttachChild(CUIWindow*);

function SetWindowName(string);

function GetStretchTexture();

function Init(number, number, number, number);

function Init(Frect*);

function Init(string, number, number, number, number);

function GetTextAlign();

function SetTextST(string);

function SetText(string);

function WindowName();

function ClipperOff();

function SetTextY(number);

function SetWndRect(Frect);

function SetWndRect(number, number, number, number);

function SetTextureOffset(number, number);

function SetOriginalRect(number, number, number, number);

function InitTexture(string);

function SetHeading(number);

function SetWndSize(number, number);

function SetTextAlign(number);

function SetColor(number);

};

 

 

Обрати внимание - эти команды для класса кастом статика, CUI Static. Есть много похожих команд - для других классов, для кнопок меню, надписей меню, скриптовых окошек.. Короче - СМОТРИ НА КЛАСС когда что-то ищешь.

 

Теперь, как это использовать. Тебе понадобится глобальная команда get_hud(). Она сканирует всё, что есть в данный момент на экране худа, и потом можно выяснять, что там имеется, а чего нету. Можно присвоить "экран" со всем содержимым переменной, вот так:

 

local hud = get_hud() -- Здесь мы записали в переменную hud всё что есть.

 

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

 

Код

if hud:GetCustomStatic("wolkolak_static")==nil then

hud:AddCustomStatic("wolkolak_static",true)

end

 

Этот кусок кода проверяет, есть ли на экране кастом статик с указанным именем (оно прописано тобой в файле ui_custom_msgs.xml). Если его нет - то такой статик добавляется. параметр true наверно означает что картинка добавится навсегда, не исчезая, пока её не уберут. Видимо, если поставить false - картинка появится на мгновение, или постепенно исчезнет - не знаю, не проверял. Я убираю статики сам, так надёжнее.

 

Дальше.

 

Теперь можно присвоить другой переменной наш кастом статик. И работать уже с переменной, чтобы строки кода были покороче.

 

local pic = hud:GetCustomStatic("wolkolak_static")

 

Всё, в переменной pic теперь хранится кастом статик, ЕСЛИ ОН ЕСТЬ на экране. если его нету - переменная равня nil, то есть она пустая. Так что логично перед таким присвоением прописать строки указанные выше - чтобы статик был. И дальше - начинаем с ним работать Вот некоторые команды, дальше сам поймёшь.

 

pic:GetWidth() -- узнаём ширину кастом статика, в пикселах.

pic:GetHeight() -- Узнаём высоту. И то и другое можно присвоить переменной.

 

pic:SetWidth(100) -- Устанавливаем свою ширину. Можно цифрой, в пискелах.

pic:SetHeight(100) -- Высота. И то и другое - можно не цифрой а числовой переменной

 

pic:SetWndPos(300, 200) -- Устанавливаем положение кастом статика на экране. Считается от верхнего левого угла экрана, там координаты 0, 0. В нижнем правом углу координаты 1024, 768. При этом НЕЗАВИСИМО ОТ РАЗРЕШЕНИЯ ЭКРАНА вся область экрана поделена именно на 1024*768 пикселей условных. Даже если у тебя широкоформатное разрешение - всё раво координаты от 0,0 до 1024,768

 

pic:InitTexture([[w_tex\wolkolak_texture]]) -- Здесь мы устанавливаем кастом статику новую текстуру. Старая исчезает (или её могло вообще не быть). Обрати внимание, путь к текстуре gamedata\textures\w_tex\wolkolak_texture.dds, но указывается он начиная с папки, лежащей в textures - я предположил, что ты её назовёшь w_tex и кинешь туда текстуру в формате dds под названием wolkolak_texture.dds. Ещё момент важный - путь до самой текстуры указывается в игре без расширения. И поэтому запросто можнокинуть в папку w_tex видеофайл под названием wolkolak_texture.ogm - он выведется на экран как и текстура. И будет циклически проигрывать видео.

 

pic:SetWndSize(100, 100) -- устанавливаем сразу, и ширину, и высоту. Одной командой. Тоже, можно цифрами, можно переменными.

 

pic:SetTextST("Привет! Я - текст") -- вот оно, выводим над кастом статиком ПОСТОЯННЫЙ неменяющийся текст. Пока есть кастом статик - текст будет виден. Исчезнет вместе с кастом статиком. Можно прямо так прописать, можно опять же, переменную.

 

pic:SetText("Привет! Я - текст") -- Это выводится НЕПОСТОЯННЫЙ, меняющийся текст - у меня так выводится переменная в которой записано, сколько Рентген я накопил. Этот текст можно изменить такой же конмандой, отданной ещё раз.

 

pic:SetTextX(-15) -- отступ текста от какой-то (не помню, угол или от центра) точки на кастом статике, по горизонтали

pic:SetTextY(-15) -- По вертикали. Тут надо поэкспериментировать, сам найдёшь, сколько отступать.

 

pic:SetTextColor(255, 255, 0, 0) -- Это устанавливаем цвет текста, в формате ARGB, то есть альфа, красный, голубой, зелёный. В данном случае альфа равна 255, красного 255, остальных - нули. Получится текст ярко-красного цвета, совершенно непрозрачный. Сквозь него кастом статик не видно будет, только вокруг текста. А вот если сделать (128, 255, 0, 0) - получим полупрозрачный красный текст, альфа наполовину от максимума. Ну и если альфа равна нулю (0, 255, 0, 0) - то оставшиеся три числа не важны, текст будет абсолютно прозрачен, его вообще не видно будет. То есть альфа это прозрачность текста, от нуля (нулевая видимость) до 255 (полная видимость). полупрозрачный белый текст задать можно так (128,255,255,255). Экспериментируй

 

Есть много и других команд, попробуй их сам.

 

 

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

Свободу всем Даром!

Моя Зона Full Realism Mod STSoC by Wolkolak

"Безвыходных ситуаций не существует в принципе."(с) Ред Шухов

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

возможен ли спавн станкового пулемёта ПКМ в сталкере? того который типа называется [mounted_weapon].

если возможно... то как он называется? ну всмысле в ал.спавне как писать путь к нему?

возможно ли за него поставит НПС?

или ты зону, или она тебя.

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

buxoukot

никто тебе не запрещает, заспавнить станковый пулемёт, НПС за него поставить можно но над много пое***, поскольку эт новая схема поведения вроде как, в билде 1935 была возможность ГГ становится за него, так что wpn_pkm_trenoga.ogf с 1935 + конфиг и можно в ТЧ с ним повоевать

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

И сидели бы сейчас вышеозначенные любители больших подписей в маленьких файлах, в байт-коде ковырялись, если не в машинном...

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

buxoukot,

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

ХАПАЕМ ВСЕ САМОЕ ЦЕННОЕ И ВАЛИМ

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

awesom_e

Бред, текстур там комплект, и для ПКМ-а тоже есть все.

И сидели бы сейчас вышеозначенные любители больших подписей в маленьких файлах, в байт-коде ковырялись, если не в машинном...

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

тяжело сделать?

и текстур я не нашёл!

то что ты их не нашёл, не значит, что их нет: wpn/wpn_pkm.dds

И сидели бы сейчас вышеозначенные любители больших подписей в маленьких файлах, в байт-коде ковырялись, если не в машинном...

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

Вопрос по логике. Вобщем пытаюсь сделать zoneguard-ов.

Вот их логика в гулаге:

[logic@work_scouts_transition]
active = zoneguard@work_scouts_transition

[zoneguard@work_scouts_transition]
path_walk = walk_1
path_look = look_1
team = scouts_transition
zone_guard = scouts_transition_attack1
zone_warn = scouts_transition_pred1
no_move = false
snd_greet = threat_stop_stalker
ignore_friends = false
no_danger = false
anim = guard_rac
snd_anim_sync = false

 

 

В игре вылета нет, НПС под гулаг берется, но почему то стоит на месте и не выполняет работу. Где ошибка? В работоспособности walk и look уверен на 100%.

 

В качестве зон для zone_guard и zone_warn - рестрикторы.

Изменено пользователем Отшель[НИК]
Ссылка на комментарий

Народ, раз уш тут заговорили про текстуры, то у меня вопрос... Как модель мутанта (снорка скажем) связана с тестурой (для снорка это act_gazmask вроде)? И можно ли переписать эту связь (чтобы модель привязывалась к другой текстуре?

Карусель-карусель - это радость для нас, прокатись на нашей ка-ру-се-ли!
-=Krovosos Mod=- 4.0 Final для S.T.A.L.K.E.R. SHoC 1.0004 (336 Мб): Мод

Финальный патч для -=Krovosos Mod=- (1 Мб): Патч

Адаптация -=Krovosos Mod=- под S.T.A.L.K.E.R. SHoC 1.0006 (1 Мб): Адаптация

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

проблема ещё страшнее. переделал главное меню... есть такая текстура в стандарте ui_static_main_menu_background. вот наложил на стандартное. и все вроде нормально. но гадкий огонь.

мне надо чтобы он горел. он появляется но выделяет сабой часть старой стены... короче скрин.: http://s42.radikal.ru/i097/0907/b3/5e58b9a0a39e.jpg огонь должен гореть. но стена-то вокруг почему старая? как я понял за огонь отвечает ui_mm_fire.ogm а как его открыть? и что это вообще за файл? или дело в другом.

вопрос номер 2:

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

какие-нибудь параметры? и какой программой с видео работать? чтобы его в нужный формат перегнать.

прошу помочь... пожалуйста.

или ты зону, или она тебя.

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

Люди подскажите делаю я простой однотипный квест найти предмет для Волка.

Добавил предмет для поиска и всё такое,но квест не появляется вообще!!!!!

[wolf_eliminate_lager_1]

type = find_item

community = actor

text = wolf_eliminate_lager_1_text

description = wolf_eliminate_lager_1_descr

parent = wolf

target = vodka_sidora

reward_money = 50

reward_reputation = 10

reward_rank = 4

;reward_item =

time = 86400

 

Почему квесты на тему find_item не идут??????

Я ДатчикХабара со stalker-portal

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

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

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

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

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

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

Войти

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

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

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