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

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


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

KD87, В НС к примеру у Гарика все время растет ранг, а ведь он в баре, и ни кого не мочит..

FANAT.gif

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

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

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

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

гарик с жориком наверное на кулочках соревнуются, как уменьшит начисление рейтинга им?

 

Будешь продолжать писать без соблюдения правил форума по грамматике - будут последствия. --/Artos

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

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

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

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

Artos, в продолжении вопроса увеличения респауна появления врагов...

 

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

 

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

 

Как отредактировать для этого файл se_respawn.script и после каких именно строк?

 

Заранее спасибо... помогите пожалуйста

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

Wolix, довольно невнятно описано то что требуется ...

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

Пока кратко повторю:

Респавнеры в оригинальной игре:

а) не спавнят в онлайне (если им специально не задан параметр respawn_radius)

б) не запоминают в сэйвы времена последних спавнов.

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

Отличие в случае перехода на др. локацию от простой загрузке сэйва на локации в том, что прекрашается респавн на новой локации (на которую перешел актор) и возобновляется на той, которую покинул.

 

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

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

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

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

Ссылка на комментарий
Weeko, насчет "НЕ РАБОТАЕТ":

1. Не стОит отождествлять то, что ты удосужился прочесть ... со всем-всем-всем. И на этом форуме, при желании, можно найти гораздо больше и подробнее по этому вопросу.

2. Если ты не видишь что-то, то это не значит что это НЕ работает.

 

О цифирьках:

Формат времени указан и в названии метода (setHMSms): Н,M,S ms - т.е. час,минута,секунда,милисекунда. Уж это можно найти в ФАКах или самому догадаться.

Т.о. в строке кода респавнера, в которой задается пауза для респавна (idle_time) стоит исходная пауза:

0 часов, 0 минут, 0 секунд, далее идут милисекунды, хотя множитель 1000 превращает их по сути в секунды. Сделано это для удобства задания рандомного диапазона.

Твой вопрос о "что за цифры?" - говорит о низком знании (если не о полном незнании) языка Lua, на котором написаны скрипты игры.

Код: math.random(self.idle_spawn_min, self.idle_spawn_max) читается как:

"получение случайного числа из диапазона заданного минимальным значением (1-м числом self.idle_spawn_min) и максимальным (2-м числом - self.idle_spawn_max)[/)".

Т.е. из параметров каждого респавнера считываются минимум и максимум и из них расчитывается пауза для следующего респавна объектов.

 

О том КАК это работает:

Если в исходном случае пауза задается милисекундами, то во втором случае вместо 0 часов применяется рандомный метод и для часов, которые и указываются как минимум и максимум: (Первое число, Второе число).

Т.о. вместо стандартной паузы (medium) примерно в 60*60*1000 милисекунд = 360 секунд = 60 минут = 1 час

в измененном варианте к этим секундам задаются и часы.

 

Но(!) огорчу тебя, показав как это "РАБОТАЕТ НЕ РАБОТАЯ":

1. Все эти параметры для пауз вступают в силу ПОСЛЕ события спавна, т.е. при старте игры каждый респавнер спавнит по определенным ему условиям объекты т.к. изначально пауза ОБНУЛЕНА и только после этого наступает пауза до следующего респавна.

2. Установленные паузы НЕ сохраняются в сэйвах и т.о. при КАЖДОМ перезапуске игры эти паузы вновь обнуляются и респавнеры спавнят объекты.

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

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

 

Ну уж если так приспичило отключить респавнеры, то стОит попробовать изменить строку (267) в методе on_register():

  -- производим первичную инициализацию
  self.respawn_time = game.CTime() --/ время след.респавна приравнено к текущеу игровому времени

на типа:

local idle_time = game.CTime() --/ текущее игровое время
idle_time:setHMSms( 8, 0, 0, 0 ) --/ тайм-аут в 8 часов
self.respawn_time = game.get_game_time() + idle_time --/ задаем начальный тайм-аут

- где каждому респавнеру при старте игры назначается пауза в 8 часов.

Но, ИМХО, это уже не ... та игра. Респавн всего в зоне будет отложен каждый раз на 8 часов при каждом перезапуске игры!

 

 

(кстати, пока была поднята тема)

 

Некоторые размышления о доработке респавнеров для тех, кто понял о чем и может воспользоваться:

 

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

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

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

Итак правим читалку/запоминалку:

-- сохранение
function se_respawn:STATE_Write( packet )
  cse_alife_smart_zone.STATE_Write( self, packet )
  
  local table_size = table.getn(self.spawned_obj)
  if table_size > 255 then --/#+# проверка переполнения
     --printf("STATE_Write:=[%s/%s],Cnt=[%s]:<%s>", self:name(), self.id, table_size, "Warning!") --/#~#
    table_size = math.min(table_size,255) --/ усекаем до объема хранилища (или потребного)
  end
  packet:w_u8(table_size)
  for i=1,table_size do
    packet:w_u16(self.spawned_obj[i])
  end
  --/#+# запоминаем тайм-аут респавнера
  if self.last_spawn_time_present then --/ спавн уже был?
    packet:w_u8(1)
    utils.w_CTime(packet, self.respawn_time) --/ записываем время след.спавна
  else
    packet:w_u8(0)
  end
end
-- восстановление
function se_respawn:STATE_Read( packet, size )
  cse_alife_smart_zone.STATE_Read( self, packet, size )
  
  if editor() then
    return
  end
  
  local table_size = packet:r_u8()
  for i=1,table_size do
    table.insert(self.spawned_obj, packet:r_u16())
  end
  --/#+# считываем тайм-аут респавнера
  if not packet:r_eof() then --/ еще не конец пакета? (для совместимости со 'старыми' сэйвами)
    self.last_spawn_time_present = packet:r_bool()
    if self.last_spawn_time_present then
      self.respawn_time = utils.r_CTime(packet)
    end
  end
end

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

function se_respawn:on_register()
  --/ ... начальные коды
  --/ производим первичную инициализацию (если нет времени последнего спавна)
  if not (self.last_spawn_time_present and self.respawn_time) then
    self.respawn_time = game.CTime()
  end
  --/ ... заключительные коды
end

и в методе 'execute' добавим инициализацию флага спавна чтобы запоминать состоявшиеся спавны:

function se_respawn:execute()
  --/ ... начальные коды
  self.last_spawn_time_present = true --/#+# флаг
  if self.respawn_time < game.get_game_time() then
  --/ ... заключительные коды
end

 

2. Еще один недостаток респавнеров - отсутствие возможности задавать начальную паузу для спавна.

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

Если ввести в параметры респавнеров дополнительный, например назовем : 'respawn_first_idle' в котором в секундах игрового времени задавать начальную паузу для спавна, то в купе с другими условиями, дает довольно простое средство задавать начальную паузу.

Таким образом доработанный вышеприведенный код в регистраторе респавнеров может быть таким:

 

 

Хочется оставить максимально оригинальный скрипт, и внести только эти изменения - победить обнуление респавна при перезапуске игре, но при смене локаций пусть остаётся такой какой в игре.

function se_respawn:on_register()
  --/ ... начальные коды
  --/ производим первичную инициализацию времени спавна
  if not (self.last_spawn_time_present and self.respawn_time) then
    --/#+# читаем начальную паузу спавна объектов (при старте игры)
    local iPause = r_num(ini, "respawn", "respawn_first_idle", nil) --/ sec
    if iPause then --/ имеется пауза (в игр.секундах)
      local iShift = math.floor(iPause*0.2) --/ погрешность (sec)
      local idle_time = game.CTime() --/ текущее игровое время
      idle_time:setHMSms(0,0,iPause+math.random(-iShift,iShift),0) --/ тайм-аут
      self.respawn_time = game.get_game_time() + idle_time --/ устанавливаем начальный тайм-аут
      self.last_spawn_time_present = true --/#+# флаг
    else --/ ставим текущее игровое время
      self.respawn_time = game.CTime()
    end
  end
  --/ ... заключительные коды
end

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

 

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

 

P.S. Подправил коды, а то при перенесении из рабочих кодов допустил пару неточностей/дублей.

 

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

===============================================================

Max_Plohih, ты хоть понял о чем спросил?

1. Звук противогаз НЕ издает, издавать звук может тот, кто в противогазе (озвучка дыхания).

2. Понятие "динамический худ" может относиться к чему угодно, та же шкала радиации, введенная во многе моды - динамический худ шкалы.

Если ты об "интерактивном худе" для противогазов/шлемов из АМК-мода, то там звук уже в наличии. Бери и смотри как 'добавлено', в чем вопрос-то?

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

Wolix

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

Неужели неясно, что ставить критериями относительные и/или расплывчатыми понятия - только размусоливает вопрос, а не решает его.

 

Хотя вроде как "максимально оригинальный скрипт" - понятно, но(!) максимально по символам (с минимумом правок) или с максимально оригинальныи алгоритмом (т.е. правки не имеют значения).

 

"внести только эти изменения" - процитировав полностью последние посты по теме (заодно и не относящееся к делу), думаешь понятн стало что подразумевается под 'только эти'?

 

"при смене локаций пусть остаётся такой какой в игре" - т.е. из всех локация для тех с которой и кудв при переходе сбрасывать замомненные времена? И это при желании "максимально оригинальный скрипт"?

И ... хотел бы уточнить, т.к. в некотором замешательстве, и получить ответ:

Weeko == Wolix: (т.е. одно лицо?)

 

 

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

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

Как можно самому исправить вот такое недоразумение:

cee696df95f8343f248f435218f68965b03eb5107762833.jpg

Это я наблюдал в "AMK 1.4.1. + NLC 5.08 + НС3 - ZaZaZy Edition v3.0".В каких файлах стоит покавыряться и каким образом,чтобы оружие было где положено,а не в стороне?

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

Seruva,

;--STRAP PARAMETERS-----------------------------------------------------------------
strap_position         = -0.13,-0.25,0.2 ; position (offset) and orientation of the weapon when it is strapped
strap_orientation      = -10,-5,10; (3rd person view in degrees)

в конфиге этого ствола

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

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

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

saruman_ten,благодарствую.Вот результат правки:

.c6aa0beb63278ee58f5cf2e670f066b3b03eb5107841174.jpg

Подойдет ли данная правка и к другим стволам(если таковые нелепости повторятся) в данной ситуации?Как я понял это координаты положения ствола в пространстве локации,так?

 

 

Изменено пользователем Seruva
Ссылка на комментарий
Seruva, я тебе вообше чисто случайный кусок конфига кидал)) это относительно центра координат модели

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

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

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

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

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

Подскажите пожалуйста как сделать чтобы мутант (например собака) передвигалась по определённому пути с помощью smart_terrain?

Ссылка на комментарий
Читак, почитай стати на вики-сайтах по логике и в частности по схеме 'walker' (для монстров).

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

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

Артос, логику я прописал. Например мне нужно чтобы собака пошла в определённую точку. Вот логика:

[logic@krai_dog]

active = mob_walker@test_mob

 

[mob_walker@krai_dog_1]

path_walk = krai_dog_1

 

Я вообще думаю прописал всё верно, но что-то напутал в спавне смарта. Потому что собака просто ничего не делает, как будто в него и не попадала, хотя я ей уже в спавне прописал по умолчанию этот смарт террейн.

 

Совет: обращайся к кому-либо, используя оригинальное написание ника. Для этого даже кнопка есть.

Cyclone

 

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

Блин сам у себя ошибку нашёл))

С названиями попутал) test_mob и krai_dog_1

P.S. Но от этого результат не меняется. После исправления всё то же самое.

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

KD87, путь в all.spawn (type = krai_dog) ссылается на скрипт гулага в gulag_escape.script:

    if type == "krai_dog" then
        t = { section = "logic@krai_dog",
            idle = 0,
            prior = 5, state = {0},
            online = true,
            in_rest = "", out_rest = ""
        }
        table.insert(sj, t)
    end

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

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

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

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

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

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

Войти

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

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

×
×
  • Создать...