Скриптование - Страница 226 - Скрипты / конфиги / движок - 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/

Vano_Santuri

1. Приведенный пример для АМК-тайменров (именно по игровым минутам) имеет пороком не ограничение разрядности счетчиков, а то, что каждый раз очередной таймер устанавлявается относительно прошедщих игровых минут, которые расчитываются относительно кадендарного дня/часа минуты. Методы level.get_time_days() и ему подобные не завязаны на тайметрах, а тупо привязаны к началу часа, дня, месяца ...

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

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

Так что таймеры AMK (игровых минут!) имеют банальное ограничение: 31 день - они правильно работают ТОЛЬКО один месяц, т.е. до 1-го числа следующего месяца, который наступит в игре ...

 

2. Cо вторым типом АМК-таймеров немного сложнее и как раз эти таймеры упираются в разрядность класса game.time() (xFFFFFFFF ~> 4294967295), т.е. аналогично первым таймерам, эти начнут "врать" через немногим более 49 дней.

 

ИМХО, давно пора отказаться от АМК-таймеров в модах, игра которых предусматривает более месяца игрового времени. Да и ... транжирят ресурсы тоже не слабенько ...

 

 

*Shoker*, ничего в game.time() не накапливается, это все го лишь функция, которая возвращает некое кол-во милисекунд от начала некоего момента. Если вначале отсчет идет от начала игры, то через ~49,7 дней игрового времени эта функция начнет возвращать опять "заново", т.е. попросту будет врать на эти 49,7 дней

 

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

IQDDD, приношу извинения за свою неправоту, относительно флагов оружия. Действительно давняя зашоренность (не только моя) кочует из версии в версию uACDC и читалок/писалок нет пакетов, хотя в игровых скриптах все определяется как нужно, т.е. без ошибок.

Спасибо, подправил и у себя и передам, чтобы и в uACDC было подправлено.

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

 

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

Artos, Ясно. Тогда вопрос ребром: а в таймерах Simbion - таких проблем уж точно нет? И какие бы ты посоветовал использовать таймеры?

У меня в данный момент есть от Simbion (только там нужно отучать от колбэков). От xStream - там боле-менее независимо от системы. А вот таймеры от Маландриуса куда-то делись (может у кого остались и может поделиться?)?

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

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

Vano_Santuri, а вот ответ на вопрос ребром врядли обрадует ...

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

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

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

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

 

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

IQDDD, если игра различает установленную оптику, а не валит все в одну кучу - значит это можно прочитать и использовать. Именно так и считаю и, как выше уже написал, как раз заканчиваю очередное обновление мода под ТЧ и покопаюсь в кодах для ЗП ... Думаю решение, которое можно будет использовать в скриптах модов есть и будет найдено.

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

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

Ограничение счётчика - давняя тема...

 

Опыт казуала:

-- file _g.script

local count_time_fix = 0
function game_time_fix()
    return game.time() + 4294967295 * count_time_fix
end

 

И понятно, что заменил всё game.time на game_time_fix. Что-то около 40 замен получилось.

Когда пробовал, дошёл... вроде до агропрома -- в игре ничего не менялось, всё работало, не вылетало.

 

Понятно, что всё это, может и ничего не значить -- всё-таки, это опыт "казуального скриптера".

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

всё легко

7.9, ... как бы это помягче ... ты сам то понимаешь всю глупость приведенного кода и последующих слов?

 

1. Об'явить некую локальную переменную, которая всегда равна 0 (нулю), чудить с "фикс"-функцией дабы получить на выходе тоже самое, что и голая game.time() - хм ... действительно опыт "казуального скриптера". Тема то давняя, да до сих пор оказывается актуальная ...

2. Проверять отсутвие результата от ничего не делающего "фикса", который и фиксить то должен только спустя почти 50 игровых дней - это сколько десятков раз можно до агропрома прогуляться и ничего не заметить ненормального? :crazy:

 

и собственно каков смысл сего кода/поста? Как не нужно делать иль еще какой казуальный ... ? ;-)

 

Ну а фиксится ошибка с разрядами (как уже ранее говорилось) просто заменой счетчиков на базе game.time() на использование аналогичных, но 64-х разрядных на базе game.CTime(), что начали делать, но так и не закончили сами разработчики оригинальной игры.

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

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

Интересуют ограничения на размер хранимых данных в db.storage

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

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

Люди, скажите, у меня где-то трабла, или такое в самом деле бывает.

function test(id)
    local obj = level.object_by_id(id)
    msg(obj:id())
    msg(obj:section())
end

 

Вылетов не вызывает, id верный. Секция отображается как 9x19.

function test_problem(id)
    local sobj = alife():object(id)
    if not sobj then abort([Что-нибудь]) end
    msg(sobj.id)
    msg(sobj:section_name())
end

 

Будучи вызанной сразу после test крашит игрут на вызове sobj.id (не на abort (!)). Как такое могет быть? По одному и тому же id клиент работает верно, а сервер вообще не адекватен.

 

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

В придачу: изменяются ли id'ы после сохранения/загрузки?

 

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

Отвечу на свой первый вопрос.

Следующий код будет работать (пусть id входной параметр (типа "number") - получение ближащей клиентской вещи)

local obj = level.object_by_id(id) -- получение клиента по number
local sobj = alife():object(id) -- получение сервера по number

 

Следующий код тоже будет работать:

local str_id = tostring(id) -- получение строкового представления id
local obj = level.object_by_id(str_id) -- получение по типу "number", который автоматически преобразовался из "string"
local sobj = alife():object(id) -- не меняем

 

Следующий код не будет работать:

local str_id = tostring(id) -- получение строкового представления id
local obj = level.object_by_id(str_id) -- получение по типу "number", который автоматически преобразовался из "string"
local sobj = alife():object(str_id) -- не изменяем

 

Если бы это было в ТЧ или ЧН - я бы не удивился, т.к. у класса alife_simulator метод object() перегружен:

    cse_alife_dynamic_object* object(int id, bool no_assert); // получение объекта по id. 
    cse_alife_dynamic_object* object(int id); // эквивалентно предыдущей функции с no_assert == true. 
    cse_alife_dynamic_object* object(string name); // получение объекта по имени. В ЗП нет!

 

Но в ЗП (в котором и тестируется этот пример) сей функции нет. Но тем не менее разработчики не потрудились убрать и "обёртку" маршалинга в вызов функции на C (или на чём там?). Я негодуэ.

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

IQDDD,

В придачу: изменяются ли id'ы после сохранения/загрузки?

 

Они неизменны на протяжении всей игры. Id пропадает только тогда, когда пропадает(удаляется из игры) объект к которому он был присвоен.

 

А по поводу первого вопроса, если я конечно правильно понял его суть, можешь просто проверять тип передаваемой переменной на эквивалентность числовому параметру.

 

Вопрос: каким образом можно получить определенный участок местности на заданной локации. Допустим АТП и его 'округ' на Кордоне. Но больше меня интересует алгоритм унифицированного кода для определения такого типа местностей...т.е. объектов-ориентиров(типа АТП, фермы и иже с ними) и их 'округов'.

 

Исходно в консоль допустим чтобы у меня вылетело типа "На АТП" либо "На подходе к АТП" и т.п.

 

Задумка в том, что мне нужно определить местоположение нужного объекта(клиентского/серверного), то есть где он ошивается.

 

P.S. вариант со спейс рестрикторами не предлагать, мне здесь нужно что-то типа "определения расстояния до...", но кучу проверок(типа distance_to) писать тоже не хочу.

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

Artos.

Помягче, так помягче...

Смысл того сообщения - "Запасной вариант не помешает".

В своё время, при предварительном тесте класса CTime были обнаружены аномалии.

Где гарантии, что все?

И учтут-ли те которые известны?

 

Код.

Приведённый код -- для проверки (на всякий случай, может и не надо было) последствий замены использования game.time() в исходных кодах, в пределах одного цикла этого счётчика, то-есть, в тех кодах и пределах, какие учитывались в скриптах самими разработчиками. Соответственно, кода с обновлением и сохранением той переменной в нём нет. Но разве это проблема?

 

Например, (казуальный) вариант с обновлением переменной:

local count_time_fix = 0
local count_time_save = game.time()
function game_time_fix()
    if count_time_save > game.time() then
        count_time_fix = count_time_fix + 1
    end
    count_time_save = game.time()
    return game.time() + 4294967295 * count_time_fix
end

 

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

 

всё легко

Вроде как просто(!) определить положение - додумался...забить рядом с текстом нужной местности его x,y,z, и проверять расстояние нужного объекта до этих координат, но как определить где эта местность?(юг, восток, север, запад и т.д.)

Как сделать это:

Если ГГ умирает, высылается сообщение: Погиб сталкер [Имя ГГ], [Причина], [Локация]

proger_Dencheek, смотря, какая модель вам ближе: "событийная" или "таймерная". Если событийная, то надо искать коллбек на изменение здоровья актора (по-моему, где-то уже обсуждалось, что даже если навесить биндер на актора, то не работает). Если таймерная, то с определённым периодом проверять здоровье ГГ, и если 0, то вроде есть метод получения последнего хита. Может ошибаюсь.

 

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

Struck, кури массивы и циклы. Создаёшь некоторую базу из точек, можно даже из областей (например, круг, прямоугольник и пр.). Вручную прописываешь сторону света, название и пр. Потом организуешь цикл.

 

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

4294967295 * count_time_fix

Здесь будет переполнение.

Изменено пользователем IQDDD
IQDDD, реально, у меня там предполагается другое число, значительно меньшее... :)

всё легко

proger_Dencheek, есть скрипт счетчика смертей ГГ...смотри его.(в своих архивах я его быстро точно не отыщу)

 

IQDDD, так для кого пишу то, что кучу проверок и спейс рестрикторов мне делать неохота, нужен алгоритм(!) способа определения стороны света с помощью скажем всеми любимых тригонометрических функций, в зависимости объекта к заданным мною координатам, а спейс рестрикторы, которые ты предлагаешь тут делать(не приоритетно, но предлагаешь), здесь абсолютно ни к чему, т.к. расстояние "до" легко определяется функцией 'distance_to', и городить тут рестрикторы по меньшей мере глупо.

 

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

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

Пфффф... Да не предлагаю я ни какие спейс рестрикторы. А если тебе нужно определить стороны света ПО ОТНОШЕНИЮ К ДРУГОМУ ОБЪЕКТУ, то тут простая математическая задача при условии, что координатные оси уровня располагаются с юга на север и с запада на восток. Если это не так, то нужно ещё вспоминать функции преобразования координат при повороте системы координат.

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

7.9

А не, нифига там не будет переполнения. Вернее, оно может быть, а может и не быть. Lua - динамический язык, и не ясно, в какой структуре будет представлено то или иное число: с фиксированной или плавающей запятой. Поэтому тут некоторые проблемы наблюдаются. Например, число 2^32 представляется в формате с фиксированной запятой (не уверен, т.к. может быть, что это число преобразуется в формат с плавающей запятой без потери точности.). А 2^64 уже преобразуется в формат с плавающей запятой с потерей точности. Т.о. мы не можем утверждать точность численных операций при значениях, больших 2^32-1. Или даже 2^31-1.

 

Если я не прав, киньте в меня огнеупорный кирпич.

 

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

Struck, а давай ты это сделаешь сам, или обратишься на dxdy.ru.

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

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

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

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

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

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

Войти

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

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

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