Скриптование - Страница 290 - Скрипты / конфиги / движок - AMK Team
Перейти к контенту

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

Тема для обсуждения скриптов всего и всех в серии игр 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
Ссылка на комментарий
https://www.amk-team.ru/forum/topic/6185-skriptovanie/

@Nazgool, да, мы идем разными путями к одному и тому же. Я поэтому и спросил, зачем читать их динамически? Вопрос был не "Зачем список clsid'ов?", а "Зачем читать статические данные из скриптов?". Важен академический интерес? Хорошо, но ИМХО этот способ применять в конечном продукте я бы не стал. 2 причины, подключение X-Ray Extensions и мы все равно не видим список, визуально, да, для кода задача решена, но для программиста какие ключи писать не ясно. Да, можно вывести в лог или еще что-нибудь, но тогда придется их куда то записать. И лично моя причина, читать так чтото из длл - жесть, для этого и существует hex редакторы. Но ладно.

Так еще то вопрос у меня был, что с clsid'ами объявленными в скриптах, а не в движке? Есть вариант (может работает, а может и нет, так что без кода), подмена функции метатаблицы __newindex на свою с вызовом старой, в своей написать добавление этого ключа в некую глобальную таблицу, только надо найти место, где переопределять это дело.

ТЧ 1.0004. SAP и Trans mod

github

Проще всего посмотреть список ключей в исходниках движка.

Nazgool

 

Сам по себе список не имеет ни какого смысла. Если уже охота попрактиковться в бинарных извращенях то составь табличку соответствий ключей к числовым констатам

Andrey07071977

 

 

Не знаю что дальше хочешь делать,

А почему я это написал?

 

 

а дальше уже просто

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

Если я ещё и это сделаю, то что останется вопрошающему?

 

И ещё. Я никого не заставляю пользоваться этим. Одному это жесть, другому извращения.

Это одна из техник!

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

Nazgool, доведи дело до конца, неужели самому не интесно сделать полностью динамическое и функциональное заполнение таблички, как говориться on demand. Про извращения это была шутка вызванная восхищением твоей упертости :)

Ну в моем конкретном случае составлять соответствие числовых значений - уже лишнее.
Мне собственно требовалось написать аналог функций IsStalker, IsWeapon, ... etc из _g.script. и для тех объектов, которые мне нужны, надо было найти как их звать по клсиду)

В случае скриптово-добавленных клсидов их можно просто в class_registrator-e посмотреть.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

составь табличку соответствий ключей к числовым констатам

А чего там составлять? Заменить в коде

elseif #key>0 then
   if clsid[key] then
       t[#t+1] = key
   end

на

elseif #key>0 then
        local k = clsid[key]
        if k then
             t[key] = k
             t[k] = key
        end

и получиться таблица вида :

{ строка = число,
  число = строка,
  ...
}

и так будет для каждого поля из clsid. Т.е. обращаться к ней можно будет и по строке и по номеру.

сделать полностью динамическое и функциональное заполнение таблички

Насколько я понял по условию, никакой динамики и не нужно. Просто необходим список и всё. Читать его один раз при загрузке - много времени не займёт. Вроде так?

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

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

Учитывая что в моем моде клсиды добавляются так же и через скрипты, и, разработка еще в процессе - могут и еще новые классы добавиться. А числовые значения при этом смещаются. И да, экспериментальным путем выяснилось, что то, что мы добавляем в class_registrator-e, добавляется вовсе не в конец списка clsid. Я так понимаю добавленные следуют за своими родителями. А все последующие в списке - смещаются. И потому даже числовые значения классов, прописанных в движке, уже не соответствуют "имеющимся табличкам".

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

,

У инвентарных предметов нет пстора, насколько я помню. для них удобнее пользоваться кастом-датой их нет-пакета. см. модуль Артоса для работы с нет-пакетами, хотя ему вроде есть и другие аналоги.

  • Полезно 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

 

Zander_driver, а чуть подробнее можно?) Потому как с такой темой столкнулся впервые и где этот модуль взять/посмотреть примеры работы, а тем более аналоги я даже не знаю)

 

как запретить использование предмета без другого 
Ну например консервы без специального ножа не открыть ?

svarog2741.gif

 

НС - шлак, солянки - шлак.

Ну для этого надо 3 вещи.

1. отловить факт того, что предмет попытались использовать (use_collback, тут все просто)
2. проверить наличие другого предмета. тоже все просто. if db.actor:object("ваш_консервный_нож") ~= nil then и так далее.

3. если второго предмета нет, то спавнить первый обратно. а если есть, то выполнять то, что должно свершиться от применения первого. И выполнять скриптово, потому что первый объект на самом деле был безвозвратно съеден в первом пункте и на этот факт никак не повлиять.

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

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

@Zander_driver,

1. отловить факт того, что предмет попытались использовать (use_collback, тут все просто)

Может я не прав, но use_collback вроде извещает о том что уже было сделано, а не о попытке это сделать ?

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

 

 

как запретить использование предмета без другого

А если близко к тексту, именно "запретить" - то можно попытаться покопать в сторону фейковых объектов. Примерно так:

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

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

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

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

 

И вообще - все это извращение...

 

 

Изменено пользователем AndreySol
  • Нравится 1

 

 

Может я не прав, но use_collback вроде извещает о том что уже было сделано, а не о попытке это сделать ?

Да, о том что уже сделано. Если прочитать весь мой пост, становится ясно почему я назвал это "попыткой".

 

@svarog2741, Все данные вам ответы, как мои так и Dennis_Chikin-a, относятся к Оригинальной игре. При достаточном желании и навыках работы с скриптами, реализовать чтобы именно так все выглядело для игрока - не сложно. Но метод непрост, и новичку маловероятно его осилить.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

Ну, так уж "непрост"... Листнуть 4 страницы назад - не такое уж и непосильное дело. Да и на сталкер-вики сходить - не велик подвиг. ;)

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

Раньше где-то на форуме я видел функцию, которая округляла число, например, до десятитысячных, найти что-то не могу ее, потому вопрос:
Как можно округлять числа до десятитысячных, тысячных и сотых?

, можно округлить в помощью string.format, например, так:

print(string.format("%.2f", math.pi)) --> 3.14
print(string.format("%.3f", math.pi)) --> 3.142
print(string.format("%.4f", math.pi)) --> 3.1416
  • Спасибо 1
  • Согласен 1

, или так:

function round(num, idx)
  local coeff = 10^(idx or 0)
  return math.floor(num*coeff+0.5)/coeff
end

где num - округляемое число, idx - порядковый номер знака после запятой, до которого следует округлить, включая 0 для округления до целого.

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

  • Спасибо 1
  • Полезно 1

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

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

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

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

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

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

Войти

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

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

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