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

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


Halford

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

12 hours ago, Houdini_one said:

Возьми с оригинала какой-то скрипт, скопируй, переименуй как надо, удали содержимое и вставь своё - должно работать.

Кодировку можно сменить несколько проще: в любом своем файле вырезать весь текст, выбрать в настройках файла ANSI, вставить текст обратно.

 

@Orсhello Как раз по таблице "костюм = перчатки" проще сопоставлять, и код нагляднее, чем if … then … elseif … then под каждую пару.

  • Согласен 1

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

@alex5773 Если речь о переносах строк, то, например, Akelpad их распознает правильно. По форматированию это тот же "блокнот", только с настройками цвета и прочих параметров, не влияющих на сам текст.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

@Hind 

1. Поймать нажатие клавиши можно через кейлоггер (вики stalkerin, "Интересный способ привязки скриптов" или как-то так).

2. Можно привязаться к самому действию "сохранение": [bind_stalker.script] actor_binder:save().

3. Callback "on_key_press" в оригинале ТЧ не существует (в логе "ошибка вывода ошибки"). Полный список доступных событий: [lua_help.script] class_callback.

4. Если мод "Золотой шар: завершение", то там движок OGSR.

  • Спасибо 1

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

  

32 minutes ago, Houdini_one said:

Скрипт level.tasks

В ЗП есть аналогичная таблица в [jump_level.script] и обработчик "найти активную карту, переместиться на сопоставленную с ней следующую карту или на Затон, после чего выйти из игры".

В ЧН такая же схема, только реализованная через if … elseif … вместо таблицы.

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

 

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

1. Пока нет активации через флаг или инфо, это просто старый тестовый код. Даже при наличии такой активации надо еще разлочить команду для "прыжков" по картам – если не нарушать синтаксис файла, игра никак не реагирует на удаление частей скрипта.

 

2. Сброс предмета: db.actor:drop_item(ссылка на объект).

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

Можно создать список id сброшенных предметов и скидывать их снова через событие actor_binder:on_item_take(obj), если разрешение не получено. В этом случае придется заносить список в pstor для переноса через сейв/загрузку, что при большом количестве предметов может и переполнить pstor (8 кб).

 

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

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

Можно отобрать управление через level.disable_input(), потом по таймеру скидывать  предметы раз в секунду или еще как-то, в конце процесса выставить ГГ за дверь и включить телепорт, который будет откидывать ГГ чуть назад, ну или саму дверь сделать неинтерактивной.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

@Houdini_one 

1. Нетпакет проще всего редактировать через подключаемый модуль [m_netpk.script] от Артоса. Флаг "можно брать" хранится в нетпакете по пути data.object_flags + Interactive. Пример действий для сброса флага:

Spoiler
function clear_useful_for_ai( sobj )
	local pk = get_netpk( sobj, 1)				-- [m_netpk] прочитать нетпакет
	local data = pk:get()							-- [m_netpk] вывести данные в таблицу
	data.object_flags = bit_xor( data.object_flags, 8 )		-- двоичное сравнение и сброс флага "интерактивно" на 0 (позиция 8 или 2^3 справа налево: …1xxx или …0xxx –> …0xxx)
			)
	data.object_flags = bit_or( data.object_flags, 8 )			-- то же для поднятия флага при любых исходных значениях
	pk:set( data )									-- [m_netpk] записать данные в нетпакет по измененной таблице
end

 

 

2. Взятие и активация водки: actor_binder:on_item_take(obj) + db.actor:eat(obj) с проверкой "водка в заданной комнате" или "водка с известным id".

 

Для начала, найди и подключи [m_netpk.script] и попытайся сделать один предмет неактивным.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

1. Какая именно часть вызывает вопросы: чтение, запись, редактирование значений? Если интересует порядок значений, можно сделать pk:dumpDesc() и отправить полученный текст в сообщение.

2. Это был вариант для transfer_item – в варианте drop_item ГГ указывается только один раз. Проверка на перезапуск (bolt + restart) тоже не требуется.

3. Для тестов можно сделать триггер через расход бинта в actor_binder:use_inventory_item(obj), либо через нажатие клавиши в главном меню – [ui_main_menu.script].

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

Кажется, есть решение: расширенная скриптовая база OGSR. В файле [_g.script] должны быть обработчики set_item_untakeable( item ) и set_item_takeable( item ), которые через дополнительные флаги состояния позволяют управлять статусом предмета.

Примерно так:

local obj = db.actor:object(…)

set_item_untakeable(obj)

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

Простой поиск через Ctlr+F в указанном файле не дает совпадений? Строка 1204.

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

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

Что же у меня за версия тогда? И в OGSE, и в OGSR обработчики флагов состояния есть.

Тогда попробуй просто вызвать метод set_item_untakeable(obj) со ссылкой на существующий объект – если библиотека xrgame.dll изменена, игра должна знать такую конструкцию.

 

Ссылки с фразой global_flags в [_g.script] есть?

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

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

Spoiler
[bind_stalker.script]
(+) выше апдейта
function set_item_untakeable( item )
  local f = item:get_inventory_item_flags()
  f:set( global_flags.FCanTake, false )				-- или f:set(1, false)
  item:set_inventory_item_flags( f )
end


function actor_binder:update(delta)
	object_binder.update(self, delta)
(+)
	if not flag then
		flag = true
		local obj = db.actor:object("medkit")		-- можно любой другой предмет
		if obj then
			db.actor:drop_item(obj)			-- проверить сброс, раскомментировать следующую строку, перезагрузиться
			-- set_obj_untakeable(obj)
		end
	end

 

 

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

Ну, теперь надо отработать ситуацию "вход в комнату – водка неактивна – триггер – водка активна". Для начала, можно добавить следующий код в [_g.script] для глобального вызова:

Spoiler
function set_item_untakeable( item )
  local f = item:get_inventory_item_flags()
  f:set( global_flags.FCanTake, false )
  item:set_inventory_item_flags( f )
end

function set_item_takeable( item )
  local f = item:get_inventory_item_flags()
  f:set( global_flags.FCanTake, true )
  item:set_inventory_item_flags( f )
end

 

 

Я на расстоянии только отдельные подсказки могу дать, так что или ковыряй скрипты, или ищи кого-то с уставленным движком OGSR именно твоей версии. Замахиваться сразу на сложные моды, конечно, похвально, но это не решается за 10 строк кода.

  • Согласен 2
  • Полезно 1

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

@Hind level.get_time_minutes() / _hours() / _days() + проверка через какой-нибудь "естественный" триггер, вроде обращения к карте (проверка через апдейт будет слишком частой). Карту можно проверять через actor_binder:info_callback и там же выдавать свой инфо-поршень, если время пришло.

В ЧН примерно так работают ночные торговцы на барахолке.

  • Спасибо 1

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

@андрей дронав 

Во втором варианте некролога несколько лишних end или не до конца "обернутая" часть обработчика – подсветка синтаксиса в помощь, ну или хотя бы табуляция "ёлочкой" для отслеживания начала и конца каждого блока.

 

Первый вариант работает как есть – проверял через битву на АТП. Может, вызов не добавлен в [xr_motivator.script] death_callback?

 

Еще в первом варианте сильно "ленивый" код:
• вместо повторяющейся проверки is victim можно сразу сделать выход if not victim then return end
• варианты killer можно сгруппировать так: по умолчанию "data error", дальше проверка на суицид, сталкера и мутанта (с дополнительной группировкой "общая часть условия > вариант / остаток > итог"), в конце проверка по таблице "если в строке найден ключ часть секции аномалии, подставить значение перевод названия"
• по-хорошему, переведенные названия мутантов и аномалий надо не прописывать в скрипте вручную, а читать из конфигов по ссылке who:section()

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

  • Согласен 1
  • Полезно 3

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

@андрей дронав В ЧН/ЗП в give_game_news добавляется еще один текстовый аргумент – заголовок (первый), в остальном формат тот же.

По коду: именно ошибок нет, только повторяющиеся действия, которые можно собрать воедино.

  • Спасибо 1

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

@Купер Можно пояснение? Если я правильно понял, выражение означает "если перед New Line нет Carriage Return, то добавить такой спецсимвол".

  • Согласен 1

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

@Houdini_one Уменьшил эти самые значения в [monsters.ltx], и трупы сталкеров тоже перестали скапливаться (множественные тесты на Кордоне под мостом и вблизи перехода).

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

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