Git Product home page Git Product logo

Comments (13)

Qveshn avatar Qveshn commented on September 18, 2024
  1. Последний параметр в createLight (async) всегда ставьте false. Асинхронный режим работает некорректно

  2. createLight/deleteLight только создает/удаляет свет на сервере. Клиент об этом не знает, т.к. сервер не посылает сообщения клиенту об этом. Поэтому игрок увидит изменения только если он отбежит очень далеко и вернется обратно (даже перезагрузка чанков не поможет F3+A)

Это сделано специально, т.к. после каждого вызова этой функции посылать уведомления клиенту не рационально и это нагрузит сервер и клиент. Для оптимизации быстродействия клиенту посылается уведомления отдельной функцией updateLight, которая за раз отправляет пакет с информацией по всему чанку, указывая какие секции чанка (16х16х16) следует обновить.

В результате алгоритм использования API примерно следующий:

  1. Создаем/удаляем свет в блоках и тут же запоминаем в хэше (HashSet) список затронутых секций и чанков (свет одного блока распространяется с затуханием и может затрагивать несклько секций/чанков). Получить список потенциально затронутых секций/чанков можно функцией collectChunks.
  2. Далее в цикле по этому списку посылаем пакеты клиентам (игрокам) командой updateLight с информацией об обновленных чанках. Клиент перерисовывает на своей стороне свет в этих секциях/чанках. (updateLight всегда работает в асинхронном режиме)

Пример кода можно посмотреть тут:
https://www.spigotmc.org/threads/lightapi-fork.278321/page-9#post-4228780

Первый пример без оптимизации. Он создает/удаляет свет в блоке и тут же отправляет клиентам пакеты об изменениях. Второй пример показывает принцип оптимизации. Он создает/удаляет свет сразу во многих блоках и коллекционирует список затронутых секций/чанков. А в конце уже отправляет пакеты клиентам.

Класс ChunkInfo в примере имеет кривое название (исторически сложилось). Он на самом деле означает инфу по секции чанка (16х16х16), а не по всему чанку (16х256х16). Т.е. updateLight на вход получает инфу по секции чанка и запоминает в своем внутреннем буфере.
Далее уже плагин с указанной в конфиге периодичностью обрабатывает этот буфер. Берет от туда секции, агрегирует их по чанкам и уже потом отправляет клиентам пакеты об изменении в чанках.

from lightapi.

Timtaran avatar Timtaran commented on September 18, 2024

Ок, есть вопрос по второму примеру, так как в Java я почти полный ноль:
Как создать Collection и засунуть в него locations?
про существование гугла знаю, но там не нашел
'Collection' is abstract; cannot be instantiated
Если по подсказкам IntelijIdea делать, то
Incompatible types. Found: 'boolean', required: 'java.util.Collection<org.bukkit.Location>'

from lightapi.

Timtaran avatar Timtaran commented on September 18, 2024

Первый способ работал, но когда я его перенес на другой сервер, он не заработал ._.
Возможно проблема в ядре Patina

image

Фото на локальном сервере
image

from lightapi.

BeYkeRYkt avatar BeYkeRYkt commented on September 18, 2024

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

from lightapi.

Timtaran avatar Timtaran commented on September 18, 2024

ок, тогда попробую заменить на Paper

from lightapi.

Timtaran avatar Timtaran commented on September 18, 2024

Да, проблема была в этом.

from lightapi.

Qveshn avatar Qveshn commented on September 18, 2024

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);;

from lightapi.

Qveshn avatar Qveshn commented on September 18, 2024

Да, со StarLight полная беда. Его сначала воткнули в Tuinity. Потом в Purpur. Вроде где то слышал что его собираются скоро воткнуть и в Paper.

from lightapi.

Qveshn avatar Qveshn commented on September 18, 2024

В общем, как я и предполагал, StarLight уже воткнули в Paper.
#37

from lightapi.

Timtaran avatar Timtaran commented on September 18, 2024

вобщем я к счастью на 1.16.5, жаль что на Paper плагин на машины работает отвратительно.

from lightapi.

Timtaran avatar Timtaran commented on September 18, 2024

кажись придется рыться в исходниках и пересобирать ядро

from lightapi.

BeYkeRYkt avatar BeYkeRYkt commented on September 18, 2024

На скорую руку сделал патч для Starlight на 1.17:
BeYkeRYkt/Paper@48c517f

Патч содержит код только для блоков

И немного переписал плагин для проверки:
https://github.com/BeYkeRYkt/LightAPI/tree/temp/5.0.0-starlight

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

from lightapi.

Qveshn avatar Qveshn commented on September 18, 2024

o_O
это надо курить))

from lightapi.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.