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

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

Люди может кто написать шпору по добавлению секций в acdc.pl?

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

Ну собственно и вопрос задам.

Как и куда прописать новую секцию аномалии (допустим zone_teleport_ххх) в acdc.pl чтобы чистый acdc_ТЧ его собрал? Искал подобные секции там нечего не увидел...

Спасибо.

 

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

У меня acdc_x1

#author: bardak

#this modified version by xiani

Там секций типа ее:zone_mincer => 'se_zone_anom нету...

Мой архив

Сталкером не занимаюсь.

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

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

 

Такая картина: Адаптировал Blowout_Mod_1.0 Под пак локаций на версию 1,0004. Решил сверху прикрутить Stalkers_are_not_blind_0.99, но вылетает с логом:

 

FATAL ERROR

 

[error]Expression : fatal error

[error]Function : CScriptEngine::lua_error

[error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp

[error]Line : 73

[error]Description : <no expression>

[error]Arguments : LUA error: ...s\s.t.a.l.k.e.r\gamedata\scripts\bind_stalker.script:2: attempt to index global 'xr_motivator' (a nil value)

 

Кто знает, что это такое, и как это лечиццо?

Заранее благодарен.

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

function init (obj)

xr_motivator.AddToMotivator(obj)

end

 

(первые 3 строки)

 

xr_motivator дописывалось:

 

...

--' Для зомбированных чуваков говорим что аномалий не существует

-- if self.object:character_community() == "zombied" then

local manager = self.object:motivation_action_manager()

manager:remove_evaluator (stalker_ids.property_anomaly)

manager:add_evaluator (stalker_ids.property_anomaly, property_evaluator_const(false))

if outfit_evaluator then

manager:add_evaluator(1101, property_evaluator_const(false))

end

else

 

if ogsm_hideout then

local manager = self.object:motivation_action_manager()

manager:add_evaluator(ogsm_hideout.property_blowout, property_evaluator_const(false))

...

 

 

...

if tonumber(_G.main_menu.get_main_menu():GetGSVer()) <= 1.0004 then

dialog_manager.load(self.object, reader)

else

self.npc_script_version = alife():object(self.object:id()).script_version

dialog_manager.load(self.object, reader, self.npc_script_version)

end

 

dialog_manager.load(self.object, reader)

trade_manager.load(self.object, reader)

 

end

...

 

 

...

-- Эвалюаторы, которые имеют высший приоритет, и, соответственно, перебивают остальные скрипты собой

function addCommonPrecondition(action)

--action:add_precondition (world_property(xr_evaluators_id.reaction,false))

 

if ogsm_hideout then

action:add_precondition(world_property(ogsm_hideout.property_blowout, false))

action:add_precondition(world_property(ogsm_hideout.property_hideout_lost, false))

action:add_precondition(world_property(ogsm_hideout.property_inhide, false))

end

 

action:add_precondition (world_property(xr_evaluators_id.stohe_meet_base + 1,false))

action:add_precondition (world_property(xr_evaluators_id.sidor_wounded_base + 0, false))

action:add_precondition (world_property(xr_evaluators_id.chugai_heli_hunter_base, false))

action:add_precondition (world_property(xr_evaluators_id.abuse_base, false))

if anomaly_evader then

action:add_precondition (world_property(1099,false))

end

if outfit_evaluator then

action:add_precondition (world_property(1101,false)) -- outfit evaluator

end

 

end

 

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

TRAMP14, мало того, что ф-ия "убога", так и причем не один из указанных аргументов не используется, следовательно в ней они не нужны.

 

function bandits_die()
    return has_alife_info("esc_kill_bandits_quest_kill") and not has_alife_info("esc_kill_bandits_noquest_kill")
end

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

Добавлю про check_fighting

 

Использование функции check_fighting

сама функция находится в файле \gamedata\scripts\xr_conditions.script

 

вот она

-- проверка (по story_id) того, что нашим врагом есть хотя бы кото-то один из списка

function check_fighting(actor, npc, p)

local enemy = db.storage[npc:id()].enemy

local sid

if enemy and enemy:alive() then

sid = enemy:story_id()

for i, v in pairs(p) do

--printf("_bp: %s.check_fighting(%d)", npc:name(), v)

if type(v) == 'number' and sid == v then

--printf("TRUE")

return true

end

end

end

--printf("_bp: check_fighting() = false")

return false

end

 

Вызывается из логики НПС

секция [combat_ignore]

 

пример логика бандитов АТП (игнорируюе Шустрого)

файл gamedata\config\misc\gulag_escape.ltx

 

;-------------------------------------------------------------------------------------------------

;-- ESCAPE FACTORY BANDITS

;-------------------------------------------------------------------------------------------------

[logic@esc_fabrika_bandit_walker1]

active = walker1@esc_fabrika_bandit

combat_ignore = combat_ignore

 

[walker1@esc_fabrika_bandit]

path_walk = day_walk1

path_look = day_look1

def_state_moving = raid

def_state_moving_fire = raid_fire

def_state_campering = threat

def_state_campering_fire = threat_fire

combat_ignore_cond = {=check_fighting(004)} игнорируют НПС с story_id = 4

 

004 это story_id Шустрого вот его секция в алл спавне

 

cse_abstract properties

section_name = stalker

name = esc_shustryi

position = 118.689079284668,-7.4942798614502,7.65357303619385

direction = 0,0,0

 

; cse_alife_trader_abstract properties

money = 5000

character_profile = esc_shustryi

 

; cse_alife_object properties

game_vertex_id = 118

distance = 8.39999961853027

level_vertex_id = 422012

object_flags = 0xffffffbf

custom_data = <<END

[smart_terrains]

esc_lager = true

END

story_id = 4

; cse_visual properties

visual_name = actors\novice\green_stalker_1

 

; cse_alife_creature_abstract properties

g_team = 0

g_squad = 0

g_group = 0

health = 2

dynamic_out_restrictions =

dynamic_in_restrictions =

 

upd:health = 2

upd:timestamp = 0x69206669

upd:creature_flags = 0x6e

upd:position = 118.689079284668,-7.4942798614502,7.65357303619385

upd:o_model = 0

upd:o_torso = 0,0,0

upd:g_team = 0

upd:g_squad = 0

upd:g_group = 0

 

; cse_alife_monster_abstract properties

 

upd:next_game_vertex_id = 65535

upd:prev_game_vertex_id = 65535

upd:distance_from_point = 0

upd:distance_to_point = 0

 

; cse_alife_human_abstract properties

predicate5 = 1,1,0,0,2

predicate4 = 1,1,0,0

 

; cse_ph_skeleton properties

 

upd:start_dialog =

 

; se_stalker properties

 

Игнорируемых НПС может быть несколько пример

часть логики стукача на арм складах

 

[5281]

; cse_abstract properties

section_name = stalker

name = mil_freedom_member0001

position = -178.503997802734,-16.9659557342529,352.31005859375

direction = 0,0,0

 

; cse_alife_trader_abstract properties

money = 5000

character_profile = mil_Svoboda_stukach

 

; cse_alife_object properties

game_vertex_id = 1828

distance = 24.5

level_vertex_id = 144846

object_flags = 0xfffff7ff

custom_data = <<END

[logic]

active = walker0

on_death = death

combat_ignore = combat_ignore

 

[walker0]

path_walk = mil_freedom_courier_wait_path

path_look = mil_freedom_courier_wait_look

on_actor_dist_le = 12 | %=killactor%

on_info = {+mil_actor_in_khutor_zone} walker1

 

[walker1]

path_walk = mil_freedom_stukach_walk4

path_look = mil_freedom_stukach_look4

on_actor_dist_le_nvis = 12 | %=killactor%

on_signal = arrive | remark1

combat_ignore_cond = {=check_fighting(712:713:714:719)} false

 

[remark1]

no_rotate = true

no_move = true

anim = wait_rac

snd = mil_pavlik_to_ara

on_signal = sound_end | %+mil_courier_call% remark2

on_actor_dist_le_nvis = 12 | %=killactor%

target = mil_courier_look_point, 0

combat_ignore_cond = {=check_fighting(712:713:714:719)} false

[remark2]

anim = guard

on_info = {+mil_ara_end} kamp1

on_actor_dist_le_nvis = 12 | %=killactor%

target = mil_courier_look_point, 0

combat_ignore_cond = {=check_fighting(712:713:714:719)} false

 

[kamp1]

center_point = mil_freedom_khutor_center

meet_enable = true

meet_dialog = mil_dolg_relax_dialog

danger = danger

path_walk = mil_freedom_khutor_center_task

radius = 3

on_actor_dist_le_nvis = 12 | %=killactor%

combat_ignore_cond = {=check_fighting(712:713:714:719)} false

 

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

Министр это функция из скриптов игры.

Ещё хотел спросить по теме: что именно делает строка return? В справочнике написано что она "возвращает" а что именно возвращает? И как ето помогает?

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

Для АМК. Спавн с выдачей SID_а:

function spawn_mervin22()
    local obj=alife():create("esc_mervin22",vector():set(9.693,56.273,48.022),5205,2417)
    local params=amk.read_stalker_params(obj)
    params.custom="[logic]ncfg = scriptsnewesc_mervin22.ltx"
    params.sid=30139
    amk.write_stalker_params(params,obj)
end

Для контроля назначнных SID_ов надо зарегистрировать Вашего НПС в файле: game_story_ids.ltx (gamedataconfig) по аналогии с остальными. Номер sid надо брать, чтобы он не дублировался с существующими, лучше назначить с "запасом", напрмер, как в примере, иначе будут вылеты с указанием на "дублирование сида".

 

Удаление НПС по SID_у:

function del_mervin22()
    local sim = alife()
    local se_obj = sim:story_object(30139)
    if se_obj then
        sim:release(se_obj, true)
    end
end

Автор не я взято с СП

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

AKKK1, а без помощи функций АМК можно продемонстрировать? Уж очень было бы полезным... :blush:

 

// Из ф-ий АМК там используется только разбор нет-пакета непися. Эта штука достаточна "объемная", лучше самому в скриптах АМК посмотреть. Министр.

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

IQDDD,

return без явного объявления возвращает nil, что в условий эквивалентно логической лжи.

Это почти так. Иногда встречал вылеты в такой ситуации и смысл сообщения был в том, что "значения нет вообще", а не то, что оно равно nil. В частности, пусть есть функция fun1, принимающая bool. Пусть есть вторая fun2, просто с return. У меня иногда был вылет в такой ситуации:

fun1(fun2())

Особенно, если fun1 - движковая, а не скриптовая.

В общем, если нужно вернуть логическое значение - верните nil или false, но не "ничего".

 

AKKK1,

Для АМК. Спавн с выдачей SID_а:

Есть только одна проблема. При этом sid не регистрируется в игре, т.е. он назначен объекту, а поиск по нему делать не выйдет (ну и соответственно в логике не будет работать). Причём, вроде даже не поможет вывести объект в оффлайн, поскольку регистрация происходит при создании/загрузке серверного объекта. Т.е. придётся ждать смены уровня или сохранения/загрузки.

 

 

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

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

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

 

Ссылка на комментарий
...смысл сообщения был в том, что "значения нет вообще", а не то, что оно равно nil...иногда был вылет в такой ситуации:

fun1(fun2())

О, вот и хороший пример. Спасибо.

Р.S.

При вскрытии luа5.1.dll в сообщениях об ошибках используется словосочитание "no value". Что-то не хватило ума его проэмулировать.

Теперь могу :-)

 

...если нужно вернуть логическое значение - верните nil или false, но не "ничего".

 

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

Как раз замена значений, например, объявленных локальных переменных на конкретное значение , прекращало серию "непонятных" ошибок.

Так что хочу подтвердить - (конечно ситуация ситуации рознь, но...) лучше используйте какое-либо значение.

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

Иногда просматривая примеры логики из ресурсов игры,сталкиваюсь с командами и оверрайдами ,не описаными ни в одном справочнике.Ниже я сделал подборку таких примеров.Если кто то сможет дать пояснения по каким либо строкам или хотя бы предположить их назначение,буду очень благодарен,да и многим думаю пригодится

hp_state = 0|wounded_heavy@help_heavy

hp_state_see = 0|wounded_heavy@help_heavy

hp_victim = 0|nil

hp_fight = 0|false

hp_cover = 0|false

psy_state = 0

 

[danger@val_escort_captive]

ignore_types = corpse какие типы можно еще сюда включить

ignore_distance_sound = 2

ignore_distance_corpse = 0 -не противоречит ли это первой строке

danger_inertion_time_hit = 1000

danger_inertion_time_sound = 500

danger_inertion_time_ricochet = 1000

 

no_retreat = true

radius = 1

 

[follower@val_escort_captive_go_to_nap1]

 

stub_for_corpse = true

dont_change_job = true

 

snd = speech -этот тип стоит у всех участников сцены ,но фразы они произносят разные

 

on_actor_dist_le = 3 | mob_camp2 %=monster_berserk% -- интересует эффект в знаках процента

 

on_info = nil %=disable_combat_handler% -так же

 

on_info2 = {=hitted_by(412)} nil %=hit_npc(412:bip01_head:400:2700)% -сдесь так же ,особенно последнее условие

 

combat_ignore_keep_when_attacked = true

 

 

[sr_idle]

on_actor_inside = sr_timer@1 %=play_snd(characters_voice\scenario\radar\rad_hat_1)% -можно ли прописывать путь к файлу звука непосредственно из логики не прописывая его в соунд теме скрипт и в скрипт саунд

 

team = escape_attack_team -что дает присвоение тима

 

reactions = ignore ---что дает эта команда

no_rotate = true

enemy_idle = 60000

radius = 20

show_spot = false

 

leader = 720

stub_for_corpse = true

distance = 0.5

 

 

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

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

active = walker@zaton_layr_0001

danger = danger_ignore@zaton_layr_0001

 

[danger_ignore@zaton_layr_0001]

ignore_distance = 5

 

[walker@zaton_layr_0001]

def_state_standing = ward_noweap

path_walk = zaton_otomstit_stalker_01_way

path_look = zaton_otomstit_stalker_01_look

invulnerable = true meet = meet@zaton_layr_0001

on_info = {+info_zaton_layr_0001} walker@zaton_layr_000101

 

[walker@zaton_layr_000101]

invulnerable = true

path_walk = zaton_otomstit_stalker_02_way

on_signal = path_end | walker@zaton_layr_00011 %+zaton_layr_0001_kvest%

 

[walker@zaton_layr_00011]

invulnerable = true

path_walk = zaton_otomstit_stalker_03_way

on_info = {+info_zaton_layr_tryp_1} remark@zaton_layr_00111

 

[remark@zaton_layr_00111]

anim = ward_noweap

path_walk = zaton_otomstit_stalker_03_way

target = story | actor

no_move = true

meet = meet@zaton_layr_0001

 

[meet@zaton_layr_0001]

close_anim = nil

close_victim = nil

far_anim = nil

far_victim = nil

close_distance = 0

far_distance = 0

close_snd_distance = 3

abuse = false

use = {=actor_enemy} false, true

allow_break = false

meet_on_talking = false

meet_on_talking = false

 

Можно ли как-то запретить этому НПС обыскивать трупы

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

gruber

Спасибо мне тоже интересно что все это значит .

Давайте попробуем разобраться.

 

on_actor_dist_le = 3 | mob_camp2 %=monster_berserk% -- интересует эффект в знаках процента

насколько я понимаю при дистанции = 3 вкючается схема mob_camp2 с эфектом %=monster_berserk%

файл хр_эфект.скрипт вот функция

function monster_berserk(actor, npc)

npc:berserk()

end

что это значит ? может berserk некий параметр поведения?

 

on_info = nil %=disable_combat_handler%

сдесь более менее понятно

 

-- Вызов этой функции отключит обработчик [combat] боя для персонажа.

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

-- уже выполнены, и повторно выполнять их во время боя нельзя (а условия секции [combat] проверяются на каждом

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

function disable_combat_handler(actor, npc)

if db.storage[npc:id()].combat then

db.storage[npc:id()].combat.enabled = false

end

 

if db.storage[npc:id()].mob_combat then

db.storage[npc:id()].mob_combat.enabled = false

end

end

 

-- Вызов этой функции отключит обработчик [combat_ignore] перехвата боя для персонажа.

function disable_combat_ignore_handler(actor, npc)

if db.storage[npc:id()].combat_ignore then

db.storage[npc:id()].combat_ignore.enabled = false

end

end

 

 

on_info2 = {=hitted_by(412)} nil %=hit_npc(412:bip01_head:400:2700)%

 

Функция

function hit_npc(actor, npc, p) тоже более менее понятно (если кто более досконально разберет буду только рад)

local h = hit()

local rev = p[5] and p[5] == 'true'

h.draftsman = npc

h.type = hit.wound

if type(p[1]) == 'number' then

local hitter = level_object_by_sid(p[1])

if not hitter then return end

if rev then

h.draftsman = hitter

h.direction = hitter:position():sub(npc:position())

else

h.direction = npc:position():sub(hitter:position())

end

else

if rev then

h.draftsman = nil

h.direction = npc:position():sub(patrol(p[1]):point(0))

else

h.direction = patrol(p[1]):point(0):sub(npc:position())

end

end

h:bone(p[2])

h.power = p[3]

h.impulse = p[4]

--printf("HIT EFFECT: (%s, %s,%d,%d) health(%s)", npc:name(), p[2], h.power, h.impulse, npc.health)

npc:hit(h)

end

 

--[[

Дать обьекту, заданному story_id, хит.

параметры: actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]

1. sid - story_id обьекта, по которому наносится хит.

2. bone - строка. Имя кости, по которой наносится удар.

3. power - сила удара

4. impulse - импульс

5. hit_src - если число, то рассматривается как story_id обьекта, со стороны

которого наносится хит (он же является и инициатором хита), иначе это

точка (waypoint), из которой по объекту наносится хит.

Если не задано, то берется позиция обьекта, из которого была вызвана

данная функция.--]]

 

[sr_idle]

on_actor_inside = sr_timer@1 %=play_snd(characters_voice\scenario\radar\rad_hat_1)% -можно ли прописывать путь к файлу звука непосредственно из логики не прописывая его в соунд теме скрипт и в скрипт саунд

функция

так же хотеось увидеть полный разбор от знаюших.

-- играть звук в голове актёра

function play_snd(actor, npc, p)

if p[1] then

local snd_obj = xr_sound.get_safe_sound_object(p[1])

--snd_obj:play(actor, p[2] or 0, sound_object.s2d)

snd_obj:play_no_feedback(actor, sound_object.s2d, p[2] or 0, vector(), 1.0)

end

end

 

-- играть звук от указанного объекта

function play_snd_from_obj(actor, npc, p)

if p[1] and p[2] then

local snd_obj = xr_sound.get_safe_sound_object(p[2])

local obj = level_object_by_sid(p[1])

if obj ~= nil then

printf("can't find object with story id %s", tostring(p[1]))

 

-- snd_obj:play_at_pos(obj, obj:position(), sound_object.s3d)

snd_obj:play_no_feedback(obj, sound_object.s3d, 0, obj:position(), 1.0)

en

end

end

 

-- играть звук от указанного объекта

function play_snd_now(actor, npc, p)

xr_sound.set_sound_play(npc, p[1])

end

 

 

это все что я хоть немного понимаю

может более знаюшие помогут разобраться полностью.

 

 

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

Там много чего есть непонятного.

Когда-то написал скрипт (никаких великих целей не ставил, поэтому потратил на него минут ... несколько), которым просмотрел папки config\scripts и config\misk и выбрал название всех секций и все записи, используемые в каждой из секций.

До этого я считал, что знаю достаточно о логике :-)

All_sections_SoC

Правда писал специально для SciTE, поэтому на расширение не обращайте внимания

Да и на значения тоже. Мне главнее были ключи.

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

Добрый день!

Существует ли такая схема логики для НПС в ТЧ 1.0004,

чтобы этот самый НПС следовал за актёром, пока актёр не дойдёт в назначенную точку?

Т.е нужна логика "догоняющего" НПС.

 

Ссылка на комментарий
antreg, в чистом 1004 этого нет. Но есть мод который реализует такую возможность Схема "Компаньоны".
Ссылка на комментарий

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

leader = 720

stub_for_corpse = true

distance = 0.5 -вот пример из тех ,что я спрашивал,просто я думал подробнее узнать о этой схеме и ее нюансах

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

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

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

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

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

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

Войти

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

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

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