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

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

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


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

  Информация (Показать)

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

 

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

  Читать рекомендуется. (Показать)

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


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

Привет всем. Вопрос, (прошу сразу - не пинайте, только начинаю осваивать нет пакеты )))), как можно сохранить(на сохранении актора) нет пакет (local packet = net_packet()) и загрузить(прочитать)(на загрузке актора) ?? не прибегая к таким методам, какие используются в хранилищах Malandrius и xStream???

к примеру мне надо сохранить данные таймера

 

  Показать

 

 

ЗЫ я понимаю, что скорее всего, я понаписывал бред, помогите разобраться, плз

ЗЫЫ Всех с наступающим)

Изменено пользователем Viнt@rь
Ссылка на комментарий
  30.12.2012 в 19:34, malandrinus сказал:
А что значит недоступны?

Надо было все таки написать, но думал по коду было понятно. Недоступны в том плане, что этот метод

function bug:get_sel_item()
local sel_index = self.list:GetSelectedItem()
local sel_item = self.list:GetItem(sel_index)
return sel_item
end

 

возвращал nil. И в методе start, который вызывается при нажатии на элемент, стоит проверка на существование элемента. Так вот в главном меню (независимо от того, только мы запустили сталкер, или нажали Esc во время игрового процесса) в консоле я видел текст из элемента, на который нажимал. Когда же я запускал окно непосредственно в игре (а ля инвентарь), то в консоле зияли надписи "item not exist", что означало, что элемента несуществует.

 

  30.12.2012 в 19:34, malandrinus сказал:
Кстати классы CUIListItemEx и CUIListItem, вообще говоря предназначены для создания скриптового класса на их основе.

Чтоб прямо предназначены я не знал, хотя видел это в кодах GSC. Сейчас я это учел, создал свой класс взял класс у GSC, немного подкорректировал его. И... все заработало. Хотя я не знаю, из за чего точно, вот исправленный код

  Код (Показать)

ТЧ 1.0004. SAP и Trans mod

github

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

Viнt@rь, при осваивании нет-пакетов, советую отбросить все "дурные" привычки. Нет-пакеты требуют полного понимания "что, как и зачем" и не допускают любых вольностей иль гаданий при их использовании.

1. Объект нет-пакета невозможно сохранить в сэвах, это не CGameObject и не его порождение.

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

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

3. Твое желание "не прибегая к таким методам, какие используются в хранилищах Malandrius и xStream" в общем-то понятно, но... разочарую тебя - ничто не дается просто так. СОбственно избегаемые тобою "методы" в первую очередь выполнют роль по созданию технологического объекта на базе одного из подклассов CGameObject и этот объект а) не влияет на уже имеющиеся алгоритмы игры (не мешается и не вносит путаницы) и б) дает возможность записать в него, используя нет-пакет соответствующий этому объекту(!), различные сторонние значения. Это позволяет, как минимум, не использовать тот же нет-пакет актора (а вернее сам объект актора), который не резиновый и имеет ограничение по размеру (для ТЧ - не более 8 кБ).

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

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

5. Ну и не хочется разбирать твой конкретный код, т.к. все одно он вероятно не будет использован, однако, перепроверь его сам на предмет ошибок. Как минимум это:

if bIsStrName then  
 local sName = packet:r_stringZ()  
else  
 local sName = packet:r_u32()  
end  
local oTimer = oTimers(sName)

- приведет к ошибке или потере данных (про область видимости переменных никогда не следует забывать!)

 

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

В твоем случае, ИМХО, виновата опять таки область видимости переменных. В своем 1-ом варианте и новом - ты используешь только глобальные переменные (для тех же создаваемых итемов), а во 2-ом варианте - создавал локальные для одного из методов основного класса (reset_list) и уже их (точнее линки на них) добавлял... Как в этом случае ведет себя сборщик мусора не берусь сейчас прогнозировать.

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

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

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

При обращении к имени cast_planner_to_action получил вылет attempt to call global 'cast_planner_to_action' (a nil value). Значит этот планировщик не работает? На ТЧ.

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

panzyuza, просто нет на самом деле такой функции. В lua_help присутствует, а на самом деле такой нет.

  Полезный утиль (Показать)
Ссылка на комментарий

Если сохранить число методом packet:w_stringZ(num), то при его чтении, оно будет строкой, верно? и что бы оно снова стало числом, нужно применить функцию tonumber?

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

Viнt@rь, нет не верно, если говорить не на сокращенном жаргоне.

Во-первых, метод w_stringZ предназначен для запоминания именно строкового значения (string), а не "абы всего что дадут". Поэтому для сохранения числа требуется перевести число в строку:

packet:w_stringZ( tostring(num) )

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

num = tonumber( packet:r_stringZ() )

 

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

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

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

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

за пояснение спс, по поводу экономии, возможно вопрос глуповат, но как определить ско

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

 

Что "Shift" не работает?

ColR_iT

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

Действительно, вопрос глуповат. ;-)

Числа бывают разные, как минимум, десятичные, двоичные и шестнадцатиричные... и сколько байт будет занимать то или иное представление - зависит от системы исчисдения! Т.о. и кол-во "знаков", а точнее разрядов, зависит от системы исчисления.

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

 

В игре, числа (данные Lua-типа == 'number') автоматически запоминаются методом w_float - а это целых 4 байта(!), что позволяет записывать аж 4294967295 - т.е. поболее 9 разрядов (даже почти половину от 10-го).

Есть еще метод u64 (8 байт) - но в сэйв это не запомнить.

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

Ежели ты "отделишь" кол-во миллионов иль триллионов, то и хранить можно их по отдельности, а потом опять "сливать" с остатком.

 

В строке же, каждый(!) разряд - это байт и плюс еще один заключительный (NULL). Вот и считай...

Все, что менее 4294967296 будет занимать 4 байта при записи w_float, а строкою w_stringZ - байты по кол-ву разрядов +1. Т.о. уже более 999 - строковая запись будет съедать больше байт, чем численная!

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

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

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

proper70

  Цитата
И еще: в файле gulag_escape.script я нашел такую строку (правда, она закомментена):

-- online = true,

а что будет, если ее раскомментить?

Этот параметр, в некотором смысле, аналогичен секции spawner в custom_data. Т.е. если стоят условия, то он определяет параметры выхода в онлайн, если же поставить true, то любой НПС будучи на данной работе всегда будет находиться в онлайне.

В целом информация очень интересная. От меня лично - благодарю.

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

Artos, спасибо за пояснение :), в общем, можно смело использовать метод w_float и не париться...

ЗЫ такие большие числа мне уж точно запоминать не надо)))

ColR_iT, с планшета писал, потому и забыл про клавишу shift

Изменено пользователем Viнt@rь
Ссылка на комментарий

proper70

  Цитата
используя эти конфиги

На самом деле, управление онлайном контролируют всего два параметра в аллспавне. Первое - это object_flags. То есть флаг, имеющий на конце a или b - всё время в онлайне. C или d - всё время в оффлайне. E или f - онлайн работаем, оффлайн не движемся.

Второе - это distance. Число, записанное там, увеличивает алайф дистанцию.

Что касается Бара, военных на Кордоне и т.д. - всё это работа смарта. То есть, у них в работе прописано online = true, что значит всегда быть в онлайне. Либо online = false, что значит работаем в оффлайне. Рестрикторы всего лишь переключают это состояние.

Кстати по флагам - есть два интересных флага 07 и 37. Они заставляют нпс в упор не замечать владельца такого флага, с одной лишь разницей, что 37 действует до попадания к ГГ в рюкзак. Достаточно вспомнить банку энергетика у костра в Деревне новичков, которая может проваляться всю игру.

P.S. Насчёт предикатов интересно, надо будет посмотреть.

  • Полезно 1

Вообще-то я белая и пушистая...

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

Плз хелп, решил сделать "упрощенное"(даже очень упрощенное) хранилище своих данных, на основе наработок xStream и Malandrius...

вот содержимое скрипта - хранилища:

  _s_storage (Показать)
Изменено пользователем Viнt@rь
Ссылка на комментарий

Viнt@rь, а чем тебя не устраивает готовое решение?

  Полезный утиль (Показать)
Ссылка на комментарий

malandrinus,

1. ИМХО, готовое решение - слишком громоздкое, в смысле, лично для меня, мне не нужно столько разных методов и тп, мне хватит того, что я сделал, в итоге получилось "простенько и со вкусом" :)

2. захотелось самому сделать нечто подобное, поработать с нет-пакетами, саморазвитие и тп... :)

Изменено пользователем Viнt@rь
Ссылка на комментарий

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

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

 

Аргумент по п.2 - вызывает желание сказать: "Молодец!", но... вот п.1 - ой как неоднозначен.

Конечно, если задача ограничена и не подразумевает возможного расширения - то конечно нет смысла использовать "скрипт-монстр", но уж больно знакомая мне тема ;-), и после "учебы" аппетит вырастет и это приведет к желанию наращивать и усложнять функционал. Иными словами, при разработке нужно учитывать не свой аппетит "на сейчас", а и то, что ... а "вдруг в гости друг заглянет?", т.е. учитывать и возможные ситуации, которые тоже может потребоваться сейчас или в дальнейшем обеспечить работой разрабатываемого скрипта.

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

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

Viнt@rь,

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

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

 

Не совсем ясно, что именно ты взял за основу и какой версии, поскольку системы мои и xStream отличаются и общего имеют только класс объекта хранения. По любому, если самоцель - именно поковыряться внутри, то рекомендую взять за основу систему xStream. На мой субъективный взгляд её разбирать и менять проще.

  Полезный утиль (Показать)
Ссылка на комментарий

malandrinus, сначала я разбирался в твоей системе)) потом в системе xStream, в итоге, думаю основную часть понял, а о методах, это я имел ввиду типа использования классов и функций из, xs_netpk, ogse_unist, и тп... за основу взял скрипт ogse_base_storage, а все остальные ваши наработки, послужили основой для более углубленного понятия, как работать и что можно делать с нет-пакетами.

Изменено пользователем Viнt@rь
Ссылка на комментарий

Такая напасть случилась:

Не работает death_callback, из bind_monster. Т.е. в статистику не записываются убитые монсты, не дается ранг за них, если в колбек поставить функцию - она не сработает и т.д... И если в логике монстра поставить on_death = ... это тоже не срабатывает. Колбеки и их функции не трогал. Мне остается только "танцевать с бубном". Подскажите хотя-бы примерную причину этого безобразия:-(

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

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

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

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

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

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

Войти

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

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

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