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

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

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


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

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

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

 

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

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

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


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

Struck

Эм....

  код (Показать)
Изменено пользователем Artos

Freedom

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

IQDDD, в Сталкере -- 2^23, из-за этого данный алгоритм, прямо в таком виде, скорее всего не подойдёт (непроверено). Поэтому я стал делать альтернативный счёт годов-дней-секунд.... правда пока не доделал (начал 2010) :) -- геймплей отвлёк.

 

Добавлено через 7 мин.:

Struck, правильно работающий код из STCO:

  код (Показать)
Изменено пользователем Artos

всё легко

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

_Призрак_, вот оно как :), ну в геометрии я ноль абсолютной(не знаю даже что такое вектор, алгебра моя стихия...), ну так вот, а получить северо-запад например как? Все ж таки я думаю нужно использовать какие то тангенсы и магическое math.pi

 

7.9, dirsector как я понял это у тебя дирекция объекта?

 

Добавлено через 61 мин.:

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

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

Убедителая просьба-напоминание:

1. Использовать для "портянок" текстов кодов/логов тэг спойлера.

2. Споры и размышления о разрядности точности и т.п. вести в тематическом топике "Язык Lua. Общие вопросы программирования.".

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

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

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

Как-то раз malandrinus высказывал своё недовольство по поводу того, что некоторые используют слово "дирекция" вместо "направление". Правильно вообще говорил. :)

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

IQDDD, да не ворчи ты :), для меня на сталкерских форумах "дирекция" - "направление взгляда объекта", как бы одно слово заменяет три, и вроде всем понятно о чем говорю, разве нет?

 

P.S. Я согласен, что это неправильно, но в данном случае...можно простить.

 

Поменьше оффтопика ... иначе будут приниматься меры без всяких "прощалок". --/Artos

 

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

 

Теперь следующий вопрос.

 

Как создать глобальную функцию? Типа IsStalker.

 

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

 

Читать мануал по Lua! Именно читать, а не курить его ... --/Artos

Изменено пользователем Artos
Ссылка на комментарий
_Призрак_, а таким способом она будет доступна после 1го апдейта актора? Или же до актора?

Что-то кончается, что-то начинается...

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

Struck, IQDDD, советую вам почитать все же мануал по Lua на тему областей видимости переменных ... лишним не будет и "прощать" за невняьные вопросы/предположения никого не придется.

1. Глобальная функция может быть как в любом конкретном скрипте/модуле, так и в глобальной метатаблице.

Т.о. исходный вопрос имеет простой ответ: пишешь функцию и не определяешь ее как локальную - вот у будет она глобальной.

Однако по уточнению "Типа IsStalker" - можно предположить, что Struck хочет обращаться к своей глобальной функции не через имя файла-скрипта ( my_script.my_func(...) ), а именно как my_func(...) - т.е. чтобы функция была в глобальной метатаблице (_G). Ну так и включи ее в нее. Способы бывают разные, два уже указаны:

- написать свою функцию в скрипте _g.script , т.е. в полной аналагии с _g.IsStalker()

- занести напрямую в таблицу: _G.my_func = function(...) <тело функции> end

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

 

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

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

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

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

Artos, Теперь возвращаюсь к производительности.

 

  тык (Показать)

Что-то кончается, что-то начинается...

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

1. Все userdata'ы (в том числе и объекты game_object) являются ссылочными типами, посему когда ты пишешь obj1 = obj2 - ты копируешь только ссылку (занимает 4/8 байта) на объект. Посему выигрыша в производительности нет.

2. Лучше использовать table.insert, т.к. даже если он и чуть медленнее, всё равно лучше поступиться производительностью во благо понятности кода.

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

IQDDD, понятно.

 

  Цитата
2. Лучше использовать table.insert, т.к. даже если он и чуть медленнее, всё равно лучше поступиться производительностью во благо понятности кода.

 

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

 

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

 

Artos, вот пытаюсь приспособить твой чудо-скрипт для оптимизации сканирования объектов. Но что-то мало не понимаю. Можешь почеркать то, что не нужно для работы? (выводы в лог и т.д)

 

И да, что должна делать эта функция?\

        --/ -- обработка объекта ----------------
        this.Build_TableObj(soObj,iCurID)
        --/ -------------------------------------

Как я понял, она должна заносить в таблицу искомый объект и его id?

 

  тык (Показать)

Что-то кончается, что-то начинается...

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

Не надо засорять код и свою голову всякими мелочными оптимизациями. Пишите код так, чтобы было в первую очередь "понятно, чётко и лаконично". Если работает медленно, надо искать возможность оптимизировать в первую очередь - структуру алгоритма, а потом уже его написание.

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

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

 

1. Во-первых, если в вопросе стоИт уточнение именно по производительности, то и нужно говорить в этом контексте, а не о "понятности кода". Задачи бывают разные, и уж в циклах по перебору тысяч вариаций - красивость и понятность кода все же на 2-ом плане! ИМХО.

 

2. Вот то, что грубые ошибки совершенно не замечены, а вроде как говорится о почти рабочих вариантах - вот это вы упускаете.

Ну как может вообще работатть такое:

if Cid == "artefact_s"

- когда число сравнивается со строкою и нет даже намека на обязательный для условия оператор 'then'? Если уж пишете в топик код и спрашиваете о его производительности, то в первую очередь проверьте хотя бы чекером - а вообще этот код рабочий?

Вероятно тут должно быть: if Cid == clsid.artefact_s then

 

3. Я никогда не говорил что table.insert "оч медленно работает". Конечно прямое заполнение поля выигрывает в скорости, но ... тут ведь в первую очередь важен формат таблицы, и во вторую - к такому прямому заполнению искуственно привязываются операции по переберу индексов (t) что смазывает возможно весь выигрыш.

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

IQDDD, ну никак не пойму, чем "понятливость" вставки в таблицу больше, чем заполнение поля таблицы ...

 

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

 

5. Если уж говорить о понятливости и простоте кода, то во-первых, зачем идентификатор (ID) обзывать переменной 'k'? Может 'id' будет более понятнее?! Ну и второе, для номеров/индексов чем 't' проще нормального названия 'idx' или 'index'?! Производительность от таких названий не повышается, а вот понятность/читабельность кода - хромает.

 

6. Ну и по this.Build_TableObj(soObj,iCurID) - видно ты плохо смотрел Симбион, ведь в нем это применено в рабочем скрипте m_oflife.script и это собственно ссылка на функцию, которой передаются аргументами уже полученные серверный об'ект и его идентификатор и функция составляет множество (суб)таблиц для этого об'екта, которые затем используются в алгоритмах оффлайн алайфа.

 

Т.о. ответ по производительности дать не могу, т.к. в отрыве от требований к формату таблицы и пояснений о ее дальнейшем использовании - вопрос по скорости заполнения таблицы достаточно бессмысленен и малосущественен. Ну а если вопрос для CoP - то вообще зачем перебирать весь диапазон игровых ID, если артефакты биндятся и онлайновые достаточно быстро ищутся в db.storage ...

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

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

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

Господа, подскажите. Хочу заспавнить труп непися вне аи сетки (в подвале - там нет аи сетки)

Я прочитал про назначения флажков, нашел этот: flUsedAI_Locations (8-й бит) и написал так:

  Раскрывающийся текст (Показать)
Ссылка на комментарий

proper70, ты спавнишь не труп, а обычного сталкера и движек пока (до манипуляций с нет пакетами) не ведает, что ты его хочешь "убить" - соответственно он создает твоего непися, но(!) тут же пытается засунуть его на AI-сетку.

И, неясно, для чего манипуляции с "менял координату Y выше, ниже" - хоть живой, хоть трупом - все одно опустится на пол. Чтобы подвешивать - нужно нечто иное ... (сейчас на вскидку не помню уже).

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

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

Подскажите, как запустить скрипт через определённый промежуток времени. В скрипте две функции: проверка_наличия_предмета и функция_действия.

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

В bind_stalker'е есть функция update(delta).

Она периодически вызывается через определённый промежуток времени (период delta зависит от производительности и составляет в среднем 15-20 мс). На этой основе и делай.

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

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

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

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

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

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

Войти

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

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

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