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

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


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

strchi, вот это уже можно назвать вопросом ... и можно ответить на твое прежнее:

strchi: Почему я спавню ГГ на другой локации, а он оказывается под землей как бы я не менял координаты?

Твоя ошибка при спавне актора на новом месте/локации в том, что задавая новую позицию для актора в all.spawn'е ты изменяешь только один параметр позиции:

position = 537.801025390625,18.2054042816162,278.553558349609

и оставляешь прежним другой параметр:

upd:position = -139.449829101563,-29.6908683776855,-351.492797851563

 

Вот и получается, что у тебя актор спавнится по новым координатам (position), но при инициализации объекта актора (следующим действием движка) он переводится на координаты upd:position, которые уже (вероятно) некорректны для новой локации и актор - оказывается под землей (у=18 => у=-29) иль может оказаться в небесах (ну с небес то он свалится на грешную землю).

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

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

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

Artos, Спасибо, все заработало. ^_^

А вот еще такой глюк нашел, рестриктор не работает.

[2145]

; cse_abstract properties

section_name = space_restrictor

name = vibros

position = 115.13001251221,-0.00020363926887512,272.88821411133

direction = 0,0,0

 

; cse_alife_object properties

game_vertex_id = 2517

distance = 0

level_vertex_id = 5983

object_flags = 0xffffffba

custom_data = <<END

[logic]

active = sr_idle1

 

[sr_idle1]

on_info = {+aes_actor_road} %=start_small_reject% sr_idle2

 

[sr_idle2]

on_info = {+aes_timer_180000} %=start_small_reject% sr_idle3

 

[sr_idle3]

on_info = {+aes_timer_120000} %=start_small_reject% sr_idle4

 

[sr_idle4]

on_info = {+aes_timer_60000} %=start_small_reject% sr_idle5

 

[sr_idle5]

on_info = {+aes_timer_20000} %=start_full_reject% nil

END

 

; cse_shape properties

shapes = shape0

shape0:type = sphere

shape0:radius = 44.6438484191895

; cse_alife_space_restrictor properties

restrictor_type = 3

Помогите пожалуйста.

strchi, благодаря сказанному волшебному слову 'пожалуйста' помогу и в этот раз, НО(!) в последующем не расчитывай на помощь в подобных вопросах. Раз взялся моддить - так и трудись(!), а не возлагай рутину на других.

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

К сути: Твои ошибки:

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

Почему во всем алл.спавне исходной игры для рестрикторов параметр object_flags = 0xffffff3e, а у тебя 0xffffffba?

С лампочками иль досками перепутал? Может это и не критично, но повнимательнее просматривай коды/параметры, да и нелишним почитать про 'object_flags'.

2. Основная (вероятно) ошибка в том, что в параметрах 'cse_shape properties', задав тип 'sphere' и указав радиус (radius), ты пропустил второй параметр 'center' (для новых версий ACDC - 'offset'). Не уверен, что твой компилятор спавна подставляет нужный параметр ...

Остальное проверяй сам, т.е. корректности значений вертексов и пр.

 

И совет: В игре есть же аналог твоему рестриктору - 'aes_space_restrictor_weather'. Что мешает сравнить как в игре и как у тебя?

И имена объектам все же стОит задавать более информативными и эксклюзивными, чем отвлеченный односложный 'vibros' ... Не зря те же разработчики игры используют и приставки от названий локаций и прочие суффиксы.

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

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

Есть такой вопрос, как реализовать скриптовые сцены, типа как на свалке?

Мож кто дураку подскажет: как сделать, чтобы диалог Сидора после принесения флэшки исчезал? Тот, который про спецзадания.

ScheiTan,

не надо себя принижать. В ветке диалога на первую фразу навесить прекондишен вида:

<dont_has_info>тут пишешь инфопоршен, который выдается, когда принесёшь флешку, я честно не помню, какой там</dont_has_info>.

 

Вампир35, Ну без написания логики там точно не обойтись..

===

Подскажите из за чего ошибка вылазиет, копаюсь в СДК, и при выполнении Make Game..

8d2446f355d13a0ff9895fbd1aa6e674539515106853254.jpg

FANAT.gif

Мой канал на ютабчике... / Недельки из жизни фаната STALKER'a / Клуб 'Фанат Отчуждения'

Я нет-нет, а думаю, может я неправильно жил, надо ж брать деньги у богатых и давать их бедным, а таким как ты давать по морде, шоб у мире была красота и гармония.(с)Ликвидация

Всё в порядке, всё нормально, я беру тебя с собой, я беру тебя с собой. В тёмный омут головой.(с)Смысловые Галлюцинации

С помощью логических схем и скриптов.

Ну без написания логики там точно не обойтись..

 

Это понятно, только в каких файлах та же сцена с юриком на свалке?

Вампир35,

1. Три бандоса и Юрик находятся в сматр терейне..

2. Имя Юрика - gar_dm_novice

Имена бандитов gar_dm_bandit_2,1,3

3. Теперь по этим именам ищи в алл.спавне или в конфиг/скрипт ихнюю логику..

FANAT.gif

Мой канал на ютабчике... / Недельки из жизни фаната STALKER'a / Клуб 'Фанат Отчуждения'

Я нет-нет, а думаю, может я неправильно жил, надо ж брать деньги у богатых и давать их бедным, а таким как ты давать по морде, шоб у мире была красота и гармония.(с)Ликвидация

Всё в порядке, всё нормально, я беру тебя с собой, я беру тебя с собой. В тёмный омут головой.(с)Смысловые Галлюцинации

Капрал Хикс, в файле dialogs_escape?

van4e3, а что, тема солянки так сложно ищется?

(Возвращаясь к теме респавнеров, см. #7786)

 

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

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

Смотрим, например, первый попавшийся подобный респавнер 'esc2_respawn_bandits_fabrika', которому в конечном счете задано: спавнить каждый игровой час по 6 бандитов, если актор не на Кордоне. Т.о. только этот респавнер будет наполнять Зону бандитами под завязку ...

Почему же разработчиками закомментированы параметры 'min_count' и 'max_count', которые вроде как могди бы и ограничить предел заспавненных респавнером объектов и/или спавнить меньшими порциями?

В алгоритме работы распавнероводним из основных параметров является кол-во уже заспавненных им объектов в игру (spawned_obj). Этот параметр и в сэйвах сохраняется и на него ориентируется алгоритм спавна, но(!) если задан предел для спавна (max_count). В противном случае получаем почти неограниченный спавн.

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

Причина, ИМХО, такой странности в параметрах в том, что вроде как организовав чистку списков заспавненного, разработчики упустили одну мелочь: В периодах между спавнами респавнеры не контролируются. Если, например, была заспавнена свежая порция бандитов и уничтожена - то их игровые идентификаторы (ID, запомненные в респавнере) освобождаются и ... запросто могут быть присвоены новым появившимся в игре объектам (патроны, аптечки, аномалии, монстры и пр.).

Т.о. при следующей проверке, если бы был установлен max_count, то респавнер, проверив наличие в игре объектов с запомненными идентификаторами (ID), обнаруживает такие объекты! А это значит, что он считает, что уже 6 бандитов в игре имеются, хотя вместо них могут быть уже совершенно иные объекты. Вот и имели разработчики застопорившиеся респавнеры, прекратившие спавн объектов ...

 

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

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

 

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

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

ScheiTan,

да. Находишь там диалог про спецзадание и перед ним ставишь строку про dont has info

Вампир, добавь light на локацию (не важно где). Из настроек необходимо указать путь к текстуре.

Артос - тема про respawners интересует, выкладывай.

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

Правим файл se_respawn.script исходной игры, хотя и к модифицированным вариантам применимо:

 

1. Добавляем в конец конструктора класса se_respawn (например перед 'function spawn(name)') новую функцию расширенной чистки:

--/ -----------------------------------------------------------------------------------------------
--/#+# Clearing: проверка и очистка списков уже заспавненных объектов
--/ удаляются идентификаторы объектов (ID): мертвых, уничтоженных, изъятых из ящиков или с невалидными секциями
--/ -----------------------------------------------------------------------------------------------
function se_respawn:clear_spawned()
  --/ проверка: респавнер инициализирован, список не пуст и окончен тайм-аут
  if self.respawn_section and next(self.spawned_obj) and (self.tm_clear or 0) < time_global() then
    self.tm_clear = time_global() + 5000 --/ обновляем тайм-аут: проверять 1 раз в 5 секунд
    for k,v in pairs(self.spawned_obj) do --/ итерация по списку заспавненных ID (v)
      local bRemove = false --/ метка для удаления записи из списка
      local Obj = level.object_by_id(v) or alife():object(v) --/ объект в игре?
      if not Obj then --/ удаленный объекта
        bRemove = true
      elseif IsMonster(Obj) or IsStalker(Obj) then --/ сталкер/монстр?
        if self.item_spawn then --/ если спавнились предметы ('предметный' респавнер)
          bRemove = true
        elseif Obj.alive and not Obj:alive() then --/ если объект мертв
          bRemove = true
        end
      elseif self.parent then --/ для респавнеров 'в ящик'
        --/ проверка 'валидности владельца' при спавне 'в ящик'
        local idParent = Obj.parent_id or (Obj.parent and Obj:parent() and Obj:parent():id()) --/ ID владельца объекта
        local soParent = idParent and alife():object(idParent) --/ текущий владелец объекта(предмета)
        if not soParent then --/ объект не имеет владельца (или не предмет)
          bRemove = true
        elseif soParent.m_story_id ~= self.parent then --/ SIDы не соответствуют? (объект не в 'своем' ящике)
          bRemove = true
        end
      end
      if not bRemove then
        --/ проверка соответвия секции объекта списку секций респавнера
        local sSection = (Obj.section and Obj:section()) or (Obj.section_name and Obj:section_name()) or "nil"
        local bValided = false --/ метка соответствия
        for _,vv in ipairs(self.respawn_section) do
          if sSection == vv.section then --/ секция объекта соответствует списку?
            bValided = true
            break
          end
        end
        bRemove = not bValided
      end
      if bRemove then --/ чистить?
        --if Obj then printf("clear_spawned:Respawner=[%s/%s]:Del(%s)=[%s]:Obj=[%s]:(%s):[%s]", self:name(), self.id, k, v, Obj:name(), #self.spawned_obj, "x") end --/#~#
        table.remove(self.spawned_obj, k)
      end
    end
  end
end
--/ -----------------------------------------------------------------------------------------------

 

2. Заменяем это:

-- Попытка спаунить объекты. Анализируется сколько уже заспавнено и выбирается один из механизмов - либо 
-- мы доспавниваем до минимального количества, либо спавним с заданной вероятностью
function se_respawn:spawn()
--  printf("RESPAWN: [%s] spawn execute", tostring(self:name()))
  
  -- Пробегаемся по списку уже заспавненных объектов и удаляем из них мертвые либо уничтоженные.
  for k,v in pairs(self.spawned_obj) do
    local obj = level.object_by_id(v)
    if obj == nil then
      obj = alife():object(v)
    end
    
    if obj ~= nil then
      if (IsStalker(obj) or IsMonster(obj)) and obj:alive() ~= true then
        table.remove(self.spawned_obj, k)
      end
    else
      table.remove(self.spawned_obj, k)
    end
  end 

  if xr_logic.pick_section_from_condlist(db.actor_proxy, self, self.conditions) == "0" then
...

на это:

-- Попытка спаунить объекты. Анализируется сколько уже заспавнено и выбирается один из механизмов - либо 
-- мы доспавниваем до минимального количества, либо спавним с заданной вероятностью
function se_respawn:spawn()
--  printf("RESPAWN: [%s] spawn execute", tostring(self:name()))
  
  self:clear_spawned() --/#+# проверка и чистка списков заспавненного
  
  if xr_logic.pick_section_from_condlist(db.actor_proxy, self, self.conditions) == "0" then
...

 

Дополнительно можно добавить вызов очистки при сохранении пакета респавнера в сэйв, дабы не записывать в сэйв 'мусор':

-- сохранение
function se_respawn:STATE_Write( packet )
  cse_alife_smart_zone.STATE_Write( self, packet )
  self:clear_spawned() --/#+# проверка/чистка списка заспавненного
  local table_size = table.getn(self.spawned_obj)
...

 

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

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

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

Артос спасибо, потестирую на выходных. Что то мне подсказывает что ты не обошел вниманием _g.script - уж больно много там мусора. Если да то отпиши, будет интересно посмотреть.

 

Andrey07071977

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

Там не только _g.script вычищен и переработан ... , тот же se_respawn.script перелопачен основательно, и пр. ...

Писать сюда кусками - так весь топик будет в описании и толковании кодов.

(см. в мастерской на сайте мода текущую альфа-сборку)

 

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

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

В последнее время в момент наступления на воду происходит вылет с логом:

FATAL ERROR

 

[error]Expression : SG

[error]Function : CRender::model_CreateParticles

[error]File : E:\stalker\patch_1_0004\xr_3da\xrRender_R2\r2.cpp

[error]Line : 330

[error]Description : Particle effect or group doesn't exist

[error]Arguments : hit_fx\hit_water_00

 

Я пробовал декомпилировать и вставить партикл,но:

1-Я этого партикла нигде не нашёл

2-Я пробовал скопировать hit_water_01 и переименовать.Скомпилировал.Но при повторной декомпиляции этого hit_water_00 уже нету.

Арбитр, у тебя нет этого партикла надо заменить в свойствах материалов партикл на тот который у тебя имеется

S.T.A.L.K.E.R 1.004, Народная..Солянка от 19.04.10, дополнение 14.08.10, патч 3.09.10, DMX 1.3.5, Saruman addon 1.1

Vkontakte

Добавление нового транспорта в сталкер

Народ, подскажите как заспаунить стационарный пулемет? Очень странно, что до сих пор этот вопрос не решили, по крайней мере ответа на форуме я не нашел. С помощью команды alife():create("stationary_mgun"... он спаунится, но невидимый и не рабочий. Через аллспаун тоже не могу, все конфиги перепробовал.

 

"Народ безмолствует ..." © А.С.Пушкин "Борис Годунов"

Задавая вопрос не клич толпу. --/Artos

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

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

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

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

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

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

Войти

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

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

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