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

[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.

 

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

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

Freedom

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

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

 

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

ColR_iT

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

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

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

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

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

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

Войти

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

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

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