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

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

Keng, НПС "проталкивает" оружием некоторые препятствия, через которые, по идее, не должны, из-за того, что они не взаимодействуют с геометрией как таковой. Они даже по ней не ходят (вопрос поднимался в соседней теме). Граниуц всех их движений (имеется ввиду место действия) определяет АИ сетка, поэтому, если она расположена близко к стене, а габариты НПС чуть более этого расстояния, то в игре и наблюдается таковое. По сути это тема для другого топика.

Что касается Волка, то он не удаляется, он идет на своих двоих... правда в оффлайне. Вообще спавн любого НПС определяется лишь одной точкой, спавниться дважды, да еще и в разных точках они не могут.

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

ColR_iT,Зато могут удалятся и спавнится их клоны :)(со всеми вытекающими,это инфопоршни не относящиеся к новому нпс,но сработавшие на старом,и стартовый инвентарь опять же новый)

Вообще все что зашито в олспавн ,спавнится один раз с началом игры,в процессе добавить кого то можно только через скрипт или респавнер,плодящий клонов(пример солянка в которой попадаются НПС с одинаковыми уникальными именами,потому что прописан их респавн)

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

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

 

Кто-нибудь может подсказать, что я делаю неправильно?

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

Приветствую!

 

 

Ребят,у меня такой вопрос: если весь спаун/спавн игры,прописать чисто в скриптах,то может ли это как то повлиять в игре? Будет ли это нагружать игру?

 

 

Пояснение: я просто учусь создавать модификации,но не разобрался в All.spawn и хочу весь спаун/спавн прописать в скриптах!

 

 

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

rusMAFIA

Здесь всё зависет от твоих целей, если тебе надо просто заспавнить НПС, то спавн скриптами никак не будет отличаться от спавна через all.spawn. Тебе надо будет просто один раз вызвать функцию, которая создаст твоего НПС. Главное выбрать правильное для этого место в скриптах,чтобы не пришлось делать лишние проверки. Как вариант в скрипте bind_stalker.script есть функция

function actor_binder:net_spawn(data)

Которая вызывается каждый раз при загрузке сохранения, достаточно где нить в самом конце функции (это важно) вставить проверку вида:

 

if not db.actor:has_info("mod_new_game") then
-- спавнишь своих нпс --

------------------------------
db.actor:give_info_portion("mod_new_game")
end

 

Другое дело что all.spawn представляет больше возможностей для тонкой настройки НПС, в частности можно укзаать им направление взгляда, story_id, name и прочие параметры, которые тебе могут пригодится в частности если решишь делать квесты. Это всё тоже можно обойти через скрипты, но тебе это явно пока не по зубам.

 

Написанное выше актуально для ЧН/ТЧ. В ЗП НПС и так скриптами появляются.

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

ColR_iT, по поводу параметра online (из вопроса #3678):

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

Пример (из мода ABC): Вход на территирию долга на локации Бар охраняет блокпост перед Свалкой. Охраняется круглосуточно, но(!) имея в своих гулаговых работах дефолтным online = false, как все обычные неписи при превышении дистанции алайфа (switch_distance = 150) - уходят в оффлайн как только актор достаточно далеко, например в баре "100 ренген" или на арене ...

В моде ABC имеется подобие войны группировок, т.е. порой спавнятся группы врагов, нападающие на Бар. Спавнятся, наример, в точке у перехода на Свалку.

Возникает ситуация: ГГ сидит в баре иль воюет на арене, блокпост чист (все в оффлайне), на локацию заспавнены враги, которые в нлайне всегда(!) и ... спокойно пройдя "пустой" блокпост - нападают уже внутри бара. Игрок недоумевает: "А какого черта делала охрана на блок посте?". Тем более, отбив атаку, приходит на блок пост (все выскочили в онлайн!) и видит там полный набор "охранников", не выпустивших ни одного патрона ...

 

Т.о. этим параметром (online) можно задавать - быть ли всегда в онлайне на текущей работе неписю, иль можно "покидать игру" ежели актор далеко. Соответственно можно управлять стычками далеко на на текущей локации, оставляя иль себе "посмотреть" иль "пусть и без меня разбираются".

 

(по другим параметрам чуть позже дам свои комменты ...)

 

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

*Shoker*: Другое дело что all.spawn представляет больше возможностей для тонкой настройки НПС

А вот тут ты уже ошибаешься. С последними вариантами читалок/писалок нет-пакетов, как раз бОльше возможностей предоставляет именно скриптовой спавн:

- можно заспавнить любой объект, который (например, созданный новый класс) не может быть пока включен в all.spawn из-за ограничений ACDC на чтение скриптов (особенно "своих" для каждого мода);

- управление любыми параметрами (включая дирекцию), включая, например, наполнение магазинов нужным набором патронов в оружие и пр ... , чего нельзя задать в all.spawn (через ACDC).

 

А вот другое дело, что то, что делается скриптами при спавне требует ой как много строчек кода для спавна всего того, что в all.spawn'е и ... rusMAFIA пока не догадывается, что на пару порядков легче понять и освоить работу с all.spawn'ом, чем пытаться обойтись без него. Тем более, все одно - перенос в скрипты потребует разбирательства с тем, что же и как нужно выносить из all.spawn'а и ... навык и понимание придет сам собою.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Никто не знает, есть ли метод\функция для выключения (или регулировки) общей громкости звуков и музыки в ТЧ?

Я нашел только метод level.set_snd_volume(), но он устанавливает громкость только у различных звуков, а на музыку (амбиент и музыки в гл. меню) не влияет.

Знаю что можно сделать через команду в консоли, но хотелось бы узнать, может есть спец. метод (как например level.set_snd_volume(), но с учетом музыки).

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

Сообщение от модератора ColR_iT
Приношу свои извинения за скоропостижные выводы и соответственно решение.

Подобные вопросы из области "а можно ли?", пожалуйста, задавать в тему ковырялок, требуемой версией игры.

Изначальный пост будет перенесен в тему "[soC] Ковыряемся в файлах".

Спасибо за понимание.

Изменено пользователем ColR_iT
Всем пока я верю в вас!
Ссылка на комментарий

Всем доброго времени суток,прошу помочь настроить логику нпс(ТЧ).Если портированная мапа Болота(ЧН)(сообщество мапперов,пак).

Заселяю базу ЧН.На локации уже был гулаг для проводника(прямо на базе)(сам проводник заспавнен,у него логика работает).Увеличил в нем кол-во нпс,до 7(спавню 3х+1(стандартный проводник).Но у моих заспавненных нпс какие то проблемы с головой(т.е логикой).Они не хотять сидеть у костра итд.Некоторый вообще уходят из зоны гулага(почему?).Прошу помочь.

[9050]

; cse_abstract properties

section_name = smart_terrain

name = baza_mar_lager

position = -133.499420166016,0.912109017372131,-295.620941162109

direction = -0.352839291095734,0,0.935683965682983

 

; cse_alife_object properties

game_vertex_id = 3381

distance = 5

level_vertex_id = 79047

object_flags = 0xffffff3e

custom_data = <<END

[smart_terrain]

type = baza_mar_lager

capacity = 7

END

 

; cse_shape properties

shapes = shape0

shape0:type = sphere

shape0:offset = 0,0,0

shape0:radius = 20.55957102775574

 

; cse_alife_space_restrictor properties

restrictor_type = 3

 

; se_smart_terrain properties

 

[9053]

; cse_abstract properties

section_name = stalker

name = marsh_csky_1

position = -136.034210205078,0.724393010139465,-292.406188964844

direction = -0.998166263103485,0,0.0605319775640965

 

; cse_alife_trader_abstract properties

money = 5000

character_profile = marsh_csky_1

 

; cse_alife_object properties

game_vertex_id = 3381

distance = 3

level_vertex_id = 78036

object_flags = 0xffffffbf

custom_data = <<END

[smart_terrains]

baza_mar_lager = true

END

 

; cse_visual properties

; cse_alife_creature_abstract properties

g_team = 0

g_squad = 0

g_group = 0

health = 3

dynamic_out_restrictions =

dynamic_in_restrictions =

upd:health = 3

upd:timestamp = 0x6d6d695f

upd:creature_flags = 0x75

upd:position = -136.034210205078,0.724393010139465,-292.406188964844

upd:o_model = 0

upd:o_torso = -0.000645029998850077,0.0445535257458687,0

upd:g_team = 0

upd:g_squad = 0

upd:g_group = 0

; cse_alife_monster_abstract properties

upd:next_game_vertex_id = 3381

upd:prev_game_vertex_id = 3381

upd:distance_from_point = 0

upd:distance_to_point = 0

; cse_alife_human_abstract properties

predicate5 = 1,0,0,2,0

predicate4 = 2,2,1,2

; cse_ph_skeleton properties

upd:start_dialog =

 

; se_stalker properties

[9054]

; cse_abstract properties

section_name = stalker

name = marsh_csky_2

position = -138.034210205078,0.724393010139465,-292.406188964844

direction = -0.998166263103485,0,0.0605319775640965

 

; cse_alife_trader_abstract properties

money = 5000

character_profile = marsh_csky_2

 

; cse_alife_object properties

game_vertex_id = 3381

distance = 5

level_vertex_id = 78036

object_flags = 0xffffffbf

custom_data = <<END

[smart_terrains]

baza_mar_lager = true

END

 

; cse_visual properties

; cse_alife_creature_abstract properties

g_team = 0

g_squad = 0

g_group = 0

health = 3

dynamic_out_restrictions =

dynamic_in_restrictions =

upd:health = 3

upd:timestamp = 0x6d6d695f

upd:creature_flags = 0x75

upd:position = -136.034210205078,0.724393010139465,-292.406188964844

upd:o_model = 0

upd:o_torso = -0.000645029998850077,0.0445535257458687,0

upd:g_team = 0

upd:g_squad = 0

upd:g_group = 0

; cse_alife_monster_abstract properties

upd:next_game_vertex_id = 3381

upd:prev_game_vertex_id = 3381

upd:distance_from_point = 0

upd:distance_to_point = 0

; cse_alife_human_abstract properties

predicate5 = 1,0,0,2,0

predicate4 = 2,2,1,2

; cse_ph_skeleton properties

upd:start_dialog =

; se_stalker properties

 

[9055]

; cse_abstract properties

section_name = stalker

name = marsh_csky_3

position = -138.034210205078,0.724393010139465,-292.406188964844

direction = -0.998166263103485,0,0.0605319775640965

 

; cse_alife_trader_abstract properties

money = 5000

character_profile = marsh_csky_3

 

; cse_alife_object properties

game_vertex_id = 3381

distance = 7

level_vertex_id = 78036

object_flags = 0xffffffbf

custom_data = <<END

[smart_terrains]

baza_mar_lager = true

END

 

; cse_visual properties

; cse_alife_creature_abstract properties

g_team = 0

g_squad = 0

g_group = 0

health = 3

dynamic_out_restrictions =

dynamic_in_restrictions =

upd:health = 3

upd:timestamp = 0x6d6d695f

upd:creature_flags = 0x75

upd:position = -136.034210205078,0.724393010139465,-292.406188964844

upd:o_model = 0

upd:o_torso = -0.000645029998850077,0.0445535257458687,0

upd:g_team = 0

upd:g_squad = 0

upd:g_group = 0

; cse_alife_monster_abstract properties

upd:next_game_vertex_id = 3381

upd:prev_game_vertex_id = 3381

upd:distance_from_point = 0

upd:distance_to_point = 0

; cse_alife_human_abstract properties

predicate5 = 1,0,0,2,0

predicate4 = 2,2,1,2

; cse_ph_skeleton properties

upd:start_dialog =

; se_stalker properties

 

 

[logic@baza_mar_lager_marsh_csky_1]

active = kamp@baza_mar_lager_marsh_csky_1

[kamp@baza_mar_lager_marsh_csky_1]

center_point = baza_marsh_csky_1_kamp

 

[logic@baza_mar_lager_marsh_csky_2]

active = kamp@baza_mar_lager_marsh_csky_2

[kamp@baza_mar_lager_marsh_csky_2]

center_point = baza_marsh_csky_2_kamp

 

[logic@baza_mar_lager_marsh_csky_3]

active = kamp@baza_mar_lager_marsh_csky_3

[kamp@baza_mar_lager_marsh_csky_3]

center_point = baza_marsh_csky_3_kamp

 

--- baza_mar лагерь ---

if type == "baza_mar_lager" then

t = { section = "logic@baza_mar_lager_baza_marsh_provodnik",

idle = 0,

prior = 5, state = {0},

in_rest = "", out_rest = ""

}

table.insert(sj, t)

end

if type == "baza_mar_lager" then

t = { section = "logic@baza_mar_lager_marsh_csky_1",

idle = 0,

prior = 7, state = {0,1,2},

in_rest = "", out_rest = ""

}

table.insert(sj, t)

end

if type == "baza_mar_lager" then

t = { section = "logic@baza_mar_lager_marsh_csky_2",

idle = 0,

prior = 7, state = {0,1,2},

in_rest = "", out_rest = ""

}

table.insert(sj, t)

end

if type == "baza_mar_lager" then

t = { section = "logic@baza_mar_lager_marsh_csky_3",

idle = 0,

prior = 7, state = {0,1,2},

in_rest = "", out_rest = ""

}

table.insert(sj, t)

end

 

 

И еще 1 вопрос.Значение типа center_point = baza_marsh_csky_3_kamp должно быть на карте(физически т.е)?

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

nanshakov, а ты уверен, что твои НПС попадают под этот гулаг? Может гулаг уже пригреб кого-то?

Тебе вообще-то, откровенно говоря, повезло, что в игру вошел без вылета. Чисто в качестве совета: для гулагов делай количество работ всегда больше его вместимости, максимум, что допустимо, одинаковым.

К стати, под каким состоянием гулаг начинает работу (что у тебя в функции load_states)?

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

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

К стати, под каким состоянием гулаг начинает работу (что у тебя в функции load_states)?

Я такой функции даже не делал...А надо было?А где?

nanshakov, а ты уверен, что твои НПС попадают под этот гулаг? Может гулаг уже пригреб кого-то?

Не уверен,а как проверить?

Ссылка на комментарий
nanshakov, много вопросов, причем мало определяющих... Все они (вопросы), скажем так, давно разжеваны, поэтому для начала могу посоветовать дать ссылку на очень хорошую статью на wiki: Настройка логики, там в пяти частях - долго, но информативно. Там ты найдешь ответы на заданные вопросы. Изменено пользователем ColR_iT
Ссылка на комментарий

Подскажите, плиз. Можно-ли скриптово сменить тип патронов заряженных в оружие, находящееся в руках ГГ.

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

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

AndreySol, если оружие в руках (активно) то незаметно для игрока за компом невозможно подменить в нем патроны. Актор (ГГ) - клиентский объект и даже нет-пакеты не помогут, т.к. в оффлайн ты его не уведешь ... , а значит будет заметно.

Можно попробовать манипулирвать подменой имеющихся в его рюкзаке патронов и разряжать оружие в руках ( obj:unload_magazine() ), чтобы уже подзаряжались из рюкзака желаемые ... но сам процес перезарядки все же будет тоже виден.

 

ИМХО, манипулировать подобным в игре с актором - моветон, т.е. навязывание игроку различных "фокусов" с ним и предметами в его руках. Можно понять поломку оружия (пуля/осколок попали), можно понять постеменный износ оружия, но ... исчезновение/подмена патронов - из области фантастики/сказок.

  • Нравится 1

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Помогите написать скрипты и подскажите куда прописать:

1. При использовании предмета Хлеб, в рюкзаке появляется колбаса и водка. Хлеб исчезает.

2. При использовании колбасы, появляется хлеб и исчезает колбаса с водкой.

3. Еще по всей локации разбросан предмет bolt. как сделать чтобы они все удалялись (по типу уборщика оружия даже можно).

 

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

Делал для ЗП запакованные пайки. Покупаешь коробочку, распаковываешь, а там целый набор.

Так же удобно с аптечками. Чтобы не забивать рюкзак всяким хламом лишний раз. Все бинты(особенно кучи таблеток в ЗП хранились в медпакетах). Хотелось бы такое же решение узнать для ТЧ.

В ЗП скрипт выглядел как: ЕСЛИ использован предмет Х То удалить предмет Х и добавить предмет У актору, и т.п.

третий скрипт вообще не представляю как делать.

Истина где-то рядом...

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

ferrari314,

Жеесть.. Ты ещё жив? )))))

А то думал-то... Надож потянул тебя куда.... X_X

 

засовывать скрипт надо в биндер актера, в функцию использования..

И в принципе удаление вроде движковое и удалять не нужно, если конечно порция употребления стоит единица.

На всякий случай напишу....

if (s_obj) and (s_obj:section_name()=="bread") then
       alife():create("kolbasa", actor_position. actor_leve_id, actor_global_id, actor_id)
       alife():create("vodka", actor_position. actor_leve_id, actor_global_id, actor_id)
       alife():release(s_obj, true)
end

Этот код пример на работу с хлебом, сначала определяем что переданный в функцию предмет это хлеб, то создаем два предмет. Указывай в функция позицию и лвид с гвидом и идом актера, для создания.

Ну и удаление переданного нам предмета.

Сувать в функцию use_inventory_item. После

    get_console():execute("snd_volume_music 0")
    get_console():execute("snd_volume_eff 0")
end

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

 

Удаления предмета.. Хмм, куда записать...

for k = 1,65535  do
    local s_obj = alife():object(k)
        if s_obj ~= nil then
        if s_obj:section_name()=="bolt" then 
        alife():release(s_obj, true)
end end end

Вроде так, при условие что болт это секция предмета.

Записать наверно, в net_spawn в биндер актера после строк

    self.already_jumped = false
    self.loaded = false

Если кто может подсказать лучше место, пожалуйста...

P.S. биндер актера - bind_stalker.script.

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

ferrari314,

3. Еще по всей локации разбросан предмет bolt. как сделать чтобы они все удалялись (по типу уборщика оружия даже можно).

Параметр destroy_time в конфиге болта не катит? Или "bolt" новый предмет с одинаковым именем с болтом? (чему я сомневаюсь)

 

засовывать скрипт надо в биндер актера, в функцию использования..

Нужно еще сам колбек юза добавить для начала.

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

Shadows Болт - новая секця.

Unnamed Black Wolf спасибо большое, но ничего не катит.. мало того, что в бинд_сталкере вообще нет функции он_юзе_итем. (ТЧ 1.004 по скриптам почти чистая), хотя я помню в амк такая была.

Куда пихать в чистом бинд_сталкер?

Функция килла болта убивает игру сразу после старта с ошибкой в вормате луа, с отсылкой на файл скриптов которого и в геймдате то у меня нет - вообщем неправильно что-то.

 

 

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

В бинд сталкере - actor_binder:reinit() прописал каллбек:

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

ну и соответственно в конце бинд сталкера добавил метод

 

function actor_binder:OnUseObject(obj, who)

if obj then 
           if obj:section() =="bread" then     
           alife():create("kolbasa", actor_position. actor_leve_id, actor_global_id, actor_id)
           alife():create("vodka", actor_position. actor_leve_id, actor_global_id, actor_id)
           end
      end

end

но при съедании хлеба вообще ничего не происходит. Что не так?

Истина где-то рядом...

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

ferrari314

1) Тут в коде опечатка, после actor_position не точка а запятая.

2) actor_position, actor_leve_id, actor_global_id и actor_id это переменные, которых у тебя наверно нету, замени каждую alife() строчку на:

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

С водкой точно также.

3) Колбек на юзанье предмета по аналогии надо ещё выключать из net_destroy(), но думаю на текущую ошибку это не влияет.

 

Попробуй сперва это, а потом если что продолжим.

 

И удаление болта, как посоветовал Unnamed Black Wolf будет происходить только при загрузке игры (и сохранений), так что тоже учти это.

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

^Shoker^, спасибо.

Поправил ф-ю хлеба:

function actor_binder:OnUseObject(obj, who)

if obj then 
           if obj:section() =="bread" then     
           alife():create("kolbasa", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
           alife():create("vodka", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
           end
      end

end

кллбек все-тот же, итог:

при съедании хлеба не происходит ровным счетом ничего.

 

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

 

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

Добавил выключатель в нет_дестрой:

    self.object:set_callback(callback.OnUseObject, nil)

и поменял вызов из реинита:

self.object:set_callback(callback.OnUseObject, self.OnUseObject, self)

Результат налицо при запуске:

 

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: d:\games\s.t.a.l.k.e.r\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value)

что делать хз

В-первую очередь, прекратить копипастить лог ошибки из буфера, а приводить его из лог-файла, с указанием нескольких строк ДО секции 'fatal error'.

--/Artos

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

Истина где-то рядом...

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

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

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

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

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

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

Войти

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

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

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