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

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

AndreySol

pstor - можно трактовать как Personal Storage, т.е. некое 'хранилище' конкретного объекта в игре.

 

В нем можно хранить что угодно, как и в других таблицах, но(!) запоминаться будут только строковые, числовые или булевы значения (при иных -> fatal error).

 

При создании сэйва, для каждого объекта (если забинден) вызывается алгоритм сохранения его pstor'а (см. в xr_logic.script), и все значения запоминаются в создаваемом сэйве.

При запуске сэйва - из него биндером объекта вновь вызывается алгоритм считывания в pstor конкретного объекта сохраненых ранее значений.

Т.о. то, что сохранено в pstor'е - хранится на всем протяжении игры (естественно, если объект в игре).

Размер сохраняемого pstor НЕ дожен превышать ~8000 байт.

 

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

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

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

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

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

Опять наскриптовался по самое небалуйся...

 

В общем, задача: сделать лагерь охранников ученых у бункера на Янтаре.

[4725]

 

; cse_abstract properties

section_name = smart_terrain

name = scientist_guard

position = 48.12174987793,-11.88060092926,-271.53497314453

direction = 0,0,0

game_vertex_id = 1480

level_vertex_id = 63987

distance = 0

object_flags = 0xffffff3e

custom_data = <<END

[smart_terrain]

type = scientist_guard

capacity = 5

communities = ecolog

groups = 2

END

; cse_shape properties

shapes = shape0

shape0:type = sphere

shape0:offset = 0,0,0

shape0:radius = 6.5

; cse_alife_space_restrictor properties

restrictor_type = 3

; se_smart_terrain properties

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[4726]

; cse_abstract properties

section_name = respawn

name = scientist_guard_respawn

position = 50.741165161133,-11.879903793335,-272.93768310547

direction = 0,0,0

game_vertex_id = 1480

level_vertex_id = 65146

distance = 0

object_flags = 0xffffff3e

custom_data = <<END

[respawn]

respawn_section = scientist_guard_1, scientist_guard_2, scientist_guard_3, scientist_guard_4, scientist_guard_5

max_spawn = 999

min_count = 5

max_count = 5

idle_spawn = medium

END

; cse_shape properties

shapes = shape0

shape0:type = sphere

shape0:offset = 0,0,0

shape0:radius = 5

; cse_alife_space_restrictor properties

restrictor_type = 0

; se_respawn properties

function load_states(gname, type)
  if type == "scientist_guard" then
    return function(gulag)
      return 0
    end
  end
end

function load_ltx(gname, type)
  return nil
end

function checkStalker(npc_community, gulag_type, npc_rank, se_obj)
  if gulag_type == "scientist_guard" then
    return npc_community == "ecolog"
  end
end
  
local t = {}

function load_job(sj, gname, type, squad, groups)
  if type == "scientist_guard" then
    t = { section = "logic@scientist_guard_walk_1",
      idle = 0,
      prior = 20, state = {0},
--      online = true,
      in_rest = "", out_rest = "",
      position_threshold = 600
    }
    table.insert(sj, t)
    t = { section = "logic@scientist_guard_walk_2",
      idle = 0,
      prior = 20, state = {0},
--      online = true,
      in_rest = "", out_rest = "",
      position_threshold = 600
    }
    table.insert(sj, t)
    t = { section = "logic@scientist_guard_patrol_l",
      idle = 0,
      prior = 15, state = {0},
--      online = true,
      in_rest = "", out_rest = "",
      position_threshold = 600
    }
    table.insert(sj, t)
    t = { section = "logic@scientist_guard_camp_1",
      idle = 0,
      prior = 15, state = {0},
--      online = true,
      in_rest = "", out_rest = "",
      position_threshold = 600
    }
    table.insert(sj, t)
    t = { section = "logic@scientist_guard_camp_2",
      idle = 0,
      prior = 5, state = {0},
--      online = true,
      in_rest = "", out_rest = "",
      position_threshold = 600
    }
    table.insert(sj, t)
  end
end

function checkMonster(npc_community, gulag_type)
  return false
end

[logic@scientist_guard_walk_1]

active = walker@scientist_guard_walk_1

 

[walker@scientist_guard_walk_1]

path_walk = walk_1_walk

path_look = walk_1_look

danger = danger_condition@scientist_guard

 

 

[logic@scientist_guard_walk_2]

active = walker@scientist_guard_walk_2

 

[walker@scientist_guard_walk_2]

path_walk = walk_2_walk

path_look = walk_2_look

danger = danger_condition@scientist_guard

 

 

[logic@scientist_guard_patrol_l]

active = walker@scientist_guard_patrol_l

 

[walker@scientist_guard_patrol_l]

path_walk = patrol_l_walk

path_look = patrol_l_look

danger = danger_condition@scientist_guard

 

 

[logic@scientist_guard_camp_1]

active = kamp@scientist_guard_camp_1

 

[kamp@scientist_guard_camp_1]

center_point = camp_1_centr

danger = danger_condition@scientist_guard

 

 

[logic@scientist_guard_camp_2]

active = kamp@scientist_guard_camp_2

 

[kamp@scientist_guard_camp_2]

center_point = camp_2_centr

danger = danger_condition@scientist_guard

 

 

[danger_condition@scientist_guard]

ignore_distance = 0

ignore_distance_corpse = 0

 

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

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

Dreamtale

1. Если постишь коды - старайся из отформатировать так, чтобы другим читать было удобно. Излишки/недостатки пробелов и пр. только убивают желание вникать в код ... Для скриптов - искользуй тэги кодов, дабы не сбивалось исходное форматирование.

2. Совершенно неразумно ставить max_spawn = 999 при 100% выборе одной из секций для спавна. Если секция не будет заспавнена в данное времы срабатывания респавнера, то пытаться тысячу раз заспавнить - глупое расходование ресурсов в игре ...

При твоем задании для секций спавна (probe = 100% для каждой) достаточно установить max_spawn = 5 (т.е. max_count).

Да и это излишне, т.к. min_count = 5 - задает респавнеру однозначную задачу заспавнить в обязательном порядке 5 объектов и дальнейшие манипуляции с max_spawn по сути бессмысленны, т.к. если не выполнен 'срочный' доспавн, то и далее недоспавнится, а если выполнен - то кол-во уже достигло заданного.

3. Судя по твоей фразе, что ранее один спавнился, а теперь и этого не происходит - можно предположить, что твой гулаг НЕ работает (не раздает работы), а других работ в Зоне для твоих ученых маловато (для одного как-то нашлась работенка).

Выводи в лог информацию о том:

- работает ли твой гулаг (т.е. создаются ли работы);

- запрашивают ли твои ученые работу у этого гулага;

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

Что-то более определенное по кускам твоих кодов предположить затруднительно ...

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

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

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

Dreamtale

А вот как выводить в лог нужную тебе информацию потрудись сам посмотреть и в кодах почти любого мода и в этом топике. Тут даже давал коды универсального вывода в лог-файл практически любой информации (т.е. даже nil'ов) ...

Программист/модмейкер, пишуший код 'вслепую' - гений или ламер, ИМХО.

 

P.S. См. тут. Остается только вставить в свои коды (или в _g.script) и в нужном месте кодов вставлять строки типа: printf ( "Это вывод в лог информации: %s", my_info )

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

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

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

Ок, вот такое:

! Cannot find saved game :>respawn: [scientist_guard_respawn] spawn execute
! Cannot find saved game :>spawning [scientist_guard_respawn], cant spawn. max count reached!!!

Странно, вроде бы в MaxCount поставил экологов всех рангов по сотне, а все равно...

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

своем собственном

Собственном - конечно... ;)

 

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

Dreamtale

1. Моддинг - это в первую очередь работа СВОЕЮ головой, а уже потом идеи/концепты/сценарии/ , чтение мануалов и туторов, кодинг и пр.

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

2. Разъяснять как заменить одну функцию другой - не собираюсь (это азы даже не программирования).

То, что вставить коды указанные по ссылке можно куда потребно - указал выше. Даже указал конкретное место (_g.script), куда же еще понятнее растолковывать?

3. О том куда вставлять свои выводы в лог:

а) В котрый раз даю понять, что не имея ТВОИХ скриптов варианта, только два говорить о неких исходных из игры и быть готовым к очередному "А у меня номера строк другие ...!" или же б) заниматься общей теорией ... по виртуальным скриптам.

б) Включаем голову и думаем:

 

- "работает ли твой гулаг (т.е. создаются ли работы);"

Где создаются работы твоего гулага? Да в тобою же написанной в некоем скрипте function load_job -> if type == "scientist_guard" then.

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

 

- "запрашивают ли твои ученые работу у этого гулага;"

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

 

- "не удаляет ли респавнер твоих заспавненных неписей по причине нехватки рабочих мест"

Это уже скрипт респавнера, который у кахдого может быть "своим", т.е. модифицированным, но в этом скрипте легко увидеть корневую функцию function spawn, в которой и спавнится объект.

Вставив в начало инфо-строку о спавнящемся объекте - можно получить общую информацию о респавне, в том числе и о "спавнятся ли мои неписи?".

Если вставить перед строкою удаления объектов - то получить инфу о всех "неподходящих объектах" ...

 

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

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

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

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

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

Artos, Спасибо, теперь понял. Вот видишь, как все просто - достаточно пары предложений, чтобы найти общий язык. Так же куда проще и, главное, быстрее, чем писать полотна обличительных душеспасительных постов, правда?

 

А что мне лог выдал - выше в моем посте.

 

Добавлено:

Лог:

! Cannot find saved game :>respawn: [scientist_guard_respawn] spawn execute
! Cannot find saved game :>spawning [scientist_guard_respawn], cant spawn. max count reached!!!

Вытекает отсюда:

 for i=1,self.max_spawn do   
    if self.max_count ~= -1 and table.getn(self.spawned_obj) >= self.max_count then
            printf("SPAWNING [%s], CANT SPAWN. MAX COUNT REACHED!!!", tostring(self:name()))
      return
    end

Короче, стандартный крипт АМК.

Изменено пользователем Artos
Ссылка на комментарий
Dreamtale: Так же куда проще и, главное, быстрее, чем писать полотна обличительных душеспасительных постов, правда?

НЕТ, не правда.

а) не будь я куратором топика - давно бы тебя в игнор поставил ...

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

Большинство мною написанное - НЕ только к тебе адресовано, но и ... в назидание ...

 

 

Ну а по логу:

Наконец прозвучали слова о версии мода/скрипта

Лог говорит, что кол-во заспавненных объектов данным респавнером уже достигло максимума (вероятно в выше сделанном 'срочном' спавне по минималу, о чем и говорил).

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

Респавн в кодах АМК довольно строгий, не "своих" в Зону гулять не пущает.

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

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

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

Прошу помощи. Пытаюсь запустить партикл. Партикл 100% должен работать бесконечно. Запускаю таким образом:

local particle = particles_object("mel_test\\test_no_time")
particle:play_at_pos(db.actor:position())

Однако партикл исчезает через несколько секунд. Где я ошибся?

Freedom

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

как открыть этот all.spawn

 

Читаем топик: "Universal ACDC и другие perl-скрипты

Более подробно см. в статье "All.spawn" на вики-сайте из шапки топика --/ Artos

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

Пункт 3.

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

Строгое предупреждение от модератора ColR_iT
Вечер добрый, Дамы и Господа!

Я смотрю меня тут ждали...

Ну что же, дядяСаша...

Опишу еще раз то, что тебе все хором сказали:

Если ты чего-то не понимаешь - это не значит, что это бред! Можно было бы и задуматься над тем, что для других статьи на Wiki, почему-то не кажутся "рисовкой", как ты сумел выразиться, а для тебя это оказалось пустой писаниной. Ответ на этот вопрос прост - ты пытаешься прыгнуть выше своей головы! Многие собственноручно заползали на эту высоту и никому не показалось, что статьи от создателей игры, как то вяло реализуют их идеи. То что там написано это всего лишь инструмент для реализации твоих идей, если конечно ты сумеешь воспользоваться данным инструментом...

По поводу твоего варианта массовки: если ты считаешь эти "танцы с бубном" "примитивным" вариантом, то ты в принципе не умеешь задаваться целью ставить вопрос, а следовательно и задачу, - правильно!

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

Ссылка на комментарий
Лёха_тц, в принципе так же как и остальные, вот только наличие 20 и более таких массивных объектов на одной локации, может привести к заметным лагам. При всём этом, есть большие минусы, один из которых - пользование этих объектов НПС, они не будут на них заходить (в случае с вышкой), поскольку на них отсутствует АИ сетка. Также, обязательным условием спавна, является наличие в модели хотя бы одной кости (подозреваю, что ты используешь сталкер_контент для СДК).
Ссылка на комментарий

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

 

Спустя некоторое время...

а через ал спавн нельзя ?

Изменено пользователем ColR_iT
Лёха_тц.gif
Ссылка на комментарий

Лёха_тц, собственно у ПЫС это функция create, вот ее описание:

create(string <имя секции объекта>, vector* position, int level_vertex_id, int game_vertex_id, int parent_id)

подробнее о скриптовом спавне можешь прочитать здесь: http://www.stalkerin.gameru.net/wiki/index...вн_через_скрипт

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

 

Можно и через all.spawn. Берешь секцию любого физического объекта и меняешь путь модели на свой.

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

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

Лёха_тц.gif
Ссылка на комментарий

Немного дополню ответ по спавну:

Помимо собственно спавна скриптом объекта, для некоторых моделей/типов объектов требуется дополнительно нет-пакетами подправить дефолтные параметры заспавненного объекта. Напримет для вертолетов это анимация и звуки, для визуальных аномалий - анимация и т.п. Для физ.объектов - 'fixed_bones' важен.

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

Ну а какой способ удобнее (скриптовой иль через all.spawn) - это и субъективно и от требуемой задачи зависит, по всем своим возможностям они (способы спавна) практически равнозначны.

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

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

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

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

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

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

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

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

Войти

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

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

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