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

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


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

Daemonion, а почему ты решил что звук должен перестать проигрываться?

Схема sr_sound_act (sr_sound2d.script) не предусматривает окончания проигрывания моно-файла и на апдейте, как только закончится предыдущее проигрывание, тут же возобновляет его.

Прерывание возможно только при переходе на другую секцию логики.

 

_Val_, ошибочность твоего совета спавнить рестриктор скриптом в том, что при указанном тобою спавне, рестриктор НЕ имеет шейпов, а значит не имеет радиуса (иль площади), чтобы могла отрабатываться on_actor_in_zone. Только когда точка рестриктора окажется внутри актора - сработает.

Так что, при спавне рестрикторов (и зависимых от этого класса других классов: аномалии/переходы/...) необходимо дополнительно нет-пакетами задавать шейпы ...

 

Примечание: Если модмейкер хочет и может заспавнить рестриктор и проверить его - что мешает, при необходимости, и актора телепортировать к этому рестриктору при начале новой игры иль в любой иной момент?! :grin2:

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

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

function spawn_himik_sr()

local se_obj = alife():create("space_restrictor",vector():set(169.09851074219,-2.1591918468475,33.848369598389),324504,2885)

local custom = "[logic]\n"..

"active = sr_idle\n"..

"[sr_idle]\n"..

"on_actor_inside = {+sidor_stvol_start} nil %=buusty_dialog.himik_prygorshnya_spawn =spawn_restrictor.babuin_bratva_spawn_sr%"

rewrite_restrictor(se_obj, custom, 4.0)

end

 

И, желательно, чтобы при попадании в него актора, метка исчезала.

----------

-- чтение формы из нет-пакета

----------

function r_shape(packet)

local s

local st = {}

st.count = packet:r_u8()

st.shapes = {}

for i=1, st.count do

s = {}

s.type = packet:r_u8()

if s.type == 0 then

s.center = packet:r_vec3()

s.radius = packet:r_float()

else

s.axis_x = packet:r_vec3()

s.axis_y = packet:r_vec3()

s.axis_z = packet:r_vec3()

s.offset = packet:r_vec3()

end

st.shapes = s

end

return st

end

 

----------

-- запись формы в нет-пакет

----------

function w_shape(packet, st)

local s

packet:w_u8(st.count)

for i=1, st.count do

s = st.shapes

packet:w_u8(s.type)

if s.type == 0 then

packet:w_vec3(s.center)

packet:w_float(s.radius)

else

packet:w_vec3(s.axis_x)

packet:w_vec3(s.axis_y)

packet:w_vec3(s.axis_z)

packet:w_vec3(s.offset)

end

end

end

 

----------

-- перепаковка нет-пакета созданного скриптом рестрикта

----------

function rewrite_restrictor(se_obj, custom, radius)

local packet = net_packet()

se_obj:STATE_Write(packet)

local game_vertex_id = packet:r_u16()

local distance = packet:r_float()

local direct_control = packet:r_s32()

local level_vertex_id = packet:r_s32()

local object_flags = packet:r_s32()

local custom_data = packet:r_stringZ()

local story_id = packet:r_s32()

local spawn_story_id = packet:r_s32()

local shape = r_shape(packet)

local restrictor_type = packet:r_u8()

 

custom_data = custom

shape = {}

shape.count = 1

shape.shapes = {}

shape.shapes[1] = {}

shape.shapes[1].type = 0

shape.shapes[1].center = vector():set(0,0,0)

shape.shapes[1].radius = radius

 

packet:w_u16(game_vertex_id)

packet:w_float(distance)

packet:w_s32(direct_control)

packet:w_s32(level_vertex_id)

packet:w_s32(object_flags)

packet:w_stringZ(custom_data)

packet:w_s32(story_id)

packet:w_s32(spawn_story_id)

w_shape(packet, shape)

packet:w_u8(restrictor_type)

se_obj:STATE_Read(packet, packet:w_tell() - packet:r_tell())

end

 

 

P.S. Знаю, такой вопрос уже задавался (тему поиском просканировал), но, к сожалению, предложенный ранее вариант лишь привел к вылету с руганью на этот скрипт. Просьба просто подсказать "где" и "что" нужно добавить (какие строки/строку).

P.S.S. Можно конечно и без метки обойтись (и ограничиться устным описанием места спавна), но не хочется флуда потом на форуме от игроков и шквала вопросов "А куда...", "А где..." :)

Ребят, подскажите пожалуйста, есть ли у кого логика вертолета из билда 1935, где он летает по точкам и атакует если атакуют его? Я в логике не силен и пришлось обратится к вам. Если нету, то помогите разобратся\написать пожалуйста.

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

on_actor_inside = {+sidor_stvol_start} nil %=buusty_dialog.remove_metka_one=buusty_dialog.himik_prygorshnya_spawn =spawn_restrictor.babuin_bratva_spawn_sr%

В misc/items к примеру создаёшь секцию

[metka_one]:identity_immunities

GroupControlSection = spawn_group

discovery_dependency =

$spawn = "food and drugs\antirad"

$prefetch = 32

class = II_ANTIR

cform = skeleton

visual = equipments\item_antirad.ogf

description = enc_equipment_medi_antirad1

 

inv_name = Antirad

inv_name_short = Antirad

inv_weight = 0.1

 

inv_grid_width = 1

inv_grid_height = 1

inv_grid_x = 18

inv_grid_y = 12

cost = 100

 

; eatable item

eat_health = -0.2

eat_satiety = -0.25

eat_power = 0

eat_radiation = -1.0

 

wounds_heal_perc = 0

eat_portions_num = 1

 

; food item

animation_slot = 4

 

;hud item

hud = wpn_vodka_hud

 

Две функции, на устанавку и удаление метки в buusty_dialog.script

function set_metka_one()
for a=1,65534 do
  local obj = alife():object(a)
  if obj then
   if obj:section_name()=="metka_one" then
    amk.add_spot_on_map(obj.id,"crlc_big","Примерное расположение того сего..")
    return
   end
  end
end
end

function remove_metka_one()
for a=1,65534 do
  local obj = alife():object(a)
  if obj then
   if obj:section_name()=="metka_one" then
    level.map_remove_object_spot(obj.id,"crlc_big")
    break
   end
  end
end
end

 

Спавнишь метку в зоне рестриктора, и так же 1-й функцией устанавливаешь, а сам рестриктор её удалит при входе ГГ в зону.

 

Указывай адресата и используй, плз, спойлер для портянок кодов. --/Artos

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

Мда-а-а, понасоветовал тут alkogolik ... :crazy:

 

Buusty, неужели в таком простом вопросе загвоздка? Ведь все просто:

"Где" - сразу же при спавне функцией ты имеешь об'ект (se_obj) - а значит и его игровой идентификатор (ID). Т.о. метку ставить можно сразу после спавна или даже в конце твоей функции.

"Что - за установку иль снятие меток отвечают методы level.map_add_object_spot_ser и level.map_remove_object_spot (это и в оригинальных кодах можно посмотреть и в топике "Справочник по функциям и методам).

Помимо идентификатора (ID), аргументами при установке/снятии метки используются тип метки (location) и опсание (hint), которые выбирай по своему вкусу.

Т.о. строки должны быть типа:

level.map_add_object_spot_ser(se_obj.id, location, hint)
level.map_remove_object_spot(se_obj.id, location)

Изменено пользователем Artos
Мда-а-а, понасоветовал тут alkogolik ... :crazy:

 

То, что посоветовал я, сработает на 99,9, а то, что посоветовали вы - уважаемый, может завести в заблуждение, т.к. ответили обычному модмейкеру, а не навороченному скриптеру, т.к. он просил показать, обьяснить. Пардон за адресата и портянки.. :wacko2:

alkogolik, не говори ерунды.

И как это простейшаяя строка для установки метки соотносится с "навороченностью скриптера" и тем более как может ввести в заблуждение?

Куда ж еще проще и понятнее об'яснять/разжевывать?

 

То, что тобою насоветовано может и работает на 99.9%, но и 0.01% кому-то непотребна :grin2: и твой вариант схож с "чесать пяткою ухо" ... и как раз для "перевороченных" скриптеров (ИМХО).

Причем, тобою же насоветовано использовать именно те же строки, только в обрамлении amk-скрипта, да еще и с извратами (иначе не назовешь) по итерации по всему диапазону игровых идентификаторов, с созданием "своих" секций для об'ектов-меток. Ну прямо - "простенько и со вкусом" ... :crazy:

 

В вопросе ничего не говорилось про убирание меток в зависимости от каких-то сюжетных условий, а если такое потребно, то и варианты опять же есть гораздо проще и понятнее (см. установку/снятие меток при выдаче квестов).

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

Artos,

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

Хм...вообще в конце вот этой строки

rewrite_restrictor(se_obj, custom, 15.0)

указан радиус срабатывания...

_Val_, однако в твоем ответе отсутствовали какие-либо коды/пояснения по rewrite_restrictor, что для Daemonion и других делало достаточно неясным/бессмысленным твой совет.

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

 

В вопросе ничего не говорилось про убирание меток в зависимости от каких-то сюжетных условий

 

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

 

rewrite_restrictor(se_obj, custom, 15.0)

 

_val_ показал нормально, лишь только не подробно, но вы цитировали, видно не зная того, что это и является радиусом дейстсвия. Радиус в шейпах сразу затронули, что для обычных рестрикторов применяется в all.spawn. Дык поясните человеку, он же просил. :D Вы же спец, а люди этого хотят!!!!!!

 

 

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

alkogolik, что-то треп идет, а не конструктивный разговор ...

_Val_ дал совет на вопрос Daemonion, т.е. когда вообще ничего неизвестно было про rewrite_restrictor. Поэтому не путай один вопрос с другим, появившимся познее.

И как же я не пояснил как поставить метку на рестриктор? Что еще требуется, чтобы тебе и "человеку" стало ясно. Тупо привести код? Ну так вот с твоими значенияями для типа и описания:

function spawn_himik_sr()
  local se_obj = alife():create("space_restrictor",vector():set(169.09851074219,-2.1591918468475,33.848369598389),324504,2885)
  local custom = "[logic]\n"..
  "active = sr_idle\n"..
  "[sr_idle]\n"..
  "on_actor_inside = {+sidor_stvol_start} nil %=buusty_dialog.himik_prygorshnya_spawn =spawn_restrictor.babuin_bratva_spawn_sr%"
  rewrite_restrictor(se_obj, custom, 4.0)
  --/ ставим метку на рестриктор
  level.map_add_object_spot_ser(se_obj.id, "crlc_big", "Примерное расположение того сего..")
end

 

 

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

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

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

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

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

Задачка то простенькая даже для начинающих модмейкеров ...

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

alkogolik,

Благодарю, все работает! :ok5:

54b194d873636283e39f658d25f99a72.jpeg

 

Спавн предмета через диалог и через этот же диалог функция на "повесить метку" на данный предмет.

 

Artos,

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

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

Мне просто в эти тонкости нет большой необходимости погружаться с головой. Можно обладать минимумом знаний в вопросах скриптования, и делать интересный сюжет. И дело не в том, что мне лень этим заниматься, вопрос в другом - сколько времени на это уйдет.... С одной меткой три дня выходных, а если дальше в таком же духе изучать/постигать азы скриптования? Релиз мода можно будет просто похоронить (примеров подобных ситуаций масса).

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

С уважением. Buusty.

 

Artos, Вот, с этого и нужно начинать, только метка вроде как не удалится, после использования рестриктора, аль нет? :crazy:

alkogolik, а что подразумевается под "после использования рестриктора"? И что под "удалиться"?

Судя по вашим репликам ... вы не удосужились сказать самого главного, без чего вопрос имеет либо один простейший ответ (каков и был дан) или бесконечное множество вариантов, один из которых и дал alkogolik.

 

Ну и для вашего развития, дам пищу для размышлений:

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

Т.е. в ту же spawn_restrictor.babuin_bratva_spawn_sr добавить:

function babuin_bratva_spawn_sr(actor, obj)
  level.map_remove_object_spot(obj:id(), "crlc_big") --/ снимаем метку с рестриктора
  --/ ... ваш код
end

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

Изменено пользователем Artos
P.S. Так что, пусть даже метод alkogolikа спавна метки и через... "одно место", но зато он работает (проверено) и мне этого вполне достаточно, чтобы двигаться дальше.
Хочу поздравить, но Ваше высказывание абсолютно утопическое.

Через "одно место" к этому месту и приведёт.

Поверь дружище, проверено опытом. И, снова поверь, не малым.

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

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

Artos

Не пиши синим ничего. Я и так понимаю что пост пойдёт под снос.

 

Artos,

в твоем ответе отсутствовали какие-либо коды/пояснения по rewrite_restrictor

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

 

Давай заканчивать этут тему. :rolleyes:

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

Да и собственно сам вопрос был о другом, да и автор вряд ли сюда уже заглянет ... (потеряв свой же вопрос и ответы). --/Artos

Да...думаю хватит)))

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

Ну зачем же так, ребята? Давайте жить дружно! :)

Даже немного неловко, что я стал косьвенной причиной этой небольшой перепалки.

 

 

----

По делу.

----

Ради объективности, нужно признать, что код Artosа тоже рабочий. После того, как он полностью привел пример (не с кусочком кода, а целиком полный код функции. I'm sorry, ну не понимаю я этих нюансов). Метка заспавнилась.

1f3665dd1329d87818bf10827a3c2099.jpeg

 

Исправление/добавление второй функции, на удаление метки, тоже сработал (ну, опыт есть опыт и его не пропьешь :)). Прогнал квест полностью - все работает, все спавнится/удаляется.

===

Вывод, который напрашивается :

Метод Artosа спавна метки безусловно проще (и скорее всего, правильнее), если нужно поставить метку точно на предмет/рестриктор/непися и т.д. Но метод alkogolikа тоже будет полезен в некоторых случаях. В каких? Когда нужно лишь примерно обозначить место, искомого предмета/непися, а не точно по центру груга. Сейчас же все идут тупо к центру круга и знают, что найдут то, что ищут. А заспавни вот так предмет, метрах в 80-100 от нужного по квесту и поставь на него метку - место приблизительно обозначено, но это совсем не по центру (как сейчас). Мне кажется, это гораздо интереснее для игрока будет. В итоге - без метки вобще - тяжко, с меткой "по центру" - слишком просто, а здесь, со спавном предмета где-нибудь "по периферии", будет золотая середина. Но это конечно лишь мое ИМХО, не более. :)

====

Artos и alkogolik спасибо за помощь (за реальную помощь), будет хороший, интересный квест (я надеюсь), так сказать "lege artis!"

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

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

1. Рандомность установки метки, т.е. чтобы не указывала на точное "положение центра" тоже давно уже имеет гораздо более изящное решение. Посмотри, например в NLC6, где из четырех пометок со смещенным центром, выбирается рандомно один - вот тебе и "лишь примерное расположение".

Я уж не поминаю тут того, что при спавне рестриктора его шейпам можно задавать смешения(!), что собственно и может давать такой же эффект рандомного смещения от центра иль от прямоугольника.

2. А вот ежели заспавнишь "вот так предмет, метрах в 80-100 от нужного по квесту", т.е. вдали от рестриктора, то как же будешь выходить из тобою же заданного условия on_actor_inside? Будешь задавать радиус рестриктору в 100++ метров, дабы твою метку в стороне гасил? ;-)

3. Порочность варианта аля-alkogolik в том, что:

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

Да неужели только по имени умеем искать нужный предмет, чтобы его удалить? Лишнего мусора в конфигах и без этого предостаточно.

б) такую метку можно использовать только одну за раз, иначе удалять неизвестно что будешь. Т.о. для каждой пометки своя метка/секция ... А ежели квестов не один, а десять-двадцать? ;-)

в) Использовать итерацию по всем 65535 идентификаторам при установке/снятии меток - мягко-говоря моветон. Всего то требуется запомнить сам идентификатор и именно по нему ставить снимать пометку. Ну иль даже со story_id спавнить и удалять по нему же.

 

Пишу это не столь для Buusty иль alkogolik, а чтобы читающие старались не повторять того, что хотя разово и дает вроде результат, но порочно по сути ...

Вывод который напрашивается: Чтобы почесать нос достаточно рук и ... не стОит использовать пятки. :crazy:

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

Artos

Не хочу ввязываться в очередной срач, но любопытство берет вверх

Посмотри, например в NLC6, где из четырех пометок со смещенным центром, выбирается рандомно один - вот тебе и "лишь примерное расположение".

А зачем вообще нужно было снимать координаты для 4 различных точек? Ведь у спейс рестрикторов нет оболочки, поэтому по идее можно было бы использовать math.random для получения рандомной точки в пространстве. Зачем нужно было напрягаться и искать эти 4 точки?

 

Немного не правильно понял. Координаты здесь практически не причём, во всяком случае те, которые на уровне.

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

ColR_iT

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

Подскажите пожалуйста какую логику писать НПС чтоб после атаки он шёл на место спауна? а что писал ему логику, на него бежит кабан он уходит с места, убивает его и остаётся там, т.е. не идёт на место спауна.

 

Вот здесь: "Настройка логики" расписана логика поведения НПС. И если обратить внимание на то, что написано про схему remark, то можно понять почему у тебя возникает данная проблема.

ColR_iT

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

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

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

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

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

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

Войти

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

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

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