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

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


Halford

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

Ребята, такой вопрос: кто-нибудь создавал новые укрытия от выбросов?

 

Я тут наковырял кое-что. Значит, в распакованном all.spawn создается спейс-рестриктор с именем zat_surge_hide_b42 (это из имеющихся).

 

Вот его

 

[227]

; cse_abstract properties

section_name = space_restrictor

name = zat_surge_hide_b42

position = 26.2803802490234,5.27456712722778,367.865234375

direction = -0.0748270004987717,0.522725999355316,0.00596300000324845

 

; cse_alife_object properties

game_vertex_id = 0

distance = 0

level_vertex_id = 293223

object_flags = 0xffffff3e

 

; cse_shape properties

shapes = shape0

shape0:type = box

shape0:axis_x = 15.4629888534546,0,0

shape0:axis_y = 0,6.51879787445068,0

shape0:axis_z = 0,0,15.4629888534546

shape0:offset = 0,0,0

 

; cse_alife_space_restrictor properties

restrictor_type = 3

 

 

Далее, регистрируем это укрытие в файле configs\misc\surge_manager.ltx.

 

И все, будет работать?

 

Или где-то еще что-то нужно прописать?..

 

Есть мысли по этому вопросу?

Поделиться этим сообщением


Ссылка на сообщение
karonbaron, об этом уже много раз писалось и статья на вики есть. Нужно зарегить смарт в simulation_objects_props. ltx с параметром surge = 1 и создать работы (way points типа смарт_surge_1_walk (look)), чтобы нпс юзали укрытие.

 

Да? Что-то я там нормальной статьи не нашел, где-бы пошагово все доходчиво объяснялось. Если нетрудно, скинь, пожалуйста, ссылку на эту статью в личку мне. Спасибо.

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

Поделиться этим сообщением


Ссылка на сообщение

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

 

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

 

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

 

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

Поделиться этим сообщением


Ссылка на сообщение

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

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

 

Правда, я функцию 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

 

 

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

 

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

 

 

 

 

Поделиться этим сообщением


Ссылка на сообщение

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

 

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

 

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

 

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

Поделиться этим сообщением


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

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-моде мутантера, когда можно через спецменю отрезать части тела, вот его бы в чистом виде. Может, есть у кого?

Поделиться этим сообщением


Ссылка на сообщение

Ребята, возникла проблема. Кто может, помогите советом!

 

Суть дела вот в чем. Заселяю новую локу, создаю торговца (модель Борова из ЧН) с

 

[logic]

active = camper

level_spot = trader

 

trade = misc\trade\trade_mil_freedom_trader.ltx

trader_flags = 0

inv_max_weight = 10000

meet = meet

 

[camper]

path_walk = mil_freedom_trader_walk

path_look = mil_freedom_trader_look

 

[meet]

close_snd_hello = gar_bandit_barman_meet

close_snd_bye = gar_bandit_barman_meet_bye

close_snd_distance = 3

 

 

При этом звуки в нужную папку закинуты, также их зарегистрировал в файле script_sound_military.ltx с

 

[list_script_sound_military]

 

gar_bandit_barman_meet

gar_bandit_barman_meet_bye

 

[gar_bandit_barman_meet]

type = npc

path = scenario\military\gar_bandit_barman_meet_greet_

shuffle = rnd

play_always = true

idle = 0,0,100

 

[gar_bandit_barman_meet_bye]

type = npc

path = scenario\military\gar_bandit_barman_meet_bye_

shuffle = rnd

idle = 1,1,100

 

 

Сам файл script_sound_military.ltx зарегистрировал в script_sounds.ltx.

 

Когда подхожу к торговцу на расстояние ближе 3 метров, ловлю

 

Expression : !m_error_code

Function : raii_guard::~raii_guard

File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp

Line : 748

Description : ....r. - cop shoker\gamedata\scripts\sound_theme.script:256: bad argument #2 to 'random' (interval is empty)

 

 

В чем проблема может быть? Я не все зарегистрировал, или логика не до конца прописана?

 

На всякий случай, кусок кода с 256 строкой из скрипта sound_theme

 

Кусок кода из sound_theme

 

function npc_sound:select_next_sound(npc_id)

local npc_data = self.npc[npc_id]

if self.shuffle == "rnd" then

if npc_data.max == 0 then

return 0

end

 

if self.played_id ~= nil then

local played_id = math.random(0,npc_data.max - 1) -- 256-я строка

if played_id >= self.played_id then

return played_id + 1

end

return played_id

end

return math.random(0,npc_data.max)

end

 

Поделиться этим сообщением


Ссылка на сообщение

Ребята, у кого-нибудь есть рабочий скрипт на проверку наличия экзоскелета, чтобы взять в руки оружие (например, пулемет)?

А то на wiki есть упоминание, но корявое, я не понял, как правильно его привести в рабочее состояние.

 

Нельзя взять оружие без брони Пишем функцию в любом скрипе: function ваше_название_функции() local armor = db.actor:item_in_slot(6) --слот брони (НЕ ТРОГАТЬ!) local weapon = db.actor:item_in_slot(2) --слот оружия (для пистолетов в оригинале слот 1)

 

if db.actor:active_slot()==2 and weapon then -- за место 2 пишем слот оружия еще раз local tmp if armor then tmp = armor:section() else tmp = "none" end

if (not string.find(tmp, "пишем_название_брони" )) and (weapon:section()=="пишем_название_оружия1" or weapon:section()=="пишем_название_оружия2" or weapon:section()=="пишем_название_оружия3") then --если необходима проверка одного оружия то надо писать так: if (not string.find(tmp, "exo" )) and weapon:section()=="wpn_pkm" then

db.actor:drop_item(weapon)

local tmpw = amk.spawn_item_in_inv(weapon:section())

db.actor:transfer_item(weapon,db.actor)

alife():release(tmpw)

news_manager.send_tip(db.actor,"Невозможно взять пулемёт в руки без экзы",nil,nil,10000)

end

end

Далее идем по этому пути

gamedata/script/bind_stalker.script

Функция

function actor_binder:update(delta)

 

Сразу ниже неё пиши вызов в формате : название_файла.название_функции. Можешь написать эту функцию в любом файле из папки scripts, а можешь создать свой файл и назвать скажем my_script и написать там. Должно быть так : Код

function actor_binder:update(delta)

my_script.check_armor()

 

Поделиться этим сообщением


Ссылка на сообщение

Ребята, кто-нибудь знает, как через скрипт (не через логику!!!) добавить репутацию у группировки?

Я вот один набросал, но он не пашет, пишет, что неверные параметры у функции.

 

 

function increase_hunter_goodwill_to_actor(first_speaker, second_speaker)

 

local actor = dialogs.who_is_actor(first_speaker, second_speaker)

 

local community == "hunter"

 

local delta == 2000

 

if actor and community and delta then

 

game_relations.change_factions_community_num(community,actor:id(), tonumber(delta))

 

else

 

abort("Wrong parameters in function 'increase_hunter_goodwill_to_actor'")

 

end

 

end

 

Функция вызывается через диалог.

Поделиться этим сообщением


Ссылка на сообщение

Есть такая задача. Нужно заспавнить на локации БТР и чтобы она стреляла в ГГ.

Взял логику из ТЧ, для БТР на ЧАЭС. То есть:

 

 

active = ph_car
[ph_car]
path_walk = mil_btr_walk
target = actor

 

Модельку взял ту, что есть в ресурсах Зова Припяти, ltx'шный файл для этой модели из мода автокоп. Также зарегил схему ph_car в modules.script, скинул скрипты ph_car.script и car.script из тч в папку со скриптами.

В результате вылет

 

FATAL ERROR

[error]Expression : !m_error_code
[error]Function : raii_guard::~raii_guard
[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
[error]Line : 748
[error]Description : ...l.k.e.r. - cop shoker\gamedata\scripts\ph_car.script:87: attempt to index field 'car' (a nil value)

stack trace:

 

Что может быть причиной? 87-строка в скрипте ph_car выглядит так (выделена жирным):

 

if self.usable == nil then
[b]self.car:SetExplodeTime(0) -- (-1)[/b]

if self.car:HasWeapon() then
printf("car <fire>: car has weapon.")
self.car:Action(CCar.eWpnActivate,1)
self.hasWeapon = true
else
printf("car <fire>: car hasn't weapon.")
self.hasWeapon = false
end

 

 

Кто-нибудь адаптировал скрипты car и ph_car под ЗП? Поделитесь опытом, пожалуйста...

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

Поделиться этим сообщением


Ссылка на сообщение

С БТР'ом разобрался, оказывается еще нужно было класс CCar зарегистрировать.

 

Вопрос следующий. В логике вертолета можно прописать параметр enemy. На вики говорится, что enemy может быть равно actor, sid непися, или nil. В логике ЧН'овского верталя я видел еще параметр all. А если нужно, чтобы вертолет атаковал не какого-то одного противника, а например, группировку. То есть прилетает поддержка во время атаки на базу бандитов и вертушка атакует только врагов, а друзей и ГГ не трогает, даже если они в поле зрения вертолета. Есть у кого какие идеи?

Может, так?

enemy = {=check_enemy_name(sim_default_bandit)} all, nil

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

Поделиться этим сообщением


Ссылка на сообщение

и реализовывались...

Например? Есть в природе правленные моддерами скрипты heli_move? Назовите адрес, пожалуйста...

Поделиться этим сообщением


Ссылка на сообщение

да и сам можешь на вертушке по группировкам поупражняться из ракетницы, и т.д.

За советы спасибо, тему AI вертолетов я знаю, просто предпочитаю для моддинга ЗП смотреть и искать в темах ЗП.

А что означает эта цитата? На вертушке в смысле управлять ей? :ny_blink:

Поделиться этим сообщением


Ссылка на сообщение

Кто-нибудь, подскажите, пожалуйста.

Если в ЗП в секции level_changer в логике я поставлю

 

[spawner]

cond = {+info_1_test}

 

 

Он заработает только тогда, когда я получу инфопорцию info_1_test?

Поделиться этим сообщением


Ссылка на сообщение
Зато добавили методы для включения и выключения level changers.

А конкретнее? Задача такая - переход должен заработать после получения определенной инфопорции. До этого ломиться бесполезно, никуда не кидает...

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

Поделиться этим сообщением


Ссылка на сообщение

При заселении локации столкнулся с такой проблемой. 

Есть база группировки, открытая (не такая, как Скадовск или Янов).

Если ГГ начинает с ней (базой) войну, то нужно, чтобы прилетел вертолет и высадил (условно) сквад поддержки.

В ЧН скриптах есть хорошая функция для логики is_smart_in_combat. В ЗП я ее не нашел.

Вот ее 

 

function is_smart_in_combat (actor, npc, p)


if p == nil then abort("Wrong parameter!!!") end
local sim_board = sim_board.get_sim_board()
for k,v in pairs (p) do
local smart = sim_board:get_smart_by_name(v)
local squads = sim_board.smarts[smart.id].squads
for kk,vv in pairs (squads) do
local squad_stage = smart.combat_manager:get_squad_stage(vv)
if squad_stage == "combat" or squad_stage == "defence" then
return true
end
end
end
return false
end

 

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

Проблема в том, что для ее регистрации нужно вносить правки в множество файлов. Саму функцию в xr_conditions, а вспомогательные элементы (например, главный get_squad_stage зарегистрирован в sim_combat, которого в ЗП тоже нет) в другие, _g.script и т.п.. Попробовать можно все это прописать, но я боюсь, что будут конфликты с другими функциями и классами.

Посоветуйте, пожалуйста, что делать?

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

Поделиться этим сообщением


Ссылка на сообщение

Старлей, благодарю, что откликнулся. 

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

Проблему решил по-другому: завел счетчик на смерть неписей, прописал его в работе, т.е. если гасим определенное количество, прилетает вертоль и высаживает десант. Вроде как база несет потери, нужна подмога...

Сработало. ;)

Поделиться этим сообщением


Ссылка на сообщение

Большая просьба ответить на вопрос: в чем разница между функцией hit_by_actor и hitted_by(actor) ?

Поделиться этим сообщением


Ссылка на сообщение

Сталкер Лом, я это понимаю, во втором случае можно даже через двоеточие несколько sid прописать. Но для чего ее (hit_by_actor) вынесли в отдельную функцию?

 

Вряд ли имелись какие-то практические цели. Просто для удобства, дабы не проверять таблицу, а сразу сравнивать id того, кто нанёс хит и id актора. Одним словом - оптимизация.

ColR_iT

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

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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