Open Timtaran opened 3 years ago
Последний параметр в createLight (async) всегда ставьте false. Асинхронный режим работает некорректно
createLight/deleteLight только создает/удаляет свет на сервере. Клиент об этом не знает, т.к. сервер не посылает сообщения клиенту об этом. Поэтому игрок увидит изменения только если он отбежит очень далеко и вернется обратно (даже перезагрузка чанков не поможет F3+A)
Это сделано специально, т.к. после каждого вызова этой функции посылать уведомления клиенту не рационально и это нагрузит сервер и клиент. Для оптимизации быстродействия клиенту посылается уведомления отдельной функцией updateLight, которая за раз отправляет пакет с информацией по всему чанку, указывая какие секции чанка (16х16х16) следует обновить.
В результате алгоритм использования API примерно следующий:
Пример кода можно посмотреть тут: https://www.spigotmc.org/threads/lightapi-fork.278321/page-9#post-4228780
Первый пример без оптимизации. Он создает/удаляет свет в блоке и тут же отправляет клиентам пакеты об изменениях. Второй пример показывает принцип оптимизации. Он создает/удаляет свет сразу во многих блоках и коллекционирует список затронутых секций/чанков. А в конце уже отправляет пакеты клиентам.
Класс ChunkInfo в примере имеет кривое название (исторически сложилось). Он на самом деле означает инфу по секции чанка (16х16х16), а не по всему чанку (16х256х16). Т.е. updateLight на вход получает инфу по секции чанка и запоминает в своем внутреннем буфере. Далее уже плагин с указанной в конфиге периодичностью обрабатывает этот буфер. Берет от туда секции, агрегирует их по чанкам и уже потом отправляет клиентам пакеты об изменении в чанках.
Ок, есть вопрос по второму примеру, так как в Java я почти полный ноль:
Как создать Collection и засунуть в него locations?
про существование гугла знаю, но там не нашел
'Collection' is abstract; cannot be instantiated
Если по подсказкам IntelijIdea делать, то
Incompatible types. Found: 'boolean', required: 'java.util.Collection<org.bukkit.Location>'
Первый способ работал, но когда я его перенес на другой сервер, он не заработал ._. Возможно проблема в ядре Patina
Фото на локальном сервере
Скорее всего в подобных ядрах используется движок освещения Starlight вместо стандартного. Starlight не поддерживает кастомные уровни освещения, только от блоков.
ок, тогда попробую заменить на Paper
Да, проблема была в этом.
Collection это не класс, а интерфейс. Т.е. на вход во вторую функцию передается экземпляр класса, который реализует интерфейс "Collection". Есть много классов, которые реализуют этот интерфейс. Например ArrayList, HashSet, Vector и т.п. https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html Полный перечень классов, которые реализуют данный интерфейс, смотри под заголовком "All Known Implementing Classes". В угловых скобочках Collection<Location> указывается тип каждого элемента коллекции.
Т.е. снаружи пишешь например так:
List<Location> list= new ArrayList<>(); // Интерфейс List тоже включает в себя итерфейс Collection
list.add(new Location(...));
list.add(new Location(...));
list.add(new Location(...));
setLight(list, 15, LightType.BLOCK);;
Да, со StarLight полная беда. Его сначала воткнули в Tuinity. Потом в Purpur. Вроде где то слышал что его собираются скоро воткнуть и в Paper.
В общем, как я и предполагал, StarLight уже воткнули в Paper. https://github.com/Qveshn/LightAPI/issues/37
вобщем я к счастью на 1.16.5, жаль что на Paper плагин на машины работает отвратительно.
кажись придется рыться в исходниках и пересобирать ядро
На скорую руку сделал патч для Starlight на 1.17: https://github.com/BeYkeRYkt/Paper/commit/48c517fb7b15239f30063759001c6b6740b62d7a
Патч содержит код только для блоков
И немного переписал плагин для проверки: https://github.com/BeYkeRYkt/LightAPI/tree/temp/5.0.0-starlight
Плагин содержит обратную совместимость со старым интерфейсом. Также проект содержит тестовый плагин для проверок с помощью блоков: красный блок, обсидиан и бедрок. На первый взгляд вроде работает, но могут быть некоторые приколы с переосвещением чанков.
o_O это надо курить))
1.16.5 Paper