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

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


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

Clayman,

Еще вопрос - а двери-слайдеры в движке подрезаны? Никто не смог их восстановить?

Не уверен, как насчёт того, были ли такие двери раньше в билдах и как они были там реализованы, но сейчас двери можно сказать не движковые, а скриптовые. Собственно дверь в игре - это физический объект общего вида с шарниром вращения. При нажатии на дверь скриптовая схема прилагает вращающий момент к нужной кости, что приводит к открытию/закрытию. Таким образом, никто не мешает сделать и сдвигающуюся дверь. Только вместо шарнира вращения нужно сделать сочленение с линейным перемещением и изменить схему с применения вращающего момента на силу. Ещё раз, движковые возможности это вполне позволяют, просто никто до сих пор этим не озаботился.

 

lychagin0,

Причём здесь "транспорт мод" и тем более какое отношение имеет БТР и его "шустрость" к вопросу о дверях?

 

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

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

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

 

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

lychagin0,

Причём здесь "транспорт мод" и тем более какое отношение имеет БТР и его "шустрость" к вопросу о дверях?

Приношу свои извинения, вел диалог о БТР, и невнимательно прочитал вопрос. Подумал что речь идёт о юзании дверей и возможности езды на транспорте в ЗП.

Ещё раз сори.

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

Clayman,

Еще вопрос - а двери-слайдеры в движке подрезаны? Никто не смог их восстановить?

 

Сделать\портировать модель и настроить в SDK, и всё будет как в ТЧ.

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

З.Ы извеняюсь если не туда написал.

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

lychagin0,

Подумал что речь идёт о юзании дверей и возможности езды на транспорте в ЗП.

Что касается машин, то двери там можно сделать таким же образом. Машина - это в целом физический объект, правда уже не общего вида, а специальный. Двери можно сделать по тому-же принципу: разблокировать шарниры, добавить схему управления открытием/закрытием. Только пользы с этого мало, поскольку уж анимации влезания/вылезания вырезаны начисто, и тяжело привязать эту манипуляцию дверями к моменту посадки/вылезания.

 

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

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

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

 

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

Да и не стоит эта возня, того, что мне нужно было. Хотел сделать контролируемый вход на базе бандитов на свалке от ЧН, поступил проще - зафиксировал кости ворот в ангаре, поставил между ними обычную стальную дверь и подправил аи-сетку. На все про все - 10 минут.

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

Ребята, подскажите, как сделать ремкомплект для ЗП? Нашел в инете

 

Создание ремонт комплекта

 

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

 

1. Для начала нам нужно создать сам ремонт комплект, то есть предмет, а уже потом вешать на него функцию при использование. Для этого в config\misc\items.ltx в конец добавляем конфиг нашего предмета:

 

[repair_kit_outfit]:identity_immunities

GroupControlSection = spawn_group

discovery_dependency =

$spawn = "food and drugs\repair kit outfit"

$prefetch = 32

class = II_ANTIR ;класс не трогаем!

cform = skeleton

visual = equipments\item_merger.ogf ;модель

description = enc_equipment_repair_kit_outfit ;ссылка на описание в config\text\rus\....xml

 

inv_name = repair_kit_outfit_name ;ссылка на название в config\text\rus\....xml

inv_name_short = repair_kit_outfit_name ;тоже самое, что и inv_name

inv_weight = 6.0 ;вес

 

inv_grid_width = 2 ;ширина иконки

inv_grid_height = 1 ;высота иконки

inv_grid_x = 8 ;координата x иконки

inv_grid_y = 18 ;координата y иконки

cost = 10000 ;цена

;всё ниже написанное не трогаем, оно нам и не нужно

eat_health = 0

eat_satiety = 0

eat_power = 0

eat_radiation = 0

wounds_heal_perc = 0

eat_portions_num = 1

animation_slot = 4

hud = wpn_vodka_hud

 

2. Теперь добавим название и описание. Для этого в файле config\text\rus\string_table_enc_equipment.xml в конец между </string> и </string_table> добавляем строки по аналогии с уже написсанными:

 

<string id="repair_kit_outfit_name">

<text>Ремонт комплект ДПК</text>

</string>

<string id="enc_equipment_repair_kit_outfit">

<text>Новинка от Вани Болта - ремонт комплект ДПК для быстрой и эффективной починки костюмов. При его создании были учтены все недочёты и, следовательно, удалены. Благодаря улучшенным инструментам и деталям, а также облегченному весу весьма ценен. С его помощью можно увеличить состояние костюма до 100%, если он повреждён не больше 30%. Незаменимая вещь во время вылазки.</text>

</string>

 

Отлично, с предметом закончили. Теперь приступим к самому главному - скриптам.

Работа со скриптами

 

1.Вешаем функцию починки при использовании нашего ремонт комплекта. Для этого в файле scripts\bind_stalker.script находим функцию:

 

function actor_binder:reinit() и после строки

 

self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self) пишем:

 

self.object:set_callback(callback.use_object, self.repair_outfit_start, self)

 

Теперь в папке scripts создаёте свой скриптовой фаил ваше_название_скрипта.script. Но! Название должно быть написано на английском языке и вместо пробелов должен стоять знак "_". Опять открываем bind_stalker.script и в самый конец добавляем эту функцию:

 

function actor_binder:repair_outfit_start(obj, who)

if obj then

if obj:section() == "repair_kit_outfit" then --здесь указываем предмет, при использование которого будет срабатывать функция ниже

ваше_название_скрипта.repair_outfit() --здесь указываем ссылку на функцию. Сначала скрипт, в котором она написана, потом название самой функции

end

end

end

 

2. Добавляем саму функцию ремонта. Для этого в файле ваше_название_скрипта.script пишем:

 

-- Ремонт комплект для костюмов

function repair_outfit()

local item_s6 = db.actor:item_in_slot(6) --объявляем переменную (item_s6)

if item_s6 ~= nil and item_s6:condition() >=0.30 and item_s6:condition() ~=1 then --когда костюм можно чинить (состояние больше или равно 30%)

item_s6:set_condition(1)

local snd_obj = xr_sound.get_safe_sound_object([[interface\inv_detach_addon]])

snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)

local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,0,255,0]Ремонт костюма завершен."

db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000)

elseif item_s6 == nil then --когда костюма нет

local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,255,0,0]Ремонт невозможен: нужно одеть коcтюм."

db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000)

alife():create("repair_kit_outfit", db.actor:position(), 1, db.actor:game_vertex_id(), db.actor:id())

elseif item_s6:condition() <0.30 then --когда костюм нельзя чинить (состояние меньше 30%)

local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,255,0,0]Ремонт невозможен: костюм слишком сильно повреждён."

db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000)

alife():create("repair_kit_outfit", db.actor:position(), 1, db.actor:game_vertex_id(), db.actor:id())

elseif item_s6:condition() ==1 then --когда костюм в отличном состояние

local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,255,0,0]Ремонт невозможен: %c[255,0,255,0]костюм в отличном состояние."

db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000)

alife():create("repair_kit_outfit", db.actor:position(), 1, db.actor:game_vertex_id(), db.actor:id())

end

end

 

Всё! Теперь заходим в игру и наслаждаемся.

Небольшая заметка

 

1. Чтобы сделать ремонт комплект для оружия проделываем тоже самое, только переименовываем всё вместо outfit на weapon и в функцие починки ставим слот 1 или 2 (оружейные слота) вместо 6 (слот костюмов). Ещё нужно заменить переменную item_s6 например на item_s1 или item_s2.

 

2. Число 0.30 - минимальное состояние костюма, следовательно его можно менять на любое вам угодное. Простите за такое оформление, это моя вторая статья. В будущем, если будет больше свободного времени, постораюсь расписать все моменты подробно. Автор статьи: Бага.

 

Но у меня ГГ съедает ремкомплект.

 

Понимаю, что это для "Теней...", но все таки, как подправить скрипты, чтобы работало для ЗП?

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

karonbaron, если он не будет его съедать - то это получится какой-то читерский ремкомплект. Предполагается, что этот ремкомплект содержит расходный материал (типа бронепластины и т.д.) и естественно, что после ремонта он должен исчезать. Ну если тебе нужен такой, то переделай вот так:

-- Ремонт комплект для костюмов
function repair_outfit()
alife():create("repair_kit_outfit", db.actor:position(), 1, db.actor:game_vertex_id(), db.actor:id())
local item_s6 = db.actor:item_in_slot(6) --объявляем переменную (item_s6)
if item_s6 ~= nil and item_s6:condition() >=0.30 and item_s6:condition() ~=1 then --когда костюм можно чинить (состояние больше или равно 30%)
item_s6:set_condition(1)
local snd_obj = xr_sound.get_safe_sound_object([[interface\inv_detach_addon]])
snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,0,255,0]Ремонт костюма завершен."
db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000)
elseif item_s6 == nil then --когда костюма нет
local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,255,0,0]Ремонт невозможен: нужно одеть коcтюм."
db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000)
elseif item_s6:condition() <0.30 then --когда костюм нельзя чинить (состояние меньше 30%)
local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,255,0,0]Ремонт невозможен: костюм слишком сильно повреждён."
db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000)
elseif item_s6:condition() ==1 then --когда костюм в отличном состояние
local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,255,0,0]Ремонт невозможен: %c[255,0,255,0]костюм в отличном состояние."
db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000)

end
end

 

И будет тебе счастье :)

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

Все равно не работает.

Он его просто съедает, и все. Никакого сообщения, даже если броник поврежден.

 

Правда, я функцию actor_binder:repair_outfit_start немного переделал:

 

function actor_binder:repair_outfit_start(obj)

if (obj) then

local s_obj = alife():object(obj:id())

if(s_obj) and (s_obj:section()=="repair_kit_outfit") then rkomplekt.repair_outfit()

end

end

end

 

 

Толку нет. Скрипт не срабатывает...

 

Поделитесь, пожалуйста, кто-нибудь рабочими кодами...

 

 

 

 

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

karonbaron, я вспомнил, в ЗП броник в 7-ом слоте :). Попробуй так:

-- Ремонт комплект для костюмов
function repair_outfit()
    alife():create("repair_kit_outfit", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
    local current_outfit = db.actor:item_in_slot(7) --объявляем переменную (current_outfit)
    if current_outfit ~= nil and current_outfit:condition() >=0.30 and current_outfit:condition() ~=1 then --когда костюм можно чинить (состояние больше или равно 30%)
        current_outfit:set_condition(1)
        local snd_obj = xr_sound.get_safe_sound_object([[interface\inv_detach_addon]])
        snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
        local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,0,255,0]Ремонт костюма завершен."
        db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000)
    elseif current_outfit == nil then --когда костюма нет
        local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,255,0,0]Ремонт невозможен: нужно одеть коcтюм."
        db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000)
    elseif current_outfit:condition() <0.30 then --когда костюм нельзя чинить (состояние меньше 30%)
        local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,255,0,0]Ремонт невозможен: костюм слишком сильно повреждён."
        db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000)
    elseif current_outfit:condition() ==1 then --когда костюм в отличном состояние
        local news_text = "%c[255,160,160,160]Ремонт комплект:\\n%c[255,255,0,0]Ремонт невозможен: %c[255,0,255,0]костюм в отличном состояние."
        db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(83,470,83,47), 1000, 5000)
    end
end

 

 

И нафига ты функцию actor_binder:repair_outfit_start немного переделал? Не вижу никакой логики, оставь как было.

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

И так не срабатывает тоже. И если функцию поменять, не реагирует. Я кучу вариантов испробовал уже, без толку...

 

Ну ладно, ремкоплект рабочий я выдернул из мизери мода.

 

У меня такой, более сложный вопрос.

 

Как восстановить выпадение частей монстров в ЗП? А то какой смысл их убивать, только патроны тратить...

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

Хоть уже и не важно, но подозреваю, что ты кое что пропустил:

1.Вешаем функцию починки при использовании нашего ремонт комплекта. Для этого в файле scripts\bind_stalker.script находим функцию:

 

function actor_binder:reinit() и после строки

 

self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self) пишем:

 

self.object:set_callback(callback.use_object, self.repair_outfit_start, self)

 

Ссылка на комментарий
Хоть уже и не важно, но подозреваю, что ты кое что пропустил:

1.Вешаем функцию починки при использовании нашего ремонт комплекта. Для этого в файле scripts\bind_stalker.script находим функцию:

 

function actor_binder:reinit() и после строки

 

self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self) пишем:

 

self.object:set_callback(callback.use_object, self.repair_outfit_start, self)

 

Я первоначально все коды из той (см. выше мои посты) статьи вставлял в игру вообще без изменений. Не работало.

 

Ну, ладно. Так что там с частями монстров?

 

Выпадение их как в SGM моде не предлагать, меня это не устраивает. Видел в ARS-моде мутантера, когда можно через спецменю отрезать части тела, вот его бы в чистом виде. Может, есть у кого?

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

Доброго времени суток.

Есть такой вопрос: как единожды вызвать функцию при старте игры (напр. спавн)?

Личные изыскания, к сожалению, результатов не дали.

userbar368.png

Ссылка на комментарий
Callisto, при начале новой игры, под ГГ находится рестриктор, его логика вынесена в отдельный файл, где-то в папке configs\scripts, этот рестриктор выдаёт основное сюжетное задание: "Узнать о причинах падения вертолётов". Как вариант, можешь сделать вызов функции через него.
Ссылка на комментарий
ColR_iT, Думала об этом способе, и даже логику этого рестриктора нашла, но вот как в него добавить вызов функции не могу понять, как-то медленно идет изучение.

userbar368.png

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

Callisto,

1. Открываем файл:

scripts\xr_effects

 

2. Добавляем туда свою функцию:

function test_func()
...
end

 

3. Открываем файл логики рестриктора:

configs\scripts\zaton\zat_b101_logic

 

4. Находим строчку:

[sr_idle]
on_info = {!black_screen -zat_b101_give_task +zat_a1_game_start} sr_idle@save %=give_task(zat_b101_heli_5_crash) +zat_b101_give_task =give_task(jup_b8_heli_4_crash) +jup_b8_give_task =give_task(zat_b28_heli_3_crash) =give_task(zat_b100_heli_2_crash) =give_task(jup_b9_heli_1_crash) +jup_b9_give_task =set_active_task(zat_b28_heli_3_crash)%

 

5. Заменяем на эту:

[sr_idle]
on_info = {!black_screen -zat_b101_give_task +zat_a1_game_start} sr_idle@save %=give_task(zat_b101_heli_5_crash) +zat_b101_give_task =give_task(jup_b8_heli_4_crash) +jup_b8_give_task =give_task(zat_b28_heli_3_crash) =give_task(zat_b100_heli_2_crash) =give_task(jup_b9_heli_1_crash) +jup_b9_give_task =set_active_task(zat_b28_heli_3_crash) =test_func%

 

6. Готово.

 

 

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

Один раз случайно поймал вот такой случай - консоль забивается вот таким ворнингом:

 

RENDER [Warning]: Too many occlusion queries were issued(>1536)!!!

 

Причем так и не понял из-за чего это... потом все обегал раз 15, вроде не появляется... никто про эти буквы ничего не знает?

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

Callisto, ещё вариант. Через скрипт.

 

Создаем скрипт my_script.script и в него пишем

function main()

if db.actor:dont_has_info("new_game_start") then

spawn_monster()

db.actor:give_info_portion("new_game_start")

end

end

------------------------------------------------------------

function spawn_monster()

alife():create("chimera_normal",vector():set(116.86434936523,-3.9353849887848,176.99018859863),1167207,138)

end

 

 

 

Вызывать так:

В bind_stalker.script, после

    benchmark.main()                                      --' Distemper 06.2008 --

Пишем :

        my_script.main()

 

 

AWRP : Re - Load 0.2 ©

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

Akella-96 aka SvD, для кого-то это совсем не вариант. Из-за одного вызова функции выполнять проверку if db.actor:dont_has_info("new_game_start") then всю игру - жесть как не рационально.

В файле xr_effects.script находим функцию damage_actor_items_on_start() и в конце дописываем вызов нашей функции. Да и вообще из неё можно всё вырезать, чтобы ГГ начинал игру во всём новом :)

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

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

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

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

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

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

Войти

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

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

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