HolographicDisplays/core/src/main/java/me/filoghost/holographicdisplays/core/tracking/ClickableLineTracker.java

107 lines
3.6 KiB
Java
Raw Normal View History

/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.core.tracking;
import me.filoghost.holographicdisplays.common.PositionCoordinates;
import me.filoghost.holographicdisplays.core.base.BaseClickableHologramLine;
import me.filoghost.holographicdisplays.core.listener.LineClickListener;
2022-06-04 10:28:44 +02:00
import me.filoghost.holographicdisplays.nms.common.NMSManager;
import me.filoghost.holographicdisplays.nms.common.entity.ClickableNMSPacketEntity;
import org.jetbrains.annotations.MustBeInvokedByOverriders;
2022-06-04 15:44:29 +02:00
public abstract class ClickableLineTracker<T extends Viewer> extends LineTracker<T> {
2021-08-18 16:16:20 +02:00
private final ClickableNMSPacketEntity clickableEntity;
2021-08-19 11:56:28 +02:00
private final double positionOffsetY;
2021-07-31 09:06:36 +02:00
private final LineClickListener lineClickListener;
2021-08-18 16:16:20 +02:00
private boolean spawnClickableEntity;
private boolean spawnClickableEntityChanged;
2022-06-04 10:28:44 +02:00
public ClickableLineTracker(BaseClickableHologramLine line, NMSManager nmsManager, LineClickListener lineClickListener) {
2021-08-18 16:16:20 +02:00
this.clickableEntity = nmsManager.newClickablePacketEntity();
2021-08-19 11:56:28 +02:00
this.positionOffsetY = (line.getHeight() - ClickableNMSPacketEntity.SLIME_HEIGHT) / 2;
2021-07-31 09:06:36 +02:00
this.lineClickListener = lineClickListener;
}
@Override
protected abstract BaseClickableHologramLine getLine();
@MustBeInvokedByOverriders
@Override
public void onRemoval() {
super.onRemoval();
2021-08-18 16:16:20 +02:00
lineClickListener.unregisterLine(clickableEntity.getID());
}
@MustBeInvokedByOverriders
@Override
protected void detectChanges() {
super.detectChanges();
boolean spawnClickableEntity = getLine().hasClickCallback();
2021-08-18 16:16:20 +02:00
if (this.spawnClickableEntity != spawnClickableEntity) {
this.spawnClickableEntity = spawnClickableEntity;
this.spawnClickableEntityChanged = true;
if (spawnClickableEntity) {
lineClickListener.registerLine(clickableEntity.getID(), getLine());
} else {
2021-08-18 16:16:20 +02:00
lineClickListener.unregisterLine(clickableEntity.getID());
}
}
}
@MustBeInvokedByOverriders
@Override
protected void clearDetectedChanges() {
super.clearDetectedChanges();
2021-08-18 16:16:20 +02:00
this.spawnClickableEntityChanged = false;
}
@MustBeInvokedByOverriders
@Override
protected void sendSpawnPackets(Viewers<T> viewers) {
2021-08-18 16:16:20 +02:00
if (spawnClickableEntity) {
viewers.sendPackets(clickableEntity.newSpawnPackets(getClickableEntityPosition()));
}
}
@MustBeInvokedByOverriders
@Override
protected void sendDestroyPackets(Viewers<T> viewers) {
2021-08-18 16:16:20 +02:00
if (spawnClickableEntity) {
viewers.sendPackets(clickableEntity.newDestroyPackets());
}
}
@MustBeInvokedByOverriders
@Override
protected void sendChangesPackets(Viewers<T> viewers) {
super.sendChangesPackets(viewers);
2021-08-18 16:16:20 +02:00
if (spawnClickableEntityChanged) {
if (spawnClickableEntity) {
viewers.sendPackets(clickableEntity.newSpawnPackets(getClickableEntityPosition()));
} else {
viewers.sendPackets(clickableEntity.newDestroyPackets());
}
}
}
@MustBeInvokedByOverriders
@Override
protected void sendPositionChangePackets(Viewers<T> viewers) {
2021-08-18 16:16:20 +02:00
if (spawnClickableEntity) {
viewers.sendPackets(clickableEntity.newTeleportPackets(getClickableEntityPosition()));
}
}
private PositionCoordinates getClickableEntityPosition() {
2022-06-04 10:28:44 +02:00
return positionCoordinates.addY(positionOffsetY);
}
}