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

Скриптование


Svoboда

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

Привет!!!

Вряд ли мне кто ни будь поможет но так как за спрос не бьют...

Вчера взялся совместить два мода AI additions (Rulix aka Bak) и AI Modification by Monnoroch.

Совмещал одинаковые файлы xr_logic.script, modules.script, xr_motivator.script. Делал все аккуратно и правильно с помощью программы Araxis Merge. То есть добавлял недостающие строчки... Вылет.

При загрузке лог ошибки

Expression : fatal error
Function : CScriptEngine::lua_error
File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
Line : 73
Description : <no expression>
Arguments : LUA error: ...\s.t.a.l.k.e.r\gamedata\scripts\smart_terrain.script:344: attempt to index 
global 'xr_logic' (a nil value)

smart_terrain.script

343. if gp.cond then
344. gp.cond = xr_logic.parse_condlist( nil, sect, "cond", gp.cond)
345. end

 

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

Мой архив

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

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


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

Проверяем наличие предмета на поясе!

Автор: singapur22

Хотя и не совсем в тему :russian_ru:

Исправлено!

Достаточно долго бытовало мнение, что определить предмет на поясе невозможно. Теоретически так оно и есть, так как слот belt нигде не отслеживается. Но благодаря ПЫСам, которые наконец соизволили объяснить, пусть не прямой, а косвеный, но всётаки способ определения нахождения предмета на поясе. Давайте сначала разберём как мы это будем делать, чтобы в дальнейшем не было глупых вопросов.

Итак, мы имеем инвентарь актора. Чтобы определить список всего инвентаря, который имеется у актора в наличии, нужно использовать метод db.actor:inventory_for_each(ScanInventory)

Где ScanInventory --имя функции которая вызывается для каждого объекта инвентаря.

Спросите, и как же мы определим какие предметы из них на поясе, а какие нет?! Вот это я щас и попытаюсь описать. Массив инвентаря актора состоит из нескольких субмассивов, которые запрашиваются в фиксированном порядке. А порядок здесь такой:

1. Массив рюкзака.

2. Массив пояса.

3. Первый слот.

4. Второй слот.

и т. д.

 

Чтобы при итерации всего списка инвентаря выудить именно массив пояса, нужно определить последний элемент в массиве рюкзака и ближайший элемент в одном из слотов. Предметы находящиеся между ними и будут являться предметами навешанными на пояс belt.

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

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

Тоесть порядок действий такой:

1. Спавним предмет-разделитель в инвентарь актора.

2. Производим итерацию предметов инвентаря.

3. Как только итератор дойдёт до предмета-разделителя включаем ключ добавления инвентаря во внешнюю таблицу.

4. После включения ключа, следующие предметы после разделителя будут добавляться в таблицу.

5. По мере добавления, производим проверку на нахождение онных в одном из слотов. И как только один из них окажется предметом находящемся в слоте, завершаем пополнение таблицы.

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

 

Вот собственно и весь принцип.

Итак создаём в скриптах новый файл с именем bind_belt.script, и вставляем в него код:

belt = {} --//внешняя таблица пояса

 

local separator = nil --//переменная для сохранения userdata разделителя

local del_separator = false --//ключь удаления разделителя

local start_add_belt = false --//ключь начала заполнения таблицы db.belt

local stop_update = false

local start_function = true

 

--основная функция итерации инвентаря

--(привязана к функции update() в файле bind_stalker.script)

function IterateInventory()

if stop_update then return end

 

--//удаление всех случайно-сохранённых разделителей

if start_function then

db.actor:inventory_for_each(function(item)

if item:section() == "separator" then

alife():release(item, true)

end

end)

separator = nil

del_separator = false

start_function = false

end

 

--//удаление разделителя (третий цикл)

if del_separator and separator then

this.DeleteSeparator()

stop_update = true

return

end

 

--//итерация инвентаря (второй цикл)

if separator then

db.belt = {}

db.actor:inventory_for_each(ScanInventory)

del_separator = true

start_add_belt = false

else

 

--//спавн разделителя (первый цикл)

separator = alife():create("separator", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())

end

end

 

--функция удаления разделителя

function DeleteSeparator()

alife():release(separator, true)

separator = nil

del_separator = false

end

 

--функция сканирования инвентаря

function ScanInventory(item)

local section = item:section()

 

if start_add_belt and not DetermineSlot(item:id()) then

if not db.belt[section] then

db.belt[section] = 1

else

db.belt[section] = db.belt[section] + 1

end

end

 

if item:section() == "separator" then

start_add_belt = true

end

end

 

--функция определения привязки объекта к одному из слотов

function DetermineSlot(item_id)

for i=0, 12 do

local obj = db.actor:item_in_slot( i )

if obj and obj:id() == item_id then

return true

end

end

return false

end

 

--функция запуска обновления таблицы при закрытии инвентаря

--(привязана к колбэку info_callback() в файле bind_stalker.script)

function InventoryInfo(info)

if info == "ui_inventory" or info == "ui_car_body" or info == "ui_trade" then

if separator then

this.DeleteSeparator()

end

elseif info == "ui_inventory_hide" or info == "ui_car_body_hide" or info == "ui_trade_hide" then

stop_update = false

end

end

 

--функция запуска обновления таблицы при потере предмета

--(привязана к колбэку on_item_drop() в файле bind_stalker.script)

function Drop(obj)

if obj:section() ~= "separator" then

stop_update = false

end

end

Создаём объект в конфигах (файл config/misc/items.ltx) с именем секции [separator]:

[separator]:identity_immunities
GroupControlSection    = spawn_group
discovery_dependency =
$spawn = ""
$prefetch = 32
class     = II_BANDG
cform     = skeleton
visual     = equipments\item_bandage.ogf
description     =  
inv_name            =  
inv_name_short      =  
inv_weight           = 0
inv_grid_width     = 0
inv_grid_height     = 0
inv_grid_x     = 0
inv_grid_y     = 0
eat_health = 0
eat_satiety = 0
eat_power = 0
eat_radiation = 0
wounds_heal_perc = 0
eat_portions_num = 1
cost    = 0
animation_slot  = 4

Затем в файле bind_stalker.script производим пропись всех нужных привязок функций:

 

1. Функция actor_binder:info_callback(npc, info_id):

вписываем в конец тела функции: bind_belt.InventoryInfo(info_id)

 

2. Функция actor_binder:on_item_drop(obj)

вписываем в конец тела функции: bind_belt.Drop(obj)

 

3. Функция actor_binder:update(delta)

вписываем в конец тела функции: bind_belt.IterateInventory()

 

Вот собственно и всё.

Этого не знаю, знаю просто где ответ есть. В скриптах не бум-бум.

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

Мой архив

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

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


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

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

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

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

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

Спасибо.

 

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

У меня acdc_x1

#author: bardak

#this modified version by xiani

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

Мой архив

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

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


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

А если предмет посадить на кости объе́кта? Убрать все не нужные анимки и т.д. Или просто прописать соответствующий ему класс?

Мысли в слух...

Министр А если объе́кт больше чем обычно?) Невидимку antreg уже рассматривал, видно не подошла...

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

Мой архив

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

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


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

Привет. Заспавнил зомбика

[664]

; cse_abstract properties

section_name = vodjanoj

name = jup_vodjanoj

position = 250.87719726563,-28.507953643799,97.133178710938

direction = 0.180322349071503,-0.275118470191956,-0.294997245073318

 

; cse_alife_object properties

game_vertex_id = 3740

distance = 25.1999988555908

level_vertex_id = 1139318

object_flags = 0xffffffff

custom_data = <<END

[smart_terrains]

none = true

 

[spawner]

cond = none

END

 

; cse_visual properties

visual_name = monsters\vodjanoj\vodjanoj

 

; cse_alife_creature_abstract properties

g_team = 0

g_squad = 0

g_group = 0

health = 1

dynamic_out_restrictions =

dynamic_in_restrictions =

 

upd:health = 1

upd:timestamp = 0

upd:creature_flags = 0

upd:position = 250.87719726563,-28.507953643799,97.133178710938

upd:o_model = 0

upd:o_torso = -0.275118470191956,0.180322349071503,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_ph_skeleton properties

 

; cse_alife_monster_base properties

 

; se_monster properties

Хочу сделать ему лагерь радиусом 30-40м. Прочитал что можно сделать так:

[665]

; cse_abstract properties

section_name = smart_terrain

name = jup_gen_lager

position = 250.87719726563,-28.507953643799,97.133178710938

direction = 0.0,0.0,0.0

 

; cse_alife_object properties

game_vertex_id = 3740

distance = 2.0

level_vertex_id = 1139318

object_flags = 0xffffffff

custom_data = <<END

[smart_terrain]

type = general_lager

capacity = 1

communities = zombie

END

 

; cse_shape properties

shapes = shape0

shape0:type = sphere

shape0:offset = 0,0,0

shape0:radius = 35.55957102775574

 

; cse_alife_space_restrictor properties

restrictor_type = 3

 

; se_smart_terrain properties

С зомбиком все окей, а вот ограничение на 30-40м нету. Как сделать правильно? У меня одна локация пока чистая.

Мой архив

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

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


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

eXiu А АИ сетка? Нпс твой домик не обойдут...

Цитата из ст_вики:

[vedro]:identity_immunities ;vedro — название спавн-секции предмета (Потом мы будем через него спавнить). Пишется латиницей.

$spawn = "physics\object" ;путь спавн-секции в дереве спавн-объектов в СДК (если не пользуетесь СДК, то особой важности не имеет).

visual = objects\dynamics\decor\vedro_01.ogf ;Путь до модели физического объекта из папки meshes.

class = O_PHYS_S

remove_time = 60000 ;Время через которое объект исчезнет. Число до от 0 до 9999, если поставить 9999 то он просуществует очень долго.

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

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

Мой архив

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

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


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

Уже не в тему ведем тему)). eXiu качай сталкер контент, там домиков много. Только в огм формат перегони через АЕ

Мой архив

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

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


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

:offtopic:

Для общей информации. Товарищ erlik (Garry_Galler) сделал недавно АИ схему по этому поводу:

AI схема - "Разборка в баре"

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

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

За все дальнейшее я не отвечаю.

Есть возможность включить схему не только в баре - читайте комментарии к схеме в файле m_bar.script.

Но по умолчанию она включена только для бара.

 

Описание:

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

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

 

PS: Недоработки схемы прежде всего в том, что под нее берется только один сталкер за раз, а хотелось бы сделать, чтобы одновременно могли подключиться к действию и другие, хотя бы в качестве активных наблюдателей. НО, так как это моя первая AI схема, то много еще неясно и есть куча нюансов, в которых мне пока не удалось разобраться. Например, не получилось сделать временное отключение привязки сталкеров к рестриктору, из которого им запрещено выходить.(Сами методы то мне известны, только работают они не так как хотелось бы). Управление движением NPC тоже непростая, как выяснилось, штука Поэтому некоторые сталкеры могут двигаться кривовато. Кстати, Информатор в баре с трудом берется по контроль схемы - в большинстве случаев он не двигается с места - у меня только пару раз срывался и бежал догонять ГГ. Бармен тоже не хочет подчиняться.

В общем, есть еще куча "неясностей и непонятностей" (как сказала бы кэролловская Алиса), распутать которые мне еще предстоит.

 

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

Мой архив

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

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


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

herurg Должно быть так:

[m_poltergeist_normal]:m_poltergeist_e

Мой архив

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

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


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

TRAMP14 Не пойму в чем у тебя проблема с не видимостью. С конфигом m_phantom.ltx (а точнее с теми моделями) знаком? Минуту нужно на то чтобы поменять шейдер и текстуру для модели нужного нпс.

Kirag прав по поводу модели.

Shadows Не знаю, возможно подойдет.

Представляю скрипт Супер-Мега-Пупер Броника. Скрипт можно привязать к любому бронежилету, хоть к куртке новичка. Точнее, скрипт привязан к актору, где проверяется какой броник надет на ГГ. Если тот, что надо, то скрипт начинает работать.

Особенности:

1. Текущее оздоровление до 0.8 единиц, при падении здоровья актора до 0.4 единиц. Оздоровление плавное, ~2 минуты игрового времени. Система текущего оздоровление ломается, при повреждении броника более чем на 0.6 единиц.

2. Экстренное оздоровление до 0.4 единиц, при падении здоровья актора до 0.2 единиц. Оздоровление мгновенное до 0.4 единиц. Далее действует текущее оздоровление. Система экстренного оздоровление ломается, при повреждении броника более чем на 0.4 единицы.

3. Система поддержки выносливости, более чем в 2 раза. При этом скорость восстановления сил замедленно, так же в 2 раза. Система поддержки выносливости ломается, при повреждении броника более чем на 0.3 единицы. При повреждении броника более чем на 0.7 единиц действует ухудшение выносливости (более быстрое падение сил). В этом случае советуется снять броник.

4. Индивидуальная система вывода оповещений о действиях и состоянии систем броника. Вывод сообщений производится в несколько ниже центральной части экрана. Каждое сообщение сопровождается звуковым зумом. При этом каждый тип сообщений имеет свой цвет.

 

Я не буду подробно описывать, как работает данный скрипт. Это будет слишком муторно и мало понятно. Но некоторые комментарии в скрипте достаточно наглядно объясняют, где и какой код, за что отвечает.

 

Итак начнём. Создаём файл super_outfit.script. И вписываем в нём такой код:

 

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

 

local med_obc = 0 --защёлка вывода информации о запуске текущего оздоровления

local pred_med = 0 --защёлка вывода информации о повреждении системы текущего оздоровления

local ekst_med = 0 --защёлка вывода информации о повреждении экстренного оздоровления

local bron_tek = 0 --защёлка вывода информации о востановлении системы текущего оздоровления

local bron_eks = 0 --защёлка вывода информации о востановлении системы экстренного оздоровления

local pow_kras = 0 --защёлка вывода информации о повреждении и востановлении системы поддержки выносливости

local tbl_news = {} --таблица текстовой информации

local pow = 1 --переменная для запоминания предыдущего параметра выносливости.

 

function update_nano()

local actor = db.actor

local bron = actor:get_current_outfit()

 

if actor:alive() == true and bron and bron:section() == "outfit_exo_m1" then --здесь ставится имя броника

local live_bron = actor:get_current_outfit_protection(9)

 

--запуск текущего оздоровления

if actor.health <= 0.4 and actor.health > 0.2 and med_obc == 0 then

if live_bron > 0.4 then

med_obc = 1

this.text_list(0)

elseif pred_med == 0 then

this.text_list(4)

pred_med = 1

if bron_tek == 0 then

bron_tek = 1

end

end

elseif med_obc == 1 and live_bron <= 0.4 and actor.health > 0.4 then

this.text_list(4)

med_obc = 0

 

--запуск экстренного оздоровления

elseif actor.health <= 0.2 then

if live_bron > 0.6 then

actor.health = 0.2

this.text_list(3)

if med_obc == 0 then

med_obc = 1

this.text_list(0)

else

this.text_list(1)

end

elseif ekst_med == 0 then

this.text_list(5)

if pred_med == 0 then

if med_obc == 0 then

this.text_list(0)

med_obc = 1

else

this.text_list(1)

end

end

ekst_med = 1

if bron_eks == 0 then

bron_eks = 1

end

end

end

 

--поддержка выносливости

if live_bron > 0.7 then

local pow_raz = pow - actor.power

actor.power = pow_raz/1.1

pow = actor.power

elseif live_bron < 0.3 then

local pow_raz = pow - actor.power

if pow_raz < 0 then

actor.power = pow_raz/1.1

else

actor.power = -(pow_raz/1.1)

end

pow = actor.power

elseif live_bron <= 0.7 and pow_kras == 0 then

this.text_list(8)

pow_kras = 1

end

 

--защёлки вывода информации о повреждениях систем броника

if pred_med == 1 and actor.health > 0.4 then

pred_med = 0

end

if ekst_med == 1 and actor.health > 0.2 then

ekst_med = 0

end

 

--апдейт активных действий

this.medic()

this.bron_rem(live_bron)

this.text_news()

end

end

 

--текущее лечение

function medic()

if med_obc == 1 then

db.actor.health = 0.0005

if db.actor.health > 0.8 then

this.text_list(2)

med_obc = 0

end

end

end

 

--востановление ресурсов после ремонта броника

function bron_rem(live_bron)

if bron_tek == 1 and live_bron > 0.4 then

this.text_list(6)

bron_tek = 0

end

if bron_eks == 1 and live_bron > 0.6 then

this.text_list(7)

bron_eks = 0

end

if pow_kras == 1 and live_bron > 0.7 then

this.text_list(9)

pow_kras = 0

end

end

 

--список текстовых сообщений, и запуск соответствующих к ним звуковых сопровождений

function text_list(typ)

if typ == 0 then

table.insert (tbl_news, 1, {'Запущен процесс текущего оздоравления!', 1000, 255, 255, 0})

elseif typ == 1 then

table.insert (tbl_news, 1, {'Продолжается текущее оздоровление!', 1000, 255, 255, 0})

elseif typ == 2 then

table.insert (tbl_news, 1, {'Текущее оздоровление завершено!', 1000, 0, 255, 0})

elseif typ == 3 then

table.insert (tbl_news, 1, {'Произведено экстренное оздоровление!', 1000, 255, 255, 0})

elseif typ == 4 then

table.insert (tbl_news, 1, {'Внимание! Система текущего оздоровления повреждена!', 1000, 255, 0, 0})

elseif typ == 5 then

table.insert (tbl_news, 1, {'Внимание! Система экстренного оздоровления повреждена!', 1000, 255, 0, 0})

elseif typ == 6 then

table.insert (tbl_news, 1, {'Система текущего оздоровления востановлена!', 1000, 0, 255, 0})

elseif typ == 7 then

table.insert (tbl_news, 1, {'Система экстренного оздоровления востановлена!', 1000, 0, 255, 0})

elseif typ == 8 then

table.insert (tbl_news, 1, {'Внимание! Система поддержки выносливости повреждена!', 1000, 255, 0, 0})

elseif typ == 9 then

table.insert (tbl_news, 1, {'Система поддержки выносливости востановлена!', 1000, 0, 255, 0})

end

 

if typ == 4 or typ == 5 or typ == 8 then

this.sound_news(1)

else

this.sound_news(0)

end

end

 

--вывод текстовых сообщений

function text_news()

local hud = get_hud()

local tm = hud:GetCustomStatic("nano_news" )

 

if tm == nil then

hud:AddCustomStatic("nano_news", true)

tm = hud:GetCustomStatic("nano_news" )

end

local tmv = ''

for k,v in ipairs(tbl_news) do

tmv = tmv.. string.format("%s\n", '%c[255,'..tostring(v[3]..','..v[4]..','..v[5]..']')..v[1])

if v[2] > 0 then

v[2] = v[2] - 1

elseif v[3] ~= 70 or v[4] ~= 70 or v[5] ~= 70 then

for j = 3, 5 do

if v[j] > 70 then

v[j] = v[j] - 1

elseif v[j] < 70 then

v[j] = v[j] + 1

end

end

else

table.remove (tbl_news, k)

end

end

 

if tm ~= nil then

tm:wnd():SetText(tmv)

end

end

 

--звуковые сопровождения текстовых сообщений

function sound_news(typ)

local snd

if typ == 1 then

snd = xr_sound.get_safe_sound_object([[device\pda\pda_sos]])

else

snd = xr_sound.get_safe_sound_object([[device\decoder]])

end

snd:play(db.actor, 0, sound_object.s2d)

end

 

--сохранение данных

function nano_save(packet)

packet:w_u8(med_obc)

packet:w_u8(pred_med)

packet:w_u8(ekst_med)

packet:w_u8(bron_tek)

packet:w_u8(bron_eks)

packet:w_u8(pow_kras)

packet:w_u8(pow)

end

 

--загрузка сохранённых данных

function nano_load(reader)

med_obc = reader:r_u8()

pred_med = reader:r_u8()

ekst_med = reader:r_u8()

bron_tek = reader:r_u8()

bron_eks = reader:r_u8()

pow_kras = reader:r_u8()

pow = reader:r_u8()

end

 

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

 

Теперь открываем файл bind_stalker.script, находим функцию actor_binder:update(delta), и в теле функции вписываем апдейт нашего скрипта:

 

super_outfit.update_nano()

 

Затем, ниже находим функцию actor_binder:save(packet) и в конец тела функции вставляем вызов сохранения данных:

 

super_outfit.nano_save(packet)

 

Далее, ещё ниже находим функцию actor_binder:load(reader), и так же, в конец тела функции вставляем вызов загрузки данных:

 

super_outfit.nano_load(reader)

 

Теперь осталось создать виджет, для вывода оповещений. Для этого открываем файл config\ui\ui_custom_msgs.xml и добавляем новую секцию:

 

<nano_news x="240" y="600" width="550" height="100" complex_mode="1">

<text font="letterica18" r="255" g="255" b="255" a="255" align="c"/>

</nano_news>

 

Вот в принципе и всё. Можно идти тестировать. Если у кого есть какие ещё соображения по нововведениям к супер-мега-пупер бронику, просьба писать в коментах.

 

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

Мой архив

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

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


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

Помогите пожалуйста с такой задачкой:

Мне нужно из монстра сделать манекена. То есть чтобы тот все игнорировал и стоял на одном месте.

gruber ты говорил в ТТ2 глянуть. Не подскажите имя той зверюшки? Под каким именем она заспавнена?

Мой архив

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

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


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

Привет. Копаюсь в логике, возникли такие вопросы :)

Мне нужно чтобы радио приемник выключился от выстрела в него. Я сделал ему такую логику (пробовал разные варианты, последним был этот):

[logic]
active = ph_sound
on_hit = hit

[hit]
on_info = %+mil_priemnik_off%

[ph_sound]
snd = radio_music
looped = true
on_info = {+mil_priemnik_off}| ph_sound@end

[ph_sound@end]
snd = $no_sound
looped = false
on_signal = sound_end| nil

Не выключается, вроде где-то видел рабочий вариант, только не помню где.

 

Хочу сделать охранника, который после атаки (любой вид "шухера") вернется на свое место (охраняемую точку). Он игнорирует почему-то логику walker(а)

[logic]
active = remark1
danger = danger_ignore
;meet = meet

[danger_ignore]
ignore_distance = 0

[remark1]
path_walk = walk_soldier_bodyguard1
path_look = look_soldier_bodyguard
;anim = guard
target = nil
meet = meet

[meet]
meet_state    = 5|guard
meet_state_wpn    = 5|threat_fire
victim = 5|actor
victim_wpn = 5|actor
use = true
use_wpn = true

[logic]

active = walker1

danger = danger_ignore

;meet = meet

 

[danger_ignore]

ignore_distance = 0

 

[walker1]

path_walk = walk_soldier_bodyguard1

path_look = look_soldier_bodyguard

combat_ignore_cond = always

on_game_timer = 50 | remark1

 

[remark1]

;path_walk = walk_soldier_bodyguard1

;path_look = look_soldier_bodyguard

;anim = guard

target = nil

meet = meet

 

[meet]

meet_state = 5|guard

meet_state_wpn = 5|threat_fire

victim = 5|actor

victim_wpn = 5|actor

use = true

use_wpn = true

 

 

ColR_iT За радио спасибо, попробую сегодня.

За охранника:

Если я ставлю такой вариант логики

[logic]
active = remark1
danger = danger_ignore


[danger_ignore]
ignore_distance = 0

[remark1]
path_walk = walk_soldier_bodyguard1
path_look = look_soldier_bodyguard
;anim = guard
target = nil
meet = meet

[meet]
meet_state    = 5|guard
meet_state_wpn    = 5|threat_fire
victim = 5|actor
victim_wpn = 5|actor
use = true
use_wpn = true

То мой нпс переходит в meet сразу, не куда не идет.

С тем вариантом логики что ты мне дал у меня идет вылет с аргументом: _g.skript:20 как-то так.

Если я оставлю вариант:

[logic]
active = walker1

[walker1]
path_walk = walk_soldier_bodyguard1
path_look = look_soldier_bodyguard

То он бежит в ту точку и где-то за 1-1,5м до пункта назначения получаю вылет.

Может точки в wp я не так сделал?

 

[look_soldier_bodyguard]
points = p0
p0:name = wp00
p0:position = -138.841918945313,-25.439302444458,-355.694732666016
p0:game_vertex_id = 19
p0:level_vertex_id = 116593


[walk_soldier_bodyguard1]
points = p0,p1
p0:name = wp00
p0:flags = 0x1
p0:position = -135.914733886719,-25.439302444458,-359.351440429688
p0:game_vertex_id = 19
p0:level_vertex_id = 116591

p1:name = wp01
p1:position = -136.714736938477,-25.439302444458,-359.351440429688
p1:game_vertex_id = 319
p1:level_vertex_id = 102988
p1:links = p0(1)

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

 

Еще, если я добавлю вот это:

[logic]

--

on_combat = combat

---

[combat]

on_timer = 30 | walker1

 

По идее вернутся должен, не правда ли?

 

п.с. Только учусь :blush:

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

Мой архив

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

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


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

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

Кампер глючит, по крайней мере на новичке. Я имел в виду так сделать:

[logic]

active = walker1

danger = danger_ignore

on_combat = combat

 

[danger_ignore]

ignore_distance = 0

 

;активная схема

[walker1]

;задаешь точки в которых будет стоять и куда смотреть

path_walk = walk_soldier_bodyguard1

path_look = look_soldier_bodyguard

;игнорируем бой, причем всегда.

combat_ignore_cond = always

;по истечении 50 секунд переходим на схему remark1

on_game_timer = 50 | remark1

 

;перешли на схему

[remark1]

;куда смотрим - не понятно, вычисляется автоматически

target = nil

;как встречаем ГГ

meet = meet

 

;секция реакции на гг

[meet]

;анимация в зависимости от расстояния до актора (если ближе 5 метров отыгрываем guard) (актор без оружия)

meet_state = 5|guard

;тоже самое, только если актор с оружием в руках

meet_state_wpn = 5|threat_fire

;на кого смотрим (ближе 5 метров - на актора)(актор без оружия)

victim = 5|actor

;тоже самое, только ГГ с оружием в руках

victim_wpn = 5|actor

;возможно ли заюзать персонажа

use = true

use_wpn = true

 

[combat]

combat_type = monolith

on_timer = 30 | walker1

 

По экспериментирую.

 

 

Главная задача вернуть его обратно в ту точку.

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

Мой архив

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

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


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

ХЕМУЛЬ36RUS way нужен только при присутствии логики. У аномалий ее нету.

[152]

 

; cse_abstract properties

section_name = zone_mosquito_bald_weak

name = esc_zone_mosquito_bald_weak

position = -62.7365341186523,20.1926517486572,169.534149169922

direction = -0.367405563592911,0.0629953369498253,0.17383885383606

version = 118

script_version = 6

 

; cse_alife_object properties

game_vertex_id = 165

distance = 39.2000007629395

level_vertex_id = 213209

object_flags = 0xffffff3e

 

; cse_shape properties

shapes = shape0

shape0:type = sphere

shape0:offset = 0,0,0

shape0:radius = 5.02300071716309

 

; cse_alife_space_restrictor properties

restrictor_type = 0

 

; cse_alife_custom_zone properties

max_power = 0

 

; cse_alife_anomalous_zone properties

offline_interactive_radius = 30

artefact_spawn_count = 32

 

; se_zone_anom properties

В section_name = zone_mosquito_bald_weak Ставишь любое название аномалии из файлов zone_... и все.

А вообще не спеши, сам пробуй понять как и что.

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

Мой архив

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

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


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

Darkscape Сам не в курсе как да что. У меня в папке по урокам валялось...

Удалим предмет из игры (или сталкера из игры(Удалим Волка)):

function dell_kluk_final()
  local se_obj = alife():object("esc_wolf")
    if se_obj then
       alife():release(se_obj, true)
    end
end

Изменено пользователем ColR_iT
Используем теги...

Мой архив

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

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


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

Dennis_Chikin Очень хороший вопрос. По крайней мере первая его часть :)

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

В конфиге сталкера есть такая строчка:

selector_attack =

Судя по слухам она не работает, в движке упоминаний нету или как-то так. Но у меня есть сомнения, по крайней мере у монстров очень видны отличия в их поведении при редактировании подобных вещей. Короче дальше..

Там, под такими параметрами как, они ниже, есть значения в цифрах:

fOptMemberDistance, ==== тут метры.

fOptMemberDistanceWeight, = тут фиг знает что.

fMinMemberDistance,==== тут метры.

fMinMemberDistanceWeight, = тут фиг знает что.

fMaxMemberDistance,==== тут метры.

fMaxMemberDistanceWeight, = тут фиг знает что.

fMemberViewDeviationWeight, = тут фиг знает что.

Я так и не понял за что отвечает приставка Weight.

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

Мой архив

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

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


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

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