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

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

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

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

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

Доброго времени суток.

Подскажите пожалуйста как в ЗП сделать динамический level changer как в НЛС ( т.е. при поднятии ПДА или другого иного предмета спаунился переход с одной локации на другую ) ?

Ссылка на комментарий
Molphar, делаешь переход (неважно, через скрипт или all.spawn), а дальше манипулируешь им методом enable_level_changer(bool val) класса game_object, то есть применяешь метод к клиентскому объекту. enable_level_changer(true) включит переход, enable_level_changer(false) - выключит. Работает только в ЧН и ЗП. Изменено пользователем KD87
Ссылка на комментарий

Такие вопросы появились:

1. Как надо записать ф-ции в таблицу, чтобы можно было их потом вызвать?

Например:

...

[12] = func() spawn(),

...

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

 

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

Попробовал создать что-то вроде idle-звука в ЗП по тутору, но ничего не работает. Никто не подскажет, в чём проблема?

 

создаете скрипт: имя_файла.script туда пишете

function use_snd(obj)
local obj_sect = obj:section()
local snd
if obj_sect == 'ваш предмет' then snd = [[Путь_до_звука_относительно_папки_sounds]]
elseif obj_sect == 'ваш предмет' then snd = [[Путь_до_звука_относительно_папки_sounds]]
elseif obj_sect == 'ваш предмет' then snd = [[Путь_до_звука_относительно_папки_sounds]]
elseif obj_sect == 'ваш предмет' then snd = [[Путь_до_звука_относительно_папки_sounds]]
end
if snd then
local snd_obj = xr_sound.get_safe_sound_object(snd)
snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
end
end

 

сохраняем

открываем bind_stalker.script и в функцию function actor_binder:net_destroy() пишем

self.object:set_callback(callback.use_object, nil)
и в функцию actor_binder:reinit() пишем
код:
self.object:set_callback(callback.use_object, self.use_object, self)

и в этом же файле создаем функцию:

function actor_binder:use_object(obj)
имя_вашего_скрипта.use_snd(obj)
end

 

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

Выводы модмейкера:

1)Вылетает - это хорошо. Значит, работает :)

2) Если хочешь сделать что-то хорошо, делай сам!

3) Если падёшь духом, падёт и мод.

4) Он живой... :o

Ссылка на комментарий
1. Как надо записать ф-ции в таблицу, чтобы можно было их потом вызвать?

Например:

...

[12] = func() spawn(),

...

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

Объясни детальнее чего ты хочешь, может и решение изменится.

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

SibireaStalker

1. В ЗП уже имеется озвучка используемых предметов ...

2. В ЗП уже имеется коллбэк на использование предметов.

 

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

 

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

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

Пишем в таблицу напрямую:

my_table = {
  [1] = function(arg) return arg end,
  ...
  [N] = function(arg) return not arg end,
  ...
}

Можно функции задать отдельно, а линки на них (т.е. имена функций) включить в таблицу:

my_func1 = function(arg) return arg end
...
my_funcN = function(arg) return not arg end
...

my_table = {
  [1] = my_func1,
  ...
  [N] = my_funcN,
  ...
}

т.е. ничего сложного ...

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

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

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

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

 

А, вот еще вспомнил: можно ли из стринговой строки, например, local t = "four_table", сделать такую строку, чтобы можно делать так: for k,v in pairs(t) do? Если да, то как?

 

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

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

SkyLoader

1

my_func1 = function() return 1 end
my_func2 = function() return 2 end
my_func3 = function() return 3 end

my_table = {
  [12] = {my_func2, my_func3}, -- заключить линки на функции в таблицы
  [21] = {my_func1, my_func2, my_func3},
  [33] = {my_func3, my_func1}
}

for k,v in pairs(my_table) do -- где-то парсим
    if any_time == k then -- если время совпало с ключем...
        for i=1,#v do
            v[i]() -- вызываем каждую из функций таблицы функций
        end
    end
end

2

four_table = {3,4,5} -- таблицу задавать только глобально в текущем контексте
                     -- при локальном объявлении нужно использовать debug
local t = "four_table"

for k,v in pairs(_G[t]) do -- если таблица находится в глобальном контексте
                           -- если в модуле, то вместо _G[t] пиши имя_файла[t]
    -- action
end

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

Существует ли способ скриптово поменять предмету из ивненторя его name или description?

Ну вообщем имя и описание.

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

*Shoker*,

незаметно убрать этот предмет, а взамен заспавнить в инвентарь точно такой же, но с другим описанием.

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

Капрал Хикс

Тогда мне придётся продублировать в игре всё оружие и всю броню :D

 

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

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

*Shoker*, не обязательно дублировать, если имя будет меняться 2-3 раза, думаю, не так уж и затратно написать еще несколько наследуемых секций, где будет изменяться только имя и описание. Хотя если у тебя пара сот стволов...

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий
*Shoker*: Существует ли способ скриптово поменять предмету из ивненторя его name или description?

Довольно "детский" вопрос ...

Что мешает скриптеру НЕ использовать штатные способы получения имени и описания объекта, а написать свои и ими пользоваться в зависимости от ситуации/потребностей?

Если предмет один и тот же - то и имя ему и описание должны в игре быть одними и теми же. Возникла потребность - ну так и формируй условие и выводи по этому условию свои имена/описания!

Если же предмет сменился - то соответственно и имя меняется (в любом случае!, метяя как минимум числовой суффикс).

 

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

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

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

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

Artos,

Довольно "детский" вопрос ...

Что мешает скриптеру НЕ использовать штатные способы получения имени и описания объекта, а написать свои и ими пользоваться в зависимости от ситуации/потребностей?

Ох и тяжелый у тебя характер =) Сразу в лоб: "детский вопрос". Совсем не детский! На стандартные движковые значения завязаны много стандартных же движковых вещей. К примеру часть интерфейса инвентаря, окна диалогов, торговли. Можно конечно завести свои скриптовые значения со смыслом "имя", "описание" и т.п., но в этих движковых диалогах так просто будет не подменить.

 

Выходов из этого есть потенциально несколько, как минимум два.

 

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

 

Второй способ, заменять движковые значения. Штатных средств для этого нет, поэтому это можно делать только модификацией движка. Мы говорим в основном о значениях системного имени, описания предмета, имени персонажа. Все это скриптами доступно только на чтение. Для записи нужно добавлять функции для записи, иногда также в серверный объект. Кроме того, описание с объектом не сохраняется, а каждый раз читается из секции. Поэтому, кроме функции записи, для описания потребуется также некоторая скриптовая обвязка, которая сохраняет это значение в нетпакете объекта и при загрузке прописывает его заново. Достоинства этого пути - это вполне реально и не очень сложно. Недостаток, требуются модификации движка со всеми вытекающими.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

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

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

Что подрузумевается под именем в контексте вопроса? Системно имя типа: wpn_ak7412345(?), имя секции объекта: medkit(?), имя из профиля: Ванька Иванов (?) иль еще какое? Бум гадать и выдавать вариации ответов?

 

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

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

На стандартные движковые значения завязаны много стандартных же движковых вещей
И почти каждый прожженый игрок и тем более модмейкер об этом знает. Хочется чтобы валяющийся автомат при наведении на него курсора отображался иным именем? Ну так и иконка вероятно потребуется другая и пр ... И заморачиваться на ожидании правленного движка врядли имеет смысл. Ответ уже дан: хочешь подменить - переспавни нужным предметом с нужным именем/описанием.

 

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

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

 

И по любому: каждый объект имеет в игре свое эксклюзивное имя. Замена системного имени - это замена на другой предмет! (ИМХО) и никакие модификации движков не могут тут быть надежнее и правильнее простого переспавна предмета на подходящий. Тем более все это доступно уже вчера и даже малоопытному модмейкеру.

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

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

 

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

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

Написал простенький, но эффективный (ИМХО) переключатель 'online->offline->online' для объектов:

--/ -----------------------------------------------------------------
--/ Helper: switchings 'online->offline->online'
--/ -----------------------------------------------------------------
local switchings_active = false --/ флаг запущенного коллбэка переключений
local tbl_switches = {} --/ ID-массив флагов/счетчиков для переключений
local sim = alife()

local execute_switchings =  function()
  local can_switch = next(tbl_switches) ~= nil --/ flag: exist switches
  if can_switch then
    for id,v in pairs(tbl_switches) do
      can_switch = sim:object(id) ~= nil --/ flag: exist server_object?
      if can_switch then --/ exist server_object?
        if not v.cnt then v.cnt = 0 end
        if level.object_by_id(id) then --/ object in 'online'
          if v.flg == false then --/ flag: need swith 'offline->online'
            if v.cnt == 0 then
              v.flg = true --/ change flag
              --/ set switches 'online->offline'
              sim:set_switch_online(id, false)
              sim:set_switch_offline(id, true)
            else --/ swithes finished
              can_switch = false --/ done -> clear
            end
          else --/ phase-1: expectation of transition in 'offline'
            v.cnt = v.cnt +1
            can_switch = v.cnt < 48 --/ limit is exceeded -> clear
          end
        else --/ object in 'offline'
          if v.flg == true then --/ flag: need swith to 'online'
            v.flg = false --/ change flag
            --/ set switches 'offline->online'
            sim:set_switch_online (id, true)
            sim:set_switch_offline(id, false)
          else --/ phase-2: expectation of transition in 'online'
            v.cnt = v.cnt +1
            can_switch = v.cnt < 96 --/ limit is exceeded -> clear
          end
        end
      end
      if not can_switch then --/ clear:
        tbl_switches[id] = nil
      end
    end
    can_switch = next(tbl_switches) --/ flag: to exit?
  end
  return not can_switch --/>
end

function Add_ToSwitchings(id)
  if type(id) ~= 'number' then return end --/>
  --/ added to table 'offline->online'
  tbl_switches[id] = {flg = not level.object_by_id(id), cnt = 0}
  --/ start callback for 'offline->online'
  if not switchings_active then
    switchings_active = true --/ set flag
    level.add_call(execute_switchings, function() switchings_active = false end)
  end
end
--/ -----------------------------------------------------------------

Просто кидаем нужный ID-объекта ( Add_ToSwitchings(id) ) и ожидаем выхода объекта в он-лайн (в среднем ~20 тактов).

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

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

 

Версия модуля работы с нет-пакетами (m_netpk) со встроенным 'переключателем on-off-on-line' (для работы с 'abstract'):

Ссылка на народ.ру (~26.2 кБ)

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

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

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

Artos

Может мне ещё скриншоты прикладывать и выделять там красным для непонятливых?

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

Специально для этого дописал name и descriotion в своём посте, какой description у имени персонажа или профиля может быть?

 

malandrinus

К сожалению цель не стоит таких усилий. Раз нет штатного способа значит нет, спс. за разьяснение.

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

*Shoker*,

вот поэтому первоначально и дал короткое определение: "детский" вопрос.

Любому, кто ковырялся хотя бы в конфигах, известно, что name и descriotion, задаваемые в каждой секции предметов - читаются движком и их заменить скриптами "штатно" невозможно. Также известно, что из конфигов/скриптов только user.ltx в игре подвергается "штатно" изменениям.

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

 

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

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

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

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

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

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

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

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

Войти

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

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

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