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

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

 

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

 

Вопросы которые будут удалятся, следовательно их задавать не нужно:
-- Где находится та или иная функция?
Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;
-- Как сделать что-то/то-то?
С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;
-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.
-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.
Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов?
В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос.

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий

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

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

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

Был вопрос на эту тему:

On 10/13/2011 at 11:37 PM, Kirag said:

Кстати, об update-пакете. Считать данные оттуда - без вопросов, а вот получалось ли у кого-нибудь данные туда результативно записать?

И был такой ответ:

On 10/13/2011 at 11:57 PM, Artos said:

А вот на вопрос: " а вот получалось ли у кого-нибудь данные туда результативно записать?" - могу ответить утвердительно.

Тот же параметр здоровья (health + upd:health) для неписей (хоть в он-лайне, хоть в офлайне) очень помогает и убивать и ранить и оживлять.

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

  • Согласен 1

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

Шпаргалка

Ссылка на комментарий
1 час назад, WinCap сказал:

Эксперимент-доказательство.

А если переключиться на подствольник, сохранить игру и загрузить?

 

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

 

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

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

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

@abramcumner Нет – я проверял, что во временный нетпакет успешно переносятся данные из UPDATE-пакета исходного объекта; проблема возникает на следующей стадии – при переносе данных из временного пакета в новый объект.

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

Шпаргалка

Ссылка на комментарий
11 минут назад, Norman Eisenherz сказал:

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

То есть, если после этого перенести данные из нового объекта в еще один нет-пакет, то там уже кривые данные будут?

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

@abramcumner В UPDATE-пакете нового оружия будут дефолтные данные класса + то, что совпадает со STATE-пакетом: например, будет один патрон, если была заряжена граната.

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

Шпаргалка

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

@Norman Eisenherz, попробуй через абстрактную часть нет-пакета. Смотри в доке у Артоса про net_abstract.

Тогда станет доступно свойство co_props.grenade_mode.

 

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

Здрасьте.

 

1. В X-Ray Extensions есть функции get/set_inventory_item_int16, которые позволяют менять флаги состояния предметов. Судя по комментарию "-- extra flags added in x-ray extensions" в списке ii_flags, флаги до 11-го бита (is_quest_item = 2048) существуют у объектов и в оригинальной игре.

2. Есть класс flags16, работа с которым вроде как похожа на работу с нетпакетом:

• создать контейнер x = flags16();

• заполнить контейнер флагами объекта через ?:get();

• изменить отдельные флаги через x:set(#, true/false);

• назначить новые флаги объекту через ?:assign(x).

Примеров использования этого класса очень мало, и составить полную картину не получается. В частности, неясно, как выполняется привязка контейнера к объекту для чтения/записи флагов.

 

Конечный вопрос: можно ли, используя только функции класса flags16, повторить работу функций get/set_inventory_item_int16? Другими словами, являются ли эти функции более удобным представлением того, что уже есть в движке, или делают что-то полностью новое?

 

Нашел в файлах XRE код, но как он работает, я без знания языка понять не могу.

Spoiler

CScriptGameObject__SetInventoryItemInt16 proc
pos   = dword ptr  8
value = dword ptr  0Ch

	push    ebp
	mov     ebp, esp
	push    edx
	;---
	call    CScriptGameObject__CInventoryItem
	mov     ecx, [ebp + pos]
	mov     edx, [ebp + value]
	mov    [eax+ecx], dx
	;---
	pop     edx
	mov     esp, ebp
	pop     ebp
	retn    08h
CScriptGameObject__SetInventoryItemInt16 endp

CScriptGameObject__GetInventoryItemInt16 proc
stub  = dword ptr  8
pos   = dword ptr  0Ch
	push    ebp
	mov     ebp, esp
	and     esp, 0FFFFFFF8h
	
	push    [ebp + pos]
	push    [ebp + pos]
	call    CScriptGameObject__GetInventoryItemInt
	and     eax, 0FFFFh
	
	mov     esp, ebp
	pop     ebp
	retn    8
CScriptGameObject__GetInventoryItemInt16 endp

 

 

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

Шпаргалка

Ссылка на комментарий
2 часа назад, Norman Eisenherz сказал:

можно ли, используя только функции класса flags16, повторить работу функций get/set_inventory_item_int16?

Нет.

Класс flags16 служит для удобства работы с флагами (отдельными битами числа). Он ни как не связан с объектами.

А функции get/set_inventory_item_int16 как раз и добавляют в движок необходимый функционал.

Скрытый текст

x = flags16()

x:assign(get_inventory_item_int16)

x:set(11, true)

set_inventory_item_int16(x:get())

 

  • Полезно 1

S.T.A.L.K.E.R. CoP Objects (upd 15.11.24)

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

@Norman Eisenherzпример использования функций ХЕ, половина взята из ОГСЕ.

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

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

@naxac Я имел в виду примеры применения функций именно базового класса flags16. Но, раз без правок XRE получить флаги для последующей обработки нельзя, примеры ничего не дадут.

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

Шпаргалка

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

Здрасьте.

 

[m_netpk.script]
Функция r_chunk, насколько можно судить по коду, читает простую таблицу, в которой len записей типа u8, даже если значение len указано как 3*4 или 4*4 (то есть, матрица все равно читается как вектор).
Что читает эта функция в варианте _r_l8u16v, когда вместо числового размера таблицы указано pk:r_u8(), а тип значения – u16? Таблицу размером 1 байт, в которой хранится 2-байтовое значение?

Еще один непонятный вариант – _r_l32szv, где размер указан как pk:r_s32(), а тип – stringZ. Это должна быть одна строка с длиной строго 4 байта, или это таблица из таких строк?

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

Шпаргалка

Ссылка на комментарий
2 часа назад, Norman Eisenherz сказал:

Что читает эта функция в варианте _r_l8u16v

Функция читает 1 байт (u8) в котором хранится количество элементов, а затем сами элементы по 2 байта (u16). На выходе таблица 2 байтных чисел.

 

2 часа назад, Norman Eisenherz сказал:

Еще один непонятный вариант – _r_l32szv

Все тоже самое - сначала читается количество строк (4 байта s32), а затем уже сами строки (sz).

  • Нравится 1

S.T.A.L.K.E.R. CoP Objects (upd 15.11.24)

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

@Norman Eisenherz, Вы таки задались целью, переделать с нуля труд Артоса?

Иначе - зачем это все, для каких тайных целей...

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

Здрасьте.

 

Вывод таблицы данных нетпакета через table.concat(k .. v, "\\n"): назначаю для определенной строки цвет – пропадает перенос в конце строки. Пока в строке только переменные и текст, перенос есть. В чем причина?

https://drive.google.com/open?id=1XU6jeaOI_HrNxm90ZiR6M6L3UTPXm0cC

Spoiler

	local pk_dump = {}

	for k, v in pairs(data) do
		if type(v) ~= "table" then
			table.insert(pk_dump, k .. " = " .. v)
		else
			if next(v) == nil then
				table.insert(pk_dump, k .. "%c[gray]" .. " = empty" .. "%c[default]")
				-- table.insert(pk_dump, k .. " = empty")
			else
				for i = 1, #v do
					table.insert(pk_dump, k .. "_" .. i .. " = " .. v[i])
				end
			end
		end
	end

	news_manager.send_tip(act, table.concat(pk_dump, "\\n"))

 

 

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

Шпаргалка

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

@Norman Eisenherz,

news_manager.send_tip(act, table.concat(pk_dump, "\n"))

И кстати, это опять изобретение велосипеда повторение уже имеющегося инструмента. В m_netpk есть функция pk:dumpDesc(), как раз предназначенная для вывода всех свойств нет-пакета. Почему бы не использовать её?

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

@Kirgudu Точно не то – один слеш в скриптовых текстах "съедается" как спецсимвол. По поводу повтора – хочется разобрать, а не открывать один черный ящик другим.

@naxac Да, так работает.

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

Шпаргалка

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

Помогите.Хочу прописать в escape_dialogue чтоб Волк побольше всего выдавал.

В частности как прописать глушитель на МП-5 ??

Еще хорошо бы несколько гранат.

  • Не нравится 1

But I, being poor, have only my dreams;
I have spread my dreams under your feet;
Tread softly because you tread on my dreams.

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

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

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

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

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

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

Войти

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

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

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