Универсальные пакеты
HollowCore предоставляет вам удобную систему пакетов, вам необходимо лишь создать сериализуемый класс с данными и наследовать метод для обработки данных на другой стороне.
Создание класса
Итак, прежде всего создайте класс, который будет сериализуем и реализуйте в нём интерфейс HollowPacketV3, где generic-параметр - ваш класс. После чего добавьте аннотацию @HollowPacketV2 и по желанию укажите сторону, на которую пакет сможет быть отправлен. (Если её не указывать, то пакет сможет быть отправлен как с клиента на сервер, так и наоборот.)
@HollowPacketV2(HollowPacketV2.Diresction.TO_CLIENT)
@Serializable
class SomeMoneyPacket(private val creditCardNumber: String, private val money: Float): HollowPacketV3<SomeMoneyPacket> {
override fun handle(player: Player) {
player.sendSystemMessage("У игрока ${player.name.string} на карте $creditCardNumber денег: $money".literal)
}
}
Отправка пакета
Для отправки пакета создайте объект вашего пакета и вызовете один из следующих методов:
send()
- отправить пакет на сервер.send(player1: Player, player2: Player, ...)
- отправить пакет с сервера определённым игрокам.sendTrackingEntity(entity: Entity)
- отправить пакет всем, кто может видеть определённого моба.sendAllInDimension(level: Level)
- отправить пакет всем игрокам в указанном измерении.
val packet = SomeMoneyPacket("2200########", -120000) // Создаём пакет (см. прошлый пример)
packet.send(player) // Отправляем пакет определённому игроку
Обработка пакета
Для обработки пакета вам необходимо лишь реализовать метод handle(player: Player)
в вашем
классе с пакетом, написав что будет происходить, когда пакет пришёл на клиент.
Здесь, player
- переменная игрока. Если пакет пришёл с сервера на клиент, то player
имеет
тип LocalPlayer
и обозначает игрока, которому пришёл пакет. Если пакет пришёл с клиента на
сервер, то player
имеет тип ServerPlayer
и обозначает игрока, который отправил пакет.
// Внутри вашего класса, реализующего интерфейс: HollowPacketV3.
override fun handle(player: Player) {
player.sendSystemMessage("У игрока ${player.name.string} на карте ${creditCardNumber} денег: ${money}".literal)
}
Пакет-запрос и корутины
Иногда вам может потребоваться сделать один или несколько запросов на сервер и получить с него какие либо данные. HollowCore имеет в себе отдельный под-тип пакета специализированный как раз под такие задачи.
Создание пакета-запроса
Для начала создайте класс с параметрами, которые хотите получить от сервера и наследуйте
абстрактный класс RequestPacket<T>
, где T
- ваш пакет. После чего наследуйте функцию
retrieveValue(player: ServerPlayer)
, в ней вам нужно получить нужные вам параметры и
записать их в параметры класса.
@HollowPacketV2
@Serializable
class GiveMyMoneyPacket(private var money: Float = 0f) : RequestPacket<SomeMoneyPacket> {
override fun retrieveValue(player: ServerPlayer) {
money = MySuperCoolDatabase[player].playerMoney
}
}
Отправка/Получение данных через корутины
Теперь можно создать пакет на клиенте с шаблонными данными (которые не будут использованы на
сервере) и вызвать suspend
метод request()
для отправки и ожидания ответа соответственно.
// Лучше используйте ваш собственный обработчик корутин
GlobalScope.launch {
val packet = GiveMyMoneyPacket() // Создаём пакет (см. прошлый пример)
val result = packet.request() // Вызываем suspend метод для отпраки запроса и получения ответа. Корутина будет приостановлена до получения ответа, а в результате вы получите пакет с сервера с уже заполненными данными
val money = result.money // Дальше делайте с этими данными, что хотите.
}