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

Скриптование


Svoboда

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

(изменено)

Romz, конечно. Сохранять и там и там избыточно.

Labus, получить имя объекта.

Карлан, согласен.

(пишу с телефона, заметки и проч. недоступны)

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

Поделиться этим сообщением


Ссылка на сообщение

@Nazgool, зачем ждать запроса? Кому-то может пригодиться позже, а своевременно выложить пример возможности не будет.

Лучше сейчас, это полезно. :)

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@Romz, у тебя есть все необходимые инструменты, ты же сам недавно подключал модули Артоса.

В lua_helper есть метод (импортированный в публичное пространство) Get_PastSeconds. Получаешь им кол-во секунд, прошедшее со времени последнего выброса:

local past_seconds = Get_PastSeconds(surge_manager.get_last_surge_time())

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

 

Upd: единственное - твоя добавленная функция surge_manager.get_last_surge_time() должна возвращать объект типа CTime, то есть то, что в оригинальном surge_manager хранится в свойстве self.last_surge_time.

 

Upd2: если интересно, как то же самое можно сделать без lua_helper, то вот:

local past_seconds = game.get_game_time():diffSec(surge_manager.get_last_surge_time())
Изменено пользователем Kirgudu
  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@Romz, да, Lua регистр различает.

То есть, можно было гораздо проще всё сделать...

Смотря для чего сам Vergas её писал. А тебе да, можно сделать всё намного проще, по крайней мере в рамках заданного вопроса. Думаю, окончательное решение должно быть уже понятно.

Изменено пользователем Kirgudu
  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение

@Romz, ты можешь его сбрасывать при первом апдейте, ведь сразу после загрузки никакой диалог (в том числе проводника) ещё не открыт.

Поделиться этим сообщением


Ссылка на сообщение

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

  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение

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

В целом нормально, но оптимизировать есть куда. Например:

function dream_calculation()
	local delta_su = surge_manager.get_delta() - surge_manager.get_last_surge_time()
	local delta_ps = psi_storm_manager.get_delta() - psi_storm_manager.get_last_psi_storm_time()

	local delta_h, delta_m = math.modf(math.min(delta_ps, delta_su)/3600)
	delta_m = math.floor(delta_m*60)

	return delta_h, delta_m
end
Ну и отсюда очевидно, что лучше не дёргать 2 раза подряд один и тот же менеджер, а вычислять соотв. дельту прямо в нём, в дополнительной функции, передавая наружу уже результат.
  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение

 

 

А вот math.modf, он разве не целую и десятичную часть возвращает? Потому что десятичная часть - это же миллисекунды, вроде. И тогда их на 3600 умножать надо, чтоб минуты получились.

Возвращает целую и дробную части, но уже после деления на 3600, то есть и то и другое - в часах. Поэтому для получения минут дробную часть надо умножать на 60.


 

 

Не, я переписал функцию, она время в секундах возвращает.

Тогда бери мой пример. Вариант @abramcumner относится к CTime.

  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

@abramcumner, можно я отвечу? :)
@Romz, где ты такое увидел? Сначала сложением вычисляется время следующего выброса (двух), потом разница между ними и текущим временем (next_surge:diffSec(now)), потом берётся минимальная разница. Она и возвращается, как оставшееся время до ближайшего выброса.

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@Romz, ну тогда сам смотри, с какого конца подходить. Если тебе проще оперировать секундами - используй свою функцию, в оптимизированном или нет виде.

Либо, если делать через CTime, у тебя уже есть время последнего выброса (self.last_surge_time)), а время до следующего можно получить так (при учёте того, что self._delta - в минутах):

local delta_ctime = game.CTime()
delta_ctime:setHMS(0,self._delta,0)

И тогда, вернув оба объекта, можно воспользоваться функцией, которую привёл @abramcumner. Только потом не забудь перевести его результат delta (который тоже CTime) в часы и минуты:

return delta:timeToString(game.CTime.TimeToMinutes)

И получишь сразу строку вида "hh:mm".

Изменено пользователем Kirgudu
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@Zander_driver, судя по всему, ты пользуешься старым m_net_utils.

upd.quaternion в m_net_utils --> upd.ph_rotation в m_netpk.

Помимо названия, в m_netpk существенно изменился сам способ чтения/записи данных, в том числе этого свойства. Я полагаю, что в новой версии модуля твоей ошибки уже не будет.

Если это так, а старая версия модуля интегрирована в слишком многие скрипты, тебе даже не обязательно повсеместно переходить на новую. Судя по инициализации там и там, обе версии вполне уживутся рядом друг с другом.

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

Поделиться этим сообщением


Ссылка на сообщение
npc:goodwill(db.actor) -- результат - число
npc:relation(db.actor) -- результат - одно из значений game_object.enemy | game_object.neutral | game_object.friend

Примеры использования можно найти в оригинальных скриптах игры.

Вообще, поиск по файлам с помощью, например, TC, может дать много интересной и полезной информации.

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Модуль se_stor на ЗП периодически, на переходе между локами, не сохраняет статистику ГГ, либо же не может её считать из сохранения.

Проблема нами с автором вопроса решена, исправленный модуль se_stor выложен в теме «Сборочный цех».

 

Что касается обещанных мной подробностей.

Как известно, при создании нового net-пакета в ЗП и ЧН позиция записи может не быть автоматически установлена на начало, и чтобы запись в пакет происходила как положено, позиция записи должна быть изменена принудительно методом packet:w_begin(0). Об этом уже неоднократно писалось, например здесь.

Однако было обойдено вниманием (или, по крайней мере, я не нашёл на форуме соответствующей информации) то, что для «чистого» net-пакета может не быть нулём также и позиция чтения. При этом packet:r_tell() для этого пакета возвращает, например, 263.

Такая ситуация встречается как минимум в ЗП, вероятно и в ЧН тоже.

@Artos не учёл это в модуле se_stor, либо просто забыл исправить, что и привело к вышеописанным вылетам. Теперь данной ошибки модуль лишён.

 

А решение простое - после создания нового net-пакета следует принудительно выставлять как позицию записи, так и позицию чтения:

local packet = net_packet()
packet:w_begin(0) --/ установка позиции записи в начало net-пакета (+2 технологических байта)
packet:r_seek(0) --/ установка позиции чтения с начала net-пакета

@Max_Raf, указанным тобой способом данные сохраняются в pstor игрока, а значит имеют ограниченный общий объём, не превышающий размера net-пакета для соотв. платформы (около 8 КБ для ТЧ и 16 КБ для ЧН/ЗП). «Войну и мир» ты в них не запихнёшь, так как переполнение гарантированно приведёт к порче сохранений.

Если есть необходимость сохранять что угодно и сколько угодно, лучше посмотреть в сторону так называемых универсальных хранилищ. Что это такое - неоднократно тут объяснялось и обсуждалось, с примерами, инструкциями и т. п. Информацию легко найти; достаточно сделать поиск по форуму или, для начала, заглянуть в тему «Сборочный цех».

Изменено пользователем Kirgudu
  • Спасибо 1
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение

 

 

Но (см. комментарий) сообщения нет.  з.ы. и да, проблема не в выводе сообщения - даже явное return 1/0 не приводит к вылету :-) (т.ею. до a4_message не доходит, при этом - даже если она вызывается из a4_on_update)

И не будет никакого сообщения при таком коде.

local packet = net_packet()
local new_game = packet:r_u8() != 1 

Во-первых, как справедливо заметил @naxac, неравенство должно обозначаться «~=».

А во-вторых, чтобы пользоваться net-пакетами, надо для начала хотя бы изучить что они такое и с чем их едят. Начать можно с азов в теме «Справочник по функциям и классам», да и в целом на форуме информации предостаточно. Даже тут, на предыдущей странице, было обсуждение, которое могло бы навести на некоторые мысли.

В частности, вызов конструктора local packet = net_packet() возвращает новый, чистый (!) net-пакет. Всегда. И пытаться получить из него признак запуска игры - бессмысленно.

 

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

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

Поделиться этим сообщением


Ссылка на сообщение

а в дальнейшем мне тут ещё будет что хранить

В зависимости от специфики и размера сохраняемых данных - пстор, обсуждавшиеся тут универсальные хранилища, нет-пакет конкретного объекта и т. д. Вариантов хватает. По целям надо и средства выбирать.

Поделиться этим сообщением


Ссылка на сообщение

@alex4321, ещё раз:

 

 

В частности, вызов конструктора local packet = net_packet() возвращает новый, чистый (!) net-пакет. Всегда. И пытаться получить из него признак запуска игры - бессмысленно.

Поэтому

local packet = net_packet()
local new_game = packet:r_u8()

вернёт что? Мне неизвестно - не пробовал получать значение из нового net-пакета.

Поделиться этим сообщением


Ссылка на сообщение

 

local actor = alife():actor()
local cactor = level.object_by_id(sactor.id)

 

Точно sactor.id? Строчкой раньше определяется переменная actor. Это первое.

А второе - зачем такие мучения? Не проще ли сделать так?

db.actor:give_game_news("Свободу тушканам!\\nТушканчики всех стран, объединяйтесь!","ui\\ui_npc_monster",Frect():set(0,215,163,105),1000,50000)
@Serge!, это при условии, что там всегда 0. А также что позиция чтения установлена с начала пакета (см. выше).

Поделиться этим сообщением


Ссылка на сообщение

Потому что в news_manager.send_tip() используется альтернативный метод вывода сообщения:

db.actor:give_game_news("Свободу тушканам!", "Тушканчики всех стран, объединяйтесь!", "ui\\ui_npc_monster", 0, 50000)

В этом варианте не указываются координаты и размеры вырезаемого из текстуры изображения.

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

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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

AMK-Team.ru

×
×
  • Создать...