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

Скриптование


Svoboда

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

@vampirnik77, модуль работает независимо от уровней.

В упомянутом посте находится комплект, который я проверил «от и до» на чистой игре и всех платформах. При условии соблюдения всех инструкций по подключению, добавления всех указанных вставок и удаления указанных кусков кода всё должно работать.

Проверь, всё ли учёл при подключении, возможно что-то случайно пропустил. Обрати внимание на таблицу tPkChunks в модуле и методы ext_save и ext_load в биндере актора - если прикручиваешь не к чистой игре, а к моду, вполне возможно, что их содержимое следует поменять.

  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

@TIGER_VLAD, это ссылка на скомпилированный байт-код. Если говорить о частном случае сохранения данных, чанк представляет собой технологический нет-пакет, созданный для хранения данных конкретного внешнего модуля; данные пишутся в него стандартными для нет-пакета методами при сохранении. Сначала создаются такие чанки для всех внешних модулей, которые мы подключаем к хранилищу. Затем чанки побайтово копируются в нет-пакет специального игрового объекта (или нескольких объектов, если суммарный размер чанков того требует), который, в свою очередь, сохраняется в сейве.

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

  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

@ZeeK, не изымается оно там, ибо кусок в оригинале закомментирован. Только деньги отдаются.

А если есть желание изъятие восстановить, то ничто не мешает сделать нужный фильтр. Например, в функцию get_actor_inv добавить проверку на класс и в список для изъятия помещать только удовлетворяющие условиям предметы. Или сделать то же самое уже после, при переборе списка. Весь нужный код там уже практически есть, надо только доработать напильником согласно своим требованиям.

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@ZeeK,

local tbl = {
  ["wpn_knife"] = true,
  ["wpn_torch"] = true,
  ["wpn_pm"]    = true
}
...
if not tbl[item:section()] then
...
end
Изменено пользователем Kirgudu

Поделиться этим сообщением


Ссылка на сообщение

@Kondr48, прежде чем советовать, неплохо бы самому подучить матчасть. Очевидно, что sobj = nil, а не результат вызова серверного метода. И проверка нужна такая:

local sobj = alife():object(self.object:id())
if sobj ~= nil then
...
end
@Wlad777, если серверный объект не найден, значит и спавнить негде. Так что такая проверка вполне подойдёт.

 

нужен кликабельный список, при нажатии на элемент чтобы вызывалась функция

Поищи здесь информацию по CUIListWnd и CUIListItem (CUIListItemEx). На элементы списка можно будет повесить коллбек ui_events.LIST_ITEM_CLICKED - вот и возможное решение искомой задачи.
  • Согласен 1
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение

Удаляется, вестимо.
Надо смотреть, что идёт перед добавленным куском кода. Причём не только в скрипте, но и, например, в секции on_death логики НПС, если обработка логики в мотиваторе идёт перед своим кодом.

В общем, надо внимательно проинспектировать свои правки.

Поделиться этим сообщением


Ссылка на сообщение

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

Расписать подробно не могу, так как забежал сюда буквально на минутку. Но ты уже давно не новичок, сообразишь. :) Если я прав, конечно.

Поделиться этим сообщением


Ссылка на сообщение

Имхо, поскольку смена локации происходит одновременно с сохранением/загрузкой, достаточно сохранить параметры текущей локации всего один раз, скажем в actor_binder:__init. Делать это пусть даже на медленном апдейте избыточно.

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
А вот это как раз слишком рано. Задумайтесь, как могут срабатывать колбеки до того, как инициализирован сам объект биндера? Это же его методы. Конечно они после __init будут срабатывать.

А при чём тут биндер? Речь-то изначально шла о том, как отловить факт перехода на другую локацию перед этим самым переходом. А это происходит уж точно тогда, когда актор полностью инициализирован в процессе предыдущей загрузки. И значит можно сохранить текущую позицию, например id локации, один раз, в момент инициализации актора.

 

@Romz, попробуй в on_item_drop проверять позицию не клиентского объекта, как ты это делаешь сейчас, а серверного. Примерно так:

local sObj = alife():object(db.actor:id())
local vPos,idLv,idGv = sObj.position, sObj.m_level_vertex_id, sObj.m_game_vertex_id
-- дальше можно вычислить id локации и сравнить с запомненным
if idGv and game_graph():valid_vertex_id(idGv) then
  local oVertex = game_graph():vertex(idGv)
  if oVertex then
    local idLevel = oVertex:level_id()
  end
end

Засим из дискуссии удаляюсь по причине катастрофической нехватки времени. Удачи в поисках решения!

Изменено пользователем Kirgudu
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@Kober(BRUC)

1. "local cly = 25" и т. п., если не ошибаюсь, видно только в пределах своей ветки if ... else. Следует объявить переменную до if, а внутри только задавать значение.

2. math.randomseed результат не возвращает, а только задаёт случайное смещение для последующего math.random. Присваивание переменной в данном случае лишнее.

3. Выбор фразы для печати ты делаешь в одной из веток внутри if, а не за пределами оного. Конкретно, печать у тебя происходит только в случае опции "random".

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

local number = 10
say_tbl_one_ru = {  -- Таблица с русскими ответами. 'Угадай число';
  "Не верно. Чуть больше.",
  "Не верно. Чуть меньше.",
  "Вы угадали! Число равно:"
}
local complexity = 'esay' -- 'esay' - Легко; 'normal' - Срдне; 'hard' - Хардкор; 'random' - Рандомное число от 100, до 10000
 
function gl()
  if complexity == 'esay' then
    local cly = 25
  elseif complexity == 'normal' then
    local cly = 100
  elseif complexity == 'hard' then
    local cly = 1000
  elseif complexity == 'random' then
    local ran_data = math.randomseed(os.time())
    local ran_data = math.random(100, 10000)
    local cly = ran_data
    local num = math.random(1, cly)
    if number < num then
      print(say_tbl_one_ru[1])
    elseif number > num then
      print(say_tbl_one_ru[2])
    elseif number == num then
      print(say_tbl_one_ru[3])
    end
  end
end
 
gl()

local number = 10
say_tbl_one_ru = {  -- Таблица с русскими ответами. 'Угадай число';
  "Не верно. Чуть больше.",
  "Не верно. Чуть меньше.",
  "Вы угадали! Число равно:"
}
local complexity = 'esay' -- 'esay' - Легко; 'normal' - Срдне; 'hard' - Хардкор; 'random' - Рандомное число от 100, до 10000
 
function gl()
  local cly
  if complexity == 'esay' then
    cly = 25
  elseif complexity == 'normal' then
    cly = 100
  elseif complexity == 'hard' then
    cly = 1000
  elseif complexity == 'random' then
    math.randomseed(os.time())
    cly = math.random(100, 10000)
  end

  local num = math.random(1, cly)
  if number < num then
    print(say_tbl_one_ru[1])
  elseif number > num then
    print(say_tbl_one_ru[2])
  else
    print(say_tbl_one_ru[3])
  end
end
 
gl()

 

Изменено пользователем Kirgudu
  • Спасибо 1
  • Сомнительно 1

Поделиться этим сообщением


Ссылка на сообщение

@Winsor, а почему ты думаешь, что данные там битые? В зависимости от значения num_items наполнение нет-пакета может меняться.

Подробнее, например, здесь.

Поделиться этим сообщением


Ссылка на сообщение

@Winsor, трудно сказать, я с таким не сталкивался. Собственно, в netpk до сих пор могут быть баги. Artos до момента своего исчезновения сам периодически находил в своих модулях и правил ошибки, да и последняя версия модулей, что лежит в «Сборочном цехе», тоже подверглась небольшим исправлениям по сравнению с оригиналом автора.

Не исключено, что ты столкнулся с ещё не обнаруженной до сих пор ошибкой.

Поделиться этим сообщением


Ссылка на сообщение

Коллеги, вы все не обратили внимание на один момент. Оставив в стороне то, как написана сама функция, видим это:

 

 

[error]Arguments : LUA error: ...ow of chernobyl\gamedata\scripts\bind_stalker.script:324: attempt to call field 'mil_sound_update' (a nil value)

 

 

Перенес в другой скрипт, функцию не менял - НЕТ вылета...

ИМХО, ошибка где-то в другом месте того модуля, где функция располагалась первоначально. И несмотря на то, что чекер ошибок не даёт, что-то мешает движку прочесть все элементы этого модуля.

UPD: Если только функция сначала была не в bind_stalker.script.

  • Спасибо 1
  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@AndrewMor, например так:

function GetMaxLevelVertexId(idLevel)
	local gg, idLvMax, levelChecked, i, idLv = game_graph(), 0, false, 0, nil
	while i < 65536 do
		if gg:valid_vertex_id(i) and gg:vertex(i):level_id() == idLevel then
			idLv = gg:vertex(i):level_vertex_id()
			if idLvMax < idLv then idLvMax = idLv end
			if not levelChecked then levelChecked = true end
		elseif levelChecked then
			break
		end
		i = i + 1
	end
	return idLvMax
end
-- пример вызова для текущей локации:
idLvMax = GetMaxLevelVertexId(alife():level_id())
Изменено пользователем Kirgudu

Поделиться этим сообщением


Ссылка на сообщение

@KitkaT.Net,

local toggle_time = 0
function test_pause()
  give_info("zamer_dozimetr")
  toggle_time = time_global() + 1000
  level.add_call(
    function() return time_global() > toggle_time end, -- условие срабатывания
    function() disable_info("zamer_dozimetr") end -- выполняется, если условие равно true
  )
end
  • Спасибо 1
  • Нравится 1
  • Согласен 1
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@CRAZY_STALKER666, глянь в оригинале функцию xr_effects.set_enemies() - там очень близко к твоему случаю. Ссорит одного НПС со списком других, сделать аналог под свои нужды не сложно.

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

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@CRAZY_STALKER666, тебе нужен клиентский. Для получения используй, например, функцию level.object_by_id(id). Ну или уже упомянутую level_object_by_sid(sid).

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

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

увидел это

void berserk(); -- вопреки некоторым предположениям - это не наследие "Oblivion Lost", поскольку функция новая, а в 1935 её не было. Однако её назначение не вполне понятно.

В теме "Справочник...", кстати, можно найти много интересного. Изменено пользователем Kirgudu

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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

AMK-Team.ru

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